shithub: git9

Download patch

ref: d03d4c6ef7978417e7f8833577db044375d9feed
parent: d5e2a8d00b4f769d56e567905c4c6689e803a49e
author: kvik <kvik@a-b.xyz>
date: Thu Nov 14 22:06:12 EST 2019

A common function die() is introduced -- it terminates the program
after displaying on stderr a message gives as argument.  The same
message is used as program exit status.

All scripts are updated to use the new function and some of the
messages / exit statuses got changed too.

Streamline fatal error handling in rc scripts.

--- a/branch
+++ b/branch
@@ -52,23 +52,14 @@
 modified=`$nl{git/query -c HEAD $base | grep '^[^-]' | sed 's/^..//'}
 deleted=`$nl{git/query -c HEAD $base | grep '^-' | sed 's/^..//'}
 
-if(! git/walk -q $modified $deleted){
-	echo branch update would clobber changes >[1=2]
-	exit dirty
-}
+if(! git/walk -q $modified $deleted)
+	die 'uncommited changes'
 if(! ~ $#create 0){
-	if(! test -e .git/$new){
-		echo branch $new: does not exist >[1=2]
-		exit noexist
-	}
+	if(! test -e .git/$new)
+		die 'branch does not exist:' $new
 }
 if not{
-	commit=`{git/query $base}
-	st=$status
-	if(! ~ $st ''){
-		echo could not find branch $base':' $st >[1=2]
-		exit notfound
-	}
+	commit=`{git/query $base || die 'branch does not exist:' $base}
 	echo $commit > .git/$new
 }
 
--- a/clone
+++ b/clone
@@ -14,11 +14,9 @@
 if(~ $#local 0)
 	local=`{basename $remote .git}
 
-if(test -e $local){
-	echo $local already exists >[1=2]
-	exit exists
-}
-	
+if(test -e $local)
+	die 'repository already exists:' $local
+
 fn clone{
 	mkdir -p $local/.git
 	mkdir -p $local/.git/objects/pack/
@@ -57,10 +55,7 @@
 				print headhash > ".git/HEAD"
 			}
 		}
-	'} |[3] tr '\x0d' '\x0a'
-	x=$status
-	if(! ~ $x '|')
-		exit $0:^' '^$"x
+	'} |[3] tr '\x0d' '\x0a' || die $status
 
 	tree=/mnt/git/branch/heads/master/tree
 	echo checking out repository...
@@ -67,10 +62,8 @@
 	if(test -f .git/refs/remotes/origin/master){
 		cp .git/refs/remotes/origin/master .git/refs/heads/master
 		git/fs
-		@ {builtin cd $tree && tar cif /fd/1 .} | @ {tar xf /fd/0}
-		x=$status
-		if(! ~ $x '')
-			exit 'checkout: '^$"x
+		@ {builtin cd $tree && tar cif /fd/1 .} | @ {tar xf /fd/0} \
+			|| die 'checkout failed:' $status
 		for(f in `$nl{walk -f $tree | sed 's@^'$tree'/*@@'}){
 			if(! ~ $#f 0){
 				idx=.git/index9/tracked/$f
--- a/commit
+++ b/commit
@@ -1,4 +1,4 @@
-#!/bin/rc
+#!/bin/rc -e
 rfork ne
 . /bin/git/common.rc
 
@@ -36,11 +36,8 @@
 		refpath=.git/refs/$branch
 		initial=true
 	}
-	if not{
-		echo invalid branch $branch >[1=2]
-		exit badbranch
-	}
-
+	if not
+		die 'invalid branch:' $branch
 }
 
 fn editmsg{
@@ -50,7 +47,7 @@
 	echo '#' $nl'# ' ^ `$nl{git/walk -fAMR} >> $msgfile.tmp
 	sam $msgfile.tmp
 	if(~ `{grep -v '^[ 	]*($|#.*$)' $msgfile.tmp | wc -l} 0)
-		exit 'empty commit message'
+		die 'empty commit message'
 	grep -v '^[ 	]*#' < $msgfile.tmp > $msgfile
 }
 
