This patch series adds support for a new receive.denyCurrentBranch setting to update the working directory (which must be clean, i.e. there must not be any uncommitted changes) when pushing into the current branch. The scenario in which the 'updateInstead' setting became a boon in this developer's daily work is when trying to get a bug fix from a Windows computer, a virtual machine, or when getting a bug fix from a user's machine onto his main machine (in all of those cases it is only possible to connect via ssh in one direction, but not in the reverse direction). It also comes in handy when updating a live web site via push (in which case a clean working directory is an absolute must). Interdiff vs v4 below diffstat. Johannes Schindelin (1): Add another option for receive.denyCurrentBranch Documentation/config.txt | 7 ++++ builtin/receive-pack.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++-- t/t5516-fetch-push.sh | 26 ++++++++++++++ 3 files changed, 124 insertions(+), 2 deletions(-) diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 7ff8be5..bbd9ba3 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -736,7 +736,7 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si) static const char *update_worktree(unsigned char *sha1) { const char *update_refresh[] = { - "update-index", "--ignore-submodules", "--refresh", "-q", NULL + "update-index", "-q", "--ignore-submodules", "--refresh", NULL }; const char *diff_files[] = { "diff-files", "--quiet", "--ignore-submodules", "--", NULL @@ -746,7 +746,7 @@ static const char *update_worktree(unsigned char *sha1) "HEAD", "--", NULL }; const char *read_tree[] = { - "read-tree", "-u", "-m", sha1_to_hex(sha1), NULL + "read-tree", "-u", "-m", NULL, NULL }; const char *work_tree = git_work_tree_cfg ? git_work_tree_cfg : ".."; struct argv_array env = ARGV_ARRAY_INIT; @@ -778,10 +778,9 @@ static const char *update_worktree(unsigned char *sha1) child.git_cmd = 1; if (run_command(&child)) { argv_array_clear(&env); - return "Working directory not clean"; + return "Working directory has unstaged changes"; } - /* run_command() does not clean up completely; reinitialize */ child_process_init(&child); child.argv = diff_index; child.env = env.argv; @@ -791,10 +790,10 @@ static const char *update_worktree(unsigned char *sha1) child.git_cmd = 1; if (run_command(&child)) { argv_array_clear(&env); - return "Working directory not clean"; + return "Working directory has staged changes"; } - /* run_command() does not clean up completely; reinitialize */ + read_tree[3] = sha1_to_hex(sha1); child_process_init(&child); child.argv = read_tree; child.env = env.argv; diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh index b8df39c..7b353d0 100755 --- a/t/t5516-fetch-push.sh +++ b/t/t5516-fetch-push.sh @@ -1341,14 +1341,19 @@ test_expect_success 'receive.denyCurrentBranch = updateInstead' ' test $(git rev-parse HEAD) = $(cd testrepo && git rev-parse HEAD) && test third = "$(cat testrepo/path2)" && (cd testrepo && - git update-index --refresh && - git diff-files --quiet && - git diff-index --cached HEAD -- && - echo changed > path2 && + git update-index -q --refresh && + git diff-files --quiet -- && + git diff-index --quiet --cached HEAD -- && + echo changed >path2 && git add path2 ) && test_commit fourth path2 && - test_must_fail git push testrepo master + test_must_fail git push testrepo master && + test $(git rev-parse HEAD^) = $(git -C testrepo rev-parse HEAD) && + (cd testrepo && + git diff --quiet && + test changed = "$(cat path2)" + ) ' test_done -- 2.0.0.rc3.9669.g840d1f9 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html