Merge branch 'maint'

Conflicts:
	scripts/repo-add.sh.in
This commit is contained in:
Dan McGee 2012-04-24 08:41:46 -05:00
commit ca4f8687f7
7 changed files with 142 additions and 73 deletions

1
contrib/.gitignore vendored
View file

@ -7,5 +7,4 @@ paclog-pkglist
pacscripts pacscripts
pacsearch pacsearch
pacsysclean pacsysclean
wget-xdelta.sh
zsh_completion zsh_completion

View file

@ -83,7 +83,6 @@ paclog-pkglist: $(srcdir)/paclog-pkglist.in
pacscripts: $(srcdir)/pacscripts.in pacscripts: $(srcdir)/pacscripts.in
pacsearch: $(srcdir)/pacsearch.in pacsearch: $(srcdir)/pacsearch.in
pacsysclean: $(srcdir)/pacsysclean.in pacsysclean: $(srcdir)/pacsysclean.in
pactree: $(srcdir)/pactree.in
zsh_completion: $(srcdir)/zsh_completion.in zsh_completion: $(srcdir)/zsh_completion.in
# vim:set ts=2 sw=2 noet: # vim:set ts=2 sw=2 noet:

View file

@ -40,8 +40,9 @@ similar to `$_basekernver`.
*pkgname (array)*:: *pkgname (array)*::
Either the name of the package or an array of names for split packages. Either the name of the package or an array of names for split packages.
Because it will be used in the package filename, this has to be unix-friendly. Valid characters for members of this array are alphanumerics, and any of
Members of the array are not allowed to start with hyphens. the following characters: ```@ . _ + -`''. Additionally, names are not
allowed to start with hyphens.
*pkgver*:: *pkgver*::
The version of the software as released from the author (e.g., '2.7.1'). The version of the software as released from the author (e.g., '2.7.1').

View file

@ -11,7 +11,7 @@ pkgdelta - package delta generation utility
Synopsis Synopsis
-------- --------
'pkgdelta' [-q] <package1> <package2> 'pkgdelta' [options] <package1> <package2>
Description Description
@ -27,6 +27,16 @@ significantly.
Options Options
------- -------
*--max-delta-size <ratio>*::
Only create delta files if the delta is smaller than ratio * package_size.
Possible values: 0.0 to 2.0.
Recommended values: 0.2 to 0.9.
Default value: 0.7
*--min-pkg-size <size>*::
Minimal size of the package file in bytes to be considered for delta creation.
Default value: 1048576 bytes = 1MiB
*-q, \--quiet*:: *-q, \--quiet*::
Be quiet. Do not output anything but warnings and errors. Be quiet. Do not output anything but warnings and errors.

View file

