Merge "two fixes for fast-import's 'ls' command" from Jonathan

Andrew Sayers noticed that the svn-fe | git fast-import pipeline
mishandles a subversion history that copies the root directory to a
sub-directory (e.g. doing `svn cp . trunk` to standardise your
layout).  As David Barr explained, the bug arises when the following
command is sent to git fast-import:

  'ls' SP ':1' SP LF

Instead of reading back what is at the root of r1, it unconditionally
reports the path as missing.

After sleeping on it, here are two patches for 'maint'.  One plugs a
memory leak.  The other ensures that trying to pass an empty path to
the 'ls' command results in an error message that can help the
frontend author instead of the silently broken conversion Andrew
found.

Then we can carefully add 'ls ""' support in 1.7.11.

* commit 'refs/pull-request-tags/jn/maint-fast-import-empty-ls':
  fast-import: don't allow 'ls' of path with empty components
  fast-import: leakfix for 'ls' of dirty trees
This commit is contained in:
Junio C Hamano
2012-03-16 08:19:18 -07:00
2 changed files with 43 additions and 0 deletions

View File

@ -1641,6 +1641,8 @@ static int tree_content_get(
n = slash1 - p; n = slash1 - p;
else else
n = strlen(p); n = strlen(p);
if (!n)
die("Empty path component found in input");
if (!root->tree) if (!root->tree)
load_tree(root); load_tree(root);
@ -3028,6 +3030,8 @@ static void parse_ls(struct branch *b)
store_tree(&leaf); store_tree(&leaf);
print_ls(leaf.versions[1].mode, leaf.versions[1].sha1, p); print_ls(leaf.versions[1].mode, leaf.versions[1].sha1, p);
if (leaf.tree)
release_tree_content_recursive(leaf.tree);
if (!b || root != &b->branch_tree) if (!b || root != &b->branch_tree)
release_tree_entry(root); release_tree_entry(root);
} }

View File

@ -1306,6 +1306,45 @@ test_expect_success \
M 040000 $subdir file3/ M 040000 $subdir file3/
INPUT_END' INPUT_END'
test_expect_success \
'N: reject foo/ syntax in copy source' \
'test_must_fail git fast-import <<-INPUT_END
commit refs/heads/N5C
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
data <<COMMIT
copy with invalid syntax
COMMIT
from refs/heads/branch^0
C file2/ file3
INPUT_END'
test_expect_success \
'N: reject foo/ syntax in rename source' \
'test_must_fail git fast-import <<-INPUT_END
commit refs/heads/N5D
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
data <<COMMIT
rename with invalid syntax
COMMIT
from refs/heads/branch^0
R file2/ file3
INPUT_END'
test_expect_success \
'N: reject foo/ syntax in ls argument' \
'test_must_fail git fast-import <<-INPUT_END
commit refs/heads/N5E
committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
data <<COMMIT
copy with invalid syntax
COMMIT
from refs/heads/branch^0
ls "file2/"
INPUT_END'
test_expect_success \ test_expect_success \
'N: copy to root by id and modify' \ 'N: copy to root by id and modify' \
'echo "hello, world" >expect.foo && 'echo "hello, world" >expect.foo &&