stash: tolerate missing user identity
authorSlavica Djukic <slavicadj.ip2018@gmail.com>
Sun, 18 Nov 2018 13:44:07 +0000 (14:44 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 18 Nov 2018 23:24:34 +0000 (08:24 +0900)
The "git stash" command insists on having a usable user identity to
the same degree as the "git commit-tree" and "git commit" commands
do, because it uses the same codepath that creates commit objects
as these commands.

It is not strictly necesary to do so. Check if we will barf before
creating commit objects and then supply fake identity to please the
machinery that creates commits.
Add test to document that stash executes correctly both with and
without valid ident.

This is not that much of usability improvement, as the users who run
"git stash" would eventually want to record their changes that are
temporarily stored in the stashes in a more permanent history by
committing, and they must do "git config user.{name,email}" at that
point anyway, so arguably this change is only delaying a step that
is necessary to work in the repository.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Slavica Djukic <slawica92@hotmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-stash.sh
t/t3903-stash.sh
index 94793c1a913abf569ff9101d935c355b9eb27648..789ce2f41d4a3c6e88084412bcc2b7be6ae98526 100755 (executable)
@@ -55,6 +55,20 @@ untracked_files () {
        git ls-files -o $z $excl_opt -- "$@"
 }
 
+prepare_fallback_ident () {
+       if ! git -c user.useconfigonly=yes var GIT_COMMITTER_IDENT >/dev/null 2>&1
+       then
+               GIT_AUTHOR_NAME="git stash"
+               GIT_AUTHOR_EMAIL=git@stash
+               GIT_COMMITTER_NAME="git stash"
+               GIT_COMMITTER_EMAIL=git@stash
+               export GIT_AUTHOR_NAME
+               export GIT_AUTHOR_EMAIL
+               export GIT_COMMITTER_NAME
+               export GIT_COMMITTER_EMAIL
+       fi
+}
+
 clear_stash () {
        if test $# != 0
        then
@@ -67,6 +81,9 @@ clear_stash () {
 }
 
 create_stash () {
+
+       prepare_fallback_ident
+
        stash_msg=
        untracked=
        while test $# != 0
index cd216655b97b852eec963916e796d11d32eb976a..5f8272b6f94b513b250575c6e99e4f76d6b08e75 100755 (executable)
@@ -1096,4 +1096,32 @@ test_expect_success 'stash -- <subdir> works with binary files' '
        test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash works when user.name and user.email are not set' '
+       git reset &&
+       >1 &&
+       git add 1 &&
+       echo "$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" >expect &&
+       git stash &&
+       git show -s --format="%an <%ae>" refs/stash >actual &&
+       test_cmp expect actual &&
+       >2 &&
+       git add 2 &&
+       test_config user.useconfigonly true &&
+       test_config stash.usebuiltin true &&
+       (
+               sane_unset GIT_AUTHOR_NAME &&
+               sane_unset GIT_AUTHOR_EMAIL &&
+               sane_unset GIT_COMMITTER_NAME &&
+               sane_unset GIT_COMMITTER_EMAIL &&
+               test_unconfig user.email &&
+               test_unconfig user.name &&
+               test_must_fail git commit -m "should fail" &&
+               echo "git stash <git@stash>" >expect &&
+               >2 &&
+               git stash &&
+               git show -s --format="%an <%ae>" refs/stash >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_done