diff options
-rw-r--r-- | Documentation/RelNotes-1.5.2.5.txt | 30 | ||||
-rw-r--r-- | builtin-add.c | 9 | ||||
-rwxr-xr-x | t/t2200-add-update.sh | 73 |
3 files changed, 92 insertions, 20 deletions
diff --git a/Documentation/RelNotes-1.5.2.5.txt b/Documentation/RelNotes-1.5.2.5.txt new file mode 100644 index 0000000000..e8281c72a0 --- /dev/null +++ b/Documentation/RelNotes-1.5.2.5.txt @@ -0,0 +1,30 @@ +GIT v1.5.2.5 Release Notes +========================== + +Fixes since v1.5.2.4 +-------------------- + + * Bugfixes + + - "git add -u" had a serious data corruption problem in one + special case (when the changes to a subdirectory's files + consist only deletion of files). + + - "git add -u <path>" did not work from a subdirectory. + + - "git apply" left an empty directory after all its files are + renamed away. + + - "git $anycmd foo/bar", when there is a file 'foo' in the + working tree, complained that "git $anycmd foo/bar --" form + should be used to disambiguate between revs and files, + which was completely bogus. + + - "git checkout-index" and other commands that checks out + files to the work tree tried unlink(2) on directories, + which is a sane thing to do on sane systems, but not on + Solaris when you are root. + + * Documentation Fixes and Updates + + - A handful documentation fixes. diff --git a/builtin-add.c b/builtin-add.c index 82c806acf0..3dd4ded937 100644 --- a/builtin-add.c +++ b/builtin-add.c @@ -102,6 +102,7 @@ static void update_callback(struct diff_queue_struct *q, break; case DIFF_STATUS_DELETED: remove_file_from_cache(path); + cache_tree_invalidate_path(active_cache_tree, path); if (verbose) printf("remove '%s'\n", path); break; @@ -109,12 +110,12 @@ static void update_callback(struct diff_queue_struct *q, } } -static void update(int verbose, const char **files) +static void update(int verbose, const char *prefix, const char **files) { struct rev_info rev; - init_revisions(&rev, ""); + init_revisions(&rev, prefix); setup_revisions(0, NULL, &rev, NULL); - rev.prune_data = get_pathspec(rev.prefix, files); + rev.prune_data = get_pathspec(prefix, files); rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; rev.diffopt.format_callback = update_callback; rev.diffopt.format_callback_data = &verbose; @@ -216,7 +217,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) } if (take_worktree_changes) { - update(verbose, argv + i); + update(verbose, prefix, argv + i); goto finish; } diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh index 0a703af149..61d08bb431 100755 --- a/t/t2200-add-update.sh +++ b/t/t2200-add-update.sh @@ -13,26 +13,67 @@ only the updates to dir/sub.' . ./test-lib.sh -test_expect_success 'setup' ' -echo initial >top && -mkdir dir && -echo initial >dir/sub && -git add dir/sub top && -git-commit -m initial && -echo changed >top && -echo changed >dir/sub && -echo other >dir/other +test_expect_success setup ' + echo initial >check && + echo initial >top && + mkdir dir1 dir2 && + echo initial >dir1/sub1 && + echo initial >dir1/sub2 && + echo initial >dir2/sub3 && + git add check dir1 dir2 top && + test_tick + git-commit -m initial && + + echo changed >check && + echo changed >top && + echo changed >dir2/sub3 && + rm -f dir1/sub1 && + echo other >dir2/other ' -test_expect_success 'update' 'git add -u dir' +test_expect_success update ' + git add -u dir1 dir2 +' -test_expect_success 'update touched correct path' \ - 'test "`git diff-files --name-status dir/sub`" = ""' +test_expect_success 'update noticed a removal' ' + test "$(git-ls-files dir1/sub1)" = "" +' + +test_expect_success 'update touched correct path' ' + test "$(git-diff-files --name-status dir2/sub3)" = "" +' + +test_expect_success 'update did not touch other tracked files' ' + test "$(git-diff-files --name-status check)" = "M check" && + test "$(git-diff-files --name-status top)" = "M top" +' + +test_expect_success 'update did not touch untracked files' ' + test "$(git-ls-files dir2/other)" = "" +' -test_expect_success 'update did not touch other tracked files' \ - 'test "`git diff-files --name-status top`" = "M top"' +test_expect_success 'cache tree has not been corrupted' ' -test_expect_success 'update did not touch untracked files' \ - 'test "`git diff-files --name-status dir/other`" = ""' + git ls-files -s | + sed -e "s/ 0 / /" >expect && + git ls-tree -r $(git write-tree) | + sed -e "s/ blob / /" >current && + diff -u expect current + +' + +test_expect_success 'update from a subdirectory' ' + ( + cd dir1 && + echo more >sub2 && + git add -u sub2 + ) +' + +test_expect_success 'change gets noticed' ' + + test "$(git diff-files --name-status dir1)" = "" + +' test_done |