Re: [PATCH] translate bad characters in refnames during git-svn fetch
From: Eric Wong <hidden>
Date: 2016-06-15 22:43:21
martin f krafft [off-list ref] wrote:
Hi, I am trying to track/convert the Debian pkg-mdadm repository with git-svn: svn://svn.debian.org/svn/pkg-mdadm/mdadm/trunk My problem is that the fetching fails: fatal: refs/remotes/tags/2.6.1-1~exp.1: cannot lock the ref update-ref -m r311 refs/remotes/tags/2.6.1-1~exp.1 c6e351ea25dc90714048e33693099595c2d5dab8: command returned error: 128 This is because the ~ character is an invalid character for a refname (it's used to specify the nth parent). So I figured that the best way to deal with this is to introduce a conversion filter to git-svn, but I cannot figure out where it has to go. My perl is rusty and even after an hour now with the code, I could not find the right spot. The following patch works, but I can't really explain why. Moreover, it does not change the STDERR output, so you'll still get stuff like r340 = 0dc5693471af9dfdb712c1342071ba1040af8963 (tags/2.6.1-1~exp.3) which makes me think that it's translating the refname too late. However, the end result looks sane. Comments welcome,
The major issue with this is that it doesn't handle odd cases where a refname is sanitized into something (say "1234~2" sanitizes to "1234=2"), and then another branch is created named "1234=2". git-svn should at least keep track of what it got sanitized to, to avoid clobbering branches. I started working on this a while back but haven't gotten around to revisiting it: http://thread.gmane.org/gmane.comp.version-control.git/45651
quoted hunk ↗ jump to hunk
--- git-check-ref-format(1) documents which characters may be contained in a refname. Since Subversion has different rules, an import can result in problems, such as: fatal: refs/remotes/tags/2.6.1-1~exp.1: cannot lock the ref update-ref -m r311 refs/remotes/tags/2.6.1-1~exp.1 c6e351ea25dc90714048e33693099595c2d5dab8: command returned error: 128 This patch translates bad characters to valid substitutes to enable imports of tags/branches/whatever using characters that git does not allow in refnames. Signed-off-by: martin f. krafft <redacted> --- git-svn.perl | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-)diff --git a/git-svn.perl b/git-svn.perl index 299b40f..de43697 100755 --- a/git-svn.perl +++ b/git-svn.perl@@ -1239,7 +1239,29 @@ sub new { $self; } -sub refname { "refs/remotes/$_[0]->{ref_id}" } +sub refname { + my ($refname) = $_[0]->{ref_id}; + ## transform the refname as per rules in git-check-ref-format(1): + # no slash-separated omponent can begin with a dot . + # /.* becomes /,* + $refname =~ s|/\.|/,|g; + # It cannot have two consecutive dots .. anywhere + # .. becomes ,, + $refname =~ s|\.\.|,,|g; + # It cannot have ASCII control character space, tilde ~, caret ^, + # colon :, question-mark ?, asterisk *, or open bracket[ anywhere + # <space> becomes _ + # ~ becomes = + # ^ becomes @ + # : becomes % + # ? becomes $ + # * becomes + + # [ becomes ( + $refname =~ y| ~^:?*[|_=@%\$+(|; + # It cannot end with a slash / + $refname =~ s|/$||g; + "refs/remotes/$refname"; +} sub svm_uuid { my ($self) = @_;--
-- Eric Wong