diff options
author | Junio C Hamano <gitster@pobox.com> | 2010-03-28 21:21:42 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-03-28 21:21:42 -0700 |
commit | cc64c6970a0d50ecb75ba902d406bac7ea461f97 (patch) | |
tree | 9b13255ef2b1e46062b90f0bc42bbacc0b56f201 /builtin-add.c | |
parent | 4c367c6ae978ef18477fba6b00458c32f1d49d0d (diff) | |
parent | 1e7ef746d3a635742690817fefe00b66a044dfe5 (diff) | |
download | git-cc64c6970a0d50ecb75ba902d406bac7ea461f97.tar.gz |
Merge branch 'cp/add-u-pathspec' into maint
* cp/add-u-pathspec:
test for add with non-existent pathspec
git add -u: die on unmatched pathspec
Diffstat (limited to 'builtin-add.c')
-rw-r--r-- | builtin-add.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/builtin-add.c b/builtin-add.c index 2705f8d057..87d2980313 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -117,7 +117,19 @@ static void fill_pathspec_matches(const char **pathspec, char *seen, int specs) } } -static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix) +static char *find_used_pathspec(const char **pathspec) +{ + char *seen; + int i; + + for (i = 0; pathspec[i]; i++) + ; /* just counting */ + seen = xcalloc(i, 1); + fill_pathspec_matches(pathspec, seen, i); + return seen; +} + +static char *prune_directory(struct dir_struct *dir, const char **pathspec, int prefix) { char *seen; int i, specs; @@ -137,13 +149,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p } dir->nr = dst - dir->entries; fill_pathspec_matches(pathspec, seen, specs); - - for (i = 0; i < specs; i++) { - if (!seen[i] && pathspec[i][0] && !file_exists(pathspec[i])) - die("pathspec '%s' did not match any files", - pathspec[i]); - } - free(seen); + return seen; } static void treat_gitlinks(const char **pathspec) @@ -359,6 +365,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) int flags; int add_new_files; int require_pathspec; + char *seen = NULL; git_config(add_config, NULL); @@ -418,7 +425,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) /* This picks up the paths that are not tracked */ baselen = fill_directory(&dir, pathspec); if (pathspec) - prune_directory(&dir, pathspec, baselen); + seen = prune_directory(&dir, pathspec, baselen); } if (refresh_only) { @@ -426,6 +433,19 @@ int cmd_add(int argc, const char **argv, const char *prefix) goto finish; } + if (pathspec) { + int i; + if (!seen) + seen = find_used_pathspec(pathspec); + for (i = 0; pathspec[i]; i++) { + if (!seen[i] && pathspec[i][0] + && !file_exists(pathspec[i])) + die("pathspec '%s' did not match any files", + pathspec[i]); + } + free(seen); + } + exit_status |= add_files_to_cache(prefix, pathspec, flags); if (add_new_files) |