chiark / gitweb /
Dgit.pm: Move make_commit_text from dgit
[dgit.git] / Debian / Dgit.pm
index 05e4c0c85178f490ad3de9c33b4d0f60cdf3107a..9d2e471948173fa33f38294b80daced55d5f8b07 100644 (file)
@@ -43,6 +43,7 @@ BEGIN {
                      dep14_version_mangle
                       debiantags debiantag_old debiantag_new
                      debiantag_maintview
+                     upstreamversion
                      stripepoch source_file_leafname is_orig_file_of_p_v
                      server_branch server_ref
                       stat_exists link_ltarget
@@ -56,6 +57,7 @@ BEGIN {
                       git_for_each_tag_referring is_fast_fwd
                      git_check_unmodified
                      git_reflog_action_msg  git_update_ref_cmd
+                     make_commit_text
                       $package_re $component_re $deliberately_re
                      $distro_re $versiontag_re $series_filename_re
                      $orig_f_comp_re $orig_f_sig_re $orig_f_tail_re
@@ -65,6 +67,7 @@ BEGIN {
                      $ffq_refprefix $gdrlast_refprefix
                       initdebug enabledebug enabledebuglevel
                       printdebug debugcmd
+                      $printdebug_when_debuglevel $debugcmd_when_debuglevel
                       $debugprefix *debuglevel *DEBUG
                       shellquote printcmd messagequote
                       $negate_harmful_gitattrs
@@ -99,6 +102,8 @@ our $orig_f_tail_re = "$orig_f_comp_re\\.tar(?:\\.\\w+)?(?:$orig_f_sig_re)?";
 our $git_null_obj = '0' x 40;
 our $ffq_refprefix = 'ffq-prev';
 our $gdrlast_refprefix = 'debrebase-last';
+our $printdebug_when_debuglevel = 1;
+our $debugcmd_when_debuglevel = 1;
 
 # policy hook exit status bits
 # see dgit-repos-server head comment for documentation
@@ -155,7 +160,21 @@ sub enabledebuglevel ($) {
 }
     
 sub printdebug {
-    print DEBUG $debugprefix, @_ or die $! if $debuglevel>0;
+    # Prints a prefix, and @_, to DEBUG.  @_ should normally contain
+    # a trailing \n.
+
+    # With no (or only empty) arguments just prints the prefix and
+    # leaves the caller to do more with DEBUG.  The caller should make
+    # sure then to call printdebug with something ending in "\n" to
+    # get the prefix right in subsequent calls.
+
+    return unless $debuglevel >= $printdebug_when_debuglevel;
+    our $printdebug_noprefix;
+    print DEBUG $debugprefix unless $printdebug_noprefix;
+    pop @_ while @_ and !length $_[-1];
+    return unless @_;
+    print DEBUG @_ or die $!;
+    $printdebug_noprefix = $_[-1] !~ m{\n$};
 }
 
 sub messagequote ($) {
@@ -194,7 +213,8 @@ sub printcmd {
 
 sub debugcmd {
     my $extraprefix = shift @_;
-    printcmd(\*DEBUG,$debugprefix.$extraprefix,@_) if $debuglevel>0;
+    printcmd(\*DEBUG,$debugprefix.$extraprefix,@_)
+       if $debuglevel >= $debugcmd_when_debuglevel;
 }
 
 sub dep14_version_mangle ($) {
@@ -231,13 +251,19 @@ sub stripepoch ($) {
     return $vsn;
 }
 
+sub upstreamversion ($) {
+    my ($vsn) = @_;
+    $vsn =~ s/-[^-]+$//;
+    return $vsn;
+}
+
 sub source_file_leafname ($$$) {
     my ($package,$vsn,$sfx) = @_;
     return "${package}_".(stripepoch $vsn).$sfx
 }
 
 sub is_orig_file_of_p_v ($$$) {
-    my ($package, $f, $upstreamvsn) = @_;
+    my ($f, $package, $upstreamvsn) = @_;
     my $base = source_file_leafname $package, $upstreamvsn, '';
     return 0 unless $f =~ m/^\Q$base\E\.$orig_f_tail_re$/;
     return 1;
@@ -259,7 +285,7 @@ sub _us () {
 
 sub failmsg {
     my $s = "error: @_\n";
-    $s =~ s/\n\n$/\n/;
+    $s =~ s/\n\n$/\n/g;
     my $prefix = _us().": ";
     $s =~ s/^/$prefix/gm;
     return "\n".$s;
@@ -355,6 +381,7 @@ sub shell_cmd {
 
 sub cmdoutput_errok {
     confess Dumper(\@_)." ?" if grep { !defined } @_;
+    local $printdebug_when_debuglevel = $debugcmd_when_debuglevel;
     debugcmd "|",@_;
     open P, "-|", @_ or die "$_[0] $!";
     my $d;
@@ -407,6 +434,7 @@ sub git_cat_file ($;$) {
     # in scalar context, just the data
     # if $etype defined, dies unless type is $etype or in @$etype
     our ($gcf_pid, $gcf_i, $gcf_o);
+    local $printdebug_when_debuglevel = $debugcmd_when_debuglevel;
     my $chk = sub {
        my ($gtype, $data) = @_;
        if ($etype) {
@@ -660,6 +688,28 @@ sub parsechangelog_loop ($$$) {
     close CLOGS or $?==SIGPIPE or failedcmd @$clogcmd;
 }      
 
+sub make_commit_text ($) {
+    my ($text) = @_;
+    my ($out, $in);
+    my @cmd = (qw(git hash-object -w -t commit --stdin));
+    debugcmd "|",@cmd;
+    print Dumper($text) if $debuglevel > 1;
+    my $child = open2($out, $in, @cmd) or die $!;
+    my $h;
+    eval {
+       print $in $text or die $!;
+       close $in or die $!;
+       $h = <$out>;
+       $h =~ m/^\w+$/ or die;
+       $h = $&;
+       printdebug "=> $h\n";
+    };
+    close $out;
+    waitpid $child, 0 == $child or die "$child $!";
+    $? and failedcmd @cmd;
+    return $h;
+}
+
 # ========== playground handling ==========
 
 # terminology: