summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-debrebase15
1 files changed, 11 insertions, 4 deletions
diff --git a/git-debrebase b/git-debrebase
index 894bad5..5a9a9cb 100755
--- a/git-debrebase
+++ b/git-debrebase
@@ -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 = '';