diff --git a/.travis.yml b/.travis.yml
index 7f6a994912..fe699a2340 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -124,6 +124,8 @@ stages:
- name: build-and-package
- name: scan
if: branch = master
+ - name: update-change-log
+ if: branch = master
- name: hyrax-olfs-trigger
if: type != pull_request OR branch =~ ^(.*-test-deploy)$
# A way to skip a stage. jhrg 1/26/23
@@ -159,10 +161,10 @@ jobs:
--volume $TRAVIS_BUILD_DIR:/root/travis
--env OS=centos-stream8
--env DIST=el8
- --env LIBDAP_RPM_VERSION=$LIBDAP_RPM_VERSION
- --env BES_BUILD_NUMBER=$BES_BUILD_NUMBER
- --env AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
- --env AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
+ --env LIBDAP_RPM_VERSION
+ --env BES_BUILD_NUMBER
+ --env AWS_ACCESS_KEY_ID
+ --env AWS_SECRET_ACCESS_KEY
opendap/centos-stream8_hyrax_builder:1.1 /root/travis/travis/build-rpm.sh
- stage: build-and-package
@@ -228,6 +230,15 @@ jobs:
# We call the hdf4/5 handlers scan opendap-bes-submodules for historical reasons. jhrg 1/13/22
- curl -s https://sonarcloud.io/api/project_badges/quality_gate?project=opendap-bes-submodules | grep "QUALITY GATE PASS"
+ - stage: update-change-log
+ name: "Update BES ChangeLog"
+ script:
+ - export STAGE=update-change-log
+ - echo $STAGE
+ - autoreconf --force --install --verbose
+ - ./configure --disable-dependency-tracking --prefix=$prefix --with-dependencies=$prefix/deps --enable-developer --enable-coverage
+ - ./travis/update-change-log.sh
+
- stage: hyrax-olfs-trigger
name: "Hyrax OLFS Trigger"
script:
diff --git a/travis/gitlog-to-changelog b/travis/gitlog-to-changelog
new file mode 100755
index 0000000000..4fa4f29702
--- /dev/null
+++ b/travis/gitlog-to-changelog
@@ -0,0 +1,445 @@
+eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
+ & eval 'exec perl -wS "$0" $argv:q'
+ if 0;
+# Convert git log output to ChangeLog format.
+
+my $VERSION = '2015-03-21 01:01'; # 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
+# do its job. Otherwise, update this string manually.
+
+# Copyright (C) 2008-2015 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+# Written by Jim Meyering
+
+use strict;
+use warnings;
+use Getopt::Long;
+use POSIX qw(strftime);
+
+(my $ME = $0) =~ s|.*/||;
+
+# use File::Coda; # http://meyering.net/code/Coda/
+END {
+ defined fileno STDOUT or return;
+ close STDOUT and return;
+ warn "$ME: failed to close standard output: $!\n";
+ $? ||= 1;
+}
+
+sub usage ($)
+{
+ my ($exit_code) = @_;
+ my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR);
+ if ($exit_code != 0)
+ {
+ print $STREAM "Try '$ME --help' for more information.\n";
+ }
+ else
+ {
+ print $STREAM < ChangeLog
+ $ME -- -n 5 foo > last-5-commits-to-branch-foo
+
+SPECIAL SYNTAX:
+
+The following types of strings are interpreted specially when they appear
+at the beginning of a log message line. They are not copied to the output.
+
+ Copyright-paperwork-exempt: Yes
+ Append the "(tiny change)" notation to the usual "date name email"
+ ChangeLog header to mark a change that does not require a copyright
+ assignment.
+ Co-authored-by: Joe User
+ List the specified name and email address on a second
+ ChangeLog header, denoting a co-author.
+ Signed-off-by: Joe User
+ These lines are simply elided.
+
+In a FILE specified via --amend, comment lines (starting with "#") are ignored.
+FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on
+a line) referring to a commit in the current project, and CODE refers to one
+or more consecutive lines of Perl code. Pairs must be separated by one or
+more blank line.
+
+Here is sample input for use with --amend=FILE, from coreutils:
+
+3a169f4c5d9159283548178668d2fae6fced3030
+# fix typo in title:
+s/all tile types/all file types/
+
+1379ed974f1fa39b12e2ffab18b3f7a607082202
+# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself.
+# Change the author to be Paul. Note the escaped "@":
+s,Jim .*>,Paul Eggert ,
+
+EOF
+ }
+ exit $exit_code;
+}
+
+# If the string $S is a well-behaved file name, simply return it.
+# If it contains white space, quotes, etc., quote it, and return the new string.
+sub shell_quote($)
+{
+ my ($s) = @_;
+ if ($s =~ m![^\w+/.,-]!)
+ {
+ # Convert each single quote to '\''
+ $s =~ s/\'/\'\\\'\'/g;
+ # Then single quote the string.
+ $s = "'$s'";
+ }
+ return $s;
+}
+
+sub quoted_cmd(@)
+{
+ return join (' ', map {shell_quote $_} @_);
+}
+
+# Parse file F.
+# Comment lines (starting with "#") are ignored.
+# F must consist of pairs where SHA is a 40-byte SHA1
+# (alone on a line) referring to a commit in the current project, and
+# CODE refers to one or more consecutive lines of Perl code.
+# Pairs must be separated by one or more blank line.
+sub parse_amend_file($)
+{
+ my ($f) = @_;
+
+ open F, '<', $f
+ or die "$ME: $f: failed to open for reading: $!\n";
+
+ my $fail;
+ my $h = {};
+ my $in_code = 0;
+ my $sha;
+ while (defined (my $line = ))
+ {
+ $line =~ /^\#/
+ and next;
+ chomp $line;
+ $line eq ''
+ and $in_code = 0, next;
+
+ if (!$in_code)
+ {
+ $line =~ /^([0-9a-fA-F]{40})$/
+ or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
+ $fail = 1, next;
+ $sha = lc $1;
+ $in_code = 1;
+ exists $h->{$sha}
+ and (warn "$ME: $f:$.: duplicate SHA1\n"),
+ $fail = 1, next;
+ }
+ else
+ {
+ $h->{$sha} ||= '';
+ $h->{$sha} .= "$line\n";
+ }
+ }
+ close F;
+
+ $fail
+ and exit 1;
+
+ return $h;
+}
+
+# git_dir_option $SRCDIR
+#
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
+# is undef). Return as a list (0 or 1 element).
+sub git_dir_option($)
+{
+ my ($srcdir) = @_;
+ my @res = ();
+ if (defined $srcdir)
+ {
+ my $qdir = shell_quote $srcdir;
+ my $cmd = "cd $qdir && git rev-parse --show-toplevel";
+ my $qcmd = shell_quote $cmd;
+ my $git_dir = qx($cmd);
+ defined $git_dir
+ or die "$ME: cannot run $qcmd: $!\n";
+ $? == 0
+ or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
+ chomp $git_dir;
+ push @res, "--git-dir=$git_dir/.git";
+ }
+ @res;
+}
+
+{
+ my $since_date;
+ my $until_date;
+ my $format_string = '%s%n%b%n';
+ my $amend_file;
+ my $append_dot = 0;
+ my $cluster = 1;
+ my $ignore_matching;
+ my $strip_tab = 0;
+ my $strip_cherry_pick = 0;
+ my $srcdir;
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'until=s' => \$until_date,
+ 'format=s' => \$format_string,
+ 'amend=s' => \$amend_file,
+ 'append-dot' => \$append_dot,
+ 'cluster!' => \$cluster,
+ 'ignore-matching=s' => \$ignore_matching,
+ 'strip-tab' => \$strip_tab,
+ 'strip-cherry-pick' => \$strip_cherry_pick,
+ 'srcdir=s' => \$srcdir,
+ ) or usage 1;
+
+ defined $since_date
+ and unshift @ARGV, "--since=$since_date";
+ defined $until_date
+ and unshift @ARGV, "--until=$until_date";
+
+ # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/)
+ # that makes a correction in the log or attribution of that commit.
+ my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {};
+
+ my @cmd = ('git',
+ git_dir_option $srcdir,
+ qw(log --log-size),
+ '--pretty=format:%H:%ct %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");
+
+ my $prev_multi_paragraph;
+ my $prev_date_line = '';
+ my @prev_coauthors = ();
+ while (1)
+ {
+ defined (my $in = )
+ or last;
+ $in =~ /^log size (\d+)$/
+ or die "$ME:$.: Invalid line (expected log size):\n$in";
+ my $log_nbytes = $1;
+
+ my $log;
+ my $n_read = read PIPE, $log, $log_nbytes;
+ $n_read == $log_nbytes
+ or die "$ME:$.: unexpected EOF\n";
+
+ # Extract leading hash.
+ my ($sha, $rest) = split ':', $log, 2;
+ defined $sha
+ or die "$ME:$.: malformed log entry\n";
+ $sha =~ /^[0-9a-fA-F]{40}$/
+ or die "$ME:$.: invalid SHA1: $sha\n";
+
+ # If this commit's log requires any transformation, do it now.
+ my $code = $amend_code->{$sha};
+ if (defined $code)
+ {
+ eval 'use Safe';
+ my $s = new Safe;
+ # Put the unpreprocessed entry into "$_".
+ $_ = $rest;
+
+ # Let $code operate on it, safely.
+ my $r = $s->reval("$code")
+ or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n";
+
+ # Note that we've used this entry.
+ delete $amend_code->{$sha};
+
+ # Update $rest upon success.
+ $rest = $_;
+ }
+
+ # Remove lines inserted by "git cherry-pick".
+ if ($strip_cherry_pick)
+ {
+ $rest =~ s/^\s*Conflicts:\n.*//sm;
+ $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
+ }
+
+ my @line = split /\s*\n/, $rest;
+ my $author_line = shift @line;
+ defined $author_line
+ or die "$ME:$.: unexpected EOF\n";
+ $author_line =~ /^(\d+) (.*>)$/
+ or die "$ME:$.: Invalid line "
+ . "(expected date/author/email):\n$author_line\n";
+
+ # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
+ # `(tiny change)' annotation.
+ my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
+ ? ' (tiny change)' : '');
+
+ my $date_line = sprintf "%s %s$tiny\n",
+ strftime ("%F", localtime ($1)), $2;
+
+ my @coauthors = grep /^Co-authored-by:.*$/, @line;
+ # Omit meta-data lines we've already interpreted.
+ @line = grep !/^(?:Signed-off-by:[ ].*>$
+ |Co-authored-by:[ ]
+ |Copyright-paperwork-exempt:[ ]
+ )/x, @line;
+
+ # Remove leading and trailing blank lines.
+ if (@line)
+ {
+ while ($line[0] =~ /^\s*$/) { shift @line; }
+ while ($line[$#line] =~ /^\s*$/) { pop @line; }
+ }
+
+ # Ignore commits that match the --ignore-matching pattern, if specified.
+ if (! (defined $ignore_matching
+ && @line && $line[0] =~ /$ignore_matching/))
+ {
+ # Record whether there are two or more paragraphs.
+ my $multi_paragraph = grep /^\s*$/, @line;
+
+ # Format 'Co-authored-by: A U Thor ' lines in
+ # standard multi-author ChangeLog format.
+ for (@coauthors)
+ {
+ s/^Co-authored-by:\s*/\t /;
+ s/\s* ;
+
+ /<.*?@.*\..*>/
+ or warn "$ME: warning: missing email address for "
+ . substr ($_, 5) . "\n";
+ }
+
+ # If clustering of commit messages has been disabled, if this header
+ # would be different from the previous date/name/etc. header,
+ # or if this or the previous entry consists of two or more paragraphs,
+ # then print the header.
+ if ( ! $cluster
+ || $date_line ne $prev_date_line
+ || "@coauthors" ne "@prev_coauthors"
+ || $multi_paragraph
+ || $prev_multi_paragraph)
+ {
+ $prev_date_line eq ''
+ or print "\n";
+ print $date_line;
+ @coauthors
+ and print join ("\n", @coauthors), "\n";
+ }
+ $prev_date_line = $date_line;
+ @prev_coauthors = @coauthors;
+ $prev_multi_paragraph = $multi_paragraph;
+
+ # If there were any lines
+ if (@line == 0)
+ {
+ warn "$ME: warning: empty commit message:\n $date_line\n";
+ }
+ else
+ {
+ if ($append_dot)
+ {
+ # If the first line of the message has enough room, then
+ if (length $line[0] < 72)
+ {
+ # append a dot if there is no other punctuation or blank
+ # at the end.
+ $line[0] =~ /[[:punct:]\s]$/
+ or $line[0] .= '.';
+ }
+ }
+
+ # Remove one additional leading TAB from each line.
+ $strip_tab
+ and map { s/^\t// } @line;
+
+ # Prefix each non-empty line with a TAB.
+ @line = map { length $_ ? "\t$_" : '' } @line;
+
+ print "\n", join ("\n", @line), "\n";
+ }
+ }
+
+ defined ($in = )
+ or last;
+ $in ne "\n"
+ and die "$ME:$.: unexpected line:\n$in";
+ }
+
+ close PIPE
+ or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n";
+ # FIXME-someday: include $PROCESS_STATUS in the diagnostic
+
+ # Complain about any unused entry in the --amend=F specified file.
+ my $fail = 0;
+ foreach my $sha (keys %$amend_code)
+ {
+ warn "$ME:$amend_file: unused entry: $sha\n";
+ $fail = 1;
+ }
+
+ exit $fail;
+}
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "my $VERSION = '"
+# time-stamp-format: "%:y-%02m-%02d %02H:%02M"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "'; # UTC"
+# End:
diff --git a/travis/update-change-log.sh b/travis/update-change-log.sh
new file mode 100755
index 0000000000..cfefd815bb
--- /dev/null
+++ b/travis/update-change-log.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+#
+# Figure out the new ChangeLog content (if any)
+#
+function get_change_log_update_text() {
+ echo "#--------------------------------------------------" >&2
+ echo "# BEGIN: get_change_log_update_text()" >&2
+
+ local bes_version_numbers=${1:-"NO_VERSION_FOUND"}
+ echo "# bes_version_numbers: ${bes_version_numbers}" >&2
+
+ #local hyrax_version_numbers=${2:-"1.16.8-0"}
+ #echo "# bes_version_numbers: ${bes_version_numbers}" >&2
+
+ local most_recent=$(grep -e "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" ChangeLog | head -1 | awk '{print $1;}')
+ echo "# most_recent: ${most_recent}" >&2
+
+
+ local update_text=$(./travis/gitlog-to-changelog --since="${most_recent}" )
+
+ # Make the log lines 72 chars max.
+ update_text=$(echo "${update_text}" | fold -s -w 72 | awk '{if(!match($0,"^[0-9]|^[\\t]")){printf("\t%s\n",$0);}else{print $0;}}' - )
+ echo "#--------------------------------------------------" >&2
+ echo "# Checking for duplicates" >&2
+ local dups=$( echo "${update_text}" | grep -n "${most_recent}";)
+ if test -n "${dups}"
+ then
+ echo "# Processing duplicates." >&2
+ # Find most recent dup.
+ local last_entry=$( echo "${dups}" | head -n 1 | awk '{split($1,a,":");print a[1]-1;}' ;)
+ echo "# last_entry: ${last_entry}" >&2
+ if test ${last_entry} -ne 0;
+ then
+ # Trim the update so that it ends before the most recent duplicate.
+ update_text=$(echo "${update_text}" | head -n ${last_entry})
+ else
+ update_text=
+ fi
+ else
+ echo "# No duplicates found." >&2
+ fi
+ echo "#--------------------------------------------------" >&2
+ echo "# update_text: " >&2
+ echo "${update_text}" | awk '{print "## "$0;}' >&2
+
+ if test -n "${update_text}"
+ then
+ echo "## -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --"
+ echo "##"
+ echo "## bes-${bes_version_numbers}"
+ #echo "## hyrax-${hyrax_version_numbers}"
+ echo "##"
+ echo ""
+ echo "${update_text}"
+ echo ""
+ fi
+}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# main()
+#
+# * Gets the ChangeLog update from "get_change_log_update_text BES_VERSION"
+# * If there is a non empty update then the ChangeLog file is updated.
+# * Commits the changes to git on the current branch with a [skip ci] message.
+# * Pushes the result to GitHub.
+#
+function main() {
+ echo "##################################################################################################" >&2
+ echo "#" >&2
+ echo "# BEGIN: $0" >&2
+ echo "#" >&2
+ #
+ export TRAVIS_BRANCH=${TRAVIS_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}
+ echo "# TRAVIS_BRANCH: ${TRAVIS_BRANCH}"
+ #
+ export BES_BUILD_NUMBER=${BES_BUILD_NUMBER:-""}
+ echo "# BES_BUILD_NUMBER: ${BES_BUILD_NUMBER}" >&2
+ #
+ export BES_VERSION=$(cat ./bes_VERSION)
+ BES_VERSION="${BES_VERSION}-${BES_BUILD_NUMBER}"
+ echo "# BES_VERSION: ${BES_VERSION}"
+ echo "#" >&2
+
+
+ change_log_update=$(get_change_log_update_text "${BES_VERSION}";)
+ if test -n "${change_log_update}"
+ then
+ tmp_file=$(mktemp)
+ echo "${change_log_update}" > "${tmp_file}"
+ cat ChangeLog >> "${tmp_file}"
+ mv "${tmp_file}" ChangeLog
+ echo "# ChangeLog:"
+ echo ChangeLog | awk '{print "## "$0;}'
+ echo "#"
+ echo "# Committing and pushing the new ChangeLog."
+ echo "#"
+ git checkout "${TRAVIS_BRANCH}"
+ #git commit -m "TheRobotTravis updated ChangeLog [skip ci]" ChangeLog
+ #git push
+ fi
+ echo "##################################################################################################" >&2
+ echo "# Committing and pushing the new ChangeLog."
+
+}
+
+main
\ No newline at end of file