#!/bin/sh
-package=${1:-$ZPMPACKAGE}
-shift
pkgver=${ZPMPKGVER:-1.0}
pkgrel=${ZPMPKGREL:-1}
+die() {
+ echo $* 1>&2
+ exit 1
+}
+
+# basic cleanup on a path
+cleanpath() {
+ clean="$1"
+ if [ -z "$clean" ]; then printf ''; fi
+
+ # multiple slashes
+ clean=$(printf "%s" "$clean" | sed -e 's|/+|/|g')
+ # curdir
+ clean=$(printf "%s" "$clean" | sed -e 's|/\./|/|g')
+ # leading curdir
+ clean=${clean#./}
+ # trailing curdir
+ clean=${clean%/.}
+ # trailing slash
+ clean=${clean%/}
+ printf "%s" "$clean"
+}
+
+tags=
+create=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:d:a:u:l:p:b:P: opt; do
+while getopts :f:v:r:l:P:S:Cc opt; do
case $opt in
f) pkgfile="$OPTARG" ;;
v) pkgver="$OPTARG" ;;
r) pkgrel="$OPTARG" ;;
- d) description="$OPTARG" ;;
- a) arch="$OPTARG" ;;
- u) url="$OPTARG" ;;
l) licenses="$OPTARG" ;;
- p) packager="$OPTARG" ;;
- b) builddate="$OPTARG" ;;
P) prefix="$OPTARG" ;;
+ S) strip=$(cleanpath "$OPTARG"); ;;
+ t) tags="$tags $OPTARG" ;;
+ c) tags="$tags configuration" ;;
+ C) create=1 ;;
+ *) echo 'unknown option'; exit 1 ;;
esac
done
+shift $((OPTIND - 1))
+
+package="$1"
+shift
+if [ -z "$package" ]; then
+ die "must specify package"
+fi
set -e
if [ -z "$pkgfile" ]; then
pkgfile="$package-$pkgver-$pkgrel.zpm"
fi
-if [ ! -f $pkgfile ]; then
- zpm newpackage $package || exit 1
-else
- appid=$(sqlite3 $pkgfile 'pragma application_id;' | ( echo obase = 16; cat - ) | bc)
- if [ "$appid" != "5A504442" ]; then
- echo $pkgfile does not appear to be a zpm package file
+# check for package file
+if [ ! -f "$pkgfile" ]; then
+ if [ $create -eq 1 ]; then
+ echo creating $pkgfile
+ zpm newpackage -I -f $pkgfile -v $pkgver -r $pkgrel $package || exit 1
+ else
+ echo $pkgfile does not exist
exit 1
fi
fi
+zpm test -v $pkgfile
+
+#strip=$(cleanpath "$strip")
for path in $*; do
- mtime=$(zpm stat -t '%y' $path)
- uid=$(zpm stat -t '%u' $path)
- gid=$(zpm stat -t '%g' $path)
- username=$(zpm stat -t '%U' $path)
- groupname=$(zpm stat -t '%G' $path)
- mode=$(zpm stat -t '%a' $path)
-
- # strip off leading slashes
- rpath=$(echo "$path" | sed -e 's|^/*||')
- # and a leading ./
- rpath=${rpath#./}
- rpath=$(echo "$rpath" | sed -e 's|^/*||')
+ 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)
+ rpath="$path"
+
+ rpath=$(cleanpath "$path")
+
+ # strip off leading slash
+ rpath=${rpath#/}
if [ -z "$rpath" ] || [ "$rpath" = '.' ]; then
continue
fi
- if [ ! -z "$prefix" ]; then
- # trailing slashes on prefix
- prefix=$(echo "$prefix" | sed -e 's|/*$||')
- rpath="$prefix/$rpath"
+ if [ ! -z "$strip" ]; then
+ echo "stripping $strip"
+ rpath=${rpath#$strip}
+ rpath=${rpath#/}
fi
- if [ -f "$path" ]; then
+ if [ -z "$rpath" ]; then
+ die "$path resolves to nothing"
+ fi
- hash=$(zpm addfile $pkgfile $path)
+ prefix=$(cleanpath "$prefix")
+ if [ ! -z "$prefix" ]; then
+ rpath="$prefix/$rpath"
+ fi
-#if [ -z "$hash" ]; then continue; fi
+ filetype=$(zpm stat -f '%t' "$path")
+ 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"
+ fi
+ hash="'$hash'"
+ ;;
+ directory)
+ filetype=d
+ ;;
+ symlink)
+ filetype=l
+ target=$(readlink $path)
+ target="'$target'"
+ ;;
+ esac
-# TODO mtime, mode
-sqlite3 $pkgfile <<EOS
+ zpm shell $pkgfile <<EOS
PRAGMA foreign_keys = ON;
-insert or replace into packagefiles (package,version,release,path,mode,mtime,username,groupname,hash)
-values ('$package', '$pkgver', $pkgrel, '$rpath', '$mode',$mtime, '$username','$groupname','$hash')
-;
+begin;
+insert or replace into packagefiles (package,version,release,path,mode,mtime,username,groupname,filetype,hash,target)
+values ('$package', '$pkgver', $pkgrel, '$rpath', '$mode',$mtime, '$username','$groupname','$filetype',$hash,$target);
+commit;
EOS
-elif [ -d "$path" ]; then
-sqlite3 $pkgfile <<EOS
-PRAGMA foreign_keys = ON;
-insert or replace into packagefiles (package,version,release,path,mode,mtime,username,groupname)
-values ('$package', '$pkgver', $pkgrel, '$rpath', '$mode',$mtime, '$username','$groupname')
-;
-EOS
-elif [ -l "$path" ]; then
- target=$(readlink $path)
-sqlite3 $pkgfile <<EOS
-PRAGMA foreign_keys = ON;
-insert or replace into packagefiles (package,version,release,path,mode,mtime,username,groupname,target)
-values ('$package', '$pkgver', $pkgrel, '$rpath', '$mode',$mtime, '$username','$groupname','$target')
-;
-EOS
-fi
+
#printf "%s %s%s\n" $path $rpath ${target:+" -> $target"}
printf "%s\n" $path
done