NULL
};
-static int merge_window(struct plist *p, FILE *f, int reverse)
+static int merge_window(struct plist *p, FILE *f, int reverse, int replace)
{
/* Display the merge window in one of the selectable modes,
* starting with the 'merge' mode.
num = tnum*10 + (c-'0');
break;
case 'q':
+ refresh = 2;
answer = 0;
- if (changes) {
+ if (replace)
+ answer = 1;
+ else if (changes)
answer = help_window(save_query, NULL, 1);
- refresh = 2;
- if (answer < 0)
- break;
- if (answer) {
- p->wiggles = 0;
- p->conflicts = isolate_conflicts(
- fm, fb, fa, csl1, csl2, 0,
- ci.merger, 0);
- p->chunks = p->conflicts;
- save_merge(fm, fb, fa, ci.merger,
- p->file, !p->is_merge);
- }
+ if (answer < 0)
+ break;
+ if (answer) {
+ p->wiggles = 0;
+ p->conflicts = isolate_conflicts(
+ fm, fb, fa, csl1, csl2, 0,
+ ci.merger, 0);
+ p->chunks = p->conflicts;
+ save_merge(fm, fb, fa, ci.merger,
+ p->file, !p->is_merge);
}
free(sm.body);
free(sb.body);
}
static int show_merge(char *origname, FILE *patch, int reverse,
- int is_merge, char *before, char *after)
+ int is_merge, char *before, char *after,
+ int replace)
{
struct plist p;
p.after = after;
freopen("/dev/null","w",stderr);
- return merge_window(&p, patch, reverse);
+ return merge_window(&p, patch, reverse, replace);
}
static void calc_one(struct plist *pl, FILE *f, int reverse)
" C only list files with a conflict",
NULL
};
-static char *saveall_msg = " %d file%s have not been saved.";
+static char *saveall_msg = " %d file%s (of %d) have not been saved.";
static char saveall_buf[200];
static char *saveall_query[] = {
"",
" Q = Don't quit just yet",
NULL
};
-static void main_window(struct plist *pl, int *np, FILE *f, int reverse)
+static void main_window(struct plist *pl, int *np, FILE *f, int reverse,
+ int replace)
{
/* The main window lists all files together with summary information:
* number of chunks, number of wiggles, number of conflicts.
int c = 0;
int mode = 0; /* 0=all, 1= only wiggled, 2=only conflicted */
int cnt; /* count of files that need saving */
+ int any; /* count of files that have been save*/
+ int ans;
freopen("/dev/null","w",stderr);
term_init();
} else {
int c;
if (pl[pos].is_merge)
- c = merge_window(&pl[pos], NULL, reverse);
+ c = merge_window(&pl[pos], NULL, reverse, 0);
else
- c = merge_window(&pl[pos], f, reverse);
+ c = merge_window(&pl[pos], f, reverse, 0);
refresh = 2;
if (c) {
pl[pos].is_merge = 1;
}
move(0, cols-10); clrtoeol();
break;
+
case 'q':
cnt = 0;
+ any = 0;
for (i = 0; i < *np; i++)
if (pl[i].end && !pl[i].is_merge)
cnt++;
- if (cnt) {
- int ans;
+ else if (pl[i].end)
+ any++;
+ if (!cnt) {
+ endwin();
+ return;
+ }
+ refresh = 2;
+ if (replace)
+ ans = 1;
+ else if (any) {
sprintf(saveall_buf, saveall_msg,
- cnt, cnt == 1 ? "" : "s");
+ cnt, cnt == 1 ? "" : "s", cnt+any);
ans = help_window(saveall_query, NULL, 1);
- refresh = 2;
-
- if (ans < 0)
- break;
- if (ans) {
- for (i = 0; i < *np; i++) {
- if (pl[i].end
- && !pl[i].is_merge)
- save_one(f, &pl[i],
- reverse);
- }
- } else
- cnt = 0;
}
+ if (ans < 0)
+ break;
+ if (ans) {
+ for (i = 0; i < *np; i++) {
+ if (pl[i].end
+ && !pl[i].is_merge)
+ save_one(f, &pl[i],
+ reverse);
+ }
+ } else
+ cnt = 0;
endwin();
if (cnt)
printf("%d file%s saved\n", cnt,
fprintf(stderr, "%s: aborting\n", Cmd);
exit(2);
}
- main_window(pl, &num_patches, in, reverse);
+ main_window(pl, &num_patches, in, reverse, replace);
plist_free(pl, num_patches);
fclose(in);
break;
fprintf(stderr, "%s: aborting\n", Cmd);
exit(2);
}
- main_window(pl, &num_patches, f, reverse);
+ main_window(pl, &num_patches, f, reverse, replace);
plist_free(pl, num_patches);
} else if (strlen(argv[0]) > 4 &&
strcmp(argv[0]+strlen(argv[0])-4, ".rej") == 0) {
char *origname = strdup(argv[0]);
origname[strlen(origname) - 4] = '\0';
- show_merge(origname, f, reverse, 0, NULL, NULL);
+ show_merge(origname, f, reverse, 0, NULL, NULL,
+ replace);
} else
- show_merge(argv[0], f, reverse, 1, NULL, NULL);
+ show_merge(argv[0], f, reverse, 1, NULL, NULL,
+ replace);
break;
case 2: /* an orig and a diff/.ref */
fprintf(stderr, "%s: cannot open %s\n", Cmd, argv[0]);
exit(1);
}
- show_merge(argv[0], f, reverse, 0, NULL, NULL);
+ show_merge(argv[0], f, reverse, 0, NULL, NULL,
+ replace);
break;
case 3: /* orig, before, after */
- show_merge(argv[0], NULL, reverse, 1, argv[1], argv[2]);
+ show_merge(argv[0], NULL, reverse, 1, argv[1], argv[2],
+ replace);
break;
}