]> granicus.if.org Git - neomutt/commitdiff
build: generate devel version suffix
authorRichard Russon <rich@flatcap.org>
Tue, 13 Dec 2016 22:06:37 +0000 (22:06 +0000)
committerRichard Russon <rich@flatcap.org>
Wed, 14 Dec 2016 01:47:29 +0000 (01:47 +0000)
When developing, a typical version string might look like:

    NeoMutt 20161126-4-bee236-dirty (1.7.1)

Components:
- Date of last release
- Number of commits since release
- Git commit hash of last commit
- 'dirty' if there are uncommitted changes
- Upstream Mutt version

It's appended wherever a version string is displayed, e.g. "User-Agent:"

The version suffix (-4-bee236-dirty) is checked EVERY time you run make.
However, unlike the original version, changes will only require the
rebuilding of git-ver.c

To keep things simple for the downstream distros, there are some
limitations in place:

The NeoMutt date (20161126) and the upstream Mutt version (1.7.1) are
hard-coded into configure.ac and hence the Makefile.

The suffix will be empty if:
- git isn't present
- The source isn't in a git repo
- There aren't any "neomutt-*" tags

.gitignore
Makefile.am
commands.c
compose.c
dotlock.c
git-version-gen [deleted file]
globals.h
init.c
muttlib.c
sendlib.c
status.c

index 7d33fa4172cc6d6ec234d6a917b3a9e9f8ad2648..c7184dff8660573a0237b4f763c0526e93fdeac2 100644 (file)
@@ -51,7 +51,7 @@ mutt
 mutt_dotlock
 mutt_dotlock.c
 mutt_md5
-oldmutt_ver.h
+git-ver.h
 patchlist.c
 pgpewrap
 pgpring
index eb1350ad0ff59577452981ecd29572c03efef4ea..e94211867ab0f128d6ef870c809a43e6ab013948 100644 (file)
@@ -31,7 +31,7 @@ endif
 
 distdir = neo$(PACKAGE)-$(VERSION)
 
-BUILT_SOURCES = keymap_defs.h patchlist.c oldmutt_ver.h conststrings.c hcachever.sh $(HCVERSION) $(top_srcdir)/.version
+BUILT_SOURCES = keymap_defs.h patchlist.c git-ver.h conststrings.c hcachever.sh $(HCVERSION)
 
 bin_PROGRAMS = mutt $(DOTLOCK_TARGET) $(PGPAUX_TARGET)
 mutt_SOURCES = \
@@ -90,8 +90,7 @@ EXTRA_DIST = COPYRIGHT LICENSE.md OPS OPS.PGP OPS.CRYPT OPS.SMIME TODO UPDATING
        snprintf.c regex.c crypt-gpgme.h hcachever.sh.in \
        txt2c.c txt2c.sh version.h \
        hcache-backend.h hcache-bdb.c hcache-gdbm.c hcache-kc.c hcache-lmdb.c \
-       hcache-qdbm.c hcache-tc.c \
-       $(top_srcdir)/.version git-version-gen
+       hcache-qdbm.c hcache-tc.c
 
 EXTRA_SCRIPTS = smime_keys
 
@@ -146,9 +145,6 @@ ACLOCAL_AMFLAGS = -I m4
 
 LDADD = $(LIBOBJS) $(INTLLIBS)
 
-$(top_srcdir)/.version:
-       echo $(VERSION) > $@-t && mv $@-t $@
-
 dist-hook:
        echo $(VERSION) > $(distdir)/.tarball-version
 
