diff options
author | Thomas Petazzoni <thomas.petazzoni@free-electrons.com> | 2011-08-31 23:35:02 +0200 |
---|---|---|
committer | Peter Korsgaard <jacmet@sunsite.dk> | 2011-09-17 08:14:11 +0200 |
commit | f082c7c5cf72296566dcf92bba4fcb4c95f2186f (patch) | |
tree | 755b968c86505d8746ba179a2e3751d0f0415703 /support | |
parent | 3e304db0f0ef583efb250a19663259bb6dc60c93 (diff) |
support: move scripts/ to a new support/ directory
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
Diffstat (limited to 'support')
-rwxr-xr-x | support/scripts/build-ext3-img | 152 | ||||
-rwxr-xr-x | support/scripts/copy.sh | 20 | ||||
-rwxr-xr-x | support/scripts/graph-depends | 169 | ||||
-rwxr-xr-x | support/scripts/mkmakefile | 47 | ||||
-rwxr-xr-x | support/scripts/pkg-stats | 284 | ||||
-rwxr-xr-x | support/scripts/setlocalversion | 72 |
6 files changed, 744 insertions, 0 deletions
diff --git a/support/scripts/build-ext3-img b/support/scripts/build-ext3-img new file mode 100755 index 000000000..1cab710c2 --- /dev/null +++ b/support/scripts/build-ext3-img @@ -0,0 +1,152 @@ +#!/bin/sh + +BLOCKSIZE=516096 +WORKING_DIR=`pwd` + +echo "This script will create a bootable ext3 image from buildroot." + +echo "Enter the path to the image (${WORKING_DIR})" +read IMG_PATH + +if [ "${IMAGE_PATH}" = "" ]; then + IMAGE_PATH=${WORKING_DIR} +fi + +echo "Enter the name of the image file (buildroot.img)" +read IMG_NAME + +if [ "${IMAGE_NAME}" = "" ]; then + IMAGE_NAME="buildroot.img" +fi + +IMAGE=${IMAGE_PATH}/${IMAGE_NAME} + +echo "Enter the path and filename for the root filesystem" +echo "tarball that you want to install into the image" +read ROOT_PATH + +if [ "${ROOT_PATH}" = "" ]; then + echo "Error: you must specify a path." + exit 1 +fi + +CYLINDERS=`du --summarize --block-size=${BLOCKSIZE} ${ROOT_PATH}` +BYTE_SIZE=`du --summarize --block-size=${BLOCKSIZE} --human-readable ${ROOT_PATH}` + +CYLINDERS=${CYLINDERS%${ROOT_PATH}} +BYTE_SIZE=${BYTE_SIZE%${ROOT_PATH}} + +CYLINDERS=`expr ${CYLINDERS} "*" 2` + +echo "Now I will create an ext3 image file" +echo "using ${CYLINDERS} cylinders, with ${BLOCKSIZE} bytes per block" +echo "in other words, ${BYTE_SIZE}bytes..." + + dd if=/dev/zero of=${IMAGE} bs=${BLOCKSIZE}c count=${CYLINDERS} + +# Create file partition and filesystem + + # STEP 1. create partition + /sbin/losetup /dev/loop3 ${IMAGE} + # probably should figure out how to use GNU parted to do this non-interactively + /sbin/fdisk -u -C${CYLINDERS} -S63 -H16 /dev/loop3 + /sbin/losetup -d /dev/loop3 + + # STEP 2. make file system (ext3) + /sbin/losetup -o 32256 /dev/loop3 ${IMAGE} + /sbin/mkfs.ext3 /dev/loop3 + /sbin/losetup -d /dev/loop3 + +# Install Software to the image + mkdir -p ${IMAGE_PATH}/temp + mount -o offset=32256,loop ${IMAGE} ${IMAGE_PATH}/temp + tar -xvf ${ROOT_PATH} --directory ${IMAGE_PATH}/temp + # make sure to unmount the image + umount ${IMAGE_PATH}/temp + rm -rf ${IMAGE_PATH}/temp + +# Create a VMware .vmx file +cat > ${IMAGE_PATH}/buildroot.vmx <<EOF +config.version = "8" +virtualHW.version = "3" + +uuid.location = "56 4d 5c cc 3d 4a 43 29-55 89 5c 28 1e 7e 06 58" +uuid.bios = "56 4d 5c cc 3d 4a 43 29-55 89 5c 28 1e 7e 06 58" + +uuid.action = "create" +checkpoint.vmState = "" + +displayName = "Buildroot" +annotation = "" +guestinfo.vmware.product.long = "" +guestinfo.vmware.product.url = "http://dcgrendel.be/vmbuilder/" + +guestOS = "linux" +numvcpus = "1" +memsize = "256" +paevm = "FALSE" +sched.mem.pshare.enable = "TRUE" +MemAllowAutoScaleDown = "FALSE" + +MemTrimRate = "-1" + +nvram = "nvram" + +mks.enable3d = "FALSE" +vmmouse.present = "TRUE" + +tools.syncTime = "TRUE" +tools.remindinstall = "FALSE" + +isolation.tools.hgfs.disable = "FALSE" +isolation.tools.dnd.disable = "FALSE" +isolation.tools.copy.enable = "TRUE" +isolation.tools.paste.enabled = "TRUE" +gui.restricted = "FALSE" + +ethernet0.present = "TRUE" +ethernet0.connectionType = "bridged" +ethernet0.addressType = "generated" +ethernet0.generatedAddress = "00:0c:29:7e:06:58" +ethernet0.generatedAddressOffset = "0" + +usb.present = "TRUE" +usb.generic.autoconnect = "FALSE" + +sound.present = "TRUE" +sound.virtualdev = "es1371" + +ide0:0.present = "TRUE" +ide0:0.fileName = "buildroot.vmdk" +ide0:0.deviceType = "disk" +ide0:0.mode = "" +ide0:0.redo = "" +ide0:0.writeThrough = "FALSE" +ide0:0.startConnected = "TRUE" + +ide1:0.present = "FALSE" +ide1:0.fileName = "" +ide1:0.deviceType = "disk" +ide1:0.mode = "" +ide1:0.redo = "" +ide1:0.writeThrough = "FALSE" +ide1:0.startConnected = "FALSE" + +floppy0.present = "FALSE" + +serial0.present = "FALSE" + +serial1.present = "FALSE" + +parallel0.present = "FALSE" + +EOF + +# Install GRUB + /sbin/grub --no-floppy --batch <<EOT + device (hd0) ${IMAGE} + geometry (hd0) ${CYLINDERS} 16 63 + root (hd0,0) + setup (hd0) + quit + EOT diff --git a/support/scripts/copy.sh b/support/scripts/copy.sh new file mode 100755 index 000000000..508ed56af --- /dev/null +++ b/support/scripts/copy.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +STAGING_DIR=$1 +TARGET_DIR=$2 + +echo "Copying development files to target..." + +cp -af ${STAGING_DIR}/usr/include ${TARGET_DIR}/usr + +for LIBSDIR in /lib /usr/lib; do + for WILDCARD in *.a *.la; do + for FILE_PATH in `find ${STAGING_DIR}${LIBSDIR} -name ${WILDCARD}`; do + STAGING_STRIPPED=${FILE_PATH##${STAGING_DIR}} + EXTENDED_DIR=${STAGING_STRIPPED%/${WILDCARD}} + mkdir -p ${TARGET_DIR}${EXTENDED_DIR} + cp -fa ${FILE_PATH} ${TARGET_DIR}${STAGING_STRIPPED} + #echo ${TARGET_DIR}${STAGING_STRIPPED} + done + done +done diff --git a/support/scripts/graph-depends b/support/scripts/graph-depends new file mode 100755 index 000000000..4d82282f5 --- /dev/null +++ b/support/scripts/graph-depends @@ -0,0 +1,169 @@ +#!/usr/bin/python + +# Usage (the graphviz package must be installed in your distribution) +# ./scripts/graph-depends [package-name] > test.dot +# dot -Tpdf test.dot -o test.pdf +# +# With no arguments, graph-depends will draw a complete graph of +# dependencies for the current configuration. With an argument, +# graph-depends will draw a graph of dependencies for the given +# package name. +# +# Limitations +# +# * Some packages have dependencies that depend on the Buildroot +# configuration. For example, many packages have a dependency on +# openssl if openssl has been enabled. This tool will graph the +# dependencies as they are with the current Buildroot +# configuration. +# +# * The X.org package definitions are only included when +# BR2_PACKAGE_XORG7 is enabled, so if this option is not enabled, +# it isn't possible to graph the dependencies of X.org stack +# components. +# +# Copyright (C) 2010 Thomas Petazzoni <thomas.petazzoni@free-electrons.com> + +import sys +import subprocess + +# In FULL_MODE, we draw the full dependency graph for all selected +# packages +FULL_MODE = 1 + +# In PKG_MODE, we only draw the dependency graph for a given package +PKG_MODE = 2 + +mode = 0 + +if len(sys.argv) == 1: + mode = FULL_MODE +elif len(sys.argv) == 2: + mode = PKG_MODE + rootpkg = sys.argv[1] +else: + print "Usage: graph-depends [package-name]" + sys.exit(1) + +allpkgs = [] +unknownpkgs = [] + +# Execute the "make show-targets" command to get the list of the main +# Buildroot TARGETS and return it formatted as a Python list. This +# list is used as the starting point for full dependency graphs +def get_targets(): + sys.stderr.write("Getting targets\n") + cmd = ["make", "show-targets"] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output = p.communicate()[0].strip() + if p.returncode != 0: + return None + if output == '': + return [] + return output.split(' ') + +# Execute the "make <pkg>-show-depends" command to get the list of +# dependencies of a given package, and return the list of dependencies +# formatted as a Python list. +def get_depends(pkg): + sys.stderr.write("Getting dependencies for %s\n" % pkg) + cmd = ["make", "%s-show-depends" % pkg] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output = p.communicate()[0].strip() + if p.returncode != 0: + return None + if output == '': + return [] + return output.split(' ') + +# Recursive function that builds the tree of dependencies for a given +# package. The dependencies are built in a list called 'dependencies', +# which contains tuples of the form (pkg1 -> +# pkg2_on_which_pkg1_depends) and the function finally returns this +# list. +def get_all_depends(pkg): + dependencies = [] + + # We already have the dependencies for this package + if pkg in allpkgs: + return + allpkgs.append(pkg) + depends = get_depends(pkg) + + # We couldn't get the dependencies of this package, because it + # doesn't use the generic or autotools infrastructure. Add it to + # unknownpkgs so that it is later rendered in red color to warn + # the user. + if depends == None: + unknownpkgs.append(pkg) + return + + # This package has no dependency. + if depends == []: + return + + # Add dependencies to the list of dependencies + for dep in depends: + dependencies.append((pkg, dep)) + + # Recurse into the dependencies + for dep in depends: + newdeps = get_all_depends(dep) + if newdeps != None: + dependencies += newdeps + + return dependencies + +# The Graphviz "dot" utility doesn't like dashes in node names. So for +# node names, we strip all dashes. +def pkg_node_name(pkg): + return pkg.replace("-","") + +# In full mode, start with the result of get_targets() to get the main +# targets and then use get_all_depends() for each individual target. +if mode == FULL_MODE: + targets = get_targets() + dependencies = [] + allpkgs.append('all') + for tg in targets: + # Skip uninteresting targets + if tg == 'target-generic-issue' or \ + tg == 'target-finalize' or \ + tg == 'erase-fakeroots' or \ + tg == 'target-generic-hostname': + continue + dependencies.append(('all', tg)) + deps = get_all_depends(tg) + if deps != None: + dependencies += deps + +# In pkg mode, start directly with get_all_depends() on the requested +# package +elif mode == PKG_MODE: + dependencies = get_all_depends(rootpkg) + +# Start printing the graph data +print "digraph G {" + +# First, the dependencies. Usage of set allows to remove duplicated +# dependencies in the graph +for dep in set(dependencies): + print "%s -> %s" % (pkg_node_name(dep[0]), pkg_node_name(dep[1])) + +# Then, the node attributes: color, style and label. +for pkg in allpkgs: + if pkg == 'all': + print "all [label = \"ALL\"]" + print "all [color=lightblue,style=filled]" + continue + + print "%s [label = \"%s\"]" % (pkg_node_name(pkg), pkg) + + if pkg in unknownpkgs: + print "%s [color=red,style=filled]" % pkg_node_name(pkg) + elif mode == PKG_MODE and pkg == rootpkg: + print "%s [color=lightblue,style=filled]" % pkg_node_name(rootpkg) + else: + print "%s [color=grey,style=filled]" % pkg_node_name(pkg) + +print "}" diff --git a/support/scripts/mkmakefile b/support/scripts/mkmakefile new file mode 100755 index 000000000..cef2ec707 --- /dev/null +++ b/support/scripts/mkmakefile @@ -0,0 +1,47 @@ +#!/bin/sh +# Generates a small Makefile used in the root of the output +# directory, to allow make to be started from there. +# The Makefile also allow for more convenient build of external modules + +# Usage +# $1 - Kernel src directory +# $2 - Output directory + + +test ! -r $2/Makefile -o -O $2/Makefile || exit 0 +# Only overwrite automatically generated Makefiles +# (so we do not overwrite buildroot Makefile) +if test -e $2/Makefile && ! grep -q Automatically $2/Makefile +then + exit 0 +fi +if [ "${quiet}" != "silent_" ]; then + echo " GEN $2/Makefile" +fi + +cat << EOF > $2/Makefile +# Automatically generated by $0: don't edit + +lastword = \$(word \$(words \$(1)),\$(1)) +makedir := \$(dir \$(call lastword,\$(MAKEFILE_LIST))) + +MAKEARGS := -C $1 +MAKEARGS += O=\$(if \$(patsubst /%,,\$(makedir)),\$(CURDIR)/)\$(patsubst %/,%,\$(makedir)) + +MAKEFLAGS += --no-print-directory + +.PHONY: all \$(MAKECMDGOALS) + +all := \$(filter-out all Makefile,\$(MAKECMDGOALS)) + +all: + \$(MAKE) \$(MAKEARGS) \$(all) + +Makefile:; + +\$(all): all + @: + +%/: all + @: +EOF diff --git a/support/scripts/pkg-stats b/support/scripts/pkg-stats new file mode 100755 index 000000000..7bb292830 --- /dev/null +++ b/support/scripts/pkg-stats @@ -0,0 +1,284 @@ +#!/bin/bash + +# Copyright (C) 2009 by Thomas Petazzoni <thomas.petazzoni@free-electrons.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# This script generates an HTML file that contains a report about all +# Buildroot packages, their usage of the different package +# infrastructure and possible cleanup actions +# +# Run the script from the Buildroot toplevel directory: +# +# ./scripts/pkg-stats > /tmp/pkg.html +# + +echo "<head> +<style type=\"text/css\"> +table { + width: 100%; +} +td { + border: 1px solid black; +} +td.centered { + text-align: center; +} +tr.wrong td { + background: #ff9a69; +} +tr.correct td { + background: #d2ffc4; +} +</style> +</head> + +<a href=\"#results\">Results</a><br/> + +<table> +<tr> +<td rowspan=\"2\">Id</td> +<td rowspan=\"2\">Package</td> +<td>Patch count</td> +<td colspan=\"2\" class=\"centered\">AUTOTARGETS</td> +<td colspan=\"2\" class=\"centered\">GENTARGETS</td> +<td colspan=\"2\" class=\"centered\">CMAKETARGETS</td> +<td colspan=\"2\" class=\"centered\">manual</td> +<td rowspan=\"2\" class=\"centered\">Actions</td> +</tr> +<tr> +<td class=\"centered\">host</td> +<td class=\"centered\">target</td> +<td class=\"centered\">host</td> +<td class=\"centered\">target</td> +<td class=\"centered\">host</td> +<td class=\"centered\">target</td> +<td class=\"centered\">host</td> +<td class=\"centered\">target</td> +</tr>" + +convert_to_generic_target=0 +convert_to_generic_host=0 +convert_to_autotools=0 +total_patch_count=0 +cnt=1 +for i in $(find package/ -name '*.mk') ; do + + if test \ + $i = "package/java/java.mk" -o \ + $i = "package/games/games.mk" -o \ + $i = "package/multimedia/multimedia.mk" -o \ + $i = "package/customize/customize.mk" -o \ + $i = "package/gnuconfig/gnuconfig.mk" -o \ + $i = "package/matchbox/matchbox.mk" -o \ + $i = "package/x11r7/x11r7.mk" ; then + echo "skipping $i" 1>&2 + continue + fi + + cnt=$((cnt+1)) + + is_auto_host=0 + is_auto_target=0 + is_cmake_host=0 + is_cmake_target=0 + is_pkg_target=0 + is_pkg_host=0 + is_manual_target=0 + is_manual_host=0 + + if grep -E "\(call AUTOTARGETS,[^,]*,[^,]*,host\)" $i > /dev/null ; then + is_auto_host=1 + fi + + if grep -E "\(call AUTOTARGETS,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then + is_auto_target=1 + fi + + if grep -E "\(call GENTARGETS,[^,]*,[^,]*,host\)" $i > /dev/null ; then + is_pkg_host=1 + fi + + if grep -E "\(call GENTARGETS,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then + is_pkg_target=1 + fi + + if grep -E "\(call CMAKETARGETS,[^,]*,[^,]*,host\)" $i > /dev/null ; then + is_cmake_host=1 + fi + + if grep -E "\(call CMAKETARGETS,[^,]*,[^,]*(,target|)\)" $i > /dev/null ; then + is_cmake_target=1 + fi + + pkg=$(basename $i) + pkg=${pkg%.mk} + + if grep "^host-$pkg:" $i > /dev/null ; then + is_manual_host=1 + fi + + if test $is_pkg_target -eq 0 -a $is_auto_target -eq 0 -a $is_cmake_target -eq 0; then + is_manual_target=1 + fi + + tasks="" + + if [ $is_manual_target -eq 1 ] ; then + if grep "/configure" $i > /dev/null ; then + tasks=$tasks"<li>convert package to autotools ?</li>" + convert_to_target_autotools=$((convert_to_target_autotools+1)) + else + tasks=$tasks"<li>convert to generic target</li>" + convert_to_generic_target=$((convert_to_generic_target+1)) + fi + fi + + if [ $is_manual_host -eq 1 ]; then + if grep "/configure" $i > /dev/null ; then + tasks=$tasks"<li>convert package to autotools ?</li>" + convert_to_host_autotools=$((convert_to_host_autotools+1)) + else + tasks=$tasks"<li>convert to generic host</li>" + convert_to_generic_host=$((convert_to_generic_host+1)) + fi + fi + + if test -n "$tasks" ; then + echo "<tr class=\"wrong\">" + else + echo "<tr class=\"correct\">" + fi + + echo "<td>$cnt</td>" + echo "<td>$i</td>" + + package_dir=$(dirname $i) + patch_count=$(find ${package_dir} -name '*.patch' | wc -l) + total_patch_count=$(($total_patch_count+$patch_count)) + + if test $patch_count -lt 1 ; then + patch_count_color="#00ff00" + elif test $patch_count -lt 5 ; then + patch_count_color="#ffc600" + else + patch_count_color="#ff0000" + fi + + echo "<td class=\"centered\" style=\"color: $patch_count_color; font-weight: bold;\">" + echo $patch_count + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_auto_host -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_auto_target -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_pkg_host -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_pkg_target -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_cmake_host -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_cmake_target -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_manual_host -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td class=\"centered\">" + if [ $is_manual_target -eq 1 ] ; then + echo "<b>YES</b>" + else + echo "NO" + fi + echo "</td>" + + echo "<td>" + echo "<ul>" + echo $tasks + echo "</ul>" + echo "</td>" + + echo "</tr>" + +done +echo "</table>" + +echo "<table>" +echo "<tr>" +echo "<td>Packages to convert to generic target</td>" +echo "<td>$convert_to_generic_target</td>" +echo "</tr>" +echo "<tr>" +echo "<td>Packages to convert to generic host</td>" +echo "<td>$convert_to_generic_host</td>" +echo "</tr>" +echo "<tr>" +echo "<td>Packages to convert to target autotools</td>" +echo "<td>$convert_to_target_autotools</td>" +echo "</tr>" +echo "<tr>" +echo "<td>Packages to convert to host autotools</td>" +echo "<td>$convert_to_host_autotools</td>" +echo "</tr>" +echo "<tr>" +echo "<td>Number of patches in all packages</td>" +echo "<td>$total_patch_count</td>" +echo "</tr>" +echo "<tr>" +echo "<td>TOTAL</td>" +echo "<td>$cnt</td>" +echo "</tr>" +echo "</table>" diff --git a/support/scripts/setlocalversion b/support/scripts/setlocalversion new file mode 100755 index 000000000..8d6fe909f --- /dev/null +++ b/support/scripts/setlocalversion @@ -0,0 +1,72 @@ +#!/bin/sh +# Print additional version information for non-release trees. + +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 + # Do we have an untagged version? + if git name-rev --tags HEAD | grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then + if tag=`git describe 2>/dev/null`; then + echo $tag | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' + 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 + + # Are there uncommitted changes? + git update-index --refresh --unmerged > /dev/null + 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. +if hgid=`hg id 2>/dev/null`; then + tag=`printf '%s' "$hgid" | cut -d' ' -f2` + + # Do we have an untagged version? + if [ -z "$tag" -o "$tag" = tip ]; then + id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` + printf '%s%s' -hg "$id" + 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=`LANG=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then + rev=`echo $rev | awk '{print $NF}'` + changes=`LANG=C svn status 2>/dev/null | grep '^[AMD]' | wc -l` + + # Are there uncommitted changes? + if [ $changes != 0 ]; then + printf -- '-svn%s%s' "$rev" -dirty + else + printf -- '-svn%s' "$rev" + fi + + # All done with svn + exit +fi |