@ -1497,6 +1497,11 @@ check_sanity() {
error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname" error "$(gettext "%s is not allowed to start with a hyphen.")" "pkgname"
ret=1 ret=1
fi fi
if [[ $i = *[^[:alnum:]+_.@-]* ]]; then
error "$(gettext "%s contains invalid characters: '%s'")" \
'pkgname' "${pkgname//[[:alnum:]+_.@-]}"
ret=1
fi
done done
if [[ ${pkgbase:0:1} = "-" ]]; then if [[ ${pkgbase:0:1} = "-" ]]; then

View file

@ -30,6 +30,13 @@ declare -r myver='@PACKAGE_VERSION@'
QUIET=0 QUIET=0
# minimal of package before deltas are generated (bytes)
min_pkg_size=$((1024*1024))
# percent of new package above which the delta will be discarded
max_delta_size=70
# ensure we have a sane umask set # ensure we have a sane umask set
umask 0022 umask 0022
@ -38,11 +45,16 @@ m4_include(library/output_format.sh)
# print usage instructions # print usage instructions
usage() { usage() {
printf "pkgdelta (pacman) %s\n\n" "$myver" printf "pkgdelta (pacman) %s\n\n" "$myver"
printf -- "$(gettext "Usage: pkgdelta [-q] <package1> <package2>\n")" printf -- "$(gettext "Usage: pkgdelta [options] <package1> <package2>\n")"
printf -- "$(gettext "\ printf -- "$(gettext "\
pkgdelta will create a delta file between two packages.\n\ pkgdelta will create a delta file between two packages.\n\
This delta file can then be added to a database using repo-add.\n\n")" This delta file can then be added to a database using repo-add.\n\n")"
printf -- "$(gettext "Example: pkgdelta pacman-3.0.0.pkg.tar.gz pacman-3.0.1.pkg.tar.gz")\n" printf -- "$(gettext "Example: pkgdelta pacman-3.0.0.pkg.tar.gz pacman-3.0.1.pkg.tar.gz")\n"
echo
printf -- "$(gettext "Options:\n")"
printf -- " -q ""$(gettext "quiet\n")"
printf -- " --min-pkg-size ""$(gettext "minimal of package before deltas are generated (bytes)\n")"
printf -- " --max-delta-size ""$(gettext "percent of new package above which the delta will be discarded\n")"
} }
version() { version() {
@ -53,6 +65,10 @@ This is free software; see the source for copying conditions.\n\
There is NO WARRANTY, to the extent permitted by law.\n")" There is NO WARRANTY, to the extent permitted by law.\n")"
} }
isnumeric() {
[[ $1 != *[!0-9]* ]]
}
read_pkginfo() read_pkginfo()
{ {
pkgname= pkgver= arch= pkgname= pkgver= arch=
@ -93,6 +109,13 @@ create_xdelta()
newver="$pkgver" newver="$pkgver"
newarch="$arch" newarch="$arch"
pkgsize="$(@SIZECMD@ -L "$newfile")"
if ((pkgsize < min_pkg_size)); then
msg "$(gettext "Skipping delta creation for small package: %s - size %s")" "$newname" "$pkgsize"
return 0
fi
if [[ $oldname != "$newname" ]]; then if [[ $oldname != "$newname" ]]; then
error "$(gettext "The package names don't match : '%s' and '%s'")" "$oldname" "$newname" error "$(gettext "The package names don't match : '%s' and '%s'")" "$oldname" "$newname"
return 1 return 1
@ -109,46 +132,78 @@ create_xdelta()
fi fi
msg "$(gettext "Generating delta from version %s to version %s")" "$oldver" "$newver" msg "$(gettext "Generating delta from version %s to version %s")" "$oldver" "$newver"
deltafile="$(dirname $newfile)/$pkgname-${oldver}_to_${newver}-$arch.delta" deltafile=$(dirname "$newfile")/$pkgname-${oldver}_to_${newver}-$arch.delta
local ret=0 local ret=0
xdelta3 -q -f -s "$oldfile" "$newfile" "$deltafile" || ret=$? xdelta3 -q -f -s "$oldfile" "$newfile" "$deltafile" || ret=$?
if (( ret )); then if (( ret )); then
error "$(gettext "Delta could not be created.")" error "$(gettext "Delta could not be created.")"
return 1 return 1
else fi
deltasize="$(@SIZECMD@ -L "$deltafile")"
if ((max_delta_size * pkgsize / 100 < deltasize)); then
msg "$(gettext "Delta package larger than maximum size. Removing.")"
rm -f "$deltafile"
return 0
fi
msg "$(gettext "Generated delta : '%s'")" "$deltafile" msg "$(gettext "Generated delta : '%s'")" "$deltafile"
(( QUIET )) && echo "$deltafile" (( QUIET )) && echo "$deltafile"
fi
return 0 return 0
} }
declare -a args
# parse arguments
while (( $# )); do
case "$1" in case "$1" in
-h|--help) usage; exit 0 ;; -h|--help) usage; exit 0 ;;
-V|--version) version; exit 0 ;; -V|--version) version; exit 0 ;;
-q|--quiet) QUIET=1; shift ;; -q|--quiet) QUIET=1;;
--min-pkg-size)
if ! isnumeric "$2"; then
echo "invalid argument '$2' for option -- '$1'"
exit 1
fi
min_pkg_size=$2
shift
;;
--max-delta-size)
arg=$(echo "$2" | awk '{print $1 * 100}')
if ! isnumeric "$arg" || (($arg > 200)); then
echo "invalid argument '$2' for option -- '$1'"
exit 1
fi
max_delta_size=$arg
shift
;;
--) shift; args+=("$@"); break 2 ;;
-*) echo "invalid option -- '$1'"; usage; exit 1 ;;
*) args+=("$1");;
esac esac
shift
done
if (( $# != 2 )); then if (( ${#args[@]} != 2 )); then
usage usage
exit 1 exit 1
fi fi
if [[ ! -f $1 ]]; then for i in "${args[@]}"; do
error "$(gettext "File '%s' does not exist")" "$1" if [[ ! -f $i ]]; then
exit 1 error "$(gettext "File '%s' does not exist")" "$i"
fi
if [[ ! -f $2 ]]; then
error "$(gettext "File '%s' does not exist")" "$2"
exit 1 exit 1
fi fi
done
if ! type xdelta3 &>/dev/null; then if ! type xdelta3 &>/dev/null; then
error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")" error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")"
exit 1 exit 1
fi fi
create_xdelta "$1" "$2" create_xdelta "${args[@]}"
# vim: set ts=2 sw=2 noet: # vim: set ts=2 sw=2 noet:

View file

@ -108,7 +108,7 @@ format_entry() {
find_pkgentry() { find_pkgentry() {
local pkgname=$1 local pkgname=$1
local pkgentry local pkgentry
for pkgentry in $tmpdir/tree/$pkgname*; do for pkgentry in "$tmpdir/tree/$pkgname"*; do
name=${pkgentry##*/} name=${pkgentry##*/}
if [[ ${name%-*-*} = $pkgname ]]; then if [[ ${name%-*-*} = $pkgname ]]; then
echo $pkgentry echo $pkgentry
@ -129,31 +129,31 @@ get_delta_pkgname() {
# write a delta entry # write a delta entry
# arg1 - path to delta file # arg1 - path to delta file
db_write_delta() { db_write_delta() {
deltafile="$1" deltafile=$1
pkgname="$(get_delta_pkgname $deltafile)" pkgname=$(get_delta_pkgname "$deltafile")
pkgentry=$(find_pkgentry $pkgname) pkgentry=$(find_pkgentry "$pkgname")
if [[ -z $pkgentry ]]; then if [[ -z $pkgentry ]]; then
error "$(gettext "No database entry for package '%s'.")" "$pkgname" error "$(gettext "No database entry for package '%s'.")" "$pkgname"
return 1 return 1
fi fi
deltas="$pkgentry/deltas" deltas=$pkgentry/deltas
if [[ ! -f $deltas ]]; then if [[ ! -f $deltas ]]; then
echo -e "%DELTAS%" >$deltas echo -e "%DELTAS%" >"$deltas"
fi fi
# get md5sum and compressed size of package # get md5sum and compressed size of package
md5sum="$(openssl dgst -md5 "$deltafile")" md5sum=$(openssl dgst -md5 "$deltafile")
md5sum="${md5sum##* }" md5sum=${md5sum##* }
csize=$(@SIZECMD@ -L "$deltafile") csize=$(@SIZECMD@ -L "$deltafile")
oldfile=$(xdelta3 printhdr $deltafile | grep "XDELTA filename (source)" | sed 's/.*: *//') oldfile=$(xdelta3 printhdr "$deltafile" | grep "XDELTA filename (source)" | sed 's/.*: *//')
newfile=$(xdelta3 printhdr $deltafile | grep "XDELTA filename (output)" | sed 's/.*: *//') newfile=$(xdelta3 printhdr "$deltafile" | grep "XDELTA filename (output)" | sed 's/.*: *//')
if grep -q "$oldfile.*$newfile" $deltas; then if grep -q "$oldfile.*$newfile" "$deltas"; then
sed -i.backup "/$oldfile.*$newfile/d" $deltas && rm -f $deltas.backup sed -i.backup "/$oldfile.*$newfile/d" "$deltas" && rm -f "$deltas.backup"
fi fi
msg2 "$(gettext "Adding 'deltas' entry : %s -> %s")" "$oldfile" "$newfile" msg2 "$(gettext "Adding 'deltas' entry : %s -> %s")" "$oldfile" "$newfile"
echo ${deltafile##*/} $md5sum $csize $oldfile $newfile >> $deltas echo "${deltafile##*/} $md5sum $csize $oldfile $newfile" >> "$deltas"
return 0 return 0
} # end db_write_delta } # end db_write_delta
@ -161,20 +161,20 @@ db_write_delta() {
# remove a delta entry # remove a delta entry
# arg1 - path to delta file # arg1 - path to delta file
db_remove_delta() { db_remove_delta() {
deltafile="$1" deltafile=$1
filename=${deltafile##*/} filename=${deltafile##*/}
pkgname="$(get_delta_pkgname $deltafile)" pkgname=$(get_delta_pkgname "$deltafile")
pkgentry=$(find_pkgentry $pkgname) pkgentry=$(find_pkgentry "$pkgname")
if [[ -z $pkgentry ]]; then if [[ -z $pkgentry ]]; then
return 1 return 1
fi fi
deltas="$pkgentry/deltas" deltas=$pkgentry/deltas
if [[ ! -f $deltas ]]; then if [[ ! -f $deltas ]]; then
return 1 return 1
fi fi
if grep -q "$filename" $deltas; then if grep -q "$filename" "$deltas"; then
sed -i.backup "/$filename/d" $deltas && rm -f $deltas.backup sed -i.backup "/$filename/d" "$deltas" && rm -f "$deltas.backup"
msg2 "$(gettext "Removing existing entry '%s'...")" "$filename" msg2 "$(gettext "Removing existing entry '%s'...")" "$filename"
# empty deltas file contains only "%DELTAS%" # empty deltas file contains only "%DELTAS%"
if (( $(wc -l < "$deltas") == 1 )); then if (( $(wc -l < "$deltas") == 1 )); then
@ -197,7 +197,7 @@ check_gpg() {
# sign the package database once repackaged # sign the package database once repackaged
create_signature() { create_signature() {
(( ! SIGN )) && return (( ! SIGN )) && return
local dbfile="$1" local dbfile=$1
local ret=0 local ret=0
msg "$(gettext "Signing database...")" msg "$(gettext "Signing database...")"
@ -217,7 +217,7 @@ create_signature() {
# verify the existing package database signature # verify the existing package database signature
verify_signature() { verify_signature() {
(( ! VERIFY )) && return (( ! VERIFY )) && return
local dbfile="$1" local dbfile=$1
local ret=0 local ret=0
msg "$(gettext "Verifying database signature...")" msg "$(gettext "Verifying database signature...")"
@ -237,7 +237,7 @@ verify_signature() {
verify_repo_extension() { verify_repo_extension() {
local repofile=$1 local repofile=$1
case "$repofile" in case $repofile in
*.@(db|files).tar.gz) TAR_OPT="z" ;; *.@(db|files).tar.gz) TAR_OPT="z" ;;
*.@(db|files).tar.bz2) TAR_OPT="j" ;; *.@(db|files).tar.bz2) TAR_OPT="j" ;;
*.@(db|files).tar.xz) TAR_OPT="J" ;; *.@(db|files).tar.xz) TAR_OPT="J" ;;
@ -255,7 +255,7 @@ verify_repo_extension() {
# arg1 - path to package # arg1 - path to package
db_write_entry() { db_write_entry() {
# blank out all variables # blank out all variables
local pkgfile="$1" local pkgfile=$1
local -a _groups _licenses _replaces _depends _conflicts _provides _optdepends local -a _groups _licenses _replaces _depends _conflicts _provides _optdepends
local pkgname pkgver pkgdesc csize size url arch builddate packager \ local pkgname pkgver pkgdesc csize size url arch builddate packager \
md5sum sha256sum pgpsig pgpsigsize md5sum sha256sum pgpsig pgpsigsize
@ -268,7 +268,7 @@ db_write_entry() {
# normalize whitespace with an extglob # normalize whitespace with an extglob
declare "$var=${val//+([[:space:]])/ }" declare "$var=${val//+([[:space:]])/ }"
case "$var" in case $var in
group) _groups+=("$group") ;; group) _groups+=("$group") ;;
license) _licenses+=("$license") ;; license) _licenses+=("$license") ;;
replaces) _replaces+=("$replaces") ;; replaces) _replaces+=("$replaces") ;;
@ -289,10 +289,10 @@ db_write_entry() {
warning "$(gettext "An entry for '%s' already existed")" "$pkgname-$pkgver" warning "$(gettext "An entry for '%s' already existed")" "$pkgname-$pkgver"
else else
if (( DELTA )); then if (( DELTA )); then
pkgentry=$(find_pkgentry $pkgname) pkgentry=$(find_pkgentry "$pkgname")
if [[ -n $pkgentry ]]; then if [[ -n $pkgentry ]]; then
local oldfilename=$(grep -A1 FILENAME $pkgentry/desc | tail -n1) local oldfilename=$(grep -A1 FILENAME "$pkgentry/desc" | tail -n1)
local oldfile="$(dirname $1)/$oldfilename" local oldfile="$(dirname "$1")/$oldfilename"
fi fi
fi fi
fi fi
@ -312,10 +312,10 @@ db_write_entry() {
# compute checksums # compute checksums
msg2 "$(gettext "Computing checksums...")" msg2 "$(gettext "Computing checksums...")"
md5sum="$(openssl dgst -md5 "$pkgfile")" md5sum=$(openssl dgst -md5 "$pkgfile")
md5sum="${md5sum##* }" md5sum=${md5sum##* }
sha256sum="$(openssl dgst -sha256 "$pkgfile")" sha256sum=$(openssl dgst -sha256 "$pkgfile")
sha256sum="${sha256sum##* }" sha256sum=${sha256sum##* }
# remove an existing entry if it exists, ignore failures # remove an existing entry if it exists, ignore failures
db_remove_entry "$pkgname" db_remove_entry "$pkgname"
@ -371,17 +371,17 @@ db_write_entry() {
if (( WITHFILES )); then if (( WITHFILES )); then
msg2 "$(gettext "Creating '%s' db entry...")" 'files' msg2 "$(gettext "Creating '%s' db entry...")" 'files'
local files_path="$tmpdir/tree/$pkgname-$pkgver/files" local files_path="$tmpdir/tree/$pkgname-$pkgver/files"
echo "%FILES%" >$files_path echo "%FILES%" >"$files_path"
bsdtar --exclude='^.*' -tf "$pkgfile" >>$files_path bsdtar --exclude='^.*' -tf "$pkgfile" >>"$files_path"
fi fi
# create a delta file # create a delta file
if (( DELTA )); then if (( DELTA )); then
if [[ -n $oldfilename ]]; then if [[ -n $oldfilename ]]; then
if [[ -f $oldfile ]]; then if [[ -f $oldfile ]]; then
delta=$(pkgdelta -q $oldfile $1) delta=$(pkgdelta -q "$oldfile" "$1")
if [[ -f $delta ]]; then if [[ -f $delta ]]; then
db_write_delta $delta db_write_delta "$delta"
fi fi
else else
warning "$(gettext "Old package file not found: %s")" "$oldfilename" warning "$(gettext "Old package file not found: %s")" "$oldfilename"
@ -397,7 +397,7 @@ db_write_entry() {
db_remove_entry() { db_remove_entry() {
local pkgname=$1 local pkgname=$1
local notfound=1 local notfound=1
local pkgentry=$(find_pkgentry $pkgname) local pkgentry=$(find_pkgentry "$pkgname")
while [[ -n $pkgentry ]]; do while [[ -n $pkgentry ]]; do
notfound=0 notfound=0
if [[ -f $pkgentry/deltas ]]; then if [[ -f $pkgentry/deltas ]]; then
@ -405,8 +405,8 @@ db_remove_entry() {
fi fi
msg2 "$(gettext "Removing existing entry '%s'...")" \ msg2 "$(gettext "Removing existing entry '%s'...")" \
"${pkgentry##*/}" "${pkgentry##*/}"
rm -rf $pkgentry rm -rf "$pkgentry"
pkgentry=$(find_pkgentry $pkgname) pkgentry=$(find_pkgentry "$pkgname")
done done
return $notfound return $notfound
} # end db_remove_entry } # end db_remove_entry
@ -432,7 +432,7 @@ check_repo_db() {
# ensure the path to the DB exists; $LOCKFILE is always an absolute path # ensure the path to the DB exists; $LOCKFILE is always an absolute path
repodir=${LOCKFILE%/*}/ repodir=${LOCKFILE%/*}/
if [[ ! -d "$repodir" ]]; then if [[ ! -d $repodir ]]; then
error "$(gettext "%s does not exist or is not a directory.")" "$repodir" error "$(gettext "%s does not exist or is not a directory.")" "$repodir"
exit 1 exit 1
fi fi
@ -442,7 +442,7 @@ check_repo_db() {
CLEAN_LOCK=1 CLEAN_LOCK=1
else else
error "$(gettext "Failed to acquire lockfile: %s.")" "$LOCKFILE" error "$(gettext "Failed to acquire lockfile: %s.")" "$LOCKFILE"
[[ -f $LOCKFILE ]] && error "$(gettext "Held by process %s")" "$(cat $LOCKFILE)" [[ -f $LOCKFILE ]] && error "$(gettext "Held by process %s")" "$(cat "$LOCKFILE")"
exit 1 exit 1
fi fi
@ -460,7 +460,7 @@ check_repo_db() {
msg "$(gettext "Extracting database to a temporary location...")" msg "$(gettext "Extracting database to a temporary location...")"
bsdtar -xf "$REPO_DB_FILE" -C "$tmpdir/tree" bsdtar -xf "$REPO_DB_FILE" -C "$tmpdir/tree"
else else
case "$cmd" in case $cmd in
repo-remove) repo-remove)
error "$(gettext "Repository file '%s' was not found.")" "$REPO_DB_FILE" error "$(gettext "Repository file '%s' was not found.")" "$REPO_DB_FILE"
exit 1 exit 1
@ -562,7 +562,7 @@ if ! type gettext &>/dev/null; then
} }
fi fi
case "$1" in case $1 in
-h|--help) usage; exit 0;; -h|--help) usage; exit 0;;
-V|--version) version; exit 0;; -V|--version) version; exit 0;;
esac esac
@ -582,7 +582,7 @@ fi
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\ tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\
error "$(gettext "Cannot create temp directory for database building.")"; \ error "$(gettext "Cannot create temp directory for database building.")"; \
exit 1) exit 1)
mkdir $tmpdir/tree mkdir "$tmpdir/tree"
trap 'clean_up' EXIT trap 'clean_up' EXIT
for signal in TERM HUP QUIT; do for signal in TERM HUP QUIT; do
@ -595,7 +595,7 @@ declare -a args
success=0 success=0
# parse arguments # parse arguments
while (( $# )); do while (( $# )); do
case "$1" in case $1 in
-q|--quiet) QUIET=1;; -q|--quiet) QUIET=1;;
-d|--delta) DELTA=1;; -d|--delta) DELTA=1;;
-f|--files) WITHFILES=1;; -f|--files) WITHFILES=1;;
@ -614,7 +614,7 @@ while (( $# )); do
-k|--key) -k|--key)
check_gpg check_gpg
shift shift
GPGKEY="$1" GPGKEY=$1
if ! gpg --list-key ${GPGKEY} &>/dev/null; then if ! gpg --list-key ${GPGKEY} &>/dev/null; then
error "$(gettext "The key ${GPGKEY} does not exist in your keyring.")" error "$(gettext "The key ${GPGKEY} does not exist in your keyring.")"
exit 1 exit 1
@ -647,7 +647,7 @@ verify_repo_extension "$REPO_DB_FILE" >/dev/null
check_repo_db check_repo_db
for arg in "${args[@]:1}"; do for arg in "${args[@]:1}"; do
case "$cmd" in case $cmd in
repo-add) add "$arg" ;; repo-add) add "$arg" ;;
repo-remove) remove "$arg" ;; repo-remove) remove "$arg" ;;
esac && success=1 esac && success=1
@ -695,7 +695,7 @@ if (( success )); then
mv "$tempname.sig" "$REPO_DB_FILE.sig" mv "$tempname.sig" "$REPO_DB_FILE.sig"
fi fi
dblink="${REPO_DB_FILE%.tar*}" dblink=${REPO_DB_FILE%.tar*}
rm -f "$dblink" "$dblink.sig" rm -f "$dblink" "$dblink.sig"
ln -s "$filename" "$dblink" 2>/dev/null || \ ln -s "$filename" "$dblink" 2>/dev/null || \
ln "$filename" "$dblink" 2>/dev/null || \ ln "$filename" "$dblink" 2>/dev/null || \