From: NeilBrown Date: Thu, 22 Aug 2013 03:24:40 +0000 (+1000) Subject: Browser: edit merge in a temporary file. X-Git-Tag: v1.0~19 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=bb7fbc555970da14b62c3c2b3af18d5d3bf31fd7;p=wiggle.git Browser: edit merge in a temporary file. When editing a merge, do so in a temp file so it is still easy to revert to the original. Signed-off-by: NeilBrown --- diff --git a/merge2.c b/merge2.c index 3bc3862..bcb8ccb 100644 --- a/merge2.c +++ b/merge2.c @@ -828,3 +828,28 @@ out: free(orignew); return err; } + +int save_tmp_merge(struct file a, struct file b, struct file c, + struct merge *merger, char **filep) +{ + int fd; + FILE *outfile; + char *dir, *fname; + + dir = getenv("TMPDIR"); + if (!dir) + dir = "/tmp"; + + asprintf(&fname, "%s/wiggle-tmp-XXXXXX", dir); + fd = mkstemp(fname); + + if (fd < 0) { + free(fname); + return -1; + } + outfile = fdopen(fd, "w"); + print_merge(outfile, &a, &b, &c, 0, merger); + fclose(outfile); + *filep = fname; + return 0; +} diff --git a/vpatch.c b/vpatch.c index cbff071..310d399 100644 --- a/vpatch.c +++ b/vpatch.c @@ -1328,6 +1328,7 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace, int changes = 0; /* If any edits have been made to the merge */ int answer; /* answer to 'save changes?' question */ int do_mark; + char *tempname; struct elmnt e; char search[80]; /* string we are searching for */ unsigned int searchlen = 0; @@ -1834,23 +1835,17 @@ static int merge_window(struct plist *p, FILE *f, int reverse, int replace, mesg = "Cannot run editor when diffing"; break; } - save_merge(fm, fb, fa, ci.merger, - p->file, !p->is_merge); - p->is_merge = 1; + save_tmp_merge(fm, fb, fa, ci.merger, + &tempname); endwin(); free_stuff(); - do_edit(p->file); - sp = load_file(p->file); + do_edit(tempname); + sp = load_file(tempname); split_merge(sp, &sm, &sb, &sa); free(sp.body); prepare_merge(0); - p->wiggles = 0; - p->conflicts = isolate_conflicts( - fm, fb, fa, csl1, csl2, 0, - ci.merger, 0, &p->wiggles); - p->chunks = p->conflicts; refresh = 2; - changes = 0; + changes = 1; find_line(pos.p.lineno); diff --git a/wiggle.h b/wiggle.h index 6560838..71c601c 100644 --- a/wiggle.h +++ b/wiggle.h @@ -22,6 +22,7 @@ * Email: */ +#define _GNU_SOURCE /* for asprintf */ #include #include #include @@ -171,6 +172,8 @@ extern void print_merge(FILE *out, extern void printword(FILE *f, struct elmnt e); extern int save_merge(struct file a, struct file b, struct file c, struct merge *merger, char *file, int backup); +extern int save_tmp_merge(struct file a, struct file b, struct file c, + struct merge *merger, char **filep); extern int isolate_conflicts(struct file af, struct file bf, struct file cf, struct csl *csl1, struct csl *csl2, int words,