diff options
author | Eric Wong <normalperson@yhbt.net> | 2006-03-20 20:51:16 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-03-20 23:31:19 -0800 |
commit | ac7490506418e3ec495775e432b7040a17449fa9 (patch) | |
tree | 71bcd71d624f70c5e8d3cc6db5b52c9bb1ac9818 | |
parent | a3c57c9adb2844cebf2048b5ece356f3a091d4f9 (diff) | |
download | git-ac7490506418e3ec495775e432b7040a17449fa9.tar.gz git-ac7490506418e3ec495775e432b7040a17449fa9.tar.xz |
contrib/git-svn: allow rebuild to work on non-linear remote heads
Because committing back to an SVN repository from different
machines can result in different lineages, two different
repositories running git-svn can result in different commit
SHA1s (but of the same tree). Sometimes trees that are tracked
independently are merged together (usually via children),
resulting in non-unique git-svn-id: lines in rev-list.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-x | contrib/git-svn/git-svn.perl | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl index cf233ef6e..f3fc3ec1a 100755 --- a/contrib/git-svn/git-svn.perl +++ b/contrib/git-svn/git-svn.perl @@ -850,11 +850,23 @@ sub assert_revision_unknown { } } +sub trees_eq { + my ($x, $y) = @_; + my @x = safe_qx('git-cat-file','commit',$x); + my @y = safe_qx('git-cat-file','commit',$y); + if (($y[0] ne $x[0]) || $x[0] !~ /^tree $sha1\n$/ + || $y[0] !~ /^tree $sha1\n$/) { + print STDERR "Trees not equal: $y[0] != $x[0]\n"; + return 0 + } + return 1; +} + sub assert_revision_eq_or_unknown { my ($revno, $commit) = @_; if (-f "$REV_DIR/$revno") { my $current = file_to_s("$REV_DIR/$revno"); - if ($commit ne $current) { + if (($commit ne $current) && !trees_eq($commit, $current)) { croak "$REV_DIR/$revno already exists!\n", "current: $current\nexpected: $commit\n"; } |