Skip to content

Commit

Permalink
Teach read-tree the -n|--dry-run option
Browse files Browse the repository at this point in the history
The option can be used to check if read-tree with the same set of other
options like "-m" and "-u" would succeed without actually changing either
the index or the working tree.

The relevant tests in the t10?? range were extended to do a read-tree -n
before the real read-tree to make sure neither the index nor any local
files were changed with -n and the same exit code as without -n is
returned. The helper functions added for that purpose reside in the new
t/lib-read-tree.sh file.

The only exception is #13 in t1004 ("unlinking an un-unlink-able
symlink"). As this is an issue of wrong directory permissions it is not
detected with -n.

Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jens Lehmann authored and Junio C Hamano committed May 25, 2011
1 parent 2c9078d commit ea5070c
Show file tree
Hide file tree
Showing 12 changed files with 198 additions and 140 deletions.
5 changes: 5 additions & 0 deletions Documentation/git-read-tree.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ OPTIONS
trees that are not directly related to the current
working tree status into a temporary index file.

-n::
--dry-run::
Check if the command would error out, without updating the index
nor the files in the working tree for real.

-v::
Show the progress of checking files out.

Expand Down
3 changes: 2 additions & 1 deletion builtin/read-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
PARSE_OPT_NONEG, exclude_per_directory_cb },
OPT_SET_INT('i', NULL, &opts.index_only,
"don't check the working tree after merging", 1),
OPT__DRY_RUN(&opts.dry_run, "don't update the index or the work tree"),
OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
"skip applying sparse checkout filter", 1),
OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack,
Expand Down Expand Up @@ -219,7 +220,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
if (unpack_trees(nr_trees, t, &opts))
return 128;

if (opts.debug_unpack)
if (opts.debug_unpack || opts.dry_run)
return 0; /* do not write the index out */

/*
Expand Down
43 changes: 43 additions & 0 deletions t/lib-read-tree.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/bin/sh
#
# Helper functions to check if read-tree would succeed/fail as expected with
# and without the dry-run option. They also test that the dry-run does not
# write the index and that together with -u it doesn't touch the work tree.
#
read_tree_must_succeed () {
git ls-files -s >pre-dry-run &&
git read-tree -n "$@" &&
git ls-files -s >post-dry-run &&
test_cmp pre-dry-run post-dry-run &&
git read-tree "$@"
}

read_tree_must_fail () {
git ls-files -s >pre-dry-run &&
test_must_fail git read-tree -n "$@" &&
git ls-files -s >post-dry-run &&
test_cmp pre-dry-run post-dry-run &&
test_must_fail git read-tree "$@"
}

read_tree_u_must_succeed () {
git ls-files -s >pre-dry-run &&
git diff-files -p >pre-dry-run-wt &&
git read-tree -n "$@" &&
git ls-files -s >post-dry-run &&
git diff-files -p >post-dry-run-wt &&
test_cmp pre-dry-run post-dry-run &&
test_cmp pre-dry-run-wt post-dry-run-wt &&
git read-tree "$@"
}

read_tree_u_must_fail () {
git ls-files -s >pre-dry-run &&
git diff-files -p >pre-dry-run-wt &&
test_must_fail git read-tree -n "$@" &&
git ls-files -s >post-dry-run &&
git diff-files -p >post-dry-run-wt &&
test_cmp pre-dry-run post-dry-run &&
test_cmp pre-dry-run-wt post-dry-run-wt &&
test_must_fail git read-tree "$@"
}
Loading

0 comments on commit ea5070c

Please sign in to comment.