Browse Source

Update auxiliary maintainer mode build tools

* git-set-file-times: Update from rsync.
* git-version-gen: Update from gnulib.
* gitlog-to-changelog: Likewise.
Dmitry V. Levin 4 years ago
parent
commit
63630746ef
3 changed files with 254 additions and 28 deletions
  1. 2
    1
      git-set-file-times
  2. 6
    5
      git-version-gen
  3. 246
    22
      gitlog-to-changelog

+ 2
- 1
git-set-file-times View File

@@ -1,5 +1,6 @@
1
-#!/usr/bin/perl -w
1
+#!/usr/bin/perl
2 2
 use strict;
3
+use warnings;
3 4
 
4 5
 # Sets mtime and atime of files to the latest commit time in git.
5 6
 #

+ 6
- 5
git-version-gen View File

@@ -1,8 +1,8 @@
1 1
 #!/bin/sh
2 2
 # Print a version string.
3
-scriptversion=2012-12-31.23; # UTC
3
+scriptversion=2014-12-02.19; # UTC
4 4
 
5
-# Copyright (C) 2007-2013 Free Software Foundation, Inc.
5
+# Copyright (C) 2007-2014 Free Software Foundation, Inc.
6 6
 #
7 7
 # This program is free software: you can redistribute it and/or modify
8 8
 # it under the terms of the GNU General Public License as published by
@@ -85,8 +85,9 @@ Print a version string.
85 85
 
86 86
 Options:
87 87
 
88
-   --prefix           prefix of git tags (default 'v')
89
-   --fallback         fallback version to use if \"git --version\" fails
88
+   --prefix PREFIX    prefix of git tags (default 'v')
89
+   --fallback VERSION
90
+                      fallback version to use if \"git --version\" fails
90 91
 
91 92
    --help             display this help and exit
92 93
    --version          output version information and exit
@@ -214,7 +215,7 @@ if test "x$v_from_git" != x; then
214 215
 fi
215 216
 
216 217
 # Omit the trailing newline, so that m4_esyscmd can use the result directly.
217
-echo "$v" | tr -d "$nl"
218
+printf %s "$v"
218 219
 
219 220
 # Local variables:
220 221
 # eval: (add-hook 'write-file-hooks 'time-stamp)

+ 246
- 22
gitlog-to-changelog View File

@@ -3,13 +3,13 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
3 3
     if 0;
4 4
 # Convert git log output to ChangeLog format.
5 5
 
6
-my $VERSION = '2011-10-31 16:06'; # UTC
6
+my $VERSION = '2014-11-20 17:25'; # UTC
7 7
 # The definition above must lie within the first 8 lines in order
8 8
 # for the Emacs time-stamp write hook (at end) to update it.
9 9
 # If you change this file with Emacs, please let the write hook
10 10
 # do its job.  Otherwise, update this string manually.
11 11
 
12
-# Copyright (C) 2008-2011 Free Software Foundation, Inc.
12
+# Copyright (C) 2008-2014 Free Software Foundation, Inc.
13 13
 
14 14
 # This program is free software: you can redistribute it and/or modify
15 15
 # it under the terms of the GNU General Public License as published by
@@ -47,7 +47,7 @@ sub usage ($)
47 47
   my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
48 48
   if ($exit_code != 0)
49 49
     {
50
-      print $STREAM "Try `$ME --help' for more information.\n";
50
+      print $STREAM "Try '$ME --help' for more information.\n";
51 51
     }
52 52
   else