@@ -165,16 +161,11 @@ keymap_alldefs.h: $(srcdir)/OPS $(srcdir)/OPS.SIDEBAR $(srcdir)/OPS.NOTMUCH $(sr
                $(srcdir)/OPS.MIX $(srcdir)/OPS.CRYPT $(srcdir)/OPS.SMIME \
                        > keymap_alldefs.h
 
-oldmutt_ver.h:
-       version="1.7.1" && \
-       echo 'const char *OldMuttVer = "'$$version'";' > oldmutt_ver.h.tmp; \
-       cmp -s oldmutt_ver.h.tmp oldmutt_ver.h || mv oldmutt_ver.h.tmp oldmutt_ver.h
-
-# reldate.h:
-#      date=`head -n 1 $(top_srcdir)/ChangeLog.neomutt | LC_ALL=C cut -b 1-10` && \
-#      echo 'const char *ReleaseDate = "'$$date'";' > reldate.h.tmp; \
-#      cmp -s reldate.h.tmp reldate.h || cp reldate.h.tmp reldate.h; \
-#      rm reldate.h.tmp
+git-ver.h:
+       @version=`git describe --dirty --abbrev=6 --match "neomutt-*" 2> /dev/null | sed -e 's/^neomutt-[0-9]\{8\}//' -e 's/g//'`; \
+       echo 'const char *GitVer = "'$$version'";' > git-ver.h.tmp; \
+       cmp -s git-ver.h.tmp git-ver.h || mv git-ver.h.tmp git-ver.h; \
+       rm -f git-ver.h.tmp
 
 # The '#undef ENABLE_NLS' is to work around an automake ordering issue:
 # BUILT_SOURCES are processed before SUBDIRS.
@@ -223,4 +214,4 @@ check-security:
 update-doc:
        (cd doc && $(MAKE) update-doc)
 
-.PHONY: commit pclean check-security
+.PHONY: commit pclean check-security git-ver.h
index 9d6a4dc83c97a9f97ee94a2ef68108d124d4defa..ce711d3bcc9d9dd4e0691be9aab0b9387a2efa5d 100644 (file)
@@ -939,7 +939,7 @@ int mutt_save_message (HEADER *h, int delete,
 
 void mutt_version (void)
 {
-  mutt_message ("NeoMutt %s (%s)", PACKAGE_VERSION, OldMuttVer);
+  mutt_message ("NeoMutt %s%s (%s)", PACKAGE_VERSION, GitVer, MUTT_VERSION);
 }
 
 void mutt_edit_content_type (HEADER *h, BODY *b, FILE *fp)
index 0c524ab6d2e23effab8ed98936bc7edd3cc77596..db4a0c38a316cc3fb69411af519b4adae7b9433c 100644 (file)
--- a/compose.c
+++ b/compose.c
@@ -501,8 +501,8 @@ compose_format_str (char *buf, size_t buflen, size_t col, int cols, char op, con
       break;
 
     case 'v':
-      snprintf (fmt, sizeof (fmt), "NeoMutt %%s");
-      snprintf (buf, buflen, fmt, PACKAGE_VERSION);
+      snprintf (fmt, sizeof (fmt), "NeoMutt %%s%%s");
+      snprintf (buf, buflen, fmt, PACKAGE_VERSION, GitVer);
       break;
 
     case 0:
index 56a2bae66ebecf6ad37a19c217bf59d18512657d..6fe814449aac13dbc3f02775d9498ade5430394f 100644 (file)
--- a/dotlock.c
+++ b/dotlock.c
@@ -53,7 +53,7 @@
 #endif
 
 #ifdef DL_STANDALONE
-# include "oldmutt_ver.h"
+#include "git-ver.h"
 #endif
 
 #define MAXLINKS 1024 /* maximum link depth */
@@ -339,22 +339,22 @@ END_PRIVILEGED (void)
 static void 
 usage (const char *av0)
 {
-  fprintf (stderr, "dotlock [NeoMutt %s (%s)]\n", PACKAGE_VERSION, OldMuttVer);
+  fprintf (stderr, "dotlock [NeoMutt %s%s (%s)]\n", PACKAGE_VERSION, GitVer, MUTT_VERSION);
   fprintf (stderr, "usage: %s [-t|-f|-u|-d] [-p] [-r <retries>] file\n",
-         av0);
+    av0);
 
   fputs ("\noptions:"
-       "\n  -t\t\ttry"
-       "\n  -f\t\tforce"
-       "\n  -u\t\tunlock"
-       "\n  -d\t\tunlink"
-       "\n  -p\t\tprivileged"
+  "\n  -t\t\ttry"
+  "\n  -f\t\tforce"
+  "\n  -u\t\tunlock"
+  "\n  -d\t\tunlink"
+  "\n  -p\t\tprivileged"
 #ifndef USE_SETGID
-       " (ignored)"
+  " (ignored)"
 #endif
-       "\n  -r <retries>\tRetry locking"
-       "\n", stderr);
-  
+  "\n  -r <retries>\tRetry locking"
+  "\n", stderr);
+
   exit (DL_EX_ERROR);
 }
 
diff --git a/git-version-gen b/git-version-gen
deleted file mode 100755 (executable)
index bd2c4b6..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-#!/bin/sh
-# Print a version string.
-scriptversion=2016-05-08.18; # UTC
-
-# Copyright (C) 2007-2016 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 <http://www.gnu.org/licenses/>.
-
-# This script is derived from GIT-VERSION-GEN from GIT: http://git.or.cz/.
-# It may be run two ways:
-# - from a git repository in which the "git describe" command below
-#   produces useful output (thus requiring at least one signed tag)
-# - from a non-git-repo directory containing a .tarball-version file, which
-#   presumes this script is invoked like "./git-version-gen .tarball-version".
-
-# In order to use intra-version strings in your project, you will need two
-# separate generated version string files:
-#
-# .tarball-version - present only in a distribution tarball, and not in
-#   a checked-out repository.  Created with contents that were learned at
-#   the last time autoconf was run, and used by git-version-gen.  Must not
-#   be present in either $(srcdir) or $(builddir) for git-version-gen to
-#   give accurate answers during normal development with a checked out tree,
-#   but must be present in a tarball when there is no version control system.
-#   Therefore, it cannot be used in any dependencies.  GNUmakefile has
-#   hooks to force a reconfigure at distribution time to get the value
-#   correct, without penalizing normal development with extra reconfigures.
-#
-# .version - present in a checked-out repository and in a distribution
-#   tarball.  Usable in dependencies, particularly for files that don't
-#   want to depend on config.h but do want to track version changes.
-#   Delete this file prior to any autoconf run where you want to rebuild
-#   files to pick up a version string change; and leave it stale to
-#   minimize rebuild time after unrelated changes to configure sources.
-#
-# As with any generated file in a VC'd directory, you should add
-# /.version to .gitignore, so that you don't accidentally commit it.
-# .tarball-version is never generated in a VC'd directory, so needn't
-# be listed there.
-#
-# Use the following line in your configure.ac, so that $(VERSION) will
-# automatically be up-to-date each time configure is run (and note that
-# since configure.ac no longer includes a version string, Makefile rules
-# should not depend on configure.ac for version updates).
-#
-# AC_INIT([GNU project],
-#         m4_esyscmd([build-aux/git-version-gen .tarball-version]),
-#         [bug-project@example])
-#
-# Then use the following lines in your Makefile.am, so that .version
-# will be present for dependencies, and so that .version and
-# .tarball-version will exist in distribution tarballs.
-#
-# EXTRA_DIST = $(top_srcdir)/.version
-# BUILT_SOURCES = $(top_srcdir)/.version
-# $(top_srcdir)/.version:
-#      echo $(VERSION) > $@-t && mv $@-t $@
-# dist-hook:
-#      echo $(VERSION) > $(distdir)/.tarball-version
-
-
-me=$0
-
-version="git-version-gen $scriptversion
-
-Copyright 2011 Free Software Foundation, Inc.
-There is NO warranty.  You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
-
-usage="\
-Usage: $me [OPTION]... \$srcdir/.tarball-version [TAG-NORMALIZATION-SED-SCRIPT]
-Print a version string.
-
-Options:
-
-   --prefix PREFIX    prefix of git tags (default 'v')
-   --fallback VERSION
-                      fallback version to use if \"git --version\" fails
-
-   --help             display this help and exit
-   --version          output version information and exit
-
-Running without arguments will suffice in most cases."
-
-prefix=v
-fallback=
-
-while test $# -gt 0; do
-  case $1 in
-    --help) echo "$usage"; exit 0;;
-    --version) echo "$version"; exit 0;;
-    --prefix) shift; prefix=${1?};;
-    --fallback) shift; fallback=${1?};;
-    -*)
-      echo "$0: Unknown option '$1'." >&2
-      echo "$0: Try '--help' for more information." >&2
-      exit 1;;
-    *)
-      if test "x$tarball_version_file" = x; then
-        tarball_version_file="$1"
-      elif test "x$tag_sed_script" = x; then
-        tag_sed_script="$1"
-      else
-        echo "$0: extra non-option argument '$1'." >&2
-        exit 1
-      fi;;
-  esac
-  shift
-done
-
-if test "x$tarball_version_file" = x; then
-    echo "$usage"
-    exit 1
-fi
-
-tag_sed_script="${tag_sed_script:-s/x/x/}"
-
-nl='
-'
-
-# Avoid meddling by environment variable of the same name.
-v=
-v_from_git=
-
-# First see if there is a tarball-only version file.
-# then try "git describe", then default.
-if test -f $tarball_version_file
-then
-    v=`cat $tarball_version_file` || v=
-    case $v in
-        *$nl*) v= ;; # reject multi-line output
-        [0-9]*) ;;
-        *) v= ;;
-    esac
-    test "x$v" = x \
-        && echo "$0: WARNING: $tarball_version_file is missing or damaged" 1>&2
-fi
-
-if test "x$v" != x
-then
-    : # use $v
-# Otherwise, if there is at least one git commit involving the working
-# directory, and "git describe" output looks sensible, use that to
-# derive a version string.
-elif test "`git log -1 --pretty=format:x . 2>&1`" = x \
-    && v=`git describe --abbrev=4 --match="$prefix*" HEAD 2>/dev/null \
-          || git describe --abbrev=4 HEAD 2>/dev/null` \
-    && v=`printf '%s\n' "$v" | sed "$tag_sed_script"` \
-    && case $v in
-         $prefix[0-9]*) ;;
-         *) (exit 1) ;;
-       esac
-then
-    # Is this a new git that lists number of commits since the last
-    # tag or the previous older version that did not?
-    #   Newer: v6.10-77-g0f8faeb
-    #   Older: v6.10-g0f8faeb
-    case $v in
-        *-*-*) : git describe is okay three part flavor ;;
-        *-*)
-            : git describe is older two part flavor
-            # Recreate the number of commits and rewrite such that the
-            # result is the same as if we were using the newer version
-            # of git describe.
-            vtag=`echo "$v" | sed 's/-.*//'`
-            commit_list=`git rev-list "$vtag"..HEAD 2>/dev/null` \
-                || { commit_list=failed;
-                     echo "$0: WARNING: git rev-list failed" 1>&2; }
-            numcommits=`echo "$commit_list" | wc -l`
-            v=`echo "$v" | sed "s/\(.*\)-\(.*\)/\1-$numcommits-\2/"`;
-            test "$commit_list" = failed && v=UNKNOWN
-            ;;
-    esac
-
-    # Change the first '-' to a '.', so version-comparing tools work properly.
-    # Remove the "g" in git describe's output string, to save a byte.
-    v=`echo "$v" | sed 's/-/./;s/\(.*\)-g/\1-/'`;
-    v_from_git=1
-elif test "x$fallback" = x || git --version >/dev/null 2>&1; then
-    v=UNKNOWN
-else
-    v=$fallback
-fi
-
-v=`echo "$v" |sed "s/^$prefix//"`
-
-# Test whether to append the "-dirty" suffix only if the version
-# string we're using came from git.  I.e., skip the test if it's "UNKNOWN"
-# or if it came from .tarball-version.
-if test "x$v_from_git" != x; then
-  # Don't declare a version "dirty" merely because a time stamp has changed.
-  git update-index --refresh > /dev/null 2>&1
-
-  dirty=`exec 2>/dev/null;git diff-index --name-only HEAD` || dirty=
-  case "$dirty" in
-      '') ;;
-      *) # Append the suffix only if there isn't one already.
-          case $v in
-            *-dirty) ;;
-            *) v="$v-dirty" ;;
-          esac ;;
-  esac
-fi
-
-# Omit the trailing newline, so that m4_esyscmd can use the result directly.
-printf %s "$v"
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
-# time-stamp-end: "; # UTC"
-# End:
index 8f556eba5325140931b7398b5990bea509cd02ef..6423e98be7ae920ec69d4f2feb55ef17e525e843 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -175,7 +175,7 @@ WHERE char *CurrentFolder;
 WHERE char *LastFolder;
 
 
