[pacman-dev] [PATCH] repo-add: fix db creation one last time

Dan McGee dan at archlinux.org
Tue Jun 28 20:58:08 EDT 2011


We fubar-ed this pretty good.

1. The whole old/new move shuffle was totally busted if you used a
relative path to your database, as we would just build the database in
place.
2. Our prior temp directory layout had the database files extracted
directly into it. When we tried to create a xxx.db.tar.gz file in this
same directory, due to the fact that we were no longer using a shell
wildcard, we tried to include the db in ourself, which is a big failure.
Fix all this by extracting to tree/ so we can have a clean top-level
temp directory.
3. Fix the inclusion of the './' directory entry; ensure the regex
prunes both leading paths of '.' as well as './'.

Where is that test suite again?

Signed-off-by: Dan McGee <dan at archlinux.org>
---
 scripts/repo-add.sh.in |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index 17b32aa..a845049 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -100,7 +100,7 @@ format_entry() {
 find_pkgentry() {
 	local pkgname=$1
 	local pkgentry
-	for pkgentry in $tmpdir/$pkgname*; do
+	for pkgentry in $tmpdir/tree/$pkgname*; do
 		name=${pkgentry##*/}
 		if [[ ${name%-*-*} = $pkgname ]]; then
 			echo $pkgentry
@@ -285,7 +285,7 @@ db_write_entry() {
 		return 1
 	fi
 
-	pushd "$tmpdir" >/dev/null
+	pushd "$tmpdir/tree" >/dev/null
 	if [[ -d $pkgname-$pkgver ]]; then
 		warning "$(gettext "An entry for '%s' already existed")" "$pkgname-$pkgver"
 	else
@@ -350,7 +350,7 @@ db_write_entry() {
 	# create files file if wanted
 	if (( WITHFILES )); then
 		msg2 "$(gettext "Creating '%s' db entry...")" 'files'
-		local files_path="$tmpdir/$pkgname-$pkgver/files"
+		local files_path="$tmpdir/tree/$pkgname-$pkgver/files"
 		echo "%FILES%" >$files_path
 		bsdtar --exclude='^.*' -tf "$pkgfile" >>$files_path
 	fi
@@ -381,7 +381,7 @@ db_remove_entry() {
 	while [[ -n $pkgentry ]]; do
 		notfound=0
 		if [[ -f $pkgentry/deltas ]]; then
-			mv "$pkgentry/deltas" "$tmpdir/$pkgname.deltas"
+			mv "$pkgentry/deltas" "$tmpdir/tree/$pkgname.deltas"
 		fi
 		msg2 "$(gettext "Removing existing entry '%s'...")" \
 		"${pkgentry##*/}"
@@ -443,7 +443,7 @@ check_repo_db() {
 		fi
 		verify_signature "$REPO_DB_FILE"
 		msg "$(gettext "Extracting database to a temporary location...")"
-		bsdtar -xf "$REPO_DB_FILE" -C "$tmpdir"
+		bsdtar -xf "$REPO_DB_FILE" -C "$tmpdir/tree"
 	else
 		case "$cmd" in
 			repo-remove)
@@ -509,7 +509,7 @@ remove() {
 	msg "$(gettext "Searching for package '%s'...")" "$pkgname"
 
 	if db_remove_entry "$pkgname"; then
-		rm -f "$tmpdir/$pkgname.deltas"
+		rm -f "$tmpdir/tree/$pkgname.deltas"
 		return 0
 	else
 		error "$(gettext "Package matching '%s' not found.")" "$pkgname"
@@ -561,6 +561,7 @@ fi
 tmpdir=$(mktemp -d /tmp/repo-tools.XXXXXXXXXX) || (\
 	error "$(gettext "Cannot create temp directory for database building.")"; \
 	exit 1)
+mkdir $tmpdir/tree
 
 trap 'clean_up' EXIT
 trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
@@ -628,12 +629,13 @@ if (( success )); then
 	TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE")
 	filename=${REPO_DB_FILE##*/}
 
-	pushd "$tmpdir" >/dev/null
+	pushd "$tmpdir/tree" >/dev/null
 	# strip the './' off filenames; this also allows us to tar an empty dir
-	bsdtar -s %^./%% -c${TAR_OPT}f "$REPO_DB_FILE" ./
-	create_signature "$filename"
+	bsdtar -s '%^./\?%%' -c${TAR_OPT}f "$tmpdir/$filename" ./
 	popd >/dev/null
 
+	create_signature "$tmpdir/$filename"
+
 	[[ -f $REPO_DB_FILE ]] && mv -f "$REPO_DB_FILE" "${REPO_DB_FILE}.old"
 	[[ -f $REPO_DB_FILE.sig ]] && rm -f "$REPO_DB_FILE.sig"
 	[[ -f $tmpdir/$filename ]] && mv "$tmpdir/$filename" "$REPO_DB_FILE"
-- 
1.7.6



More information about the pacman-dev mailing list