mirror of
https://github.com/git/git.git
synced 2024-10-30 22:07:53 +01:00
completion: support completing fully qualified non-fast-forward refspecs
After 'git fetch <remote> <TAB>' our completion script offers refspecs that will fetch to a local branch with the same name as in the remote repository, e.g. 'master:master'. This also completes non-fast-forward refspecs, i.e. after a '+' prefix like '+master:master', and fully qualified refspecs, e.g. 'refs/heads/master:refs/heads/master'. However, it does not complete non-fast-forward fully qualified refspecs (or fully qualified refspecs following any other prefix, e.g. '--option=', though currently no git command supports such an option, but third party git commands might). These refspecs are listed by the __git_refs2() function, which is just a thin wrapper iterating over __git_refs()'s output, turning each listed ref into a refspec. Now, it's certainly possible to modify __git_refs2() and its callsite to pass an extra parameter containing only the ref part of the current word to be completed (to follow suit of the previous commit) to deal with prefixed fully qualified refspecs as well. Unfortunately, keeping the current behavior unchanged in the "no extra parameter" case brings in a bit of subtlety, which makes the resulting code ugly and compelled me to write a 8-line long comment in the proof of concept. Not good. However, since the callsite has to be modified for proper functioning anyway, we might as well leave __git_refs2() as is and introduce a new helper function without backwards compatibility concerns. Add the new function __git_complete_fetch_refspecs() that has all the necessary parameters to do the right thing in all cases mentioned above, including non-fast-forward fully qualified refspecs. This new function can also easier benefit from optimizations coming later in this patch series. Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
2ea328a119
commit
aa0644f74f
2 changed files with 88 additions and 1 deletions
|
@ -486,6 +486,7 @@ __git_complete_refs ()
|
|||
}
|
||||
|
||||
# __git_refs2 requires 1 argument (to pass to __git_refs)
|
||||
# Deprecated: use __git_complete_fetch_refspecs() instead.
|
||||
__git_refs2 ()
|
||||
{
|
||||
local i
|
||||
|
@ -494,6 +495,24 @@ __git_refs2 ()
|
|||
done
|
||||
}
|
||||
|
||||
# Completes refspecs for fetching from a remote repository.
|
||||
# 1: The remote repository.
|
||||
# 2: A prefix to be added to each listed refspec (optional).
|
||||
# 3: The ref to be completed as a refspec instead of the current word to be
|
||||
# completed (optional)
|
||||
# 4: A suffix to be appended to each listed refspec instead of the default
|
||||
# space (optional).
|
||||
__git_complete_fetch_refspecs ()
|
||||
{
|
||||
local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
|
||||
|
||||
__gitcomp_nl "$(
|
||||
for i in $(__git_refs "$remote" "" "" "$cur_") ; do
|
||||
echo "$i:$i"
|
||||
done
|
||||
)" "$pfx" "$cur_" "$sfx"
|
||||
}
|
||||
|
||||
# __git_refs_remotes requires 1 argument (to pass to ls-remote)
|
||||
__git_refs_remotes ()
|
||||
{
|
||||
|
@ -686,7 +705,7 @@ __git_complete_remote_or_refspec ()
|
|||
case "$cmd" in
|
||||
fetch)
|
||||
if [ $lhs = 1 ]; then
|
||||
__gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
|
||||
__git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
|
||||
else
|
||||
__git_complete_refs --pfx="$pfx" --cur="$cur_"
|
||||
fi
|
||||
|
|
|
@ -912,6 +912,74 @@ test_expect_success '__git_complete_refs - suffix' '
|
|||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success '__git_complete_fetch_refspecs - simple' '
|
||||
sed -e "s/Z$//" >expected <<-EOF &&
|
||||
HEAD:HEAD Z
|
||||
branch-in-other:branch-in-other Z
|
||||
master-in-other:master-in-other Z
|
||||
EOF
|
||||
(
|
||||
cur= &&
|
||||
__git_complete_fetch_refspecs other &&
|
||||
print_comp
|
||||
) &&
|
||||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success '__git_complete_fetch_refspecs - matching' '
|
||||
sed -e "s/Z$//" >expected <<-EOF &&
|
||||
branch-in-other:branch-in-other Z
|
||||
EOF
|
||||
(
|
||||
cur=br &&
|
||||
__git_complete_fetch_refspecs other "" br &&
|
||||
print_comp
|
||||
) &&
|
||||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success '__git_complete_fetch_refspecs - prefix' '
|
||||
sed -e "s/Z$//" >expected <<-EOF &&
|
||||
+HEAD:HEAD Z
|
||||
+branch-in-other:branch-in-other Z
|
||||
+master-in-other:master-in-other Z
|
||||
EOF
|
||||
(
|
||||
cur="+" &&
|
||||
__git_complete_fetch_refspecs other "+" "" &&
|
||||
print_comp
|
||||
) &&
|
||||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success '__git_complete_fetch_refspecs - fully qualified' '
|
||||
sed -e "s/Z$//" >expected <<-EOF &&
|
||||
refs/heads/branch-in-other:refs/heads/branch-in-other Z
|
||||
refs/heads/master-in-other:refs/heads/master-in-other Z
|
||||
refs/tags/tag-in-other:refs/tags/tag-in-other Z
|
||||
EOF
|
||||
(
|
||||
cur=refs/ &&
|
||||
__git_complete_fetch_refspecs other "" refs/ &&
|
||||
print_comp
|
||||
) &&
|
||||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success '__git_complete_fetch_refspecs - fully qualified & prefix' '
|
||||
sed -e "s/Z$//" >expected <<-EOF &&
|
||||
+refs/heads/branch-in-other:refs/heads/branch-in-other Z
|
||||
+refs/heads/master-in-other:refs/heads/master-in-other Z
|
||||
+refs/tags/tag-in-other:refs/tags/tag-in-other Z
|
||||
EOF
|
||||
(
|
||||
cur=+refs/ &&
|
||||
__git_complete_fetch_refspecs other + refs/ &&
|
||||
print_comp
|
||||
) &&
|
||||
test_cmp expected out
|
||||
'
|
||||
|
||||
test_expect_success 'teardown after ref completion' '
|
||||
git branch -d matching-branch &&
|
||||
git tag -d matching-tag &&
|
||||
|
|
Loading…
Reference in a new issue