-WHERE const char *OldMuttVer;
+WHERE const char *GitVer;
 
 WHERE HASH *Groups;
 WHERE HASH *Labels;
@@ -342,5 +342,5 @@ extern const char * const Months[];
 #include "buffy.h"
 #include "sort.h"
 #include "mutt_crypt.h"
-#include "oldmutt_ver.h"
+#include "git-ver.h"
 #endif /* MAIN_C */
diff --git a/init.c b/init.c
index e428976594148f937c71e5a3f997d730c19f0665..27fff8798789116beb72930c546528d9a1ebe846 100644 (file)
--- a/init.c
+++ b/init.c
@@ -3188,7 +3188,7 @@ static void start_debug (void)
   {
     setbuf (debugfile, NULL); /* don't buffer the debugging output! */
     dprint(1,(debugfile,"NeoMutt/%s (%s) debugging at level %d\n",
-                               PACKAGE_VERSION, OldMuttVer, debuglevel));
+                               PACKAGE_VERSION, MUTT_VERSION, debuglevel));
   }
 }
 #endif
index 8a1114d3dc0ca7a1f85d4089e552408b4f88e28a..c1719337be94f1ab65125b70e7d1f926bb4517c2 100644 (file)
--- a/muttlib.c
+++ b/muttlib.c
@@ -2011,8 +2011,8 @@ void mutt_set_mtime (const char* from, const char* to)
 const char *mutt_make_version (void)
 {
   static char vstring[STRING];
-  snprintf (vstring, sizeof (vstring), "NeoMutt %s (%s)",
-           PACKAGE_VERSION, OldMuttVer);
+  snprintf (vstring, sizeof (vstring), "NeoMutt %s%s (%s)",
+           PACKAGE_VERSION, GitVer, MUTT_VERSION);
   return vstring;
 }
 
