hlfw.ca

rc

ref: 40b3d95f95fb48b806b8ff648e0fc2b26584d62c
dir: /syspatch/

View raw version
#!/bin/rc

argv0=$0

fn usage {
	echo 'usage:' $argv0 '[-u] [-f sources]' >[1=2]
	exit 'usage'
}

fn fetch {
	dir=()
	src=()
	type=()
	patch=()

	echo Fetching $1
	dir=`{ndb/query -f $2 pkg $1 path}
	src=`{ndb/query -f $2 pkg $1 src}
	type=`{ndb/query -f $2 pkg $1 type}
	patch=`{ndb/query -f $2 pkg $1 patch}
	switch($type){
	case git
		git/clone $src $dir
		cd $dir
		~ $#patch 1 && hget $patch | patch
	case mkfs
		mkdir -p $dir
		hget $src | gunzip | disk/mkext -d $dir
		cd $dir
		~ $#patch 1 && hget $patch | patch
	case patch
		cd $dir
		hget $patch | patch
	case patch5
		cd $dir
		hget $patch | patch -p5
	}
}

fn revert {
	dir=()
	type=()
	base=()

	dir=`{ndb/query -f $2 pkg $1 path}
	type=`{ndb/query -f $2 pkg $1 type}
	echo Reverting $1
	base=`{basename -d $dir}
	if(~ $type patch){
		git/revert $dir
	}
	if not {
		# TODO: git/walk -f UMR --> loop + switch, just rm/revert the files that were changed
		git/walk -f U $base | grep -s $1 && rm -rf $dir
		git/walk -f MR $base | grep -s $1 && git/revert $dir
	}
}

pkgs=()
sourcesfile=$home/lib/sources
undo=0

while (~ $1 -*) {
	switch ($1) {
	case -f
		sourcesfile=$2
		shift
	case -u
		undo=1
	case -*
		usage
	}
	shift
}

pkgs=`{awk '/pkg=/{print $1}' $sourcesfile | sed 's/pkg=//'}

if (~ $#pkgs 0){
	echo 'no entries in lib/sources'
	exit 'entries'
}

~ $#* 0 || usage

if (~ $undo 0) {
	webfs
	for(pkg in $pkgs){
		fetch $pkg $sourcesfile
	}
}
if not {
	# Give us a git view
	cd /
	if(! test -d ,git)
		bind -ac /dist/plan9front /
	git/fs
	for(pkg in $pkgs){
		revert $pkg $sourcesfile
	}
}