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, m
--- 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 <madduck@piper.oerlikon.madduck.net> --- git-svn.perl | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-)
Show changes to git-svn.perl +23 −1
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) = @_;
--
1.5.3.rc1.27.ga5e40
--
martin; (greetings from the heart of the sun.)
\____ echo mailto: !#^."<*>"|tr "<*> mailto:" net@madduck
spamtraps: madduck.bogus@madduck.net
"a warm bed in a house sounds a mite better
than eating a hot dog on a stick
with an old geezer traveling on a lawn mower."
-- alvin straight (the straight story)