index 5441fa5136044ca5669a9fa8b807b40994a13cd8..c1802a7584cab977fe1f9cdf6d9bbcfcd59ac524 100644 (file)
--- a/sendlib.c
+++ b/sendlib.c
@@ -2122,7 +2122,7 @@ int mutt_write_rfc822_header (FILE *fp, ENVELOPE *env, BODY *attach,
   if (mode == 0 && !privacy && option (OPTXMAILER) && !has_agent)
   {
     /* Add a vanity header */
-    fprintf (fp, "User-Agent: NeoMutt/%s (%s)\n", PACKAGE_VERSION, OldMuttVer);
+    fprintf (fp, "User-Agent: NeoMutt/%s%s (%s)\n", PACKAGE_VERSION, GitVer, MUTT_VERSION);
   }
 
   return (ferror (fp) == 0 ? 0 : -1);
index ec090932c49fda99ea59cab2cb47c8735d6ffe49..4d1533dc0a1ce1e3ec0a98aac45c27d45c28a018 100644 (file)
--- a/status.c
+++ b/status.c
@@ -285,8 +285,8 @@ status_format_str (char *buf, size_t buflen, size_t col, int cols, char op, cons
       break;
 
     case 'v':
-      snprintf (fmt, sizeof (fmt), "NeoMutt %%s");
-      snprintf (buf, buflen, fmt, PACKAGE_VERSION);
+      snprintf (fmt, sizeof (fmt), "NeoMutt %%s%%s");
+      snprintf (buf, buflen, fmt, PACKAGE_VERSION, GitVer);
       break;
 
     case 'V':