[pacman-dev] [PATCH] Add deltas to repository database.

Nathan Jones nathanj at insightbb.com
Fri Oct 5 20:58:30 EDT 2007


This patch adds delta information to the repository database along with
the other information about a package. This would be useful if two or
more package versions have been built since a user upgrades.

I don't think it would be too difficult to create an algorithm to decide
which delta files, if any, would be downloaded and applied.

Any comments?

Sample output:

$ ls -l *.pkg.tar.gz *.delta
-rw-r--r-- 1 nathanj users 1045940 2007-05-12 21:03 pan-devel-0.129-1-i686.pkg.tar.gz
-rw-r--r-- 1 nathanj users  583339 2007-10-05 18:38 pan-devel-0.129-1_to_0.130-1-i686.delta
-rw-r--r-- 1 nathanj users 1044271 2007-05-19 13:17 pan-devel-0.130-1-i686.pkg.tar.gz
-rw-r--r-- 1 nathanj users  425727 2007-10-05 18:38 pan-devel-0.130-1_to_0.131-1-i686.delta
-rw-r--r-- 1 nathanj users 1055063 2007-05-26 18:40 pan-devel-0.131-1-i686.pkg.tar.gz
-rw-r--r-- 1 nathanj users  680644 2007-10-05 18:38 pan-devel-0.131-1_to_0.132-1-i686.delta
-rw-r--r-- 1 nathanj users 1025859 2007-08-15 22:03 pan-devel-0.132-1-i686.pkg.tar.gz
-rw-r--r-- 1 nathanj users    1792 2007-10-05 18:38 pan-devel-0.132-1_to_0.132-2-i686.delta
-rw-r--r-- 1 nathanj users 1025826 2007-08-01 17:04 pan-devel-0.132-2-i686.pkg.tar.gz
$ ~/code/pacman/scripts/repo-add repo.db.tar.gz pan-devel-0.132-2-i686.pkg.tar.gz *.delta
==> Extracting database to a temporary location...
==> Adding package 'pan-devel-0.132-2-i686.pkg.tar.gz'
  -> Removing existing package 'pan-devel-0.132-2'...
  -> Creating 'desc' db entry...
  -> Computing md5 checksums...
  -> Creating 'depends' db entry...
==> Adding delta 'pan-devel-0.129-1_to_0.130-1-i686.delta'
==> Adding delta 'pan-devel-0.130-1_to_0.131-1-i686.delta'
==> Adding delta 'pan-devel-0.131-1_to_0.132-1-i686.delta'
==> Adding delta 'pan-devel-0.132-1_to_0.132-2-i686.delta'
==> Creating updated database file /home/nathanj/pkgs/pan-devel/repo.db.tar.gz
$ tar zxOf repo.db.tar.gz pan-devel-0.132-2/deltas
%DELTAS%
0.129-1 0.130-1 583339
0.130-1 0.131-1 425727
0.131-1 0.132-1 680644
0.132-1 0.132-2 1792

Signed-off-by: Nathan Jones <nathanj at insightbb.com>
---
 scripts/repo-add.sh.in |   64 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index cb741d7..4a7949e 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -97,6 +97,61 @@ write_list_entry() {
 	fi
 }
 
+# write a delta entry to the pacman database
+#   arg1 - path to delta
+db_write_delta()
+{
+	# blank out all variables and set deltafile
+	local deltafile=$(readlink -f "$1")
+	local pkgname fromver tover arch csize
+
+	pkgname="$(echo "$1" | sed -e 's/\(.*\)-\(.*-.*\)_to_\(.*-.*\)-\(.*\).delta/\1/')"
+	fromver="$(echo "$1" | sed -e 's/\(.*\)-\(.*-.*\)_to_\(.*-.*\)-\(.*\).delta/\2/')"
+	tover="$(echo "$1" | sed -e 's/\(.*\)-\(.*-.*\)_to_\(.*-.*\)-\(.*\).delta/\3/')"
+	arch="$(echo "$1" | sed -e 's/\(.*\)-\(.*-.*\)_to_\(.*-.*\)-\(.*\).delta/\4/')"
+
+	# get size of delta
+	csize=$(du -b -L "$deltafile" | cut -f 1)
+
+	pushd "$gstmpdir" 2>&1 >/dev/null
+
+	# ensure $pkgname and $pkgver variables were found
+	if [ -z "$pkgname" -o -z "$fromver" ]; then
+		error "$(gettext "Invalid delta file '%s'.")" "$deltafile"
+		popd 2>&1 >/dev/null
+		return 1
+	fi
+
+	# cd into the package's directory
+	local existing
+	local gotpackage=f
+	for existing in *; do
+		if [ "${existing%-*-*}" = "$pkgname" ]; then
+			cd "$existing"
+			gotpackage=t
+			break
+		fi
+	done
+
+	# exit out if the package's directory does not exist
+	if [ "$gotpackage" == "f" ]; then
+		error "$(gettext "Cannot find directory for '%s'.")" "$pkgname"
+		popd 2>&1 >/dev/null
+		return 1
+	fi
+
+	# create deltas file if it doesn't exist
+	if [ ! -f "deltas" ]; then
+		echo -e "%DELTAS%" >>deltas
+	fi
+
+	# add the entry for this delta file
+	echo -e "$fromver $tover $csize" >>deltas
+
+	popd 2>&1 >/dev/null
+} # end db_write_delta
+
+
 # write an entry to the pacman database
 #   arg1 - path to package
 db_write_entry()
@@ -242,7 +297,14 @@ for arg in "$@"; do
 		fi
 	else
 		if [ -f "$arg" ]; then
-			if ! bsdtar -tf "$arg" .PKGINFO 2>&1 >/dev/null; then
+			# see if extension is .delta ... there's gotta be a better way
+			if [ "${arg%.delta}" != "$arg" ]; then
+				msg "$(gettext "Adding delta '%s'")" "$arg"
+
+				if db_write_delta "$arg"; then
+					success=1
+				fi
+			elif ! bsdtar -tf "$arg" .PKGINFO 2>&1 >/dev/null; then
 				error "$(gettext "'%s' is not a package file, skipping")" "$arg"
 			else
 				msg "$(gettext "Adding package '%s'")" "$arg"
-- 
1.5.3.4




More information about the pacman-dev mailing list