diff options
-rw-r--r-- | Makefile | 45 | ||||
-rw-r--r-- | Makefile.win | 45 | ||||
-rwxr-xr-x | build-aux/couchdb-build-release.sh | 6 | ||||
-rw-r--r-- | src/chttpd/src/chttpd_misc.erl | 1 | ||||
-rw-r--r-- | src/chttpd/test/chttpd_welcome_test.erl | 2 | ||||
-rw-r--r-- | src/couch/rebar.config.script | 8 | ||||
-rw-r--r-- | src/couch/src/couch_server.erl | 3 |
7 files changed, 96 insertions, 14 deletions
@@ -13,20 +13,49 @@ include version.mk REBAR?=$(shell echo `pwd`/bin/rebar) + +# Handle the following scenarios: +# 1. When building from a tarball, use version.mk. +# 2. When building from a clean release tag (#.#.#), use that tag. +# 3. When building from a clean RC tag (#.#.#-RC#), use JUST the version +# number inside the tarball, but use the full name for the name of the +# tarball itself. +# 4. When not on a clean tag, use version.mk + git sha + dirty status. + +COUCHDB_GIT_SHA=$(git_sha) + IN_RELEASE = $(shell if [ ! -d .git ]; then echo true; fi) ifeq ($(IN_RELEASE), true) + +# 1. Building from tarball, use version.mk. COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch) + else -# IN_RC generates a tarball that has the -RCx suffix in the name if needed + +# Gather some additional information. +# We do it this way so we don't bake shell-isms into Makefile +# to make it easier to port to Windows. I know, I know. -jst +# IN_RC contains the -RCx suffix in the name if present IN_RC = $(shell git describe --tags --always --first-parent \ - | grep -Eo -- '-RC[0-9]+' 2>/dev/null) -RELTAG = $(shell git describe --dirty --abbrev=0 --tags --always --first-parent \ - | grep -Eo '^[0-9]+\.[0-9]\.[0-9]+') -ifeq ($(RELTAG),) -COUCHDB_VERSION_SUFFIX = $(shell git rev-parse --short --verify HEAD) + | grep -Eo -- '-RC[0-9]+' 2>/dev/null) +# ON_TAG matches *ONLY* if we are on a release or RC tag +ON_TAG = $(shell git describe --tags --always --first-parent \ + | grep -Eo -- '^[0-9]+\.[0-9]\.[0-9]+(-RC[0-9]+)?$$' 2>/dev/null) +# RELTAG contains the #.#.# from git describe, which might be used +RELTAG = $(shell git describe --tags --always --first-parent \ + | grep -Eo -- '^[0-9]+\.[0-9]\.[0-9]+' 2>/dev/null) +# DIRTY identifies if we're not on a commit +DIRTY = $(shell git describe --dirty | grep -Eo -- '-dirty' 2>/dev/null) +# COUCHDB_GIT_SHA is our current git hash. +COUCHDB_GIT_SHA=$(shell git rev-parse --short --verify HEAD) + +ifeq ($(ON_TAG),) +# 4. Not on a tag. +COUCHDB_VERSION_SUFFIX = $(COUCHDB_GIT_SHA)$(DIRTY) COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)-$(COUCHDB_VERSION_SUFFIX) else -COUCHDB_VERSION = $(RELTAG) +# 2 and 3. On a tag. +COUCHDB_VERSION = $(RELTAG)$(DIRTY) endif endif @@ -82,7 +111,7 @@ help: .PHONY: couch # target: couch - Build CouchDB core, use ERL_OPTS to provide custom compiler's options couch: config.erl - @COUCHDB_VERSION=$(COUCHDB_VERSION) $(REBAR) compile $(COMPILE_OPTS) + @COUCHDB_VERSION=$(COUCHDB_VERSION) COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) $(REBAR) compile $(COMPILE_OPTS) @cp src/couch/priv/couchjs bin/ diff --git a/Makefile.win b/Makefile.win index 5a2a73ab1..67c15fc69 100644 --- a/Makefile.win +++ b/Makefile.win @@ -14,13 +14,50 @@ include version.mk SHELL=cmd.exe REBAR?=$(shell where rebar.cmd) + +# Handle the following scenarios: +# 1. When building from a tarball, use version.mk. +# 2. When building from a clean release tag (#.#.#), use that tag. +# 3. When building from a clean RC tag (#.#.#-RC#), use JUST the version +# number inside the tarball, but use the full name for the name of the +# tarball itself. +# 4. When not on a clean tag, use version.mk + git sha + dirty status. + +COUCHDB_GIT_SHA=$(git_sha) IN_RELEASE = $(shell if not exist .git echo true) + ifeq ($(IN_RELEASE), true) -COUCHDB_VERSION_SUFFIX= + +# 1. Building from tarball, use version.mk. COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch) + +else + +# Gather some additional information. +# We do it this way so we don't bake shell-isms into Makefile +# to make it easier to port to Windows. I know, I know. -jst +# COUCHDB_GIT_SHA is our current git hash. +COUCHDB_GIT_SHA=$(shell git rev-parse --short --verify HEAD) +# IN_RC contains the -RCx suffix in the name if present +IN_RC = $(shell git describe --tags --always --first-parent \ + | grep -Eo -- '-RC[0-9]+' 2>/dev/null) +# ON_TAG matches *ONLY* if we are on a release or RC tag +ON_TAG = $(shell git describe --tags --always --first-parent \ + | grep -Eo -- '^[0-9]+\.[0-9]\.[0-9]+(-RC[0-9]+)?$$' 2>/dev/null) +# RELTAG contains the #.#.# from git describe, which might be used +RELTAG = $(shell git describe --tags --always --first-parent \ + | grep -Eo -- '^[0-9]+\.[0-9]\.[0-9]+' 2>/dev/null) +# DIRTY identifies if we're not on a commit +DIRTY = $(shell git describe --dirty | grep -Eo -- '-dirty' 2>/dev/null) + +ifeq ($(ON_TAG),) +# 4. Not on a tag. +COUCHDB_VERSION_SUFFIX = $(COUCHDB_GIT_SHA)$(DIRTY) +COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)-$(COUCHDB_VERSION_SUFFIX) else -COUCHDB_VERSION_SUFFIX = -$(shell git rev-parse --short --verify HEAD) -COUCHDB_VERSION = $(vsn_major).$(vsn_minor).$(vsn_patch)$(COUCHDB_VERSION_SUFFIX) +# 2 and 3. On a tag. +COUCHDB_VERSION = $(RELTAG)$(DIRTY) +endif endif DESTDIR= @@ -53,7 +90,7 @@ all: couch fauxton docs .PHONY: couch # target: couch - Build CouchDB core couch: config.erl - @set COUCHDB_VERSION=$(COUCHDB_VERSION) && $(REBAR) compile + @set COUCHDB_VERSION=$(COUCHDB_VERSION) && set COUCHDB_GIT_SHA=$(COUCHDB_GIT_SHA) && $(REBAR) compile @copy src\couch\priv\couchjs.exe bin diff --git a/build-aux/couchdb-build-release.sh b/build-aux/couchdb-build-release.sh index 4482b713c..2d219e5e4 100755 --- a/build-aux/couchdb-build-release.sh +++ b/build-aux/couchdb-build-release.sh @@ -35,8 +35,12 @@ done cd .. -# create CONTRIBUTORS file + if test -e .git; then + # save git sha in version.mk + git_sha=`git rev-parse --short HEAD` + echo "git_sha=$git_sha" >> $RELDIR/version.mk + # create CONTRIBUTORS file OS=`uname -s` case "$OS" in Linux|CYGWIN*) # GNU sed diff --git a/src/chttpd/src/chttpd_misc.erl b/src/chttpd/src/chttpd_misc.erl index 95345d42b..596e0142b 100644 --- a/src/chttpd/src/chttpd_misc.erl +++ b/src/chttpd/src/chttpd_misc.erl @@ -49,6 +49,7 @@ handle_welcome_req(#httpd{method='GET'}=Req, WelcomeMessage) -> send_json(Req, {[ {couchdb, WelcomeMessage}, {version, list_to_binary(couch_server:get_version())}, + {git_sha, list_to_binary(couch_server:get_git_sha())}, {features, config:features()} ] ++ case config:get("vendor") of [] -> diff --git a/src/chttpd/test/chttpd_welcome_test.erl b/src/chttpd/test/chttpd_welcome_test.erl index af9732f57..b737abd7a 100644 --- a/src/chttpd/test/chttpd_welcome_test.erl +++ b/src/chttpd/test/chttpd_welcome_test.erl @@ -60,6 +60,8 @@ should_have_version(Url) -> Version = couch_util:get_value(<<"version">>, Json, undefined), CouchDB = couch_util:get_value(<<"couchdb">>, Json, undefined), Features = couch_util:get_value(<<"features">>, Json, undefined), + Sha = couch_util:get_value(<<"git_sha">>, Json, undefined), + ?assertNotEqual(Sha, undefined), ?assertEqual(<<"Welcome">>, CouchDB), RealVersion = list_to_binary(couch_server:get_version()), ?assertEqual(RealVersion, Version), diff --git a/src/couch/rebar.config.script b/src/couch/rebar.config.script index fe249d0dd..fe7383c18 100644 --- a/src/couch/rebar.config.script +++ b/src/couch/rebar.config.script @@ -39,6 +39,13 @@ Version = case os:getenv("COUCHDB_VERSION") of string:strip(Version0, right) end, +GitSha = case os:getenv("COUCHDB_GIT_SHA") of + false -> + ""; % release builds won’t get a fallback + GitSha0 -> + string:strip(GitSha0, right) +end, + CouchConfig = case filelib:is_file(os:getenv("COUCHDB_CONFIG")) of true -> {ok, Result} = file:consult(os:getenv("COUCHDB_CONFIG")), @@ -149,6 +156,7 @@ AddConfig = [ {port_specs, PortSpecs}, {erl_opts, PlatformDefines ++ [ {d, 'COUCHDB_VERSION', Version}, + {d, 'COUCHDB_GIT_SHA', GitSha}, {i, "../"} ] ++ MD5Config}, {eunit_compile_opts, PlatformDefines} diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl index 002f08ebb..ede8227c8 100644 --- a/src/couch/src/couch_server.erl +++ b/src/couch/src/couch_server.erl @@ -15,7 +15,7 @@ -behaviour(config_listener). -vsn(3). --export([open/2,create/2,delete/2,get_version/0,get_version/1,get_uuid/0]). +-export([open/2,create/2,delete/2,get_version/0,get_version/1,get_git_sha/0,get_uuid/0]). -export([all_databases/0, all_databases/2]). -export([init/1, handle_call/3,sup_start_link/0]). -export([handle_cast/2,code_change/3,handle_info/2,terminate/2]). @@ -57,6 +57,7 @@ get_version(short) -> [Version|_Rest] = string:tokens(get_version(), "+"), Version. +get_git_sha() -> ?COUCHDB_GIT_SHA. get_uuid() -> case config:get("couchdb", "uuid", undefined) of |