53 53
     {
@@ -60,14 +60,26 @@ $ME, they may be preceded by '--'.
60 60
 
61 61
 OPTIONS:
62 62
 
63
+   --amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that
64
+                  makes a change to SHA1's commit log text or metadata.
65
+   --append-dot append a dot to the first line of each commit message if
66
+                  there is no other punctuation or blank at the end.
67
+   --no-cluster never cluster commit messages under the same date/author
68
+                  header; the default is to cluster adjacent commit messages
69
+                  if their headers are the same and neither commit message
70
+                  contains multiple paragraphs.
71
+   --srcdir=DIR the root of the source tree, from which the .git/
72
+                  directory can be derived.
63 73
    --since=DATE convert only the logs since DATE;
64 74
                   the default is to convert all log entries.
75
+   --until=DATE convert only the logs older than DATE.
65 76
    --format=FMT set format string for commit subject and body;
66 77
                   see 'man git-log' for the list of format metacharacters;
67 78
                   the default is '%s%n%b%n'
68
-   --append-dot append a dot to the first line of each commit message if
69
-                  there is no other punctuation or blank at the end.
70
-
79
+   --strip-tab  remove one additional leading TAB from commit message lines.
80
+   --strip-cherry-pick  remove data inserted by "git cherry-pick";
81
+                  this includes the "cherry picked from commit ..." line,
82
+                  and the possible final "Conflicts:" paragraph.
71 83
    --help       display this help and exit
72 84
    --version    output version information and exit
73 85
 
@@ -76,6 +88,38 @@ EXAMPLE:
76 88
   $ME --since=2008-01-01 > ChangeLog
77 89
   $ME -- -n 5 foo > last-5-commits-to-branch-foo
78 90
 
91
+SPECIAL SYNTAX:
92
+
93
+The following types of strings are interpreted specially when they appear
94
+at the beginning of a log message line.  They are not copied to the output.
95
+
96
+  Copyright-paperwork-exempt: Yes
97
+    Append the "(tiny change)" notation to the usual "date name email"
98
+    ChangeLog header to mark a change that does not require a copyright
99
+    assignment.
100
+  Co-authored-by: Joe User <user\@example.com>
101
+    List the specified name and email address on a second
102
+    ChangeLog header, denoting a co-author.
103
+  Signed-off-by: Joe User <user\@example.com>
104
+    These lines are simply elided.
105
+
106
+In a FILE specified via --amend, comment lines (starting with "#") are ignored.
107
+FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on
108
+a line) referring to a commit in the current project, and CODE refers to one
109
+or more consecutive lines of Perl code.  Pairs must be separated by one or
110
+more blank line.
111
+
112
+Here is sample input for use with --amend=FILE, from coreutils:
113
+
114
+3a169f4c5d9159283548178668d2fae6fced3030
115
+# fix typo in title:
116
+s/all tile types/all file types/
117
+
118
+1379ed974f1fa39b12e2ffab18b3f7a607082202
119
+# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
120
+# Change the author to be Paul.  Note the escaped "@":
121
+s,Jim .*>,Paul Eggert <eggert\\\@cs.ucla.edu>,
122
+
79 123
 EOF
80 124
     }
81 125
   exit $exit_code;
@@ -101,29 +145,125 @@ sub quoted_cmd(@)
101 145
   return join (' ', map {shell_quote $_} @_);
102 146
 }
103 147
 
148
+# Parse file F.
149
+# Comment lines (starting with "#") are ignored.
150
+# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1
151
+# (alone on a line) referring to a commit in the current project, and
152
+# CODE refers to one or more consecutive lines of Perl code.
153
+# Pairs must be separated by one or more blank line.
154
+sub parse_amend_file($)
155
+{
156
+  my ($f) = @_;
157
+
158
+  open F, '<', $f
159
+    or die "$ME: $f: failed to open for reading: $!\n";
160
+
161
+  my $fail;
162
+  my $h = {};
163
+  my $in_code = 0;
164
+  my $sha;
165
+  while (defined (my $line = <F>))
166
+    {
167
+      $line =~ /^\#/
168
+        and next;
169
+      chomp $line;
170
+      $line eq ''
171
+        and $in_code = 0, next;
172
+
173
+      if (!$in_code)
174
+        {
175
+          $line =~ /^([0-9a-fA-F]{40})$/
176
+            or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
177
+              $fail = 1, next;
178
+          $sha = lc $1;
179
+          $in_code = 1;
180
+          exists $h->{$sha}
181
+            and (warn "$ME: $f:$.: duplicate SHA1\n"),
182
+              $fail = 1, next;
183
+        }
184
+      else
185
+        {
186
+          $h->{$sha} ||= '';
187
+          $h->{$sha} .= "$line\n";
188
+        }
189
+    }
190
+  close F;
191
+
192
+  $fail
193
+    and exit 1;
194
+
195
+  return $h;
196
+}
197
+
198
+# git_dir_option $SRCDIR
199
+#
200
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
201
+# is undef).  Return as a list (0 or 1 element).
202
+sub git_dir_option($)
203
+{
204
+  my ($srcdir) = @_;
205
+  my @res = ();
206
+  if (defined $srcdir)
207
+    {
208
+      my $qdir = shell_quote $srcdir;
209
+      my $cmd = "cd $qdir && git rev-parse --show-toplevel";
210
+      my $qcmd = shell_quote $cmd;
211
+      my $git_dir = qx($cmd);
212
+      defined $git_dir
213
+        or die "$ME: cannot run $qcmd: $!\n";
214
+      $? == 0
215
+        or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
216
+      chomp $git_dir;
217
+      push @res, "--git-dir=$git_dir/.git";
218
+    }
219
+  @res;
220
+}
221
+
104 222
 {
105 223
   my $since_date;
224
+  my $until_date;
106 225
   my $format_string = '%s%n%b%n';
226
+  my $amend_file;
107 227
   my $append_dot = 0;
228
+  my $cluster = 1;
229
+  my $strip_tab = 0;
230
+  my $strip_cherry_pick = 0;
231
+  my $srcdir;
108 232
   GetOptions
109 233
     (
110 234
      help => sub { usage 0 },
111 235
      version => sub { print "$ME version $VERSION\n"; exit },
112 236
      'since=s' => \$since_date,
237
+     'until=s' => \$until_date,
113 238
      'format=s' => \$format_string,
239
+     'amend=s' => \$amend_file,
114 240
      'append-dot' => \$append_dot,
241
+     'cluster!' => \$cluster,
242
+     'strip-tab' => \$strip_tab,
243
+     'strip-cherry-pick' => \$strip_cherry_pick,
244
+     'srcdir=s' => \$srcdir,
115 245
     ) or usage 1;
116 246
 
117 247
   defined $since_date
118 248
     and unshift @ARGV, "--since=$since_date";
249
+  defined $until_date
250
+    and unshift @ARGV, "--until=$until_date";
119 251
 
120
-  my @cmd = (qw (git log --log-size),
121
-             '--pretty=format:%ct  %an  <%ae>%n%n'.$format_string, @ARGV);
252
+  # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
253
+  # that makes a correction in the log or attribution of that commit.
254
+  my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
255
+
256
+  my @cmd = ('git',
257
+             git_dir_option $srcdir,
258
+             qw(log --log-size),
259
+             '--pretty=format:%H:%ct  %an  <%ae>%n%n'.$format_string, @ARGV);
122 260
   open PIPE, '-|', @cmd
123
-    or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n"
261
+    or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
124 262
             . "(Is your Git too old?  Version 1.5.1 or later is required.)\n");
125 263
 
264
+  my $prev_multi_paragraph;
126 265
   my $prev_date_line = '';
266
+  my @prev_coauthors = ();
127 267
   while (1)
128 268
     {
129 269
       defined (my $in = <PIPE>)
@@ -137,7 +277,41 @@ sub quoted_cmd(@)
137 277
       $n_read == $log_nbytes
138 278
         or die "$ME:$.: unexpected EOF\n";
139 279
 
140
-      my @line = split "\n", $log;
280
+      # Extract leading hash.
281
+      my ($sha, $rest) = split ':', $log, 2;
282
+      defined $sha
283
+        or die "$ME:$.: malformed log entry\n";
284
+      $sha =~ /^[0-9a-fA-F]{40}$/
285
+        or die "$ME:$.: invalid SHA1: $sha\n";
286
+
287
+      # If this commit's log requires any transformation, do it now.
288
+      my $code = $amend_code->{$sha};
289
+      if (defined $code)
290
+        {
291
+          eval 'use Safe';
292
+          my $s = new Safe;
293
+          # Put the unpreprocessed entry into "$_".
294
+          $_ = $rest;
295
+
296
+          # Let $code operate on it, safely.
297
+          my $r = $s->reval("$code")
298
+            or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
299
+
300
+          # Note that we've used this entry.
301
+          delete $amend_code->{$sha};
302
+
303
+          # Update $rest upon success.
304
+          $rest = $_;
305
+        }
306
+
307
+      # Remove lines inserted by "git cherry-pick".
308
+      if ($strip_cherry_pick)
309
+        {
310
+          $rest =~ s/^\s*Conflicts:\n.*//sm;
311
+          $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
312
+        }
313
+
314
+      my @line = split "\n", $rest;
141 315
       my $author_line = shift @line;
142 316
       defined $author_line
143 317
         or die "$ME:$.: unexpected EOF\n";
@@ -145,19 +319,20 @@ sub quoted_cmd(@)
145 319
         or die "$ME:$.: Invalid line "
146 320
           . "(expected date/author/email):\n$author_line\n";
147 321
 
148
-      my $date_line = sprintf "%s  $2\n", strftime ("%F", localtime ($1));
149
-      # If this line would be the same as the previous date/name/email
150
-      # line, then arrange not to print it.
151
-      if ($date_line ne $prev_date_line)
152
-        {
153
-          $prev_date_line eq ''
154
-            or print "\n";
155
-          print $date_line;
156
-        }
157
-      $prev_date_line = $date_line;
322
+      # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
323
+      # `(tiny change)' annotation.
324
+      my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
325
+                  ? '  (tiny change)' : '');
158 326
 
