]> Savannah Git Hosting - gnulib.git/commitdiff
gitlog-to-changelog: Add a new --commit-timezone option.
authorCollin Funk <collin.funk1@gmail.com>
Thu, 4 Jul 2024 04:55:13 +0000 (21:55 -0700)
committerCollin Funk <collin.funk1@gmail.com>
Thu, 4 Jul 2024 04:55:13 +0000 (21:55 -0700)
* build-aux/gitlog-to-changelog: Use the date given in the commit time
zone if --commit-timezone is used.
(usage): Mention the new option.
* doc/gitlog-to-changelog.texi (gitlog-to-changelog): Mention the
--commit-timezone and add an invocation example. Add example of date
ordering that may be undesired.

ChangeLog
build-aux/gitlog-to-changelog
doc/gitlog-to-changelog.texi

index a886e25cc230e4053ecfa4073c1a4e7825371e96..b19c2a482a93ddb1d48dc45e6bd89583eb127740 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2024-07-03  Collin Funk  <collin.funk1@gmail.com>
+
+       gitlog-to-changelog: Add a new --commit-timezone option.
+       * build-aux/gitlog-to-changelog: Use the date given in the commit time
+       zone if --commit-timezone is used.
+       (usage): Mention the new option.
+       * doc/gitlog-to-changelog.texi (gitlog-to-changelog): Mention the
+       --commit-timezone and add an invocation example. Add example of date
+       ordering that may be undesired.
+
 2024-07-03  Jim Meyering  <meyering@meta.com>
 
        maintainer-makefile: derive VERSION from RELEASE only from command line
index 49e7ef95cef4155fddae2c2847790ed5031c8c17..32b3a6264ceb97c55456aeeae6fd53b5486a7282 100755 (executable)
@@ -35,7 +35,7 @@
 eval 'exec perl -wSx "$0" "$@"'
      if 0;
 
-my $VERSION = '2023-06-24 21:59'; # UTC
+my $VERSION = '2024-07-04 04:42'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
@@ -97,6 +97,7 @@ OPTIONS:
    --strip-cherry-pick  remove data inserted by "git cherry-pick";
                   this includes the "cherry picked from commit ..." line,
                   and the possible final "Conflicts:" paragraph.
+   --commit-timezone  use dates respecting the timezone commits were made in.
    --help       display this help and exit
    --version    output version information and exit
 
@@ -247,6 +248,7 @@ sub git_dir_option($)
   my $ignore_line;
   my $strip_tab = 0;
   my $strip_cherry_pick = 0;
+  my $commit_timezone = 0;
   my $srcdir;
   GetOptions
     (
@@ -262,6 +264,7 @@ sub git_dir_option($)
      'ignore-line=s' => \$ignore_line,
      'strip-tab' => \$strip_tab,
      'strip-cherry-pick' => \$strip_cherry_pick,
+     'commit-timezone' => \$commit_timezone,
      'srcdir=s' => \$srcdir,
     ) or usage 1;
 
@@ -274,10 +277,12 @@ sub git_dir_option($)
   # that makes a correction in the log or attribution of that commit.
   my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
 
+  my $commit_time_format = $commit_timezone ? '%cI' : '%ct';
   my @cmd = ('git',
              git_dir_option $srcdir,
              qw(log --log-size),
-             '--pretty=format:%H:%ct  %an  <%ae>%n%n'.$format_string, @ARGV);
+             ("--pretty=format:%H:$commit_time_format"
+              . '  %an  <%ae>%n%n'.$format_string, @ARGV));
   open PIPE, '-|', @cmd
     or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n"
             . "(Is your Git too old?  Version 1.5.1 or later is required.)\n");
@@ -350,17 +355,31 @@ sub git_dir_option($)
       my $author_line = shift @line;
       defined $author_line
         or die "$ME:$.: unexpected EOF\n";
-      $author_line =~ /^(\d+)  (.*>)$/
+      $author_line =~ /^(\S+)  (.*>)$/
         or die "$ME:$.: Invalid line "
           . "(expected date/author/email):\n$author_line\n";
 
+      # Author  <email>
+      my $author = $2;
+
+      my $commit_date = $1;
+      if (! $commit_timezone)
+        {
+          # Seconds since the Epoch.
+          $commit_date = strftime "%Y-%m-%d", localtime ($commit_date);
+        }
+      else
+        {
+          # ISO 8601 date.
+          $commit_date =~ s/T.*$//;
+        }
+
       # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
       # '(tiny change)' annotation.
       my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line)
                   ? '  (tiny change)' : '');
 
-      my $date_line = sprintf "%s  %s$tiny\n",
-        strftime ("%Y-%m-%d", localtime ($1)), $2;
+      my $date_line = "$commit_date  $author$tiny\n";
 
       my @coauthors = grep /^Co-authored-by:.*$/, @line;
       # Omit meta-data lines we've already interpreted.
index 5dc1043e4575aea3b5f054f69ef52a6782df5a16..2b96721e5db0a2380d86613d9688369ed03275c9 100644 (file)
@@ -43,6 +43,51 @@ you want to generate reproducible @file{ChangeLog} files that do not
 depend on the developer's locale and time zone.  Omit this line if you
 prefer @file{ChangeLog} files that depend on these developer settings.
 
+If you wish to output the @file{ChangeLog} with dates respecting the
+time zone each individual commit was made in you can use the
+@option{--commit-timezone} option.  For example:
+
+@example
+dist-hook: gen-ChangeLog
+.PHONY: gen-ChangeLog
+gen-ChangeLog:
+        $(AM_V_GEN)if test -e .git; then                                 \
+          $(top_srcdir)/build-aux/gitlog-to-changelog --commit-timezone  \
+            > $(distdir)/ChangeLog.tmp &&                                \
+          mv -f $(distdir)/ChangeLog.tmp $(distdir)/ChangeLog;           \
+        fi
+@end example
+
+The use of @option{--commit-timezone} means that @file{ChangeLog} dates
+correctly represent when a committer pushed a change according to their
+time zone.  However, as a consequence @file{ChangeLog} dates will no
+longer be monotonically increasing.  This behavior may be undesired,
+especially when developers are spread across many different time zones.
+For example, the following three commits were made in a short period of
+time across two different time zones:
+
+@example
+2024-06-19  Bruno Haible  <bruno@@clisp.org>
+
+       filemode tests: Tweak.
+       * tests/test-filemode.c: Update comment.
+       * modules/filemode-tests (Depends-on): Add unistd.
+
+2024-06-18  Collin Funk  <collin.funk1@@gmail.com>
+
+       filemode: Add tests.
+       * modules/filemode-tests: New file.
+       * tests/test-filemode.c: New file.
+
+2024-06-19  Bruno Haible  <bruno@@clisp.org>
+
+       copysignl tests: Avoid failure on Solaris 11.4.
+       * tests/test-copysignl.c: Include <float.h>.
+       (LDBL_BYTES): New macro.
+       (main): Use it instead of sizeof (long double).
+       * modules/copysignl-tests (Depends-on): Add float.
+@end example
+
 If you wish to limit the @file{ChangeLog} entries (perhaps for size
 issues) to contain only entries since a particular git tag, you can
 use a @code{gen-ChangeLog} rule like the following: