our (@dget) = qw(dget);
our (@dput) = qw(dput);
our (@debsign) = qw(debsign);
+our (@cleancmd) = qw(debian/rules clean);
our $keyid;
our $debug = 0;
die "@_ $! $?" if system @_;
}
+sub printdone {
+ if (!$dryrun) {
+ print "dgit ok: @_\n";
+ } else {
+ print "would be ok: @_ (but dry run only)\n";
+ }
+}
+
sub cmdoutput_errok {
die Dumper(\@_)." ?" if grep { !defined } @_;
printcmd(\*DEBUG,"|",@_) if $debug>0;
'dgit-distro.debian.git-path' => '/git/dgit-repos',
'dgit-distro.debian.git-check' => 'ssh-cmd',
'dgit-distro.debian.git-create' => 'ssh-cmd',
- 'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/');
+ 'dgit-distro.debian.mirror' => 'http://http.debian.net/debian/');
sub cfg {
foreach my $c (@_) {
Perhaps the upload is stuck in incoming. Using the version from git.
END
$outputhash = $upload_hash;
- } else {
- die "version in archive is same as version in git".
- " to-be-uploaded (upload/) branch but archive".
- " version hash no commit hash?!\n";
+ } elsif ($outputhash ne $upload_hash) {
+ die "version in archive ($clogp->{Version})".
+ " is same as version in git".
+ " to-be-uploaded (upload/) branch ($oldclogp->{Version})".
+ " but archive version hash no commit hash?!\n";
}
}
chdir '../../../..' or die $!;
} else {
die "$lrref_fn $!";
}
- print DEBUG "last upload hash $upload_hash\n";
+ print DEBUG "previous reference hash $upload_hash\n";
my $hash;
if (defined $dsc_hash) {
die "missing git history even though dsc has hash"
}
fetch_from_archive() or die;
runcmd @git, qw(reset --hard), lrref();
- print "dgit ok: ready for work in $dstdir\n";
+ printdone "ready for work in $dstdir";
}
sub fetch () {
git_fetch_us();
}
fetch_from_archive() or die;
- print "dgit ok: fetched into ".lrref()."\n";
+ printdone "fetched into ".lrref();
}
sub pull () {
fetch();
runcmd_ordryrun @git, qw(merge -m),"Merge from $suite [dgit]",
lrref();
- print "dgit ok: fetched to ".lrref()." and merged into HEAD\n";
+ printdone "fetched to ".lrref()." and merged into HEAD";
+}
+
+sub check_not_dirty () {
+ my $output = cmdoutput @git, qw(status --porcelain);
+ if (length $output) {
+ my $m = "tree dirty:\n$output\n";
+ if (!$dryrun) {
+ die $m;
+ } else {
+ warn $m;
+ }
+ }
+}
+
+sub commit_quilty_patch () {
+ my $output = cmdoutput @git, qw(status --porcelain);
+ my $vsn = $dsc->{Version};
+ my %fixups = map {$_=>1}
+ (".pc/debian-changes-$vsn/","debian/patches/debian-changes-2.8-5");
+ my @files;
+ foreach my $l (split /\n/, $output) {
+ next unless $l =~ s/^\?\? //;
+ next unless $fixups{$l};
+ push @files, $l;
+ }
+ print DEBUG "checking for quilty\n", Dumper(\@files);
+ if (@files == 2) {
+ runcmd_ordryrun @git, qw(add), @files;
+ runcmd_ordryrun
+ @git, qw(commit -m), "Commit Debian 3.0 (quilt) metadata";
+ }
}
sub dopush () {
- runcmd @git, qw(diff --quiet HEAD);
+ print DEBUG "actually entering push\n";
+ runcmd @cleancmd;
my $clogp = parsechangelog();
$package = $clogp->{Source};
my $dscfn = "${package}_$clogp->{Version}.dsc";
stat "../$dscfn" or die "$dscfn $!";
$dsc = parsecontrol("../$dscfn");
+ print DEBUG "format $dsc->{Format}\n";
+ if ($dsc->{Format} eq '3.0 (quilt)') {
+ commit_quilty_patch();
+ }
+ check_not_dirty();
prep_ud();
chdir $ud or die $!;
print "checking that $dscfn corresponds to HEAD\n";
my $host = access_cfg('upload-host');
my @hostarg = defined($host) ? ($host,) : ();
runcmd_ordryrun @dput, @hostarg, $changesfile;
- print "dgit ok: pushed and uploaded $dsc->{Version}\n";
+ printdone "pushed and uploaded $dsc->{Version}";
}
sub cmd_clone {
sub cmd_push {
parseopts();
die if defined $package;
+ runcmd @git, qw(diff --quiet HEAD);
my $clogp = parsechangelog();
$package = $clogp->{Source};
if (@ARGV==0) {
my $clogp = parsechangelog();
$suite = $clogp->{Distribution};
$package = $clogp->{Source};
+ canonicalise_suite() unless grep { m/^--git-debian-branch/ } @ARGV;
runcmd_ordryrun
qw(git-buildpackage -us -uc --git-no-sign-tags),
'--git-builder=dpkg-buildpackage -i\.git/ -I.git',
push @$om, $2;
} elsif (m/^--existing-package=(.*)/s) {
$existing_package = $1;
+ } elsif (m/^--clean-command=(.*)/s) {
+ @cleancmd = split /\s+/, $1;
} else {
die "$_ ?";
}
}
parseopts();
+print STDERR "DRY RUN ONLY\n" if $dryrun;
die unless @ARGV;
my $cmd = shift @ARGV;