@@ -67,10 +64,7 @@
 	msg=`"{cat $msgfile}
 	if(! ~ $#parents 0)
 		pflags='-p'^$parents
-	hash=`{git/save -n $"name -e $"email  -m $"msg $pflags}
-	st=$status
-	if(~ $hash '')
-		exit nocommit
+	hash=`{git/save -n $"name -e $"email  -m $"msg $pflags || die $status}
 }
 
 fn update{
@@ -96,10 +90,8 @@
 
 msgfile=/tmp/git-msg.$pid
 mkdir -p .git/refs
-if(git/walk -q){
-	echo no changes to commit >[1=2]
-	exit clean
-}
+if(git/walk -q)
+	die 'nothing to commit'
 @{
 	flag e +
 	whoami
@@ -109,9 +101,4 @@
 	commit
 	update
 	cleanup
-}
-x=$status
-if(! ~ $x ''){
-	echo 'could not commit:' $x >[1=2]
-	exit $x
-}
+} || die 'could not commit:' $status
--- a/common.rc
+++ b/common.rc
@@ -1,17 +1,20 @@
 nl='
 '
 
+fn die{
+	>[1=2] echo $0: $*
+	exit $"*
+}
+
 fn usage{
-	>[2=1] echo -n 'usage:' $usage
+	>[1=2] echo -n 'usage:' $usage
 	exit 'usage'
 }
 
 fn gitup{
 	gitroot=`{git/conf -r >[2]/dev/null}
-	if(~ $#gitroot 0){
-		>[2=1] echo 'not a git repository'
-		exit 'not a git repository'
-	}
+	if(~ $#gitroot 0)
+		die 'not a git repository'
 	cd $gitroot
 	git/fs
 }
--- a/export
+++ b/export
@@ -11,12 +11,7 @@
 q=$*
 if(~ $#q 0)
 	q=HEAD
-commits=`{git/query $q}
-x=$status
-if(! ~ $x ''){
-	echo 'could not find commits: '$x
-	exit $x
-}
+commits=`{git/query $q || die $status}
 
 scratch=/tmp/gitexport.$pid
 mkdir -p $scratch
--- a/import
+++ b/import
@@ -6,14 +6,7 @@
 	git/import [file ...]
 '
 
-fn die{
-	echo $patchname: $1 $2
-	exit $2
-}
-
 fn apply @{
-	flag +e
-
 	git/fs
 	email=''
 	name=''
@@ -26,7 +19,7 @@
 	if not if(test -e /mnt/git/object/$branch/tree)
 		refpath=.git/HEAD
 	if not
-		exit 'invalid branch '$branch
+		die 'invalid branch:' $branch
 	awk '
 	BEGIN{
 		state="headers"
@@ -63,25 +56,17 @@
 	END{
 		if(state != "diff")
 			exit("malformed patch: " state);
-		if(name == "" || email == "" || msg == "" || date == ""){
-			print "missing headers" > "/fd/2";
-			exit("missingheader");
-		}
+		if(name == "" || email == "" || msg == "" || date == "")
+			exit("missing headers");
 		printf "%s", name > "/env/name"
 		printf "%s", email > "/env/email"
 		printf "%s", msg > "/env/msg"
 		printf "%s", date > "/env/date"
 	}
-	'
-	st=$status
-	if(! ~ $st ''){
-		echo could not import: $st >[1=2]
-		exit badpatch
-	}
+	' || die 'could not import:' $status
 
 	# force re-reading env
 	rc -c '
-		flag -e
 		echo applying $msg | sed 1q
 		date=`{seconds $date}
 		files=`$nl{ape/patch -p1 < $diffpath | sed ''s/^patching file `(.*)''''/\1/''}
@@ -97,15 +82,6 @@
 	'
 }
 
-fn import{
-	apply
-	st=$status
-	if(! ~ $st ''){
-		echo stdin: $st
-		exit $st
-	}
-}
-
 gitup
 
 patches=(/fd/0)
@@ -112,4 +88,4 @@
 if(! ~ $#* 0)
 	patches=$*
 for(f in $patches)
-	import < $f
+	apply < $f || die $status 
--- a/init
+++ b/init
@@ -1,4 +1,4 @@
-#!/bin/rc
+#!/bin/rc -e
 rfork ne
 . /bin/git/common.rc
 
@@ -32,10 +32,8 @@
 if not
 	usage
 
-if(test -e $dir$sub){
-	echo $dir$sub already exists >[1=2]
-	exit exists
-}
+if(test -e $dir$sub)
+	die $dir$sub already exists
 
 mkdir -p $dir$sub
 dircp /sys/lib/git/template $dir/$sub
--- a/pull
+++ b/pull
@@ -15,14 +15,8 @@
 	upstream=$2
 	url=$3
 	dir=$4
-
-	fetch=`"{git/fetch  -b $branch -u $upstream $url |[2]  tr '\x0d' '\x0a'}
-	st=$status
-	if(! ~ $st ''){
-		echo fetch failed: $st
-		exit $st
-	}	
-	echo $"fetch | awk '
+	
+	{git/fetch -b $branch -u $upstream $url || die $status} | awk '
 	/^remote/{
 		if($2=="HEAD")
 			next
@@ -68,10 +62,8 @@
 
 if(~ $#remote 0)
 	remote=`{git/conf 'remote "'$upstream'".url'}
-if(~ $#remote 0){
-	echo 'no idea from where to pull'
-	exit upstream
-}
+if(~ $#remote 0)
+	die 'no remote to pull from'
 
 update $branch $upstream $remote
 if (~ $#checkout 0)
@@ -83,16 +75,13 @@
 # we have local commits, but the remote hasn't changed.
 # in this case, we want to keep the local commits untouched.
 if(~ `{git/query HEAD $remote @} `{git/query $remote}){
-	echo up to date >[1=2]
+	echo 'up to date' >[1=2]
 	exit
 }
 # The remote repository and our HEAD have diverged: we
 # need to merge.
-if(! ~ `{git/query HEAD $remote @} `{git/query HEAD}){
-	echo git/merge $remote '# diverged' >[1=2]
-	exit merge
-}
-
+if(! ~ `{git/query HEAD $remote @} `{git/query HEAD})
+	die 'remote diverged:' $remote
 # The remote is directly ahead of the local, and we have
 # no local commits that need merging.
 echo $local':' `{git/query $local} '=>' `{git/query $remote}  >[1=2]
--- a/push
+++ b/push
@@ -1,4 +1,4 @@
-#!/bin/rc
+#!/bin/rc -e
 rfork en
 . /bin/git/common.rc
 
@@ -45,17 +45,12 @@
 	remote=`{git/conf 'remote "'$upstream'".url'}
 if(~ $#remote 0)
 	remote=$upstream
-if(~ $#remote 0){
-	echo 'no idea where to push'
-	exit upstream
-}
+if(~ $#remote 0)
+	die 'no idea where to push'
 if(~ $sendall '')
-	updates=`$nl{git/send $force -b $branch  $remove $remote}
+	updates=`$nl{git/send $force -b $branch  $remove $remote || die $status}
 if not
-	updates=`$nl{git/send $force $remove -a $remote}
-x=$status
-if(! ~ $x '')
-	exit $x
+	updates=`$nl{git/send $force $remove -a $remote || die $status}
 
 for(ln in $updates){
 	u=`{echo $ln}