Re: [PATCH] git-filter-branch could be confused by similar names
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:02
Dmitry Potapov [off-list ref] writes:
quoted hunk
'git-filter-branch branch' could fail producing the error: "Which ref do you want to rewrite?" if existed another branch or tag, which name was 'branch-something' or 'something/branch'. Signed-off-by: Dmitry Potapov <redacted> --- I have corrected my previous patch to allow "heads" or "tags" in the name of a branch or tag, i.e. to write it like this: git filter-branch heads/master git-filter-branch.sh | 2 +- t/t7003-filter-branch.sh | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletions(-)diff --git a/git-filter-branch.sh b/git-filter-branch.sh index dbab1a9..5de8b12 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh@@ -219,7 +219,7 @@ do ;; *) ref="$(git for-each-ref --format='%(refname)' | - grep /"$ref")" + grep '^refs/\([^/]\+/\)\?'"$ref"'$')" esac
Do we assume everybody's grep groks ERE these days? I had an
impression that we try to stick to a subset of BRE (namely, no
\{m,n\}, [::], [==], nor [..]).
Also as a general rule when dealing with refname, we use
fileglob not regex.
What's the goal here? Is it to make sure given refname is
unambiguous by being a unique suffix of tags or heads, as in
test $(git show-ref "$ref" | wc -l) = 1
or is there anything more going on?
Ah, it also wants the full name of the ref. How about...
ref=$(git show-ref "$ref" | sed -e 's/^.* //')
and have the "git check-ref-format" that comes later to issue an
error message?
A better error message would be obtained with perhaps doing
LF='
'
at the beginning and then doing:
candidate=$(git show-ref "$ref" | sed -e 's/^.* //')
case "$candidate" in
'')
die "should not happen -- $ref did not match?"
;;
?*"$LF"?*)
die "$ref is ambiguous, which one of: $canidate?"
;;
esac
ref=$candidate