Skip to content

Commit

Permalink
add -i: Fix running from a subdirectory
Browse files Browse the repository at this point in the history
This fixes the pathspec interactive_add() passes to the underlying
git-add--interactive helper.  When the command was run from a
subdirectory, cmd_add() already has gone up to the toplevel of the work
tree, and the helper will be spawned from there.  The pathspec given on
the command line from the user needs to be adjusted for this.

This adds "validate_pathspec()" function in the callchain, but it does
not validate yet.  The function can be changed to barf if there are
unmatching pathspec given by the user, but that is not strictly
necessary.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Junio C Hamano committed Nov 25, 2007
1 parent 324ccbd commit 3f06188
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 6 deletions.
24 changes: 20 additions & 4 deletions builtin-add.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,29 @@ static void refresh(int verbose, const char **pathspec)
free(seen);
}

int interactive_add(int argc, const char **argv)
static const char **validate_pathspec(int argc, const char **argv, const char *prefix)
{
const char **pathspec = get_pathspec(prefix, argv);

return pathspec;
}

int interactive_add(int argc, const char **argv, const char *prefix)
{
int status;
const char **args = xcalloc(sizeof(const char *), (argc + 2));
const char **args;
const char **pathspec = NULL;

if (argc) {
pathspec = validate_pathspec(argc, argv, prefix);
if (!pathspec)
return -1;
}

args = xcalloc(sizeof(const char *), (argc + 2));
args[0] = "add--interactive";
memcpy(&(args[1]), argv, sizeof(const char *) * argc);
if (argc)
memcpy(&(args[1]), pathspec, sizeof(const char *) * argc);
args[argc + 1] = NULL;

status = run_command_v_opt(args, RUN_GIT_CMD);
Expand Down Expand Up @@ -177,7 +193,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, builtin_add_options,
builtin_add_usage, 0);
if (add_interactive)
exit(interactive_add(argc, argv));
exit(interactive_add(argc, argv, prefix));

git_config(git_default_config);

Expand Down
2 changes: 1 addition & 1 deletion builtin-commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)
const char **pathspec = NULL;

if (interactive) {
interactive_add(argc, argv);
interactive_add(argc, argv, prefix);
commit_style = COMMIT_AS_IS;
return get_index_file();
}
Expand Down
2 changes: 1 addition & 1 deletion commit.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ extern struct commit_list *get_shallow_commits(struct object_array *heads,

int in_merge_bases(struct commit *, struct commit **, int);

extern int interactive_add(int argc, const char **argv);
extern int interactive_add(int argc, const char **argv, const char *prefix);
extern int rerere(void);

static inline int single_parent(struct commit *commit)
Expand Down

0 comments on commit 3f06188

Please sign in to comment.