mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Change the revision parsing logic to match @{upstream}, @{u} & @{push} case-insensitively. Before this change supplying anything except the lower-case forms emits an "unknown revision or path not in the working tree" error. This change makes upper-case & mixed-case versions equivalent to the lower-case versions. The use-case for this is being able to hold the shift key down while typing @{u} on certain keyboard layouts, which makes the sequence easier to type, and reduces cases where git throws an error at the user where it could do what he means instead. These suffixes now join various other suffixes & special syntax documented in gitrevisions(7) that matches case-insensitively. A table showing the status of the various forms documented there before & after this patch is shown below. The key for the table is: - CI = Case Insensitive - CIP = Case Insensitive Possible (without ambiguities) - AG = Accepts Garbage (.e.g. @{./.4.minutes./.}) Before this change: |----------------+-----+------+-----| | What? | CI? | CIP? | AG? | |----------------+-----+------+-----| | @{<date>} | Y | Y | Y | | @{upstream} | N | Y | N | | @{push} | N | Y | N | |----------------+-----+------+-----| After it: |----------------+-----+------+-----| | What? | CI? | CIP? | AG? | |----------------+-----+------+-----| | @{<date>} | Y | Y | Y | | @{upstream} | Y | Y | N | | @{push} | Y | Y | N | |----------------+-----+------+-----| The ^{<type>} suffix is not made case-insensitive, because other places that take <type> like "cat-file -t <type>" do want them case sensitively (after all we never declared that type names are case insensitive). Allowing case-insensitive typename only with this syntax will make the resulting Git as a whole inconsistent. This change was independently authored to scratch a longtime itch, but when I was about to submit it I discovered that a similar patch had been submitted unsuccessfully before by Conrad Irwin in August 2011 as "rev-parse: Allow @{U} as a synonym for @{u}" (<1313287071-7851-1-git-send-email-conrad.irwin@gmail.com>). The tests for this patch are more exhaustive than in the 2011 submission. The starting point for them was to first change the code to only support upper-case versions of the existing words, seeing what broke, and amending the breaking tests to check upper case & mixed case as appropriate, and where not redundant to other similar tests. The implementation itself is equivalent. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
74 lines
2 KiB
Bash
Executable file
74 lines
2 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='test <branch>@{push} syntax'
|
|
. ./test-lib.sh
|
|
|
|
resolve () {
|
|
echo "$2" >expect &&
|
|
git rev-parse --symbolic-full-name "$1" >actual &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
test_expect_success 'setup' '
|
|
git init --bare parent.git &&
|
|
git init --bare other.git &&
|
|
git remote add origin parent.git &&
|
|
git remote add other other.git &&
|
|
test_commit base &&
|
|
git push origin HEAD &&
|
|
git branch --set-upstream-to=origin/master master &&
|
|
git branch --track topic origin/master &&
|
|
git push origin topic &&
|
|
git push other topic
|
|
'
|
|
|
|
test_expect_success '@{push} with default=nothing' '
|
|
test_config push.default nothing &&
|
|
test_must_fail git rev-parse master@{push} &&
|
|
test_must_fail git rev-parse master@{PUSH} &&
|
|
test_must_fail git rev-parse master@{PuSH}
|
|
'
|
|
|
|
test_expect_success '@{push} with default=simple' '
|
|
test_config push.default simple &&
|
|
resolve master@{push} refs/remotes/origin/master &&
|
|
resolve master@{PUSH} refs/remotes/origin/master &&
|
|
resolve master@{pUSh} refs/remotes/origin/master
|
|
'
|
|
|
|
test_expect_success 'triangular @{push} fails with default=simple' '
|
|
test_config push.default simple &&
|
|
test_must_fail git rev-parse topic@{push}
|
|
'
|
|
|
|
test_expect_success '@{push} with default=current' '
|
|
test_config push.default current &&
|
|
resolve topic@{push} refs/remotes/origin/topic
|
|
'
|
|
|
|
test_expect_success '@{push} with default=matching' '
|
|
test_config push.default matching &&
|
|
resolve topic@{push} refs/remotes/origin/topic
|
|
'
|
|
|
|
test_expect_success '@{push} with pushremote defined' '
|
|
test_config push.default current &&
|
|
test_config branch.topic.pushremote other &&
|
|
resolve topic@{push} refs/remotes/other/topic
|
|
'
|
|
|
|
test_expect_success '@{push} with push refspecs' '
|
|
test_config push.default nothing &&
|
|
test_config remote.origin.push refs/heads/*:refs/heads/magic/* &&
|
|
git push &&
|
|
resolve topic@{push} refs/remotes/origin/magic/topic
|
|
'
|
|
|
|
test_expect_success 'resolving @{push} fails with a detached HEAD' '
|
|
git checkout HEAD^0 &&
|
|
test_when_finished "git checkout -" &&
|
|
test_must_fail git rev-parse @{push}
|
|
'
|
|
|
|
test_done
|