Code

Allow low-level driver to specify different behaviour during internal merge.
authorJunio C Hamano <junkio@cox.net>
Wed, 18 Apr 2007 19:18:25 +0000 (12:18 -0700)
committerJunio C Hamano <junkio@cox.net>
Wed, 18 Apr 2007 19:30:49 +0000 (12:30 -0700)
This allows [merge "drivername"] to have a variable "recursive"
that names a different low-level merge driver to be used when
merging common ancestors to come up with a virtual ancestor.

Signed-off-by: Junio C Hamano <junkio@cox.net>
merge-recursive.c

index 0f5c28eaff1ccbfd2abd288e9c72d43d86f1d20d..7b5ca8e717217011ffde95434e58d47e401c40e5 100644 (file)
@@ -677,6 +677,7 @@ struct ll_merge_driver {
        const char *name;
        const char *description;
        ll_merge_fn fn;
+       const char *recursive;
        struct ll_merge_driver *next;
        char *cmdline;
 };
@@ -934,6 +935,13 @@ static int read_merge_config(const char *var, const char *value)
                return 0;
        }
 
+       if (!strcmp("recursive", ep)) {
+               if (!value)
+                       return error("%s: lacks value", var);
+               fn->recursive = strdup(value);
+               return 0;
+       }
+
        return 0;
 }
 
@@ -1013,6 +1021,10 @@ static int ll_merge(mmbuffer_t *result_buf,
        merge_attr = git_path_check_merge(a->path);
        driver = find_ll_merge_driver(merge_attr);
 
+       if (index_only && driver->recursive) {
+               merge_attr = git_attr(driver->recursive, strlen(driver->recursive));
+               driver = find_ll_merge_driver(merge_attr);
+       }
        merge_status = driver->fn(driver, a->path,
                                  &orig, &src1, name1, &src2, name2,
                                  result_buf);