A git-only SBCL workflow
[sbcl.git] / generate-version.sh
1 #!/bin/sh
2 # Not a shell script, but something intended to be sourced from shell scripts
3 git_available_p() {
4     # Check that (1) we have git (2) this is a git tree.
5     (which git >/dev/null 2>/dev/null && git describe >/dev/null 2>/dev/null)
6 }
7
8 generate_version() {
9     if ([ -f version.lisp-expr ] && ! git_available_p)
10     then
11         # Relase tarball, leave version.lisp-expr alone.
12         return
13     elif ! git_available_p
14     then
15         echo "Can't run 'git describe' and version.lisp-expr is missing." >&2
16         echo "To fix this, either install git or create a fake version.lisp-expr file." >&2
17         echo "You can create a fake version.lisp-expr file like this:" >&2
18         echo "    \$ echo '\"1.0.99.999\"' > version.lisp-expr" >&2
19         exit 1
20     fi
21     # Build it.
22     version_head=$(git rev-parse HEAD)
23     if [ -z "$SBCL_BUILDING_RELEASE_FROM" ]
24     then
25         version_root="origin/master"
26     else
27         version_root="$SBCL_BUILDING_RELEASE_FROM"
28     fi
29     version_base=$(git rev-parse "$version_root")
30     version_tag=`git describe --tags --match="sbcl*" --abbrev=0 $version_base`
31     version_release=`echo $version_tag | sed -e 's/sbcl[_-]//' | sed -e 's/_/\./g'`
32     version_n_root=`git rev-list $version_base --not $version_tag --count`
33     version_n_branch=`git rev-list HEAD --not $version_base --count`
34     if [ -z "$NO_GIT_HASH_IN_VERSION" ]
35     then
36         version_hash="-`git rev-parse --short $version_head`"
37     else
38         version_hash=""
39     fi
40     if git diff HEAD --no-ext-diff --quiet --exit-code
41     then
42         version_dirty=""
43     else
44         version_dirty="-dirty"
45     fi
46     # Now that we have all the pieces, put them together.
47     cat >version.lisp-expr <<EOF
48 ;;; This file is auto-generated using generate-version.sh. Every time
49 ;;; you re-run make.sh, this file will be overwritten if you are
50 ;;; working from a Git checkout.
51 EOF
52     if [ "$version_base" = "$version_head" ]
53     then
54         if [ "0" = "$version_n_root" ]
55         then
56             printf "\"%s%s\"\n" \
57                 $version_release $version_dirty >>version.lisp-expr
58         else
59             printf "\"%s.%s%s%s\"\n" \
60                 $version_release $version_n_root \
61                 $version_hash $version_dirty >>version.lisp-expr
62         fi
63     else
64         echo "base=$version_base"
65         echo "head=$version_head"
66         version_branchname=`git describe --contains --all HEAD`
67         printf "\"%s.%s.%s.%s%s%s\"\n" \
68             $version_release $version_n_root \
69             $version_branchname $version_n_branch \
70             $version_hash $version_dirty >>version.lisp-expr
71     fi
72 }