our $suite_re = '[-+.0-9a-z]+';
our $cleanmode_re = 'dpkg-source(?:-d)?|git|git-ff|check|none';
+our $git_authline_re = '^([^<>]+) \<(\S+)\> (\d+ [-+]\d+)$';
+
our (@git) = qw(git);
our (@dget) = qw(dget);
our (@curl) = qw(curl -f);
our (@dpkgsource) = qw(dpkg-source -i\.git/ -I.git);
our (@dpkggenchanges) = qw(dpkg-genchanges);
our (@mergechanges) = qw(mergechanges -f);
+our (@gbppq) = qw(gbp-pq);
our (@changesopts) = ('');
our %opts_opt_map = ('dget' => \@dget, # accept for compatibility
our $supplementary_message = '';
our $need_split_build_invocation = 0;
+our $split_brain = 0;
END {
local ($@, $?);
$author =~ s#,.*##ms;
my $date = cmdoutput qw(date), '+%s %z', qw(-d), getfield($clogp,'Date');
my $authline = "$author $date";
- $authline =~ m/^[^<>]+ \<\S+\> \d+ [-+]\d+$/ or
+ $authline =~ m/$git_authline_re/o or
fail "unexpected commit author line format \`$authline'".
" (was generated from changelog Maintainer field)";
+ return ($1,$2,$3) if wantarray;
return $authline;
}
sub quiltify_trees_differ ($$;$) {
my ($x,$y,$finegrained) = @_;
# returns true iff the two tree objects differ other than in debian/
- # returns bitmas 01 - differ in upstream files except .gitignore
- # 02 - differ in .gitignore
+ # with $finegrained,
+ # returns bitmask 01 - differ in upstream files except .gitignore
+ # 02 - differ in .gitignore
local $/=undef;
my @cmd = (@git, qw(diff-tree --name-only -z));
push @cmd, qw(-r) if $finegrained;
qw(-- debian/rules debian/control);
$r =~ s/\n/,/g;
return $r;
+ }
+
+sub quiltify_splitbrain_needed () {
+ if (!$split_brain) {
+ progress "creating dgit view";
+ runcmd @git, qw(checkout -q -b dgit-view);
+ $split_brain = 1;
+ }
}
-sub quiltify_splitbrain () {
- # memoisation via git-reflog
- my $may_apply = $quilt_mode =~ m/gbp|unapplied/;
- die "xxx not yet implemented";
-# if ($may_apply &&
-# quiltify_trees_differ($userhead,)) {}
+sub quiltify_splitbrain ($$) {
+ my ($clogp, $diffbits) = @_;
+ if ($quilt_mode !~ m/gbp|dpm/) {
+ # treat .gitignore just like any other upstream file
+ $diffbits = { %$diffbits };
+ $_ = !!$_ foreach values %$diffbits;
+ }
+ if ($quilt_mode =~ m/gbp|unapplied/ &&
+ ($diffbits->{O2A} & 01) && # some patches
+ !($diffbits->{H2O} & 01)) { # but HEAD is like orig
+ quiltify_splitbrain_needed();
+ runcmd @gbppq, qw(import);
+ die "SPLIT BRAIN";
+ }
+ die 'xxx gitignore';
+ die 'xxx memoisation via git-reflog';
+ die 'xxx fast forward';
}
sub quiltify ($$$$) {
# We calculate some guesswork now about what kind of tree this might
# be. This is mostly for error reporting.
- my $user2unapplied = quiltify_trees_differ($headref, $unapplied, 1);
- my $user2applied = quiltify_trees_differ($headref, $oldtiptree,1);
- my $applied2unapplied = quiltify_trees_differ($oldtiptree,$unapplied, 1);
+ my $diffbits = {
+ # H = user's HEAD
+ # O = orig, without patches applied
+ # A = "applied", ie orig with H's debian/patches applied
+ H2O => quiltify_trees_differ($headref, $unapplied, 1),
+ H2A => quiltify_trees_differ($headref, $oldtiptree,1),
+ O2A => quiltify_trees_differ($unapplied,$oldtiptree,1),
+ };
my @dl;
foreach my $b (qw(01 02)) {
- foreach my $v ($user2unapplied, $applied2unapplied, $user2applied) {
- push @dl, ($v & $b) ? '##' : '==';
+ foreach my $v (qw(H2O O2A H2A)) {
+ push @dl, ($diffbits->{$v} & $b) ? '##' : '==';
}
}
printdebug "differences \@dl @dl.\n";
$dl[2], $dl[5];
my @failsuggestion;
- if (!($user2unapplied & $applied2unapplied)) {
+ if (!($diffbits->{H2O} & $diffbits->{O2A})) {
push @failsuggestion, "This might be a patches-unapplied branch.";
- } elsif (!($user2applied & $applied2unapplied)) {
+ } elsif (!($diffbits->{H2A} & $diffbits->{O2A})) {
push @failsuggestion, "This might be a patches-applied branch.";
}
push @failsuggestion, "Maybe you need to specify one of".
" --quilt=gbp --quilt=dpm --quilt=unapplied ?";
- if ($quilt_mode =~ m/gbp|dpm|apply/) {
- quiltify_splitbrain();
+ if ($quilt_mode =~ m/gbp|dpm|unapplied/) {
+ quiltify_splitbrain($clogp, $diffbits);
return;
}