chiark / gitweb /
i18n: dgit: mark some messages (2)
[dgit.git] / git-debrebase
index a0fc2aaa63fbd7f85795a45b299a691606d200ac..645b072aaf2a11eb34ca2943eb4b69961c49ed74 100755 (executable)
@@ -21,6 +21,7 @@
 END { $? = $Debian::Dgit::ExitStatus::desired // -1; };
 use Debian::Dgit::GDR;
 use Debian::Dgit::ExitStatus;
+use Debian::Dgit::I18n;
 
 use strict;
 
@@ -30,6 +31,7 @@ setup_sigwarn();
 use Memoize;
 use Carp;
 use POSIX;
+use Locale::gettext;
 use Data::Dumper;
 use Getopt::Long qw(:config posix_default gnu_compat bundling);
 use Dpkg::Version;
@@ -603,9 +605,10 @@ sub merge_series ($$$;@) {
        playtree_setup();
        foreach my $q ($base_q, reverse @input_qs) {
            my $s = $q->{MR}{S};
-           gbp_pq_export "p-$s", $q->{SeriesBase}, $q->{SeriesTip};
+           my $any = gbp_pq_export "p-$s", $q->{SeriesBase}, $q->{SeriesTip};
            my @earlier;
-           if (open S, $seriesfile) {
+           if ($any) {
+               open S, $seriesfile or die "$seriesfile $!";
                while (my $patch = <S>) {
                    chomp $patch or die $!;
                    $prereq{$patch} //= {};
@@ -617,8 +620,6 @@ sub merge_series ($$$;@) {
                }
                S->error and die "$seriesfile $!";
                close S;
-           } else {
-               die "$seriesfile $!" unless $!==ENOENT;
            }
            read_tree_upstream $newbase, 1;
            my $pec = make_commit [ grep { defined } $base_q->{MR}{PEC} ], [
@@ -1081,9 +1082,8 @@ sub keycommits ($;$$$$$) {
     my ($head, $furniture, $unclean, $trouble, $fatal, $claimed_bw) = @_;
     # => ($anchor, $breakwater)
 
-    # $unclean->("unclean-$tagsfx", $msg, $cl)
     # $furniture->("unclean-$tagsfx", $msg, $cl)
-    # $dgitimport->("unclean-$tagsfx", $msg, $cl))
+    # $unclean->("unclean-$tagsfx", $msg, $cl)
     #   is callled for each situation or commit that
     #   wouldn't be found in a laundered branch
     # $furniture is for furniture commits such as might be found on an
@@ -2066,7 +2066,7 @@ sub cmd_new_upstream () {
     my $old_upstream;
     if (!$old_anchor_cl->{OrigParents}) {
        snag 'anchor-treated',
          'old anchor is recognised due to --anchor, cannot check upstream';
__ 'old anchor is recognised due to --anchor, cannot check upstream';
     } else {
        $old_upstream = parsecommit
            $old_anchor_cl->{OrigParents}[0]{CommitId};
@@ -2172,30 +2172,39 @@ sub cmd_new_upstream () {
  "[git-debrebase anchor: new upstream $new_upstream_version, merge]",
             ];
 
-       my $clogsignoff = cmdoutput qw(git show),
-           '--pretty=format:%an <%ae>  %aD',
-           $new_bw;
-
        # Now we have to add a changelog stanza so the Debian version
-       # is right.
-       die if unlink "debian";
-       die $! unless $!==ENOENT or $!==ENOTEMPTY;
-       unlink "debian/changelog" or $!==ENOENT or die $!;
-        mkdir "debian" or die $!;
-       open CN, ">", "debian/changelog" or die $!;
-       my $oldclog = git_cat_file ":debian/changelog";
-       $oldclog =~ m/^($package_re) \(\S+\) / or
-           fail "cannot parse old changelog to get package name";
-       my $p = $1;
-       print CN <<END, $oldclog or die $!;
-$p ($new_version) UNRELEASED; urgency=medium
-
-  * Update to new upstream version $new_upstream_version.
-
- -- $clogsignoff
-
-END
-       close CN or die $!;
+       # is right.  We use debchange to do this.  Invoking debchange
+       # here is a bit fiddly because it has a lot of optional
+       # exciting behaviours, some of which will break stuff, and
+       # some of which won't work in a playtree.
+
+       # Make debchange use git's idea of the user's identity.
+       # That way, if the user never uses debchange et al, configuring
+       # git is enough.
+       my $usetup = sub {
+           my ($e, $k) = @_;
+           my $v = cfg $k, 1;
+           defined $v or return;
+           $ENV{$e} = $v;
+       };
+       $usetup->('DEBEMAIL',    'user.email');
+       $usetup->('DEBFULLNAME', 'user.name');
+
+sleep 2;
+
+       my @dch = (qw(debchange
+                     --allow-lower-version .*
+                     --no-auto-nmu
+                     --preserve
+                     --vendor=Unknown-Vendor
+                     --changelog debian/changelog
+                     --check-dirname-level 0
+                     --release-heuristic=changelog
+                     -v), $new_version,
+                  "Update to new upstream version $new_upstream_version.");
+
+       runcmd @git, qw(checkout -q debian/changelog);
+       runcmd @dch;
        runcmd @git, qw(update-index --add --replace), 'debian/changelog';
 
        # Now we have the final new breakwater branch in the index
@@ -2398,20 +2407,27 @@ sub make_patches_staged ($) {
     # laundered.
     my ($secret_head, $secret_bw, $last_anchor) = walk $head;
     fresh_workarea();
+    my $any;
     in_workarea sub {
-       gbp_pq_export 'bw', $secret_bw, $secret_head;
+       $any = gbp_pq_export 'bw', $secret_bw, $secret_head;
     };
+    return $any;
 }
 
 sub make_patches ($) {
     my ($head) = @_;
     keycommits $head, 0, \&snag;
-    make_patches_staged $head;
+    my $any = make_patches_staged $head;
     my $out;
     in_workarea sub {
-       my $ptree = cmdoutput @git, qw(write-tree --prefix=debian/patches/);
+       my $ptree = !$any ? undef :
+           cmdoutput @git, qw(write-tree --prefix=debian/patches/);
        runcmd @git, qw(read-tree), $head;
-       read_tree_subdir 'debian/patches', $ptree;
+       if ($ptree) {
+           read_tree_subdir 'debian/patches', $ptree;
+       } else {
+           rm_subdir_cached 'debian/patches';
+       }
        $out = make_commit [$head], [
             'Commit patch queue (exported by git-debrebase)',
             '[git-debrebase make-patches: export and commit patches]',
@@ -2631,15 +2647,20 @@ sub cmd_convert_to_gbp () {
     badusage "no arguments allowed" if @ARGV;
     my $head = get_head();
     my (undef, undef, undef, $ffq, $gdrlast) = ffq_prev_branchinfo();
-    keycommits $head, 0;
-    my $out;
-    make_patches_staged $head;
-    in_workarea sub {
-       $out = make_commit ['HEAD'], [
-            'Commit patch queue (converted from git-debrebase format)',
-            '[git-debrebase convert-to-gbp: commit patches]',
-        ];
-    };
+    my ($anchor, $breakwater) = keycommits $head, 0;
+    my $out = $breakwater;
+    my $any = make_patches_staged $head;
+    if ($any) {
+       in_workarea sub {
+           $out = make_commit [$out], [
+               'Commit patch queue (converted from git-debrebase format)',
+               '[git-debrebase convert-to-gbp: commit patches]',
+           ];
+       };
+    } else {
+       # in this case, it can be fast forward
+       $out = $head;
+    }
     if (defined $ffq) {
        push @deferred_updates, "delete $ffq";
        push @deferred_updates, "delete $gdrlast";
@@ -2942,6 +2963,9 @@ sub cmd_downstream_rebase_launder_v0 () {
     }
 }
 
+setlocale(LC_MESSAGES, "");
+textdomain("git-debrebase");
+
 getoptions_main
           ("bad options\n",
           "D+" => \$debuglevel,
@@ -2953,7 +2977,7 @@ getoptions_main
           'experimental-merge-resolution!', \$opt_merges,
           '-i:s' => sub {
               my ($opt,$val) = @_;
-              badusage "git-debrebase: no cuddling to -i for git-rebase"
+              badusage __ "git-debrebase: no cuddling to -i for git-rebase"
                   if length $val;
               die if $opt_defaultcmd_interactive; # should not happen
               $opt_defaultcmd_interactive = [ qw(-i) ];
@@ -2984,7 +3008,7 @@ if (!@ARGV || $opt_defaultcmd_interactive || $ARGV[0] =~ m{^-}) {
     $cmdfn =~ y/-/_/;
     $cmdfn = ${*::}{"cmd_$cmdfn"};
 
-    $cmdfn or badusage "unknown git-debrebase sub-operation $cmd";
+    $cmdfn or badusage f_ "unknown git-debrebase sub-operation %s", $cmd;
     $cmdfn->();
 }