#!/bin/sh # # This scripts adds local version information from the version # control systems git, mercurial (hg) and subversion (svn). # # If something goes wrong, send a mail the kernel build mailinglist # (see MAINTAINERS) and CC Nico Schottelius # . # # usage() { echo "Usage: $0 [srctree]" >&2 exit 1 } cd "${1:-.}" || usage # Check for git and a git repo. if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then atag="`git describe 2>/dev/null`" # Show -g if we have no tag, or just the tag # otherwise. if [ -z "${atag}" ] ; then printf "%s%s" -g ${head} else printf ${atag} 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 # All done with git exit fi # Check for mercurial and a mercurial repo. # In the git case, 'git describe' will show the latest tag, and unless we are # exactly on that tag, the number of commits since then, and last commit id. # Mimic something similar in the Mercurial case. if hgid=`HGRCPATH= hg id --id --tags 2>/dev/null`; then tag=`printf '%s' "$hgid" | cut -d' ' -f2 --only-delimited` # Do we have an untagged version? if [ -z "$tag" -o "$tag" = tip ]; then # current revision is not tagged, determine latest tag latesttag=`HGRCPATH= hg log -r. -T '{latesttag}' 2>/dev/null` # In case there is more than one tag on the latest tagged commit, # 'latesttag' will separate them by colon (:). We'll retain this. # In case there is no tag at all, 'null' will be returned. if [ "$latesttag" = "null" ]; then latesttag='' fi # add the commit id id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` printf '%s%s%s' "${latesttag}" -hg "$id" else # current revision is tagged, just print the tag printf ${tag} fi # Are there uncommitted changes? # These are represented by + after the changeset id. case "$hgid" in *+|*+\ *) printf '%s' -dirty ;; esac # All done with mercurial exit fi # Check for svn and a svn repo. if rev=`LC_ALL=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then rev=`echo $rev | awk '{print $NF}'` printf -- '-svn%s' "$rev" # All done with svn exit fi