X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit;h=c64f0fe4106e577363bade0a98942a86d9cbb21f;hp=4283a27574020c2e32fe7fd0fb6a04a363af8435;hb=dfec10c836bfb4cf5bc80e0e90d6d7306442be1b;hpb=1ad50a40447cf930bde69ee6b0a21b6d35c15104 diff --git a/dgit b/dgit index 4283a275..c64f0fe4 100755 --- a/dgit +++ b/dgit @@ -2510,14 +2510,15 @@ END } } -sub quiltify_trees_differ ($$) { - my ($x,$y) = @_; +sub quiltify_trees_differ ($$;$) { + my ($x,$y,$ignoregitignore) = @_; # returns 1 iff the two tree objects differ other than in debian/ local $/=undef; my @cmd = (@git, qw(diff-tree --name-only -z), $x, $y); my $diffs= cmdoutput @cmd; foreach my $f (split /\0/, $diffs) { next if $f eq 'debian'; + next if $f eq '.gitignore' && $ignoregitignore; return 1; } return 0; @@ -2532,8 +2533,15 @@ sub quiltify_tree_sentinelfiles ($) { return $r; } -sub quiltify ($$) { - my ($clogp,$target) = @_; +sub quilt_could_gbp ($$$) { + my ($userhead,$unapplied,$applied) = @_; + return + !quiltify_trees_differ($userhead,$unapplied,1) && + quiltify_trees_differ($userhead,$applied,1); +} + +sub quiltify ($$$$) { + my ($clogp,$target,$unapplied,$oldtiptree) = @_; # Quilt patchification algorithm # @@ -2559,12 +2567,6 @@ sub quiltify ($$) { # After traversing PT, we git commit the changes which # should be contained within debian/patches. - changedir '../fake'; - rmtree '.pc'; - runcmd @git, qw(add -Af .); - my $oldtiptree=git_write_tree(); - changedir '../work'; - # The search for the path S..T is breadth-first. We maintain a # todo list containing search nodes. A search node identifies a # commit, and looks something like this: @@ -2677,6 +2679,12 @@ sub quiltify ($$) { foreach my $notp (@nots) { print STDERR "$us: ", $reportnot->($notp), "\n"; } + if (quilt_could_gbp($target,$unapplied,$oldtiptree)) { + print STDERR <' or die $!; @@ -2907,8 +2940,10 @@ END quilt_fixup_linkorigs($upstreamversion, $dscaddfile); - my @files=qw(debian/source/format debian/rules); - foreach my $maybe (qw(debian/patches debian/source/options)) { + my @files=qw(debian/source/format debian/rules + debian/control debian/changelog); + foreach my $maybe (qw(debian/patches debian/source/options + debian/tests/control)) { next unless stat_exists "../../../$maybe"; push @files, $maybe; } @@ -2919,7 +2954,8 @@ END $dscaddfile->($debtar); close $fakedsc or die $!; - runcmd qw(sh -ec), 'exec dpkg-source --no-check -x fake.dsc >/dev/null'; + runcmd qw(sh -ec), + 'exec dpkg-source --no-check --skip-patches -x fake.dsc >/dev/null'; my $fakexdir= $package.'-'.(stripepoch $upstreamversion); rename $fakexdir, "fake" or die "$fakexdir $!"; @@ -2929,6 +2965,17 @@ END remove_stray_gits(); mktree_in_ud_here(); + rmtree '.pc'; + + runcmd @git, qw(add -Af .); + my $unapplied=git_write_tree(); + printdebug "fake orig tree object $unapplied\n"; + + ensuredir '.pc'; + + runcmd qw(sh -ec), + 'exec dpkg-source --before-build . >/dev/null'; + changedir '..'; quilt_fixup_mkwork($headref); @@ -2942,7 +2989,13 @@ END rename '../fake/.pc','.pc' or die $!; } - quiltify($clogp,$headref); + changedir '../fake'; + rmtree '.pc'; + runcmd @git, qw(add -Af .); + my $oldtiptree=git_write_tree(); + changedir '../work'; + + quiltify($clogp,$headref,$unapplied,$oldtiptree); if (!open P, '>>', ".pc/applied-patches") { $!==&ENOENT or die $!;