Merge branch 'mm/apply-double-slash'
authorJunio C Hamano <gitster@pobox.com>
Sun, 31 May 2009 23:17:46 +0000 (16:17 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 31 May 2009 23:17:46 +0000 (16:17 -0700)
* mm/apply-double-slash:
apply: handle filenames with double slashes better

1  2 
builtin-apply.c
diff --combined builtin-apply.c
index a40b9822425e25272cadf6f4170ba967eacf11bf,660aab95df2cb4520601ae212f8c3f2abba0e408..ebbf084639e07a398ea6de62d5d135faabbd1bd4
@@@ -320,6 -320,20 +320,20 @@@ static int name_terminate(const char *n
        return 1;
  }
  
+ /* remove double slashes to make --index work with such filenames */
+ static char *squash_slash(char *name)
+ {
+       int i = 0, j = 0;
+       while (name[i]) {
+               if ((name[j++] = name[i++]) == '/')
+                       while (name[i] == '/')
+                               i++;
+       }
+       name[j] = '\0';
+       return name;
+ }
  static char *find_name(const char *line, char *def, int p_value, int terminate)
  {
        int len;
                                free(def);
                                if (root)
                                        strbuf_insert(&name, 0, root, root_len);
-                               return strbuf_detach(&name, NULL);
+                               return squash_slash(strbuf_detach(&name, NULL));
                        }
                }
                strbuf_release(&name);
                        start = line;
        }
        if (!start)
-               return def;
+               return squash_slash(def);
        len = line - start;
        if (!len)
-               return def;
+               return squash_slash(def);
  
        /*
         * Generally we prefer the shorter name, especially
        if (def) {
                int deflen = strlen(def);
                if (deflen < len && !strncmp(start, def, deflen))
-                       return def;
+                       return squash_slash(def);
                free(def);
        }
  
                strcpy(ret, root);
                memcpy(ret + root_len, start, len);
                ret[root_len + len] = '\0';
-               return ret;
+               return squash_slash(ret);
        }
  
-       return xmemdupz(start, len);
+       return squash_slash(xmemdupz(start, len));
  }
  
  static int count_slashes(const char *cp)
@@@ -3315,10 -3329,6 +3329,10 @@@ int cmd_apply(int argc, const char **ar
  
        argc = parse_options(argc, argv, builtin_apply_options,
                        apply_usage, 0);
 +      fake_ancestor = parse_options_fix_filename(prefix, fake_ancestor);
 +      if (fake_ancestor)
 +              fake_ancestor = xstrdup(fake_ancestor);
 +
        if (apply_with_reject)
                apply = apply_verbosely = 1;
        if (!force_apply && (diffstat || numstat || summary || check || fake_ancestor))