159
-      # Omit "Signed-off-by..." lines.
160
-      @line = grep !/^Signed-off-by: .*>$/, @line;
327
+      my $date_line = sprintf "%s  %s$tiny\n",
328
+        strftime ("%F", localtime ($1)), $2;
329
+
330
+      my @coauthors = grep /^Co-authored-by:.*$/, @line;
331
+      # Omit meta-data lines we've already interpreted.
332
+      @line = grep !/^(?:Signed-off-by:[ ].*>$
333
+                       |Co-authored-by:[ ]
334
+                       |Copyright-paperwork-exempt:[ ]
335
+                       )/x, @line;
161 336
 
162 337
       # Remove leading and trailing blank lines.
163 338
       if (@line)
@@ -166,6 +341,41 @@ sub quoted_cmd(@)
166 341
           while ($line[$#line] =~ /^\s*$/) { pop @line; }
167 342
         }
168 343
 
344
+      # Record whether there are two or more paragraphs.
345
+      my $multi_paragraph = grep /^\s*$/, @line;
346
+
347
+      # Format 'Co-authored-by: A U Thor <email@example.com>' lines in
348
+      # standard multi-author ChangeLog format.
349
+      for (@coauthors)
350
+        {
351
+          s/^Co-authored-by:\s*/\t    /;
352
+          s/\s*</  </;
353
+
354
+          /<.*?@.*\..*>/
355
+            or warn "$ME: warning: missing email address for "
356
+              . substr ($_, 5) . "\n";
357
+        }
358
+
359
+      # If clustering of commit messages has been disabled, if this header
360
+      # would be different from the previous date/name/email/coauthors header,
361
+      # or if this or the previous entry consists of two or more paragraphs,
362
+      # then print the header.
363
+      if ( ! $cluster
364
+          || $date_line ne $prev_date_line
365
+          || "@coauthors" ne "@prev_coauthors"
366
+          || $multi_paragraph
367
+          || $prev_multi_paragraph)
368
+        {
369
+          $prev_date_line eq ''
370
+            or print "\n";
371
+          print $date_line;
372
+          @coauthors
373
+            and print join ("\n", @coauthors), "\n";
374
+        }
375
+      $prev_date_line = $date_line;
376
+      @prev_coauthors = @coauthors;
377
+      $prev_multi_paragraph = $multi_paragraph;
378
+
169 379
       # If there were any lines
170 380
       if (@line == 0)
171 381
         {
@@ -185,6 +395,10 @@ sub quoted_cmd(@)
185 395
                 }
186 396
             }
187 397
 
398
+          # Remove one additional leading TAB from each line.
399
+          $strip_tab
400
+            and map { s/^\t// } @line;
401
+
188 402
           # Prefix each non-empty line with a TAB.
189 403
           @line = map { length $_ ? "\t$_" : '' } @line;
190 404
 
@@ -200,6 +414,16 @@ sub quoted_cmd(@)
200 414
   close PIPE
201 415
     or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
202 416
   # FIXME-someday: include $PROCESS_STATUS in the diagnostic
417
+
418
+  # Complain about any unused entry in the --amend=F specified file.
419
+  my $fail = 0;
420
+  foreach my $sha (keys %$amend_code)
421
+    {
422
+      warn "$ME:$amend_file: unused entry: $sha\n";
423
+      $fail = 1;
424
+    }
425
+
426
+  exit $fail;
203 427
 }
204 428
 
205 429
 # Local Variables:

Loading…
Cancel
Save