]> git.neil.brown.name Git - wiggle.git/commitdiff
Browser: edit merge in a temporary file.
authorNeilBrown <neilb@suse.de>
Thu, 22 Aug 2013 03:24:40 +0000 (13:24 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 22 Aug 2013 03:24:40 +0000 (13:24 +1000)
When editing a merge, do so in a temp file so it is still
easy to revert to the original.

Signed-off-by: NeilBrown <neilb@suse.de>
merge2.c
vpatch.c
wiggle.h

index 3bc38622273dbe73d3ea770ceaf9fafe98f82ccd..bcb8ccb5cac141d404f7f3d43750c0fcc5477b28 100644 (file)
--- 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;
+}
index cbff071efbac014b2e057a1112a998651acf9d7e..310d3998080d72a35c564ccfc02542581b880f2c 100644 (file)
--- 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);
 
index 656083844376e61d35837f39a933d49beda69e58..71c601c533eaf9880ecde1ced0b2fb66e731b8de 100644 (file)
--- a/wiggle.h
+++ b/wiggle.h
@@ -22,6 +22,7 @@
  *    Email: <neilb@suse.de>
  */
 
+#define _GNU_SOURCE /* for asprintf */
 #include       <stdio.h>
 #include       <string.h>
 #include       <memory.h>
@@ -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,