use Dpkg::Version;
use POSIX;
+our $our_version = 'UNRELEASED'; ###substituted###
+
our $isuite = 'unstable';
our $idistro;
our $package;
exit 8;
}
-sub helponly () {
+sub cmd_help () {
print $helpmsg or die $!;
exit 0;
}
'dgit-distro.debian.sshdakls-host' => 'coccia.debian.org',
'dgit-distro.debian.sshdakls-dir' =>
'/srv/ftp-master.debian.org/ftp/dists',
+ 'dgit-distro.debian.upload-host' => 'ftp-master', # for dput
'dgit-distro.debian.mirror' => 'http://ftp.debian.org/debian/');
sub cfg {
$dscurl = access_cfg('mirror').$subpath;
$dscdata = url_get($dscurl);
next unless defined $dscdata;
- $dscurl = access_cfg('mirror').$subpath;
- $dscdata = url_get($dscurl);
my $dscfh = new IO::File \$dscdata, '<' or die $!;
print DEBUG Dumper($dscdata) if $debug>1;
$dsc = parsecontrolfh($dscfh,$dscurl, allow_pgp=>1);
return ($tree,$dir);
}
-sub dsc_files () {
- my $field = $dsc->{'Checksums-Sha256'} || $dsc->{Files};
- defined $field or
- fail "missing both Checksums-Sha256 and Files in ".
+sub dsc_files_info () {
+ foreach my $csumi (['Checksums-Sha256','Digest::SHA', 'new(256)'],
+ ['Checksums-Sha1', 'Digest::SHA', 'new(1)'],
+ ['Files', 'Digest::MD5', 'new()']) {
+ my ($fname, $module, $method) = @$csumi;
+ my $field = $dsc->{$fname};
+ next unless defined $field;
+ eval "use $module; 1;" or die $@;
+ my @out;
+ foreach (split /\n/, $field) {
+ next unless m/\S/;
+ m/^(\w+) (\d+) (\S+)$/ or
+ fail "could not parse .dsc $fname line \`$_'";
+ my $digester = eval "$module"."->$method;" or die $@;
+ push @out, {
+ Hash => $1,
+ Bytes => $2,
+ Filename => $3,
+ Digester => $digester,
+ };
+ }
+ return @out;
+ }
+ fail "missing any supported Checksums-* or Files field in ".
$dsc->get_option('name');
- map {
- m/^\w+ \d+ (\S+)$/ or
- fail "could not parse .dsc Files/Checksums line \`$_'";
- $1;
- } grep m/\S/, split /\n/, $field;
+}
+
+sub dsc_files () {
+ map { $_->{Filename} } dsc_files_info();
}
sub is_orig_file ($) {
}
sub ensure_we_have_orig () {
- foreach my $f (dsc_files()) {
+ foreach my $fi (dsc_files_info()) {
+ my $f = $fi->{Filename};
next unless is_orig_file($f);
- if (stat "../$f") {
- die "$f ?" unless -f _;
+ if (open F, "<", "../$f") {
+ $fi->{Digester}->reset();
+ $fi->{Digester}->addfile(*F);
+ F->error and die $!;
+ my $got = $fi->{Digester}->hexdigest();
+ $got eq $fi->{Hash} or
+ fail "existing file $f has hash $got but .dsc".
+ " demands hash $fi->{Hash}".
+ " (perhaps you should delete this file?)";
+ print "using existing $f\n";
+ next;
} else {
die "$f $!" unless $!==&ENOENT;
}
}
sub git_fetch_us () {
- badusage "cannot dry run with fetch" if $dryrun;
- runcmd @git, qw(fetch),access_giturl(),fetchspec();
+ runcmd_ordryrun @git, qw(fetch),access_giturl(),fetchspec();
}
sub fetch_from_archive () {
if (check_for_git()) {
print "fetching existing git history\n";
git_fetch_us();
- runcmd @git, qw(fetch origin);
+ runcmd_ordryrun @git, qw(fetch origin);
} else {
print "starting new git history\n";
}
create_remote_git_repo();
}
runcmd_ordryrun @git, qw(push),access_giturl(),"HEAD:".rrref();
+ runcmd_ordryrun @git, qw(update-ref -m), 'dgit push', lrref(), 'HEAD';
if (!$dryrun) {
rename "../$dscfn.tmp","../$dscfn" or die "$dscfn $!";
} else {
$keyid = access_cfg('keyid','RETURN-UNDEF');
}
my @tag_cmd = (@git, qw(tag -s -m),
- "Release $dversion for $csuite [dgit]");
+ "$package release $dversion for $csuite [dgit]");
push @tag_cmd, qw(-u),$keyid if defined $keyid;
push @tag_cmd, $tag;
runcmd_ordryrun @tag_cmd;
my $ncommits = 3;
my $patchname = "auto-$version-$headref-$time";
my $msg = cmdoutput @git, qw(log), "-n$ncommits";
+ mkpath '.git/dgit';
my $descfn = ".git/dgit/quilt-description.tmp";
open O, '>', $descfn or die "$descfn: $!";
$msg =~ s/\n/\n /g;
build_maybe_quilt_fixup();
}
+sub cmd_version {
+ print "dgit version $our_version\n" or die $!;
+ exit 0;
+}
+
sub parseopts () {
my $om;
while (@ARGV) {
} elsif (m/^--no-sign$/) {
$sign=0;
} elsif (m/^--help$/) {
- helponly();
+ cmd_help();
+ } elsif (m/^--version$/) {
+ cmd_version();
} elsif (m/^--new$/) {
$new_package=1;
} elsif (m/^--(\w+)=(.*)/s &&
if (s/^-n/-/) {
$dryrun=1;
} elsif (s/^-h/-/) {
- helponly();
+ cmd_help();
} elsif (s/^-D/-/) {
open DEBUG, ">&STDERR" or die $!;
$debug++;