2024
test_cmp expect err.trimmed
2025
'
2026
2027
+test_expect_success '--update-refs checks resolved non-branch symref target' '
2028
+ test_when_finished "
2029
+ git worktree remove --force checked-out-target-wt &&
2030
+ git symbolic-ref -d refs/heads/non-branch-alias &&
2031
+ git tag -d checked-out-target
2032
+ " &&
2033
+ git tag checked-out-target HEAD~1 &&
2034
+ git symbolic-ref refs/heads/non-branch-alias refs/tags/checked-out-target &&
2035
+ git worktree add --detach checked-out-target-wt checked-out-target &&
2036
+ git -C checked-out-target-wt symbolic-ref HEAD refs/tags/checked-out-target &&
2037
+
2038
+ GIT_SEQUENCE_EDITOR="cat >todo" git rebase -i --update-refs HEAD~2 &&
2039
+
2040
+ test_grep "^# Ref refs/heads/non-branch-alias checked out at" todo &&
2041
+ test_write_lines refs/tags/checked-out-target >expect &&
2042
+ git symbolic-ref refs/heads/non-branch-alias >actual &&
2043
+ test_cmp expect actual
2044
+'
2045
+
2046
+test_expect_success '--update-refs deduplicates non-branch symref targets' '
2047
+ test_when_finished "
2048
+ git symbolic-ref -d refs/heads/non-branch-alias-one &&
2049
+ git symbolic-ref -d refs/heads/non-branch-alias-two &&
2050
+ git tag -d shared-non-branch-target
2051
+ " &&
2052
+ git tag shared-non-branch-target HEAD~1 &&
2053
+ git symbolic-ref refs/heads/non-branch-alias-one \
2054
+ refs/tags/shared-non-branch-target &&
2055
+ git symbolic-ref refs/heads/non-branch-alias-two \
2056
+ refs/tags/shared-non-branch-target &&
2057
+
2058
+ GIT_SEQUENCE_EDITOR=: git rebase -i --force-rebase --update-refs HEAD~2 &&
2059
+
2060
+ test_cmp_rev HEAD~1 refs/heads/non-branch-alias-one &&
2061
+ test_cmp_rev HEAD~1 refs/heads/non-branch-alias-two &&
2062
+ test_write_lines refs/tags/shared-non-branch-target >expect &&
2063
+ git symbolic-ref refs/heads/non-branch-alias-one >actual &&
2064
+ test_cmp expect actual &&
2065
+ git symbolic-ref refs/heads/non-branch-alias-two >actual &&
2066
+ test_cmp expect actual
2067
+'
2068
+
2069
+test_expect_success '--update-refs honors non-branch symref reservations' '
2070
+ test_when_finished "
2071
+ test_might_fail git worktree remove --force reserved-target-wt &&
2072
+ test_might_fail git symbolic-ref -d \
2073
+ refs/heads/reserved-non-branch-alias-one &&
2074
+ test_might_fail git symbolic-ref -d \
2075
+ refs/heads/reserved-non-branch-alias-two &&
2076
+ test_might_fail git tag -d reserved-non-branch-target
2077
+ " &&
2078
+ git tag reserved-non-branch-target HEAD~1 &&
2079
+ git symbolic-ref refs/heads/reserved-non-branch-alias-one \
2080
+ refs/tags/reserved-non-branch-target &&
2081
+ git symbolic-ref refs/heads/reserved-non-branch-alias-two \
2082
+ refs/tags/reserved-non-branch-target &&
2083
+ git worktree add --detach reserved-target-wt HEAD &&
2084
+ wt_gitdir=$(git -C reserved-target-wt rev-parse --absolute-git-dir) &&
2085
+ mkdir -p "$wt_gitdir/rebase-merge" &&
2086
+ old_oid=$(git rev-parse refs/heads/reserved-non-branch-alias-one) &&
2087
+ test_write_lines refs/heads/reserved-non-branch-alias-one \
2088
+ "$old_oid" "$old_oid" >"$wt_gitdir/rebase-merge/update-refs" &&
2089
+
2090
+ GIT_SEQUENCE_EDITOR="cat >todo" git rebase -i --update-refs HEAD~2 &&
2091
+
2092
+ test_grep "^# Ref refs/heads/reserved-non-branch-alias-one checked out at" \
2093
+ todo &&
2094
+ test_grep "^# Ref refs/heads/reserved-non-branch-alias-two checked out at" \
2095
+ todo &&
2096
+ test_grep ! "^update-ref refs/heads/reserved-non-branch-alias" todo
2097
+'
2098
+
2099
test_expect_success 'respect user edits to update-ref steps' '
2100
git checkout -B update-refs-break no-conflict-branch &&
2101
git branch -f base HEAD~4 &&