From 9fa18d9a4b4ce5217842c71d8a45676e3fb9d3f4 Mon Sep 17 00:00:00 2001 From: Xavier Chantry Date: Wed, 25 Feb 2009 19:26:31 +0100 Subject: Add pkgdelta script to create deltas. This should obsolete the delta support in makepkg. Having a separate script should be more flexible. Example usage: $ pkgdelta repo/tzdata-2009a-1-x86_64.pkg.tar.gz repo/tzdata-2009b-1-x86_64.pkg.tar.gz ==> Generating delta from version 2009a-1 to version 2009b-1 ==> Generated delta : 'repo/tzdata-2009a-1_to_2009b-1-x86_64.delta' Signed-off-by: Xavier Chantry --- scripts/.gitignore | 1 + scripts/Makefile.am | 3 + scripts/pkgdelta.sh.in | 165 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 scripts/pkgdelta.sh.in diff --git a/scripts/.gitignore b/scripts/.gitignore index f2f19fd8..eafc4930 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -3,3 +3,4 @@ pacman-optimize rankmirrors repo-add repo-remove +pkgdelta diff --git a/scripts/Makefile.am b/scripts/Makefile.am index d6d9bb93..5a2b780c 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -8,12 +8,14 @@ bin_SCRIPTS = \ OURSCRIPTS = \ makepkg \ pacman-optimize \ + pkgdelta \ rankmirrors \ repo-add EXTRA_DIST = \ makepkg.sh.in \ pacman-optimize.sh.in \ + pkgdelta.sh.in \ rankmirrors.py.in \ repo-add.sh.in @@ -58,6 +60,7 @@ $(OURSCRIPTS): Makefile makepkg: $(srcdir)/makepkg.sh.in pacman-optimize: $(srcdir)/pacman-optimize.sh.in +pkgdelta: $(srcdir)/pkgdelta.sh.in rankmirrors: $(srcdir)/rankmirrors.py.in repo-add: $(srcdir)/repo-add.sh.in repo-remove: $(srcdir)/repo-add.sh.in diff --git a/scripts/pkgdelta.sh.in b/scripts/pkgdelta.sh.in new file mode 100644 index 00000000..588dc49d --- /dev/null +++ b/scripts/pkgdelta.sh.in @@ -0,0 +1,165 @@ +#!/bin/bash +# +# pkgdelta - create delta files for use with pacman and repo-add +# @configure_input@ +# +# Copyright (c) 2009 Xavier Chantry +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# bash options +set -o nounset +set -o errexit + +# gettext initialization +export TEXTDOMAIN='pacman' +export TEXTDOMAINDIR='@localedir@' + +myver='@PACKAGE_VERSION@' + +QUIET=0 + +# ensure we have a sane umask set +umask 0022 + +msg() { + [ $QUIET -ne 0 ] && return + local mesg=$1; shift + printf "==> ${mesg}\n" "$@" >&1 +} + +warning() { + local mesg=$1; shift + printf "==> $(gettext "WARNING:") ${mesg}\n" "$@" >&2 +} + +error() { + local mesg=$1; shift + printf "==> $(gettext "ERROR:") ${mesg}\n" "$@" >&2 +} + +# print usage instructions +usage() { + printf "pkgdelta (pacman) %s\n\n" "$myver" + printf "$(gettext "Usage: pkgdelta [-q] \n")" + printf "$(gettext "\ + 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")" + echo "$(gettext "Example: pkgdelta pacman-3.0.0.pkg.tar.gz pacman-3.0.1.pkg.tar.gz")" +} + +version() { + printf "pkgdelta (pacman) %s\n\n" "$myver" + printf "$(gettext "\ +Copyright (c) 2009 Xavier Chantry .\n\n\ +This is free software; see the source for copying conditions.\n\ +There is NO WARRANTY, to the extent permitted by law.\n")" +} + +read_pkginfo() +{ + pkgname= pkgver= arch= + local OLDIFS=$IFS + # IFS (field separator) is only the newline character + IFS=" +" + local line var val + for line in $(bsdtar -xOf "$1" .PKGINFO 2>/dev/null | + grep -v "^#" | sed 's|\(\w*\)\s*=\s*\(.*\)|\1="\2"|'); do + eval "$line" + if [ -n "$pkgname" -a -n "$pkgver" -a -n "$arch" ]; then + IFS=$OLDIFS + return 0 + fi + done + IFS=$OLDIFS + error "$(gettext "Invalid package '%s'")" "$1" + return 1 +} + +# $oldfile $oldmd5 $newfile $newmd5 $deltafile $deltamd5 $deltasize +create_xdelta() +{ + local oldfile=$1 + local newfile=$2 + local \ + oldname oldver oldarch \ + newname newver newarch \ + deltafile + + read_pkginfo "$oldfile" || return 1 + oldname="$pkgname" + oldver="$pkgver" + oldarch="$arch" + read_pkginfo "$newfile" || return 1 + newname="$pkgname" + newver="$pkgver" + newarch="$arch" + + if [ "$oldname" != "$newname" ]; then + error "$(gettext "The package names don't match : '%s' and '%s'")" "$oldname" "$newname" + return 1 + fi + + if [ "$oldarch" != "$newarch" ]; then + error "$(gettext "The package architectures don't match : '%s' and '%s'")" "$oldarch" "$newarch" + return 1 + fi + + if [ "$oldver" == "$newver" ]; then + error "$(gettext "Both packages have the same version : '%s'")" "$newver" + return 1 + fi + + msg "$(gettext "Generating delta from version %s to version %s")" "$oldver" "$newver" + deltafile="$(dirname $newfile)/$pkgname-${oldver}_to_${newver}-$arch.delta" + local ret=0 + + xdelta3 -q -f -s "$oldfile" "$newfile" "$deltafile" || ret=$? + if [ $ret -ne 0 ]; then + error "$(gettext "Delta could not be created.")" + return 1 + else + msg "$(gettext "Generated delta : '%s'")" "$deltafile" + [ $QUIET -eq 1 ] && echo "$deltafile" + fi + return 0 +} + +case "$1" in + -q|--quiet) QUIET=1; shift ;; +esac + +if [ $# -ne 2 ]; then + usage + exit 0 +fi + +if [ ! -f "$1" ]; then + error "$(gettext "File '%s' does not exist")" "$1" + exit 0 +fi + +if [ ! -f "$2" ]; then + error "$(gettext "File '%s' does not exist")" "$2" + exit 0 +fi + +if [ ! "$(type -p xdelta3)" ]; then + error "$(gettext "Cannot find the xdelta3 binary! Is xdelta3 installed?")" + exit 1 +fi + +create_xdelta "$1" "$2" -- cgit v1.2.3-70-g09d2