docs/diff-options: clarify scope of diff-filter types
[gitweb.git] / t / t1400-update-ref.sh
index 97406fa4b137afdd99e64172d956718005844120..b0ffc0b5731dd746ed170604784287d3e48e9c30 100755 (executable)
@@ -8,23 +8,33 @@ test_description='Test git update-ref and basic ref logging'
 
 Z=$_z40
 
-test_expect_success setup '
+m=refs/heads/master
+n_dir=refs/heads/gu
+n=$n_dir/fixes
+outside=refs/foo
+bare=bare-repo
 
+create_test_commits ()
+{
+       prfx="$1"
        for name in A B C D E F
        do
                test_tick &&
                T=$(git write-tree) &&
                sha1=$(echo $name | git commit-tree $T) &&
-               eval $name=$sha1
+               eval $prfx$name=$sha1
        done
+}
 
+test_expect_success setup '
+       create_test_commits "" &&
+       mkdir $bare &&
+       cd $bare &&
+       git init --bare &&
+       create_test_commits "bare" &&
+       cd -
 '
 
-m=refs/heads/master
-n_dir=refs/heads/gu
-n=$n_dir/fixes
-outside=foo
-
 test_expect_success \
        "create $m" \
        "git update-ref $m $A &&
@@ -93,6 +103,61 @@ test_expect_success 'update-ref creates reflogs with --create-reflog' '
        git reflog exists $outside
 '
 
+test_expect_success 'creates no reflog in bare repository' '
+       git -C $bare update-ref $m $bareA &&
+       git -C $bare rev-parse $bareA >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       test_must_fail git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true creates reflog in bare repository' '
+       test_when_finished "git -C $bare config --unset core.logAllRefUpdates && \
+               rm $bare/logs/$m" &&
+       git -C $bare config core.logAllRefUpdates true &&
+       git -C $bare update-ref $m $bareB &&
+       git -C $bare rev-parse $bareB >expect &&
+       git -C $bare rev-parse $m >actual &&
+       test_cmp expect actual &&
+       git -C $bare reflog exists $m
+'
+
+test_expect_success 'core.logAllRefUpdates=true does not create reflog by default' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates reflog by default' '
+       test_config core.logAllRefUpdates always &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       git reflog exists $outside
+'
+
+test_expect_success 'core.logAllRefUpdates=always creates no reflog for ORIG_HEAD' '
+       test_config core.logAllRefUpdates always &&
+       git update-ref ORIG_HEAD $A &&
+       test_must_fail git reflog exists ORIG_HEAD
+'
+
+test_expect_success '--no-create-reflog overrides core.logAllRefUpdates=always' '
+       test_config core.logAllRefUpdates true &&
+       test_when_finished "git update-ref -d $outside" &&
+       git update-ref --no-create-reflog $outside $A &&
+       git rev-parse $A >expect &&
+       git rev-parse $outside >actual &&
+       test_cmp expect actual &&
+       test_must_fail git reflog exists $outside
+'
+
 test_expect_success \
        "create $m (by HEAD)" \
        "git update-ref HEAD $A &&
@@ -361,7 +426,7 @@ test_expect_success 'stdin test setup' '
 
 test_expect_success '-z fails without --stdin' '
        test_must_fail git update-ref -z $m $m $m 2>err &&
-       grep "usage: git update-ref" err
+       test_i18ngrep "usage: git update-ref" err
 '
 
 test_expect_success 'stdin works with no input' '
@@ -479,7 +544,7 @@ test_expect_success 'stdin fails with duplicate refs' '
        create $a $m
        EOF
        test_must_fail git update-ref --stdin <stdin 2>err &&
-       grep "fatal: Multiple updates for ref '"'"'$a'"'"' not allowed." err
+       grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
 '
 
 test_expect_success 'stdin create ref works' '
@@ -501,6 +566,7 @@ test_expect_success 'stdin does not create reflogs by default' '
 '
 
 test_expect_success 'stdin creates reflogs with --create-reflog' '
+       test_when_finished "git update-ref -d $outside" &&
        echo "create $outside $m" >stdin &&
        git update-ref --create-reflog --stdin <stdin &&
        git rev-parse $m >expect &&
@@ -880,7 +946,7 @@ test_expect_success 'stdin -z fails option with unknown name' '
 test_expect_success 'stdin -z fails with duplicate refs' '
        printf $F "create $a" "$m" "create $b" "$m" "create $a" "$m" >stdin &&
        test_must_fail git update-ref -z --stdin <stdin 2>err &&
-       grep "fatal: Multiple updates for ref '"'"'$a'"'"' not allowed." err
+       grep "fatal: multiple updates for ref '"'"'$a'"'"' not allowed." err
 '
 
 test_expect_success 'stdin -z create ref works' '
@@ -1102,6 +1168,41 @@ test_expect_success 'stdin -z delete refs works with packed and loose refs' '
        test_must_fail git rev-parse --verify -q $c
 '
 
+test_expect_success 'fails with duplicate HEAD update' '
+       git branch target1 $A &&
+       git checkout target1 &&
+       cat >stdin <<-EOF &&
+       update refs/heads/target1 $C
+       option no-deref
+       update HEAD $B
+       EOF
+       test_must_fail git update-ref --stdin <stdin 2>err &&
+       grep "fatal: multiple updates for '\''HEAD'\'' (including one via its referent .refs/heads/target1.) are not allowed" err &&
+       echo "refs/heads/target1" >expect &&
+       git symbolic-ref HEAD >actual &&
+       test_cmp expect actual &&
+       echo "$A" >expect &&
+       git rev-parse refs/heads/target1 >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'fails with duplicate ref update via symref' '
+       git branch target2 $A &&
+       git symbolic-ref refs/heads/symref2 refs/heads/target2 &&
+       cat >stdin <<-EOF &&
+       update refs/heads/target2 $C
+       update refs/heads/symref2 $B
+       EOF
+       test_must_fail git update-ref --stdin <stdin 2>err &&
+       grep "fatal: multiple updates for '\''refs/heads/target2'\'' (including one via symref .refs/heads/symref2.) are not allowed" err &&
+       echo "refs/heads/target2" >expect &&
+       git symbolic-ref refs/heads/symref2 >actual &&
+       test_cmp expect actual &&
+       echo "$A" >expect &&
+       git rev-parse refs/heads/target2 >actual &&
+       test_cmp expect actual
+'
+
 run_with_limited_open_files () {
        (ulimit -n 32 && "$@")
 }
@@ -1130,4 +1231,23 @@ test_expect_success ULIMIT_FILE_DESCRIPTORS 'large transaction deleting branches
 )
 '
 
+test_expect_success 'handle per-worktree refs in refs/bisect' '
+       git commit --allow-empty -m "initial commit" &&
+       git worktree add -b branch worktree &&
+       (
+               cd worktree &&
+               git commit --allow-empty -m "test commit"  &&
+               git for-each-ref >for-each-ref.out &&
+               ! grep refs/bisect for-each-ref.out &&
+               git update-ref refs/bisect/something HEAD &&
+               git rev-parse refs/bisect/something >../worktree-head &&
+               git for-each-ref | grep refs/bisect/something
+       ) &&
+       test_path_is_missing .git/refs/bisect &&
+       test_must_fail git rev-parse refs/bisect/something &&
+       git update-ref refs/bisect/something HEAD &&
+       git rev-parse refs/bisect/something >main-head &&
+       ! test_cmp main-head worktree-head
+'
+
 test_done