Re: git-svn 1.5.3 does not understand grafts?

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: git-svn 1.5.3 does not understand grafts?

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:43:34

"Joakim Tjernlund" [off-list ref] writes:
hmm, I think git-cat-file is to blame.
git-cat-file commit da783cce390ce013b19f1d308ea6813269c6a6b5 does
not list list any parent...
The plumbing cat-file does not deal with grafts and this is
deliberate.  Otherwise you would not be able to find the true
set of parents when you'd want to.

So do not blame cat-file, but blame the Porcelain that uses
cat-file to read a commit object, without annotating what it
read with what is in grafts, in this case your command line
experiment ;-).

The log family of commands and rev-list plumbing while
traversing commit ancestry chain do take grafts into account.

One caveat is pretty=raw output format shows true parents
without grafts on "parent " header line, while the "commit "
fake header prepended in the output for each commit shows the
parents that takes into account.

To illustrate, if you forge the history and say the parent of
1ddea77 is 5da1606 (when the true parent is 820eca68) with
grafts mechanism, here is what happens:

    $ echo '1ddea77e449ef28d8a7c74521af21121ab01abc0 5da1606d0bf5b970fadfa0ca91618a1e871f6755' >.git/info/grafts
    $ git show -s --pretty=raw --parents 1ddea77
    commit 1ddea77e449ef28d8a7c74521af21121ab01abc0 5da1606d0bf5b970fadfa0ca91618a1e871f6755
    tree e9e61bc801438062978ff47b0963c536ed1e51a9
    parent 820eca68c2577d7499d203d7f4f7ae479b577683
    author Nick Hengeveld [off-list ref] 1127757131 -0700
    committer Junio C Hamano [off-list ref] 1127805558 -0700

        [PATCH] Return CURL error message when object transfer fails

        Return CURL error message when object transfer fails
        ...
    $ git-cat-file commit 1ddea77
    tree e9e61bc801438062978ff47b0963c536ed1e51a9
    parent 820eca68c2577d7499d203d7f4f7ae479b577683
    author Nick Hengeveld [off-list ref] 1127757131 -0700
    committer Junio C Hamano [off-list ref] 1127805558 -0700

    [PATCH] Return CURL error message when object transfer fails

    Return CURL error message when object transfer fails
    ...

[PATCH] git-svn: understand grafts when doing dcommit

From: Eric Wong <hidden>
Date: 2016-06-15 22:43:34

Use the rev-list --parents functionality to read the parents
of the commit.  cat-file only shows the raw object with the
original parents and doesn't take into account grafts; so
we'll rely on rev-list machinery for the smarts here.

Signed-off-by: Eric Wong <redacted>
---
  Junio C Hamano [off-list ref] wrote:
  > "Joakim Tjernlund" [off-list ref] writes:
  > 
  > > hmm, I think git-cat-file is to blame.
  > > git-cat-file commit da783cce390ce013b19f1d308ea6813269c6a6b5 does
  > > not list list any parent...
  > 
  > The plumbing cat-file does not deal with grafts and this is
  > deliberate.  Otherwise you would not be able to find the true
  > set of parents when you'd want to.
  > 
  > So do not blame cat-file, but blame the Porcelain that uses
  > cat-file to read a commit object, without annotating what it
  > read with what is in grafts, in this case your command line
  > experiment ;-).
  > 
  > The log family of commands and rev-list plumbing while
  > traversing commit ancestry chain do take grafts into account.
  > 
  > One caveat is pretty=raw output format shows true parents
  > without grafts on "parent " header line, while the "commit "
  > fake header prepended in the output for each commit shows the
  > parents that takes into account.
  > 
  > To illustrate, if you forge the history and say the parent of
  > 1ddea77 is 5da1606 (when the true parent is 820eca68) with
  > grafts mechanism, here is what happens:
  > 
  >     $ echo '1ddea77e449ef28d8a7c74521af21121ab01abc0 5da1606d0bf5b970fadfa0ca91618a1e871f6755' >.git/info/grafts
  >     $ git show -s --pretty=raw --parents 1ddea77
  >     commit 1ddea77e449ef28d8a7c74521af21121ab01abc0 5da1606d0bf5b970fadfa0ca91618a1e871f6755
  >     tree e9e61bc801438062978ff47b0963c536ed1e51a9
  >     parent 820eca68c2577d7499d203d7f4f7ae479b577683
  >     author Nick Hengeveld [off-list ref] 1127757131 -0700
  >     committer Junio C Hamano [off-list ref] 1127805558 -0700
  > 
  >         [PATCH] Return CURL error message when object transfer fails
  > 
  >         Return CURL error message when object transfer fails
  >         ...

  Interesting.  I didn't know about the --parents option before.

 git-svn.perl |   11 +++--------
 1 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/git-svn.perl b/git-svn.perl
index fbd4691..f818160 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -841,14 +841,9 @@ sub working_head_info {
 
 sub read_commit_parents {
 	my ($parents, $c) = @_;
-	my ($fh, $ctx) = command_output_pipe(qw/cat-file commit/, $c);
-	while (<$fh>) {
-		chomp;
-		last if '';
-		/^parent ($sha1)/ or next;
-		push @{$parents->{$c}}, $1;
-	}
-	close $fh; # break the pipe
+	chomp(my $p = command_oneline(qw/rev-list --parents -1/, $c));
+	$p =~ s/^($c)\s*// or die "rev-list --parents -1 $c failed!\n";
+	@{$parents->{$c}} = split(/ /, $p);
 }
 
 sub linearize_history {
-- 
Eric Wong
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help