diff --git a/maint/Makefile.am b/maint/Makefile.am index a08de40c9a..bb129efb7e 100644 --- a/maint/Makefile.am +++ b/maint/Makefile.am @@ -1,92 +1,102 @@ # # Copyright 2019-2022 the Pacemaker project contributors # # The version control history for this file may have further details. # # This source code is licensed under the GNU General Public License version 2 # or later (GPLv2+) WITHOUT ANY WARRANTY. # # Define release-related variables include $(abs_srcdir)/../mk/release.mk noinst_SCRIPTS = bumplibs EXTRA_DIST = README # # Change log generation # # Count changes in these directories CHANGELOG_DIRS = ../include ../lib ../daemons ../tools ../xml +.PHONY: require_last_release +require_last_release: + @if [ -z "$(CHECKOUT)" ]; then \ + echo "This target must be run from a git checkout"; \ + exit 1; \ + elif ! git rev-parse $(LAST_RELEASE) >/dev/null 2>&1; then \ + echo "LAST_RELEASE must be set to a valid git tag"; \ + exit 1; \ + fi + .PHONY: summary -summary: +summary: require_last_release @printf "\n* `date +"%a %b %d %Y"` `git config user.name` <`git config user.email`> $(NEXT_RELEASE)" @printf "\n- Changesets: `git log --pretty=oneline --no-merges $(LAST_RELEASE)..HEAD | wc -l`" @printf "\n- Diff:`git diff $(LAST_RELEASE)..HEAD --shortstat $(CHANGELOG_DIRS)`\n" .PHONY: changes changes: summary @printf "\n- Features added since $(LAST_RELEASE)\n" @git log --pretty=format:'%s' --no-merges --abbrev-commit $(LAST_RELEASE)..HEAD \ | sed -n -e 's/^ *Feature: */ + /p' | sort -uf @printf "\n- Fixes since $(LAST_RELEASE)\n" @git log --pretty=format:'%s' --no-merges --abbrev-commit $(LAST_RELEASE)..HEAD \ | sed -n -e 's/^ *\(Fix\|High\|Bug\): */ + /p' | sed \ -e 's@\(cib\|pacemaker-based\|based\):@CIB:@' \ -e 's@\(crmd\|pacemaker-controld\|controld\):@controller:@' \ -e 's@\(lrmd\|pacemaker-execd\|execd\):@executor:@' \ -e 's@\(Fencing\|stonithd\|stonith\|pacemaker-fenced\|fenced\):@fencing:@' \ -e 's@\(PE\|pengine\|pacemaker-schedulerd\|schedulerd\):@scheduler:@' \ | sort -uf @printf "\n- Public API changes since $(LAST_RELEASE)\n" @git log --pretty=format:'%s' --no-merges --abbrev-commit $(LAST_RELEASE)..HEAD \ | sed -n -e 's/^ *API: */ + /p' | sort -uf .PHONY: rc-changes rc-changes: @$(MAKE) $(AM_MAKEFLAGS) NEXT_RELEASE=$(shell echo $(LAST_RC) | sed s:-rc.*::) LAST_RELEASE=$(LAST_RC) changes .PHONY: authors -authors: +authors: require_last_release git log $(LAST_RELEASE)..$(COMMIT) --format='%an' | sort -u .PHONY: changelog -changelog: +changelog: require_last_release @$(MAKE) $(AM_MAKEFLAGS) changes > ../ChangeLog @printf "\n">> ../ChangeLog git show $(LAST_RELEASE):ChangeLog >> ../ChangeLog # # gnulib updates # # See https://www.gnu.org/software/gnulib/manual/html_node/ # # V3 = scandir unsetenv alphasort xalloc # V2 = setenv strerror strchrnul strndup GNU_MODS = crypto/md5-buffer # stdint appears to be surrogate only for C99-lacking environments GNU_MODS_AVOID = stdint .PHONY: gnulib-update gnulib-update: @echo 'Newer versions of gnulib require automake 1.14' @echo 'Pacemaker cannot update until minimum supported automake is 1.14' @exit 1 if test -e gnulib; then \ cd gnulib && git pull; \ else \ git clone https://git.savannah.gnu.org/git/gnulib.git gnulib \ && cd gnulib && git config pull.rebase false; \ fi cd $(top_srcdir) && maint/gnulib/gnulib-tool --source-base=lib/gnu \ --lgpl=2 --no-vc-files --no-conditional-dependencies --libtool \ $(GNU_MODS_AVOID:%=--avoid %) --import $(GNU_MODS) sed -i -e "s/bundled(gnulib).*/bundled(gnulib) = `date +'%Y%m%d'`/" \ ../rpm/pacemaker.spec.in sed -i -e "s/_GL_EXTERN_INLINE/_GL_INLINE/" \ -e "s#left_over -= 64;#left_over \&= 63; /* helps static analysis */#" \ -e "s#&ctx->buffer\[16\]#\&(((char *) ctx->buffer)[64]) /* helps static analysis */#" \ ../lib/gnu/md5.c diff --git a/mk/release.mk b/mk/release.mk index 9bf9651504..34042cd27a 100644 --- a/mk/release.mk +++ b/mk/release.mk @@ -1,87 +1,86 @@ # # Copyright 2008-2022 the Pacemaker project contributors # # The version control history for this file may have further details. # # This source code is licensed under the GNU General Public License version 2 # or later (GPLv2+) WITHOUT ANY WARRANTY. # # Define variables related to release version and such COMMIT ?= HEAD # TAG defaults to DIST when in a source distribution instead of a git checkout, # the tag name if COMMIT is tagged, and the full commit ID otherwise. TAG ?= $(shell \ T=$$(git describe --tags --exact-match '$(COMMIT)' 2>/dev/null); \ [ -n "$${T}" ] && echo "$${T}" \ || git log --pretty=format:%H -n 1 '$(COMMIT)' 2>/dev/null \ || echo DIST) # If DIRTY=anything is passed to make, generated versions will end in ".mod" # as long as there are uncommitted changes and COMMIT is not changed from the # default. DIRTY_EXT = $(shell [ -n "$(DIRTY)" ] \ && [ "$(COMMIT)" == "HEAD" ] \ && ! git diff-index --quiet HEAD -- 2>/dev/null \ && echo .mod) # These can be used in case statements to avoid make interpreting parentheses lparen = ( rparen = ) # git tag of highest-versioned release candidate (such as "Pacemaker-2.1.5-rc2") # or empty if not in git checkout LAST_RC ?= $(shell git tag -l 2>/dev/null \ | sed -n -e 's/^\(Pacemaker-[0-9.]*-rc[0-9]*\)$$/\1/p' \ | sort -Vr | head -n 1) -# true if in a git checkout -CHECKOUT = $(shell git rev-parse --git-dir >/dev/null 2>/dev/null \ - && echo true) +# This will be empty if not in a git checkout +CHECKOUT = $(shell git rev-parse --git-dir 2>/dev/null) # VERSION is set by configure, but we allow some make targets to be run without # running configure first, so set a reasonable default in that case. VERSION ?= $(shell if [ -z "$(CHECKOUT)" ]; then \ echo 0.0.0; \ else \ git tag -l \ | sed -n -e 's/^\(Pacemaker-[0-9.]*\)$$/\1/p' \ | sort -Vr | head -n 1; \ fi) # What the git tag would be for configured VERSION (such as "Pacemaker-2.1.5") LAST_RELEASE ?= Pacemaker-$(VERSION) # What the git tag would be for configured VERSION with minor-minor version bump # (such as "Pacemaker-2.1.6"; this should be manually overriden when bumping # the major or minor version) NEXT_RELEASE ?= $(shell echo $(LAST_RELEASE) \ | awk -F. '/[0-9]+\./{$$3+=1;OFS=".";print $$1,$$2,$$3}') # We have two make targets for creating distributions: # # - "make dist" is automake's native functionality, based on the various # dist/nodist make variables; it always uses the current sources # # - "make export" is a custom target based on "git archive" and relevant # entries from .gitattributes; it defaults to current sources but can use any # git tag # # Both targets use the same name for the result, though they generate different # contents. # # The directory is named pacemaker- when in a source distribution # instead of a git checkout, pacemaker- for tagged # commits, and pacemaker- otherwise. top_distdir = $(PACKAGE)-$(shell \ case $(TAG) in \ DIST$(rparen) \ [ -n "$(VERSION)" ] && echo "$(VERSION)" \ || echo DIST;; \ Pacemaker-*$(rparen) \ echo '$(TAG)' | cut -c11-;; \ *$(rparen) \ git log --pretty=format:%h -n 1 '$(TAG)';; \ esac)$(DIRTY_EXT)