summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jackson <ijackson@chiark.greenend.org.uk>2018-08-19 19:15:56 +0100
committerIan Jackson <ijackson@chiark.greenend.org.uk>2018-08-19 19:16:46 +0100
commit813a7ced61b4c18222f43b31c10ad7b4c8e16bf1 (patch)
treeaf22a13ab6d720c67dca8e5447b1d59d3ecc5981
parent1ec04ea662cbc346ed085684ba22b7cc06660f08 (diff)
git-debrebase: get_tree: Support $precheck and $recurse
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
-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 = '';