our $dryrun = 0;
our $changesfile;
our $new_package = 0;
+our $ignoredirty = 0;
our $existing_package = 'dpkg';
our $cleanmode = 'dpkg-source';
return "debian/$v";
}
-sub dscfn ($) { return "${package}_$_[0].dsc"; }
+sub stripepoch ($) {
+ my ($vsn) = @_;
+ $vsn =~ s/^\d+\://;
+ return $vsn;
+}
+
+sub dscfn ($) {
+ my ($vsn) = @_;
+ return "${package}_".(stripepoch $vsn).".dsc";
+}
sub changesopts () { return @changesopts[1..$#changesopts]; }
'dgit.default.ssh' => 'ssh',
'dgit-distro.debian.git-host' => 'git.debian.org',
'dgit-distro.debian.git-proto' => 'git+ssh://',
- 'dgit-distro.debian.git-path' => '/git/dgit-repos',
+ 'dgit-distro.debian.git-path' => '/git/dgit-repos/repos',
'dgit-distro.debian.git-check' => 'ssh-cmd',
'dgit-distro.debian.git-create' => 'ssh-cmd',
'dgit-distro.debian.sshdakls-host' => 'coccia.debian.org',
}
$5 eq 'source' or die "$rmad ?";
my $prefix = substr($package, 0, $package =~ m/^l/ ? 4 : 1);
- my $subpath = "/pool/$component/$prefix/$package/${package}_$vsn.dsc";
+ my $subpath = "/pool/$component/$prefix/$package/".dscfn($vsn);
push @out, [$vsn,$subpath,$newsuite];
}
return sort { -version_compare_string($a->[0],$b->[0]); } @out;
}
sub canonicalise_suite () {
+ return if defined $csuite;
+ fail "cannot operate on $isuite suite" if $isuite eq 'UNRELEASED';
$csuite = archive_query('canonicalise_suite');
if ($isuite ne $csuite) {
# madison canonicalises for us
sub is_fast_fwd ($$) {
my ($ancestor,$child) = @_;
- my $mb = cmdoutput @git, qw(merge-base), $ancestor, $child;
- return rev_parse($mb) eq rev_parse($ancestor);
+ my @cmd = (@git, qw(merge-base), $ancestor, $child);
+ my $mb = cmdoutput_errok @cmd;
+ if (defined $mb) {
+ return rev_parse($mb) eq rev_parse($ancestor);
+ } else {
+ $?==256 or failedcmd @cmd;
+ return 0;
+ }
}
sub git_fetch_us () {
}
sub check_not_dirty () {
+ return if $ignoredirty;
my @cmd = (@git, qw(diff --quiet HEAD));
printcmd(\*DEBUG,"+",@cmd) if $debug>0;
$!=0; $?=0; system @cmd;
$dsc->{$ourdscfield[0]} = rev_parse('HEAD');
$dsc->save("../$dscfn.tmp") or die $!;
if (!$changesfile) {
- my $multi = "../${package}_${cversion}_multi.changes";
+ my $multi = "../${package}_".(stripepoch $cversion)."_multi.changes";
if (stat "$multi") {
$changesfile = $multi;
} else {
$!==&ENOENT or die "$multi: $!";
- my $pat = "${package}_${cversion}_*.changes";
+ my $pat = "${package}_".(stripepoch $cversion)."_*.changes";
my @cs = glob "../$pat";
fail "failed to find unique changes file".
" (looked for $pat in .., or $multi);".
sub cmd_push {
parseopts();
badusage "-p is not allowed with dgit push" if defined $package;
- runcmd @git, qw(diff --quiet HEAD);
+ check_not_dirty();
my $clogp = parsechangelog();
$package = getfield $clogp, 'Source';
if (@ARGV==0) {
git_fetch_us();
}
if (fetch_from_archive()) {
- is_fast_fwd(lrref(), 'HEAD') or die;
+ is_fast_fwd(lrref(), 'HEAD') or
+ fail "dgit push: HEAD is not a descendant".
+ " of the archive's version.\n".
+ "$us: To overwrite it, use git-merge -s ours ".lrref().".";
} else {
$new_package or
fail "package appears to be new in this suite;".
chomp;
return unless madformat($_);
# sigh
+ my $clogp = parsechangelog();
+ my $version = getfield $clogp, 'Version';
+ my $author = getfield $clogp, 'Maintainer';
my $headref = rev_parse('HEAD');
my $time = time;
+ my $ncommits = 3;
my $patchname = "auto-$version-$headref-$time";
- my $author = cmdoutput @git, qw(log -n1), '--pretty=format:%an <%ae>';
- my $msg = cmdoutput @git, qw(log -n1), "--pretty=format:%s\n%b";
+ my $msg = cmdoutput @git, qw(log), "-n$ncommits";
my $descfn = ".git/dgit/quilt-description.tmp";
open O, '>', $descfn or die "$descfn: $!";
$msg =~ s/\n/\n /g;
$msg =~ s/^\s+$/ ./mg;
print O <<END or die $!;
-Description: $msg
- [generated from git commit $headref]
+Description: Automatically generated patch ($clogp->{Version})
+ Last (up to) $ncommits git changes, FYI:
+ .
+ $msg
Author: $author
---
exit 0;
}
-sub cmd_build {
- # we pass further options and args to git-buildpackage
- badusage "-p is not allowed with dgit build" if defined $package;
- badusage "dgit build implies --clean=dpkg-source" if defined $package;
+sub build_prep () {
+ badusage "-p is not allowed when building" if defined $package;
+ check_not_dirty();
my $clogp = parsechangelog();
$isuite = getfield $clogp, 'Distribution';
$package = getfield $clogp, 'Source';
$version = getfield $clogp, 'Version';
build_maybe_quilt_fixup();
+}
+
+sub cmd_build {
+ badusage "dgit build implies --clean=dpkg-source"
+ if $cleanmode ne 'dpkg-source';
+ build_prep();
+ runcmd_ordryrun @dpkgbuildpackage, qw(-us -uc), changesopts(), @ARGV;
+ printdone "build successful\n";
+}
+
+sub cmd_git_build {
+ badusage "dgit git-build implies --clean=dpkg-source"
+ if $cleanmode ne 'dpkg-source';
+ build_prep();
my @cmd =
(qw(git-buildpackage -us -uc --git-no-sign-tags),
"--git-builder=@dpkgbuildpackage");
- unless (grep { m/^--git-debian-branch/ } @ARGV) {
+ unless (grep { m/^--git-debian-branch|^--git-ignore-branch/ } @ARGV) {
canonicalise_suite();
push @cmd, "--git-debian-branch=".lbranch();
}
}
sub build_source {
- badusage "-p is not allowed with this action" if defined $package;
- check_not_dirty();
- my $clogp = parsechangelog();
- $package = getfield $clogp, 'Source';
- $isuite = getfield $clogp, 'Distribution';
- $version = getfield $clogp, 'Version';
- $sourcechanges = "${package}_${version}_source.changes";
+ build_prep();
+ $sourcechanges = "${package}_".(stripepoch $version)."_source.changes";
$dscfn = dscfn($version);
- build_maybe_quilt_fixup();
if ($cleanmode eq 'dpkg-source') {
runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S)), changesopts();
} else {
sub cmd_sbuild {
build_source();
chdir ".." or die $!;
- my $pat = "${package}_${version}_*.changes";
+ my $pat = "${package}_".(stripepoch $version)."_*.changes";
if (!$dryrun) {
stat $dscfn or fail "$dscfn (in parent directory): $!";
stat $sourcechanges or fail "$sourcechanges (in parent directory): $!";
}
runcmd_ordryrun @sbuild, @ARGV, qw(-d), $isuite, $dscfn;
runcmd_ordryrun @mergechanges, glob $pat;
- my $multichanges = "${package}_${version}_multi.changes";
+ my $multichanges = "${package}_".(stripepoch $version)."_multi.changes";
if (!$dryrun) {
stat $multichanges or fail "$multichanges: $!";
}
$cleanmode = $1;
} elsif (m/^--clean=(.*)$/s) {
badusage "unknown cleaning mode \`$1'";
+ } elsif (m/^--ignore-dirty$/s) {
+ $ignoredirty = 1;
} else {
badusage "unknown long option \`$_'";
}