Tag Archives: shell

Checkout specific patchset of FreeBSD sources

Following is a script to checkout FreeBSD sources (from its subversion repository) to specific patch-level as asked by a friend on IRC:

#!/bin/sh

if [ -z "$1" -o -z "$2" ]; then
        echo Usage: $0 release patchlevel
        echo e.g. To get 8.0-p5, $0 8.0 5

        exit 0
fi

RVER=$1
PVER=$2

SVNBASE=svn://svn.freebsd.org/base/releng
NEWVERS=sys/conf/newvers.sh
LIMIT=40
RETVAL=0

SVNLOG=$(mktemp -t $(basename $0))

if svn log -l $LIMIT $SVNBASE/$RVER/$NEWVERS >$SVNLOG; then
        BASEREV=$(awk 'BEGIN { sec=1; i=0; } /^r[[:digit:]]+/ { sec=0; revs[i++]=rev=$1; } /^(Security|Errata):/ { sec=1; } /^-+$/ { if(sec == 0) { print revs[i-'$PVER'-1]; exit 0; } }' <$SVNLOG)
        echo svn co -$BASEREV $SVNBASE/$RVER
else
        echo Error executing svn log
        RETVAL=$1
fi

rm -f $SVNLOG
exit $RETVAL

Obligatory screenshot:

chateau.d.if!abbe [~/bin] % co-freebsd-sources 7.0 4
svn co -r182740 svn://svn.freebsd.org/base/releng/7.0
chateau.d.if!abbe [~/bin] % svn cat -r 182740 svn://svn.freebsd.org/base/releng/7.0/sys/conf/newvers.sh|grep RELEASE-p
BRANCH="RELEASE-p4"
Download link: http://www.lostca.se/~abbe/scripts/co-freebsd-sources
SHA256 sum: c9958c4fd7cae5a5e9ff3fa84ba3af6adf38d9c8494b7913ad5b3a2f265a3f48

xargs

Maybe, I’m the lost person to realize the functional awesomeness of xargs(1).

Without xargs(1):

% i=0; for j in $(jot 100 1); do if [ $i = 4 ]; then printf "%2x %2x %2x %2x %2x\n" $s $j; s=""; i=0; else i=$((i+1)); s="$s $j"; fi; done
 1  2  3  4  5
 6  7  8  9  a
 b  c  d  e  f
10 11 12 13 14
15 16 17 18 19
1a 1b 1c 1d 1e
1f 20 21 22 23
24 25 26 27 28
29 2a 2b 2c 2d
2e 2f 30 31 32
33 34 35 36 37
38 39 3a 3b 3c
3d 3e 3f 40 41
42 43 44 45 46
47 48 49 4a 4b
4c 4d 4e 4f 50
51 52 53 54 55
56 57 58 59 5a
5b 5c 5d 5e 5f
60 61 62 63 64

With xargs(1):

% jot 100 1 |xargs -n 5 printf "%2x %2x %2x %2x %2x\n"
 1  2  3  4  5
 6  7  8  9  a
 b  c  d  e  f
10 11 12 13 14
15 16 17 18 19
1a 1b 1c 1d 1e
1f 20 21 22 23
24 25 26 27 28
29 2a 2b 2c 2d
2e 2f 30 31 32
33 34 35 36 37
38 39 3a 3b 3c
3d 3e 3f 40 41
42 43 44 45 46
47 48 49 4a 4b
4c 4d 4e 4f 50
51 52 53 54 55
56 57 58 59 5a
5b 5c 5d 5e 5f
60 61 62 63 64