cookutils rev 1129

cook: patchit(): allow external patches and patches checksum
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Jan 04 17:23:46 2019 +0200 (2019-01-04)
parents 8cf66e7d3c64
children b6def327b90a
files cook
line diff
     1.1 --- a/cook	Wed Jan 02 18:55:20 2019 +0200
     1.2 +++ b/cook	Fri Jan 04 17:23:46 2019 +0200
     1.3 @@ -528,21 +528,59 @@
     1.4  
     1.5  patchit() {
     1.6  	[ -f "$stuff/patches/series" ] || return
     1.7 +	# Empty lines and comments (started with "#") are ignored
     1.8 +	# Up to three fields (no spaces inside allowed) separated by "|":
     1.9 +	#   1. patch options like "-p0" (optional);
    1.10 +	#   2. patch file name or URL (mandatory);
    1.11 +	#   3. patch checksum in form "sha1=..." or other *sum (optional).
    1.12  
    1.13 -	local done="$pkgdir/.patch.done"
    1.14 +	local done="$pkgdir/.patch.done" var1 var2 var3
    1.15 +	local patchname patchopts patchfile patchsum patchsum_type patchsum_sum
    1.16  	IFS=$'\n'
    1.17  	while read i; do
    1.18  		patchname=$(echo ${i%%#*} | cut -d' ' -f1)	# allow comments (anything after the # or space)
    1.19 -		case $patchname in		# allow patch options in form <options_no_spaces>|<file_name>
    1.20 -			*\|*) patchopts="${patchname%|*}"; patchname="${patchname#*|}";;
    1.21 -			*)    patchopts='-Np1';;
    1.22 +		[ -n "$patchname" ] || continue				# skip empty lines
    1.23 +
    1.24 +		var1=$(echo "$patchname||" | cut -d'|' -f1) # options  or name
    1.25 +		var2=$(echo "$patchname||" | cut -d'|' -f2) # name     or checksum or empty
    1.26 +		var3=$(echo "$patchname||" | cut -d'|' -f3) # checksum or empty
    1.27 +
    1.28 +		if [ -n "$var3" ]; then
    1.29 +			patchopts="$var1"; patchname="$var2"; patchsum="$var3"
    1.30 +		elif [ -n "$var2" ]; then
    1.31 +			case $var2 in
    1.32 +				*=*) patchopts='-Np1';  patchname="$var1"; patchsum="$var2";;
    1.33 +				*)   patchopts="$var1"; patchname="$var2"; patchsum='';;
    1.34 +			esac
    1.35 +		else
    1.36 +			patchopts='-Np1'; patchname="$var1"; patchsum=''
    1.37 +		fi
    1.38 +
    1.39 +		case $patchname in
    1.40 +				ftp://*|http://*|https://*)
    1.41 +					patchfile="$SRC/$(basename $patchname)"
    1.42 +					[ -e "$patchfile" ] || wget -q -T 60 -O $patchfile $patchname ||
    1.43 +					die 'ERROR: %s' "can't get $patchname"
    1.44 +					;;
    1.45 +				*)
    1.46 +					patchfile="$stuff/patches/$patchname"
    1.47 +					;;
    1.48  		esac
    1.49 -		[ -n "$patchname" ] || continue				# allow empty lines
    1.50 +
    1.51 +		if [ -n "$patchsum" ]; then
    1.52 +			patchsum_type=${patchsum%=*}
    1.53 +			patchsum_sum=${patchsum#*=}
    1.54 +			echo "$patchsum_sum  $patchfile" | ${patchsum_type}sum -cs ||
    1.55 +			die 'ERROR: %s' "wrong ${patchsum_type}sum for $patchfile"
    1.56 +		fi
    1.57 +
    1.58  		touch $done
    1.59  		grep -q "^${patchname}$" $done && continue	# already applied (useful with `cook --continue`)
    1.60 +
    1.61  		newline
    1.62  		_ 'Applying patch %s' "$patchname"
    1.63 -		patch $patchopts -i $stuff/patches/$patchname | sed 's|^|  |'
    1.64 +		patch $patchopts -i $patchfile | sed 's|^|  |'
    1.65 +
    1.66  		echo $patchname >> $done
    1.67  	done < $stuff/patches/series
    1.68  	newline
    1.69 @@ -1384,7 +1422,8 @@
    1.70  # cook <package> --getsrc
    1.71  # cook <package> -gs
    1.72  [ -n "$getsrc" -o "$2" == '-gs' ] && {
    1.73 -	title 'Getting source for "%s"' "$1"
    1.74 +	pkg="$1"
    1.75 +	title 'Getting source for "%s"' "$pkg"
    1.76  	receipt="$WOK/$pkg/receipt"
    1.77  	check_pkg_in_wok
    1.78  	unset_receipt