Browse Source

remote-hg: unquote C-style paths when exporting

git-fast-import documentation says that paths can be C-style quoted.
Unfortunately, the current remote-hg helper doesn't unquote quoted
path and pass them as-is to Mercurial when the commit is created.

This results in the following situation:

 - clone a mercurial repository with git
 - add a file with space in a directory: `>dir/foo\ bar`
 - commit that new file, and push the change to mercurial
 - the mercurial repository now has a new directory named '"dir',
   which contains a file named 'foo bar"'

Use Python str.decode('string-escape') to unquote the string if it
starts and ends with ".  It has been tested with quotes, spaces, and
utf-8 encoded file-names.

Signed-off-by: Antoine Pelisse <apelisse@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Antoine Pelisse 11 years ago committed by Junio C Hamano
parent
commit
1136265377
  1. 6
      contrib/remote-helpers/git-remote-hg

6
contrib/remote-helpers/git-remote-hg

@ -678,6 +678,11 @@ def get_merge_files(repo, p1, p2, files):
f = { 'ctx' : repo[p1][e] } f = { 'ctx' : repo[p1][e] }
files[e] = f files[e] = f


def c_style_unescape(string):
if string[0] == string[-1] == '"':
return string.decode('string-escape')[1:-1]
return string

def parse_commit(parser): def parse_commit(parser):
global marks, blob_marks, parsed_refs global marks, blob_marks, parsed_refs
global mode global mode
@ -720,6 +725,7 @@ def parse_commit(parser):
f = { 'deleted' : True } f = { 'deleted' : True }
else: else:
die('Unknown file command: %s' % line) die('Unknown file command: %s' % line)
path = c_style_unescape(path).decode('utf-8')
files[path] = f files[path] = f


# only export the commits if we are on an internal proxy repo # only export the commits if we are on an internal proxy repo

Loading…
Cancel
Save