convert run_add_interactive to use struct pathspec
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sun, 14 Jul 2013 08:35:50 +0000 (15:35 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 15 Jul 2013 17:56:08 +0000 (10:56 -0700)
This passes the pathspec, more or less unmodified, to
git-add--interactive. The command itself does not process pathspec. It
simply passes the pathspec to other builtin commands. So if all those
commands support pathspec, we're good.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/add.c
builtin/checkout.c
builtin/reset.c
commit.h

index 9a7235e..d039fc9 100644 (file)
@@ -244,16 +244,12 @@ static void refresh(int verbose, const char **pathspec)
 }
 
 int run_add_interactive(const char *revision, const char *patch_mode,
 }
 
 int run_add_interactive(const char *revision, const char *patch_mode,
-                       const char **pathspec)
+                       const struct pathspec *pathspec)
 {
 {
-       int status, ac, pc = 0;
+       int status, ac, i;
        const char **args;
 
        const char **args;
 
-       if (pathspec)
-               while (pathspec[pc])
-                       pc++;
-
-       args = xcalloc(sizeof(const char *), (pc + 5));
+       args = xcalloc(sizeof(const char *), (pathspec->nr + 6));
        ac = 0;
        args[ac++] = "add--interactive";
        if (patch_mode)
        ac = 0;
        args[ac++] = "add--interactive";
        if (patch_mode)
@@ -261,11 +257,9 @@ int run_add_interactive(const char *revision, const char *patch_mode,
        if (revision)
                args[ac++] = revision;
        args[ac++] = "--";
        if (revision)
                args[ac++] = revision;
        args[ac++] = "--";
-       if (pc) {
-               memcpy(&(args[ac]), pathspec, sizeof(const char *) * pc);
-               ac += pc;
-       }
-       args[ac] = NULL;
+       for (i = 0; i < pathspec->nr; i++)
+               /* pass original pathspec, to be re-parsed */
+               args[ac++] = pathspec->items[i].original;
 
        status = run_command_v_opt(args, RUN_GIT_CMD);
        free(args);
 
        status = run_command_v_opt(args, RUN_GIT_CMD);
        free(args);
@@ -280,17 +274,17 @@ int interactive_add(int argc, const char **argv, const char *prefix, int patch)
         * git-add--interactive itself does not parse pathspec. It
         * simply passes the pathspec to other builtin commands. Let's
         * hope all of them support all magic, or we'll need to limit
         * git-add--interactive itself does not parse pathspec. It
         * simply passes the pathspec to other builtin commands. Let's
         * hope all of them support all magic, or we'll need to limit
-        * the magic here. There is still a problem with prefix. But
-        * that'll be worked on later on.
+        * the magic here.
         */
        parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
                       PATHSPEC_PREFER_FULL |
         */
        parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
                       PATHSPEC_PREFER_FULL |
-                      PATHSPEC_SYMLINK_LEADING_PATH,
+                      PATHSPEC_SYMLINK_LEADING_PATH |
+                      PATHSPEC_PREFIX_ORIGIN,
                       prefix, argv);
 
        return run_add_interactive(NULL,
                                   patch ? "--patch" : NULL,
                       prefix, argv);
 
        return run_add_interactive(NULL,
                                   patch ? "--patch" : NULL,
-                                  pathspec.raw);
+                                  &pathspec);
 }
 
 static int edit_patch(int argc, const char **argv, const char *prefix)
 }
 
 static int edit_patch(int argc, const char **argv, const char *prefix)
index 2f0fb8d..5d31767 100644 (file)
@@ -257,7 +257,7 @@ static int checkout_paths(const struct checkout_opts *opts,
 
        if (opts->patch_mode)
                return run_add_interactive(revision, "--patch=checkout",
 
        if (opts->patch_mode)
                return run_add_interactive(revision, "--patch=checkout",
-                                          opts->pathspec.raw);
+                                          &opts->pathspec);
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
 
        lock_file = xcalloc(1, sizeof(struct lock_file));
 
@@ -1159,10 +1159,9 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
                 * cannot handle. Magic mask is pretty safe to be
                 * lifted for new magic when opts.patch_mode == 0.
                 */
                 * cannot handle. Magic mask is pretty safe to be
                 * lifted for new magic when opts.patch_mode == 0.
                 */
-               parse_pathspec(&opts.pathspec,
-                              opts.patch_mode == 0 ? 0 :
-                              (PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP),
-                              0, prefix, argv);
+               parse_pathspec(&opts.pathspec, 0,
+                              opts.patch_mode ? PATHSPEC_PREFIX_ORIGIN : 0,
+                              prefix, argv);
 
                if (!opts.pathspec.nr)
                        die(_("invalid path specification"));
 
                if (!opts.pathspec.nr)
                        die(_("invalid path specification"));
index 313b296..9bef869 100644 (file)
@@ -219,9 +219,9 @@ static void parse_args(struct pathspec *pathspec,
                }
        }
        *rev_ret = rev;
                }
        }
        *rev_ret = rev;
-       parse_pathspec(pathspec,
-                      patch_mode ? PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP : 0,
-                      PATHSPEC_PREFER_FULL,
+       parse_pathspec(pathspec, 0,
+                      PATHSPEC_PREFER_FULL |
+                      (patch_mode ? PATHSPEC_PREFIX_ORIGIN : 0),
                       prefix, argv);
 }
 
                       prefix, argv);
 }
 
@@ -299,7 +299,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
        if (patch_mode) {
                if (reset_type != NONE)
                        die(_("--patch is incompatible with --{hard,mixed,soft}"));
        if (patch_mode) {
                if (reset_type != NONE)
                        die(_("--patch is incompatible with --{hard,mixed,soft}"));
-               return run_add_interactive(sha1_to_hex(sha1), "--patch=reset", pathspec.raw);
+               return run_add_interactive(sha1_to_hex(sha1), "--patch=reset", &pathspec);
        }
 
        /* git reset tree [--] paths... can be used to
        }
 
        /* git reset tree [--] paths... can be used to
index 4d452dc..1f1350c 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -194,7 +194,7 @@ int in_merge_bases_many(struct commit *, int, struct commit **);
 
 extern int interactive_add(int argc, const char **argv, const char *prefix, int patch);
 extern int run_add_interactive(const char *revision, const char *patch_mode,
 
 extern int interactive_add(int argc, const char **argv, const char *prefix, int patch);
 extern int run_add_interactive(const char *revision, const char *patch_mode,
-                              const char **pathspec);
+                              const struct pathspec *pathspec);
 
 static inline int single_parent(struct commit *commit)
 {
 
 static inline int single_parent(struct commit *commit)
 {