From: Richard Russon Date: Tue, 13 Dec 2016 22:06:37 +0000 (+0000) Subject: build: generate devel version suffix X-Git-Tag: neomutt-20170113~24 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a0239ad6a142f5eb7030fbe4e11953053a038d70;p=neomutt build: generate devel version suffix 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 --- diff --git a/.gitignore b/.gitignore index 7d33fa417..c7184dff8 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,7 @@ mutt mutt_dotlock mutt_dotlock.c mutt_md5 -oldmutt_ver.h +git-ver.h patchlist.c pgpewrap pgpring diff --git a/Makefile.am b/Makefile.am index eb1350ad0..e94211867 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/commands.c b/commands.c index 9d6a4dc83..ce711d3bc 100644 --- a/commands.c +++ b/commands.c @@ -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) diff --git a/compose.c b/compose.c index 0c524ab6d..db4a0c38a 100644 --- 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: diff --git a/dotlock.c b/dotlock.c index 56a2bae66..6fe814449 100644 --- 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 ] 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 \tRetry locking" - "\n", stderr); - + "\n -r \tRetry locking" + "\n", stderr); + exit (DL_EX_ERROR); } diff --git a/git-version-gen b/git-version-gen deleted file mode 100755 index bd2c4b6b5..000000000 --- a/git-version-gen +++ /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 . - -# 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: diff --git a/globals.h b/globals.h index 8f556eba5..6423e98be 100644 --- 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 e42897659..27fff8798 100644 --- 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 diff --git a/muttlib.c b/muttlib.c index 8a1114d3d..c1719337b 100644 --- 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; } diff --git a/sendlib.c b/sendlib.c index 5441fa513..c1802a758 100644 --- 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); diff --git a/status.c b/status.c index ec090932c..4d1533dc0 100644 --- 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':