chiark / gitweb /
git-debrebase: get_tree: Support $precheck and $recurse
[dgit.git] / git-debrebase
index 894bad5d227b8e0adcbb47843ad58af2bd4ac800..5a9a9cbe10886ded4019ffbfe8669ed2de7a01cb 100755 (executable)
@@ -183,23 +183,30 @@ sub run_deferred_updates ($) {
     @deferred_update_messages = ();
 }
 
-sub get_tree ($) {
+sub get_tree ($;$$) {
     # tree object name => ([ $name, $info ], ...)
     # where $name is the sort key, ie has / at end for subtrees
     # $info is the LHS from git-ls-tree (<mode> <type> <hash>)
-    # will crash if $x does not exist, so don't do that;
+    # without $precheck, will crash if $x does not exist, so don't do that;
     # instead pass '' to get ().
-    my ($x) = @_;
+    my ($x, $precheck, $recurse) = @_;
 
     return () if !length $x;
 
+    if ($precheck) {
+       my ($type, $dummy) = git_cat_file $x, [qw(tree missing)];
+       return () if $type eq 'missing';
+    }
+
     our (@get_tree_memo, %get_tree_memo);
     my $memo = $get_tree_memo{$x};
     return @$memo if $memo;
 
     local $Debian::Dgit::debugcmd_when_debuglevel = 3;
     my @l;
-    my @cmd = (qw(git ls-tree -z --full-tree --), $x);
+    my @cmd = (qw(git ls-tree -z --full-tree));
+    push @cmd, qw(-r) if $recurse;
+    push @cmd, qw(--), $x;
     my $o = cmdoutput @cmd;
     $o =~ s/\0$//s;
     my $last = '';