X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=zpm-add;h=f627c6dc6990578a0a9a290d87b45761dddfbc78;hb=de3ce49c093f0c274d2921fa90ad829e1fc4a5f9;hp=4025bde71ee60b290e300f91cdf186a1c629d452;hpb=9d083a447a46714def83ef782581c51d8e5897dc;p=zpackage diff --git a/zpm-add b/zpm-add index 4025bde..f627c6d 100755 --- a/zpm-add +++ b/zpm-add @@ -29,21 +29,38 @@ cleanpath() { printf "%s" "$clean" } +verbose=0 tags= isconfig=0 +addcontent=1 +complete=0 # option for "multipackage" just to let the system know that's what you meant # option to take filenames from stdin # parse package, version, release from file if not given -while getopts :f:v:r:l:P:S:cu:g: opt; do +# TODO -l follow symlinks, -L follow symlinks, adding all, links and targets +# -T set link target +# -M set mtime +# -m set mode +# -H set hash, will be overridden for regular files unless -N is set +# -F set filetype, regular, symlink, directory +while getopts :f:vr:l:P:S:cu:g:NCm:M:T:H:F: opt; do case $opt in + N) addcontent=0 ;; f) pkgfile="$OPTARG" ;; P) prefix="$OPTARG" ;; S) strip=$(cleanpath "$OPTARG"); ;; t) tags="$tags $OPTARG" ;; c) isconfig=1 ;; - u) username="$OPTARG" ;; - g) groupname="$OPTARG" ;; - *) echo 'unknown option' $opt; exit 1 ;; + u) cluser="$OPTARG" ;; + g) clgroup="$OPTARG" ;; + m) clmode="$OPTARG" ;; + M) clmtime="$OPTARG" ;; + T) cltarget="$OPTARG" ;; + F) cltype="$OPTARG" ;; + H) clhash="$OPTARG" ;; + v) verbose=$((verbose + 1)) ;; + C) complete=1 ;; + *) echo 'unknown option' $OPTARG; exit 1 ;; esac done shift $((OPTIND - 1)) @@ -52,6 +69,10 @@ if [ $isconfig -eq 1 ]; then tags="$tags configuration" fi +if [ $verbose -gt 2 ]; then + set -x +fi + pkgid="$1" shift eval $(zpm parse -E $pkgid) @@ -64,7 +85,7 @@ if [ -z "$release" ]; then if [ -z "$pkgfile" ]; then die "cannot determine package file" else - pkgstr=$(zpm findpkg $pkgfile $pkgid) + pkgstr=$(zpm findpkg -f $pkgfile $pkgid) if [ -z "$pkgstr" ]; then die "unable to find package id for $pkgid in $pkgfile" fi @@ -83,15 +104,19 @@ if [ -z "$pkgfile" ]; then die "cannot determine package file" fi -set -e - # check for package file if [ ! -f "$pkgfile" ]; then echo $pkgfile does not exist exit 1 fi +set -e zpm test -v $pkgfile +set +e + +if [ $verbose -gt 0 ]; then + echo adding to $pkgfile $pkgid +fi package=$(zpm quote "$name") pkgver=$(zpm quote "$version") @@ -100,12 +125,17 @@ pkgrel=$(zpm quote "$release") #strip=$(cleanpath "$strip") for path in $*; do #echo adding $path - mtime=$(zpm stat -f '%y' $path) - uid=$(zpm stat -f '%u' $path) - gid=$(zpm stat -f '%g' $path) - : ${username:=$(zpm stat -f '%U' $path)} - : ${groupname:=$(zpm stat -f '%G' $path)} - mode=$(zpm stat -f '%a' $path) +if [ $verbose -gt 1 ]; then + printf "adding %s\n" $path +fi + + # only stat the file for items not set on the command line + mode=${clmode:-$(zpm stat -l -f '%a' $path)} + username=${cluser:-$(zpm stat -l -f '%U' $path)} + groupname=${clgroup:-$(zpm stat -l -f '%G' $path)} + mtime=${clmtime:-$(zpm stat -l -f '%y' $path)} + filetype=${cltype:-$(zpm stat -l -f '%t' "$path")} + rpath="$path" rpath=$(cleanpath "$path") @@ -118,7 +148,6 @@ for path in $*; do fi if [ ! -z "$strip" ]; then - echo "stripping $strip" rpath=${rpath#$strip} rpath=${rpath#/} fi @@ -132,15 +161,25 @@ for path in $*; do rpath="$prefix/$rpath" fi - filetype=$(zpm stat -f '%t' "$path") + # ensure all paths are absolute + rpath=/${rpath#/} + hash='NULL' target='NULL' case "$filetype" in regular) filetype=r - hash=$(zpm addfile $pkgfile "$path") - if [ $? -ne 0 ]; then - die "zpm addfile failed ($?): $pkgfile $path" + if [ $addcontent -eq 1 ]; then + hash=$(zpm addfile $pkgfile "$path") + if [ $? -ne 0 ]; then + die "zpm addfile failed ($?): $pkgfile $path" + fi + else + if [ -z "$clhash" ]; then + hash=$(zpm hash "$path") + else + hash=$clhash + fi fi hash="'$hash'" ;; @@ -149,21 +188,43 @@ for path in $*; do ;; symlink) filetype=l - target=$(readlink $path) - target="'$target'" + if [ -n "$cltarget" ]; then + target=$cltarget + else + target=$(readlink $path) + target=$(zpm quote -q "$target") + fi + ;; + *) + die "filetype $filetype not supported" ;; esac # TODO check that we have such a package,version,release #cat < $target"} -printf "%s\n" $path +if [ $verbose -gt 1 ]; then + printf "%s%s %s:%s %s\n" $filetype $mode $username $groupname $path +elif [ $verbose -gt 0 ]; then + printf "%s\n" $path +fi + done + +if [ $complete -eq 1 ]; then + zpm pkg -f $pkgfile $pkgid build_time=$(date +'%s') + zpm packagehash -f $pkgfile -s -q $pkgid +else + zpm pkg -f $pkgfile $pkgid hash= +fi