Browse Source

Merge branch 'cp/add-u-pathspec'

* cp/add-u-pathspec:
  test for add with non-existent pathspec
  git add -u: die on unmatched pathspec
maint
Junio C Hamano 15 years ago
parent
commit
e25ccff140
  1. 38
      builtin/add.c
  2. 5
      t/t2200-add-update.sh
  3. 5
      t/t3700-add.sh

38
builtin/add.c

@ -117,7 +117,19 @@ static void fill_pathspec_matches(const char **pathspec, char *seen, int specs) @@ -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 @@ -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) @@ -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) @@ -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) @@ -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)

5
t/t2200-add-update.sh

@ -176,4 +176,9 @@ test_expect_success 'add -u resolves unmerged paths' ' @@ -176,4 +176,9 @@ test_expect_success 'add -u resolves unmerged paths' '

'

test_expect_success '"add -u non-existent" should fail' '
test_must_fail git add -u non-existent &&
! (git ls-files | grep "non-existent")
'

test_done

5
t/t3700-add.sh

@ -255,4 +255,9 @@ test_expect_success 'git add to resolve conflicts on otherwise ignored path' ' @@ -255,4 +255,9 @@ test_expect_success 'git add to resolve conflicts on otherwise ignored path' '
git add track-this
'

test_expect_success '"add non-existent" should fail' '
test_must_fail git add non-existent &&
! (git ls-files | grep "non-existent")
'

test_done

Loading…
Cancel
Save