Blame view

scripts/setlocalversion 3.93 KB
881a87ecb   Wolfgang Denk   Add GIT version i...
1
  #!/bin/sh
a7b391853   Kyle Moffett   tools/setlocalver...
2
3
4
5
6
7
8
  #
  # This scripts adds local version information from the version
  # control systems git, mercurial (hg) and subversion (svn).
  #
  # It was originally copied from the Linux kernel v3.2.0-rc4 and modified
  # to support the U-Boot build-system.
  #
881a87ecb   Wolfgang Denk   Add GIT version i...
9
10
  
  usage() {
a7b391853   Kyle Moffett   tools/setlocalver...
11
  	echo "Usage: $0 [--save-scmversion] [srctree]" >&2
881a87ecb   Wolfgang Denk   Add GIT version i...
12
13
  	exit 1
  }
a7b391853   Kyle Moffett   tools/setlocalver...
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  scm_only=false
  srctree=.
  if test "$1" = "--save-scmversion"; then
  	scm_only=true
  	shift
  fi
  if test $# -gt 0; then
  	srctree=$1
  	shift
  fi
  if test $# -gt 0 -o ! -d "$srctree"; then
  	usage
  fi
  
  scm_version()
  {
  	local short
  	short=false
  
  	cd "$srctree"
  	if test -e .scmversion; then
  		cat .scmversion
  		return
  	fi
  	if test "$1" = "--short"; then
  		short=true
  	fi
  
  	# Check for git and a git repo.
  	if test -e .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
  
  		# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
  		# it, because this version is defined in the top level Makefile.
  		if [ -z "`git describe --exact-match 2>/dev/null`" ]; then
  
  			# If only the short version is requested, don't bother
  			# running further git commands
  			if $short; then
  				echo "+"
  				return
  			fi
  			# If we are past a tagged commit (like
  			# "v2.6.30-rc5-302-g72357d5"), we pretty print it.
  			if atag="`git describe 2>/dev/null`"; then
  				echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
  
  			# If we don't have a tag at all we print -g{commitish}.
  			else
  				printf '%s%s' -g $head
  			fi
  		fi
  
  		# Is this git on svn?
  		if git config --get svn-remote.svn.url >/dev/null; then
  			printf -- '-svn%s' "`git svn find-rev $head`"
  		fi
  
  		# Update index only on r/w media
  		[ -w . ] && git update-index --refresh --unmerged > /dev/null
  
  		# Check for uncommitted changes
  		if git diff-index --name-only HEAD | grep -v "^scripts/package" \
  		    | read dummy; then
  			printf '%s' -dirty
  		fi
881a87ecb   Wolfgang Denk   Add GIT version i...
79

a7b391853   Kyle Moffett   tools/setlocalver...
80
81
  		# All done with git
  		return
881a87ecb   Wolfgang Denk   Add GIT version i...
82
  	fi
a7b391853   Kyle Moffett   tools/setlocalver...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  	# Check for mercurial and a mercurial repo.
  	if test -d .hg && hgid=`hg id 2>/dev/null`; then
  		# Do we have an tagged version?  If so, latesttagdistance == 1
  		if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
  			id=`hg log -r . --template '{latesttag}'`
  			printf '%s%s' -hg "$id"
  		else
  			tag=`printf '%s' "$hgid" | cut -d' ' -f2`
  			if [ -z "$tag" -o "$tag" = tip ]; then
  				id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
  				printf '%s%s' -hg "$id"
  			fi
  		fi
  
  		# Are there uncommitted changes?
  		# These are represented by + after the changeset id.
  		case "$hgid" in
  			*+|*+\ *) printf '%s' -dirty ;;
  		esac
  
  		# All done with mercurial
  		return
881a87ecb   Wolfgang Denk   Add GIT version i...
105
  	fi
92bad20ad   Mike Frysinger   Add support for u...
106

a7b391853   Kyle Moffett   tools/setlocalver...
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  	# Check for svn and a svn repo.
  	if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
  		rev=`echo $rev | awk '{print $NF}'`
  		printf -- '-svn%s' "$rev"
  
  		# All done with svn
  		return
  	fi
  }
  
  collect_files()
  {
  	local file res
  
  	for file; do
  		case "$file" in
  		*\~*)
  			continue
  			;;
  		esac
  		if test -e "$file"; then
  			res="$res$(cat "$file")"
  		fi
  	done
  	echo "$res"
  }
  
  if $scm_only; then
  	if test ! -e .scmversion; then
  		res=$(scm_version)
  		echo "$res" >.scmversion
92bad20ad   Mike Frysinger   Add support for u...
138
  	fi
a7b391853   Kyle Moffett   tools/setlocalver...
139
  	exit
881a87ecb   Wolfgang Denk   Add GIT version i...
140
  fi
92bad20ad   Mike Frysinger   Add support for u...
141

a7b391853   Kyle Moffett   tools/setlocalver...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  #if test -e include/config/auto.conf; then
  #	. include/config/auto.conf
  #else
  #	echo "Error: kernelrelease not valid - run 'make prepare' to update it"
  #	exit 1
  #fi
  CONFIG_LOCALVERSION=
  CONFIG_LOCALVERSION_AUTO=y
  
  # localversion* files in the build and source directory
  res="$(collect_files localversion*)"
  if test ! "$srctree" -ef .; then
  	res="$res$(collect_files "$srctree"/localversion*)"
  fi
  
  # CONFIG_LOCALVERSION and LOCALVERSION (if set)
  res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
  
  # scm version string if not at a tagged commit
  if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
  	# full scm version string
  	res="$res$(scm_version)"
  else
  	# append a plus sign if the repository is not in a clean
  	# annotated or signed tagged state (as git describe only
  	# looks at signed or annotated tags - git tag -a/-s) and
  	# LOCALVERSION= is not specified
  	if test "${LOCALVERSION+set}" != "set"; then
  		scm=$(scm_version --short)
  		res="$res${scm:++}"
  	fi
92bad20ad   Mike Frysinger   Add support for u...
173
  fi
a7b391853   Kyle Moffett   tools/setlocalver...
174
  echo "$res"