diff options
author | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2013-09-15 13:28:21 +0100 |
---|---|---|
committer | Ian Jackson <ijackson@chiark.greenend.org.uk> | 2013-09-15 13:28:21 +0100 |
commit | 251174a2cc06e0cd3041c0b97b9fc687902979fc (patch) | |
tree | 035570af43ed9e2ef9fabc1eb803b8cd6d662050 | |
parent | 5ed00ff3ed9037f29a6718888525e32731947da2 (diff) |
wip changes for remote push
-rwxr-xr-x | dgit | 64 |
1 files changed, 49 insertions, 15 deletions
@@ -566,6 +566,18 @@ sub make_commit ($) { return cmdoutput @git, qw(hash-object -w -t commit), $file; } +sub clogp_authline ($) { + my ($clogp) = @_; + my $author = getfield $clogp, 'Maintainer'; + $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 + fail "unexpected commit author line format \`$authline'". + " (was generated from changelog Maintainer field)"; + return $authline; +} + sub generate_commit_from_dsc () { prep_ud(); chdir $ud or die $!; @@ -586,13 +598,7 @@ sub generate_commit_from_dsc () { my ($tree,$dir) = mktree_in_ud_from_only_subdir(); runcmd qw(sh -ec), 'dpkg-parsechangelog >../changelog.tmp'; my $clogp = parsecontrol('../changelog.tmp',"commit's changelog"); - my $date = cmdoutput qw(date), '+%s %z', qw(-d), getfield($clogp,'Date'); - my $author = getfield $clogp, 'Maintainer'; - $author =~ s#,.*##ms; - my $authline = "$author $date"; - $authline =~ m/^[^<>]+ \<\S+\> \d+ [-+]\d+$/ or - fail "unexpected commit author line format \`$authline'". - " (was generated from changelog Maintainer field)"; + my $authline = clogp_authline $clogp; my $changes = getfield $clogp, 'Changes'; open C, ">../commit.tmp" or die $!; print C <<END or die $!; @@ -966,6 +972,35 @@ sub dopush () { } my $tag = debiantag($dversion); runcmd @git, qw(check-ref-format), $tag; + + # We make the git tag by hand because (a) that makes it easier + # to control the "tagger" (b) we can do remote signing + my $authline = clogp_authline $clogp; + my $tfn = sub { ".git/dgit/tag$_[0]"; }; + open TO, '>', $tfn->('.tmp') or die $!; + print TO <<END or die $!; +object $head +type commit +tag $tag +tagger $authline + +$package release $dversion for $csuite [dgit] +END + close TO or die $!; + + my $tagobjfn = $tfn->('.tmp'); + if ($sign) { + if (!defined $keyid) { + $keyid = access_cfg('keyid','RETURN-UNDEF'); + } + unlink $tfn->('.tmp.asc') or $!==&ENOENT or die $!; + my @sign_cmd = (@gpg, qw(--clearsign --armor)); + push @sign_cmd, qw(-u),$keyid if defined $keyid; + push @sign_cmd, $tfn->('.tmp'); + runcmd_ordryrun @sign_cmd; + if (!$dry + runcmd_ordryrun @ + } if (!check_for_git()) { create_remote_git_repo(); } @@ -976,18 +1011,17 @@ sub dopush () { } else { print "[new .dsc left in $dscfn.tmp]\n"; } + if ($sign) { - if (!defined $keyid) { - $keyid = access_cfg('keyid','RETURN-UNDEF'); + if (!$as_remote) { + my @tag_cmd = (@git, qw(tag -a -m), + ); + push @tag_cmd, $tag; + runcmd_ordryrun @tag_cmd; + } else { } - my @tag_cmd = (@git, qw(tag -a -m), - "$package release $dversion for $csuite [dgit]"); - push @tag_cmd, $tag; - runcmd_ordryrun @tag_cmd; - push @tag_cmd, qw(-u),$keyid if defined $keyid; - push @tag_cmd, qw(-u),$keyid if defined $keyid; my @debsign_cmd = @debsign; push @debsign_cmd, "-k$keyid" if defined $keyid; |