From 22dd30328ec4229321f1f96026704ff3cf1cc621 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 1 Nov 2011 09:55:25 -0500 Subject: db-*: always handle pkgname/pkgbase/pkgfile argument last This matches what we do in db-update, and makes the most sense if we want to expand these commands to take multiple arguments at the same time. Especially in the case of db-repo-add and db-repo-remove, these wrapper commands should be no more limiting than repo-add and repo-remove which always allow multiple arguments and are more efficient that way. This patch simply reorders the arguments; a later patch will support multiple pkgname/pkgbase/pkgfile arguments on the command line. Although this does break backwards compatibility and requires some changing of muscle memory, I think it is a worthwhile change to make as the functionality of these commands becomes more powerful and the order of arguments becomes the same in all of them. Signed-off-by: Dan McGee --- db-remove | 8 ++++---- db-repo-add | 8 ++++---- db-repo-remove | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/db-remove b/db-remove index b44eb33..e7326c0 100755 --- a/db-remove +++ b/db-remove @@ -4,13 +4,13 @@ . "$(dirname $0)/config" if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " + msg "usage: $(basename $0) " exit 1 fi -pkgbase="$1" -repo="$2" -arch="$3" +repo="$1" +arch="$2" +pkgbase="$3" ftppath="$FTP_BASE/$repo/os" svnrepo="$repo-$arch" diff --git a/db-repo-add b/db-repo-add index 53cfc84..8d4a56d 100755 --- a/db-repo-add +++ b/db-repo-add @@ -4,13 +4,13 @@ . "$(dirname $0)/config" if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " + msg "usage: $(basename $0) " exit 1 fi -pkgfile="$1" -repo="$2" -arch="$3" +repo="$1" +arch="$2" +pkgfile="$3" ftppath="$FTP_BASE/$repo/os" diff --git a/db-repo-remove b/db-repo-remove index b01910f..e55cd07 100755 --- a/db-repo-remove +++ b/db-repo-remove @@ -4,13 +4,13 @@ . "$(dirname $0)/config" if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " + msg "usage: $(basename $0) " exit 1 fi -pkgname="$1" -repo="$2" -arch="$3" +repo="$1" +arch="$2" +pkgname="$3" ftppath="$FTP_BASE/$repo/os" -- cgit v1.1-4-g5e80 From bbf00cc90ed8d1bf3bbed1f78acca71b2d624ee2 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 1 Nov 2011 09:55:26 -0500 Subject: db-repo-{add, remove}: allow specifying multiple packages This allows invoking these commands for more than one package at a time which is incredibly more efficient as the database doesn't need to be locked, unpacked, modified, changed, and unlocked for every single passed package name or file if you have more than one. Signed-off-by: Dan McGee --- db-remove | 4 ++-- db-repo-add | 20 +++++++++++--------- db-repo-remove | 13 +++++++------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/db-remove b/db-remove index e7326c0..7e2282a 100755 --- a/db-remove +++ b/db-remove @@ -3,8 +3,8 @@ . "$(dirname $0)/db-functions" . "$(dirname $0)/config" -if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " +if [ $# -lt 3 ]; then + msg "usage: $(basename $0) ..." exit 1 fi diff --git a/db-repo-add b/db-repo-add index 8d4a56d..9661b91 100755 --- a/db-repo-add +++ b/db-repo-add @@ -3,14 +3,14 @@ . "$(dirname $0)/db-functions" . "$(dirname $0)/config" -if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " +if [ $# -lt 3 ]; then + msg "usage: $(basename $0) ..." exit 1 fi repo="$1" arch="$2" -pkgfile="$3" +pkgfiles=(${@:3}) ftppath="$FTP_BASE/$repo/os" @@ -28,12 +28,14 @@ for tarch in ${tarches[@]}; do repo_lock $repo $tarch || exit 1 done -msg "Adding $pkgfile to [$repo]..." - for tarch in ${tarches[@]}; do - if [ ! -f "${pkgfile}" ]; then - die "Package file ${pkgfile} not found" - fi - arch_repo_add "${repo}" "${tarch}" ${pkgfile} + for pkgfile in ${pkgfiles[@]}; do + if [[ ! -f $pkgfile ]]; then + die "Package file $pkgfile not found" + else + msg "Adding $pkgfile to [$repo]..." + fi + done + arch_repo_add "${repo}" "${tarch}" ${pkgfiles[@]} repo_unlock $repo $tarch done diff --git a/db-repo-remove b/db-repo-remove index e55cd07..4f04ed1 100755 --- a/db-repo-remove +++ b/db-repo-remove @@ -3,14 +3,14 @@ . "$(dirname $0)/db-functions" . "$(dirname $0)/config" -if [ $# -ne 3 ]; then - msg "usage: $(basename $0) " +if [ $# -lt 3 ]; then + msg "usage: $(basename $0) ..." exit 1 fi repo="$1" arch="$2" -pkgname="$3" +pkgnames=(${@:3}) ftppath="$FTP_BASE/$repo/os" @@ -28,9 +28,10 @@ for tarch in ${tarches[@]}; do repo_lock $repo $tarch || exit 1 done -msg "Removing $pkgname from [$repo]..." - for tarch in ${tarches[@]}; do - arch_repo_remove "${repo}" "${tarch}" ${pkgname} + for pkgname in ${pkgnames[@]}; do + msg "Removing $pkgname from [$repo]..." + done + arch_repo_remove "${repo}" "${tarch}" ${pkgnames[@]} repo_unlock $repo $tarch done -- cgit v1.1-4-g5e80 From ae3ff361863b72d9cd52d9379cda7e7dbe825b15 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 15:03:05 +0100 Subject: Adjust tests to use new db-remove interface --- test/test.d/create-filelists.sh | 2 +- test/test.d/db-remove.sh | 4 ++-- test/test.d/ftpdir-cleanup.sh | 8 ++++---- test/test.d/sourceballs.sh | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/test.d/create-filelists.sh b/test/test.d/create-filelists.sh index 80b0927..49734c4 100755 --- a/test/test.d/create-filelists.sh +++ b/test/test.d/create-filelists.sh @@ -88,7 +88,7 @@ testCleanupFileLists() { ../db-update for arch in ${arches[@]}; do - ../db-remove pkg-simple-a extra ${arch} + ../db-remove extra ${arch} pkg-simple-a done for arch in ${arches[@]}; do diff --git a/test/test.d/db-remove.sh b/test/test.d/db-remove.sh index 573bd71..945ca62 100755 --- a/test/test.d/db-remove.sh +++ b/test/test.d/db-remove.sh @@ -19,7 +19,7 @@ testRemovePackages() { for pkgbase in ${pkgs[@]}; do for arch in ${arches[@]}; do - ../db-remove ${pkgbase} extra ${arch} + ../db-remove extra ${arch} ${pkgbase} done done @@ -41,7 +41,7 @@ testRemoveAnyPackages() { ../db-update for pkgbase in ${pkgs[@]}; do - ../db-remove ${pkgbase} extra any + ../db-remove extra any ${pkgbase} done for pkgbase in ${pkgs[@]}; do diff --git a/test/test.d/ftpdir-cleanup.sh b/test/test.d/ftpdir-cleanup.sh index 77b02b8..20026b4 100755 --- a/test/test.d/ftpdir-cleanup.sh +++ b/test/test.d/ftpdir-cleanup.sh @@ -18,7 +18,7 @@ testCleanupSimplePackages() { ../db-update for arch in ${arches[@]}; do - ../db-remove pkg-simple-a extra ${arch} + ../db-remove extra ${arch} pkg-simple-a done ../cron-jobs/ftpdir-cleanup >/dev/null @@ -49,7 +49,7 @@ testCleanupEpochPackages() { ../db-update for arch in ${arches[@]}; do - ../db-remove pkg-simple-epoch extra ${arch} + ../db-remove extra ${arch} pkg-simple-epoch done ../cron-jobs/ftpdir-cleanup >/dev/null @@ -72,7 +72,7 @@ testCleanupAnyPackages() { done ../db-update - ../db-remove pkg-any-a extra any + ../db-remove extra any pkg-any-a ../cron-jobs/ftpdir-cleanup >/dev/null local pkg1='pkg-any-a-1-1-any.pkg.tar.xz' @@ -100,7 +100,7 @@ testCleanupSplitPackages() { ../db-update for arch in ${arches[@]}; do - ../db-remove ${pkgs[0]} extra ${arch} + ../db-remove extra ${arch} ${pkgs[0]} done ../cron-jobs/ftpdir-cleanup >/dev/null diff --git a/test/test.d/sourceballs.sh b/test/test.d/sourceballs.sh index 11bd0f4..fdcf08c 100755 --- a/test/test.d/sourceballs.sh +++ b/test/test.d/sourceballs.sh @@ -73,7 +73,7 @@ testSourceballsCleanup() { ../cron-jobs/sourceballs for arch in ${arches[@]}; do - ../db-remove pkg-simple-a extra ${arch} + ../db-remove extra ${arch} pkg-simple-a done ../cron-jobs/sourceballs -- cgit v1.1-4-g5e80 From 6159269bfbb850b2aed25e335fc5d538a2d4de4f Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 16:34:53 +0100 Subject: db-remove: support removing multiple packages at once --- db-remove | 33 ++++++++++++++++++--------------- test/test.d/db-remove.sh | 25 +++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/db-remove b/db-remove index 7e2282a..a3e03e6 100755 --- a/db-remove +++ b/db-remove @@ -10,7 +10,7 @@ fi repo="$1" arch="$2" -pkgbase="$3" +pkgbases=(${@:3}) ftppath="$FTP_BASE/$repo/os" svnrepo="$repo-$arch" @@ -29,21 +29,24 @@ for tarch in ${tarches[@]}; do repo_lock $repo $tarch || exit 1 done -msg "Removing $pkgbase from [$repo]..." -/usr/bin/svn checkout -q "${SVNREPO}/${pkgbase}" "${WORKDIR}/svn/${pkgbase}" >/dev/null - -if [ -d "${WORKDIR}/svn/$pkgbase/repos/$svnrepo" ]; then - pkgnames=($(. "${WORKDIR}/svn/$pkgbase/repos/$svnrepo/PKGBUILD"; echo ${pkgname[@]})) - /usr/bin/svn rm --force -q "${WORKDIR}/svn/$pkgbase/repos/$svnrepo" - /usr/bin/svn commit -q "${WORKDIR}/svn/$pkgbase" -m "$(basename $0): $pkgbase removed by $(id -un)" -else - warning "$pkgbase not found in $svnrepo" - warning "Removing only $pkgbase from the repo" - warning "If it was a split package you have to remove the others yourself!" - pkgnames=($pkgbase) -fi +remove_pkgs=() +for pkgbase in ${pkgbases[@]}; do + msg "Removing $pkgbase from [$repo]..." + /usr/bin/svn checkout -q "${SVNREPO}/${pkgbase}" "${WORKDIR}/svn/${pkgbase}" >/dev/null + + if [ -d "${WORKDIR}/svn/$pkgbase/repos/$svnrepo" ]; then + remove_pkgs=(${remove_pkgs[@]} $(. "${WORKDIR}/svn/$pkgbase/repos/$svnrepo/PKGBUILD"; echo ${pkgname[@]})) + /usr/bin/svn rm --force -q "${WORKDIR}/svn/$pkgbase/repos/$svnrepo" + /usr/bin/svn commit -q "${WORKDIR}/svn/$pkgbase" -m "$(basename $0): $pkgbase removed by $(id -un)" + else + warning "$pkgbase not found in $svnrepo" + warning "Removing only $pkgbase from the repo" + warning "If it was a split package you have to remove the others yourself!" + remove_pkgs[${#remove_pkgs[*]}]=$pkgbase + fi +done for tarch in ${tarches[@]}; do - arch_repo_remove "${repo}" "${tarch}" ${pkgnames[@]} + arch_repo_remove "${repo}" "${tarch}" ${remove_pkgs[@]} repo_unlock $repo $tarch done diff --git a/test/test.d/db-remove.sh b/test/test.d/db-remove.sh index 945ca62..416e693 100755 --- a/test/test.d/db-remove.sh +++ b/test/test.d/db-remove.sh @@ -30,6 +30,31 @@ testRemovePackages() { done } +testRemoveMultiplePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b' 'pkg-split-a' 'pkg-split-b' 'pkg-simple-epoch') + local pkgbase + local arch + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + releasePackage extra ${pkgbase} ${arch} + done + done + + ../db-update + + for arch in ${arches[@]}; do + ../db-remove extra ${arch} ${pkgs[@]} + done + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkRemovedPackage extra ${pkgbase} ${arch} + done + done +} + testRemoveAnyPackages() { local pkgs=('pkg-any-a' 'pkg-any-b') local pkgbase -- cgit v1.1-4-g5e80 From 5c614ddd8ba74bca6a2dfe83a599601533d9ddc7 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 17:38:16 +0100 Subject: check svn entry for any packages --- test/lib/common.inc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/lib/common.inc b/test/lib/common.inc index c96e677..61e57d0 100644 --- a/test/lib/common.inc +++ b/test/lib/common.inc @@ -158,6 +158,11 @@ checkAnyPackage() { [ -r "${FTP_BASE}/${repo}/os/any/${pkg}" ] && fail "${repo}/os/any/${pkg} should not exist" [ -r "${FTP_BASE}/${repo}/os/any/${pkg}.sig" ] && fail "${repo}/os/any/${pkg}.sig should not exist" + + local pkgbase=$(getpkgbase "${FTP_BASE}/${PKGPOOL}/${pkg}") + svn up -q "${TMP}/svn-packages-copy/${pkgbase}" + [ -d "${TMP}/svn-packages-copy/${pkgbase}/repos/${repo}-any" ] \ + || fail "svn-packages-copy/${pkgbase}/repos/${repo}-any does not exist" } checkPackage() { -- cgit v1.1-4-g5e80 From 449f67604bad8794b3da80f2bc49d7e87c226048 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 17:49:17 +0100 Subject: Split package database test functions from check* functions This way we can check consitency of databases independent from a svn repo --- test/lib/common.inc | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test/lib/common.inc b/test/lib/common.inc index 61e57d0..a2dee10 100644 --- a/test/lib/common.inc +++ b/test/lib/common.inc @@ -125,7 +125,7 @@ releasePackage() { fi } -checkAnyPackage() { +checkAnyPackageDB() { local repo=$1 local pkg=$2 local arch @@ -158,6 +158,13 @@ checkAnyPackage() { [ -r "${FTP_BASE}/${repo}/os/any/${pkg}" ] && fail "${repo}/os/any/${pkg} should not exist" [ -r "${FTP_BASE}/${repo}/os/any/${pkg}.sig" ] && fail "${repo}/os/any/${pkg}.sig should not exist" +} + +checkAnyPackage() { + local repo=$1 + local pkg=$2 + + checkAnyPackageDB $repo $pkg local pkgbase=$(getpkgbase "${FTP_BASE}/${PKGPOOL}/${pkg}") svn up -q "${TMP}/svn-packages-copy/${pkgbase}" @@ -165,7 +172,7 @@ checkAnyPackage() { || fail "svn-packages-copy/${pkgbase}/repos/${repo}-any does not exist" } -checkPackage() { +checkPackageDB() { local repo=$1 local pkg=$2 local arch=$3 @@ -192,6 +199,14 @@ checkPackage() { && bsdtar -xf "${FTP_BASE}/${repo}/os/${arch}/${repo}${db%.tar.*}" -O | grep -q ${pkg}) \ || fail "${pkg} not in ${repo}/os/${arch}/${repo}${db%.tar.*}" done +} + +checkPackage() { + local repo=$1 + local pkg=$2 + local arch=$3 + + checkPackageDB $repo $pkg $arch local pkgbase=$(getpkgbase "${FTP_BASE}/${PKGPOOL}/${pkg}") svn up -q "${TMP}/svn-packages-copy/${pkgbase}" @@ -199,7 +214,7 @@ checkPackage() { || fail "svn-packages-copy/${pkgbase}/repos/${repo}-${arch} does not exist" } -checkRemovedPackage() { +checkRemovedPackageDB() { local repo=$1 local pkgbase=$2 local arch=$3 @@ -210,13 +225,21 @@ checkRemovedPackage() { && bsdtar -xf "${FTP_BASE}/${repo}/os/${arch}/${repo}${db%.tar.*}" -O | grep -q ${pkgbase}) \ && fail "${pkgbase} should not be in ${repo}/os/${arch}/${repo}${db%.tar.*}" done +} + +checkRemovedPackage() { + local repo=$1 + local pkgbase=$2 + local arch=$3 + + checkRemovedPackageDB $repo $pkgbase $arch svn up -q "${TMP}/svn-packages-copy/${pkgbase}" [ -d "${TMP}/svn-packages-copy/${pkgbase}/repos/${repo}-${arch}" ] \ && fail "svn-packages-copy/${pkgbase}/repos/${repo}-${arch} should not exist" } -checkRemovedAnyPackage() { +checkRemovedAnyPackageDB() { local repo=$1 local pkgbase=$2 local arch @@ -229,6 +252,13 @@ checkRemovedAnyPackage() { && fail "${pkgbase} should not be in ${repo}/os/${arch}/${repo}${db%.tar.*}" done done +} + +checkRemovedAnyPackage() { + local repo=$1 + local pkgbase=$2 + + checkRemovedAnyPackageDB $repo $pkgbase svn up -q "${TMP}/svn-packages-copy/${pkgbase}" [ -d "${TMP}/svn-packages-copy/${pkgbase}/repos/${repo}-any" ] \ -- cgit v1.1-4-g5e80 From 0c8c401b9638087e3f7127f83a2cb0b5cfdd3269 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 17:56:29 +0100 Subject: Add test for moving multiple packages at once --- test/test.d/db-move.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/test.d/db-move.sh b/test/test.d/db-move.sh index 40b40de..9d7c1f6 100755 --- a/test/test.d/db-move.sh +++ b/test/test.d/db-move.sh @@ -27,6 +27,30 @@ testMoveSimplePackages() { done } +testMoveMultiplePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b') + local pkgbase + local arch + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + releasePackage testing ${pkgbase} ${arch} + done + done + + ../db-update + + ../db-move testing extra pkg-simple-a pkg-simple-b + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkPackage extra ${pkgbase}-1-1-${arch}.pkg.tar.xz ${arch} + checkRemovedPackage testing ${pkgbase}-1-1-${arch}.pkg.tar.xz ${arch} + done + done +} + testMoveEpochPackages() { local arches=('i686' 'x86_64') local pkgs=('pkg-simple-epoch') -- cgit v1.1-4-g5e80 From 23a508412936b1408e9ce9399e675fc1397c28eb Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 18:10:08 +0100 Subject: db-repo-add: At least check if the package to be added is available in the correct directory --- db-repo-add | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db-repo-add b/db-repo-add index 9661b91..b83fb77 100755 --- a/db-repo-add +++ b/db-repo-add @@ -30,8 +30,8 @@ done for tarch in ${tarches[@]}; do for pkgfile in ${pkgfiles[@]}; do - if [[ ! -f $pkgfile ]]; then - die "Package file $pkgfile not found" + if [[ ! -f "${FTP_BASE}/${repo}/os/${arch}/${pkgfile##*/}" ]]; then + die "Package file ${pkgfile##*/} not found in ${FTP_BASE}/${repo}/os/${arch}/" else msg "Adding $pkgfile to [$repo]..." fi -- cgit v1.1-4-g5e80 From 3084db6f3c6678eeb27ba0d532db0007432bfed1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sat, 5 Nov 2011 18:37:51 +0100 Subject: Add simple tests for db-repo-add and db-repo-remove --- test/test.d/db-repo-add.sh | 54 ++++++++++++++++++++++++++++++++++++++++ test/test.d/db-repo-remove.sh | 58 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100755 test/test.d/db-repo-add.sh create mode 100755 test/test.d/db-repo-remove.sh diff --git a/test/test.d/db-repo-add.sh b/test/test.d/db-repo-add.sh new file mode 100755 index 0000000..8603104 --- /dev/null +++ b/test/test.d/db-repo-add.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +curdir=$(readlink -e $(dirname $0)) +. "${curdir}/../lib/common.inc" + +testAddSimplePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b') + local pkgbase + local arch + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + cp "${pkgdir}/${pkgbase}/${pkgbase}-1-1-${arch}.pkg.tar.xz" "${FTP_BASE}/${PKGPOOL}/" + touch "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz.sig" + ln -s "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz" "${FTP_BASE}/extra/os/${arch}/" + ln -s "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz.sig" "${FTP_BASE}/extra/os/${arch}/" + ../db-repo-add extra ${arch} ${pkgbase}-1-1-${arch}.pkg.tar.xz + done + done + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkPackageDB extra ${pkgbase}-1-1-${arch}.pkg.tar.xz ${arch} + done + done +} + +testAddMultiplePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b') + local pkgbase + local arch + + for arch in ${arches[@]}; do + add_pkgs=() + for pkgbase in ${pkgs[@]}; do + cp "${pkgdir}/${pkgbase}/${pkgbase}-1-1-${arch}.pkg.tar.xz" "${FTP_BASE}/${PKGPOOL}/" + touch "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz.sig" + ln -s "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz" "${FTP_BASE}/extra/os/${arch}/" + ln -s "${FTP_BASE}/${PKGPOOL}/${pkgbase}-1-1-${arch}.pkg.tar.xz.sig" "${FTP_BASE}/extra/os/${arch}/" + add_pkgs[${#add_pkgs[*]}]=${pkgbase}-1-1-${arch}.pkg.tar.xz + done + ../db-repo-add extra ${arch} ${add_pkgs[@]} + done + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkPackageDB extra ${pkgbase}-1-1-${arch}.pkg.tar.xz ${arch} + done + done +} + +. "${curdir}/../lib/shunit2" diff --git a/test/test.d/db-repo-remove.sh b/test/test.d/db-repo-remove.sh new file mode 100755 index 0000000..315d63d --- /dev/null +++ b/test/test.d/db-repo-remove.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +curdir=$(readlink -e $(dirname $0)) +. "${curdir}/../lib/common.inc" + +testRemovePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b' 'pkg-simple-epoch') + local pkgbase + local arch + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + releasePackage extra ${pkgbase} ${arch} + done + done + + ../db-update + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + ../db-repo-remove extra ${arch} ${pkgbase} + done + done + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkRemovedPackageDB extra ${pkgbase} ${arch} + done + done +} + +testRemoveMultiplePackages() { + local arches=('i686' 'x86_64') + local pkgs=('pkg-simple-a' 'pkg-simple-b' 'pkg-simple-epoch') + local pkgbase + local arch + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + releasePackage extra ${pkgbase} ${arch} + done + done + + ../db-update + + for arch in ${arches[@]}; do + ../db-repo-remove extra ${arch} ${pkgs[@]} + done + + for pkgbase in ${pkgs[@]}; do + for arch in ${arches[@]}; do + checkRemovedPackageDB extra ${pkgbase} ${arch} + done + done +} + +. "${curdir}/../lib/shunit2" -- cgit v1.1-4-g5e80 From ef69c002a69e5d7983554b68d41f26e06ad8fb7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Sat, 5 Nov 2011 19:17:01 +0100 Subject: Use ctypes module to access alpm_pkg_vercmp() instead of the C module. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Oudompheng --- cron-jobs/check_archlinux/README | 8 +----- cron-jobs/check_archlinux/alpm.c | 40 ---------------------------- cron-jobs/check_archlinux/alpm.so | Bin 7057 -> 0 bytes cron-jobs/check_archlinux/check_packages.py | 17 ++++++++++-- cron-jobs/check_archlinux/setup.py | 10 ------- 5 files changed, 16 insertions(+), 59 deletions(-) delete mode 100644 cron-jobs/check_archlinux/alpm.c delete mode 100755 cron-jobs/check_archlinux/alpm.so delete mode 100644 cron-jobs/check_archlinux/setup.py diff --git a/cron-jobs/check_archlinux/README b/cron-jobs/check_archlinux/README index 8f178dc..03bb0e0 100644 --- a/cron-jobs/check_archlinux/README +++ b/cron-jobs/check_archlinux/README @@ -1,8 +1,2 @@ -1) Build the python module -$ python2 setup.py build - -2) copy it back to the current working directory -$ cp build/lib.*/alpm.* . - -3) run the script +1) run the script $ ./check_packages.py -h diff --git a/cron-jobs/check_archlinux/alpm.c b/cron-jobs/check_archlinux/alpm.c deleted file mode 100644 index 0b7cd2c..0000000 --- a/cron-jobs/check_archlinux/alpm.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -static PyObject * -alpm_vercmp(PyObject *self, PyObject *args) -{ - const char *v1, *v2; - int ret; - - if (!PyArg_ParseTuple(args, "ss", &v1, &v2)) - return NULL; - ret = alpm_pkg_vercmp(v1, v2); - return Py_BuildValue("i", ret); -} - -static PyMethodDef AlpmMethods[] = { - {"vercmp", alpm_vercmp, METH_VARARGS, - "Execute vercmp."}, - {NULL, NULL, 0, NULL} /* Sentinel */ -}; - -PyMODINIT_FUNC -initalpm(void) -{ - (void) Py_InitModule("alpm", AlpmMethods); -} - -int -main(int argc, char *argv[]) -{ - /* Pass argv[0] to the Python interpreter */ - Py_SetProgramName(argv[0]); - - /* Initialize the Python interpreter. Required. */ - Py_Initialize(); - - /* Add a static module */ - initalpm(); - return 0; -} diff --git a/cron-jobs/check_archlinux/alpm.so b/cron-jobs/check_archlinux/alpm.so deleted file mode 100755 index 8944bbe..0000000 Binary files a/cron-jobs/check_archlinux/alpm.so and /dev/null differ diff --git a/cron-jobs/check_archlinux/check_packages.py b/cron-jobs/check_archlinux/check_packages.py index 0a2b10e..06589ca 100755 --- a/cron-jobs/check_archlinux/check_packages.py +++ b/cron-jobs/check_archlinux/check_packages.py @@ -16,9 +16,12 @@ # a non-core package) # 8. Circular dependencies -import os,re,commands,getopt,sys,tarfile,alpm +import os,re,commands,getopt,sys,tarfile import pdb +import ctypes +_alpm = ctypes.cdll.LoadLibrary("libalpm.so") + DBEXT='.db.tar.gz' packages = {} # pkgname : PacmanPackage @@ -143,7 +146,17 @@ def splitprov(prov): return (name,version) def vercmp(v1,mod,v2): - res = alpm.vercmp(v1,v2) + """ + >>> vercmp("1.0", "<=", "2.0") + True + >>> vercmp("1:1.0", ">", "2.0") + True + >>> vercmp("1.0.2", ">=", "2.1.0") + False + """ + s1 = ctypes.c_char_p(v1) + s2 = ctypes.c_char_p(v2) + res = _alpm.alpm_pkg_vercmp(s1,s2) if res == 0: return (mod.find("=") > -1) elif res < 0: diff --git a/cron-jobs/check_archlinux/setup.py b/cron-jobs/check_archlinux/setup.py deleted file mode 100644 index b172752..0000000 --- a/cron-jobs/check_archlinux/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -from distutils.core import setup, Extension - -alpm = Extension('alpm', - libraries = ['alpm'], - sources = ['alpm.c']) - -setup (name = 'Alpm', - version = '1.0', - description = 'Alpm bindings', - ext_modules = [alpm]) -- cgit v1.1-4-g5e80 From e2efbc58d64c6202fcad66ebefd5dcdcb28f985a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Sat, 5 Nov 2011 19:18:00 +0100 Subject: Move global code under a if __name__ == '__main__' block. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows running python2 -m doctest on the script. Signed-off-by: Rémy Oudompheng --- cron-jobs/check_archlinux/check_packages.py | 241 ++++++++++++++-------------- 1 file changed, 121 insertions(+), 120 deletions(-) diff --git a/cron-jobs/check_archlinux/check_packages.py b/cron-jobs/check_archlinux/check_packages.py index 06589ca..d233bf6 100755 --- a/cron-jobs/check_archlinux/check_packages.py +++ b/cron-jobs/check_archlinux/check_packages.py @@ -377,131 +377,132 @@ def print_usage(): print " ./check_packages.py --abs-tree=/var/abs --repos=community --arch=i686" print "" -## Default path to the abs root directory -absroots = ["/var/abs"] -## Default list of repos to check -repos = ['core', 'extra'] -## Default arch -arch = "i686" -## Default repodir -repodir = "/srv/ftp" - -try: - opts, args = getopt.getopt(sys.argv[1:], "", ["abs-tree=", "repos=", - "arch=", "repo-dir="]) -except getopt.GetoptError: - print_usage() - sys.exit() -if opts != []: - for o, a in opts: - if o in ("--abs-tree"): - absroots = a.split(',') - elif o in ("--repos"): - repos = a.split(",") - elif o in ("--arch"): - arch = a - elif o in ("--repo-dir"): - repodir = a - else: - print_usage() - sys.exit() - if args != []: - print_usage() +if __name__ == "__main__": + ## Default path to the abs root directory + absroots = ["/var/abs"] + ## Default list of repos to check + repos = ['core', 'extra'] + ## Default arch + arch = "i686" + ## Default repodir + repodir = "/srv/ftp" + + try: + opts, args = getopt.getopt(sys.argv[1:], "", ["abs-tree=", "repos=", + "arch=", "repo-dir="]) + except getopt.GetoptError: + print_usage() + sys.exit() + if opts != []: + for o, a in opts: + if o in ("--abs-tree"): + absroots = a.split(',') + elif o in ("--repos"): + repos = a.split(",") + elif o in ("--arch"): + arch = a + elif o in ("--repo-dir"): + repodir = a + else: + print_usage() + sys.exit() + if args != []: + print_usage() + sys.exit() + + for absroot in absroots: + if not os.path.isdir(absroot): + print "Error : the abs tree " + absroot + " does not exist" sys.exit() + for repo in repos: + repopath = absroot + "/" + repo + if not os.path.isdir(repopath): + print("Warning : the repository " + repo + " does not exist in " + absroot) -for absroot in absroots: - if not os.path.isdir(absroot): - print "Error : the abs tree " + absroot + " does not exist" + if not os.path.isdir(repodir): + print "Error: the repository directory %s does not exist" % repodir sys.exit() for repo in repos: - repopath = absroot + "/" + repo - if not os.path.isdir(repopath): - print("Warning : the repository " + repo + " does not exist in " + absroot) - -if not os.path.isdir(repodir): - print "Error: the repository directory %s does not exist" % repodir - sys.exit() -for repo in repos: - path = os.path.join(repodir,repo,'os',arch,repo + DBEXT) - if not os.path.isfile(path): - print "Error : repo DB %s : File not found" % path - sys.exit() - if not tarfile.is_tarfile(path): - print "Error : Cant open repo DB %s, not a valid tar file" % path - sys.exit() -# repos which need to be loaded -loadrepos = set([]) -for repo in repos: - loadrepos = loadrepos | set(get_repo_hierarchy(repo)) + path = os.path.join(repodir,repo,'os',arch,repo + DBEXT) + if not os.path.isfile(path): + print "Error : repo DB %s : File not found" % path + sys.exit() + if not tarfile.is_tarfile(path): + print "Error : Cant open repo DB %s, not a valid tar file" % path + sys.exit() + # repos which need to be loaded + loadrepos = set([]) + for repo in repos: + loadrepos = loadrepos | set(get_repo_hierarchy(repo)) -print_heading("Integrity Check " + arch + " of " + ",".join(repos)) -print("\nPerforming integrity checks...") + print_heading("Integrity Check " + arch + " of " + ",".join(repos)) + print("\nPerforming integrity checks...") -print("==> parsing pkgbuilds") -parse_pkgbuilds(loadrepos,arch) + print("==> parsing pkgbuilds") + parse_pkgbuilds(loadrepos,arch) -# fill provisions -for name,pkg in packages.iteritems(): - for prov in pkg.provides: - provname=prov.split("=")[0] - if provname not in provisions: - provisions[provname] = [] - provisions[provname].append(pkg) - -# fill repopkgs -for name,pkg in packages.iteritems(): - if pkg.repo in repos: - repopkgs[name] = pkg - -print("==> parsing db files") -dbpkgs = parse_dbs(repos,arch) - -print("==> checking mismatches") -for name,pkg in repopkgs.iteritems(): - pkgdirname = pkg.path.split("/")[-1] - if name != pkgdirname and pkg.base != pkgdirname: - mismatches.append(name + " vs. " + pkg.path) - -print("==> checking archs") -for name,pkg in repopkgs.iteritems(): - archs = verify_archs(name,pkg.repo,pkg.archs) - invalid_archs.extend(archs) - -deph,makedeph = [],[] - -print("==> checking dependencies") -for name,pkg in repopkgs.iteritems(): - (deps,missdeps,hierarchy) = verify_deps(name,pkg.repo,pkg.deps) - pkgdeps[pkg] = deps - missing_deps.extend(missdeps) - deph.extend(hierarchy) - -print("==> checking makedepends") -for name,pkg in repopkgs.iteritems(): - (makedeps,missdeps,hierarchy) = verify_deps(name,pkg.repo,pkg.makedeps) - makepkgdeps[pkg] = makedeps - missing_makedeps.extend(missdeps) - makedeph.extend(hierarchy) - -print("==> checking hierarchy") -dep_hierarchy = check_hierarchy(deph) -makedep_hierarchy = check_hierarchy(makedeph) - -print("==> checking for circular dependencies") -# make sure pkgdeps is filled for every package -for name,pkg in packages.iteritems(): - if pkg not in pkgdeps: - (deps,missdeps,_) = verify_deps(name,pkg.repo,pkg.deps) + # fill provisions + for name,pkg in packages.iteritems(): + for prov in pkg.provides: + provname=prov.split("=")[0] + if provname not in provisions: + provisions[provname] = [] + provisions[provname].append(pkg) + + # fill repopkgs + for name,pkg in packages.iteritems(): + if pkg.repo in repos: + repopkgs[name] = pkg + + print("==> parsing db files") + dbpkgs = parse_dbs(repos,arch) + + print("==> checking mismatches") + for name,pkg in repopkgs.iteritems(): + pkgdirname = pkg.path.split("/")[-1] + if name != pkgdirname and pkg.base != pkgdirname: + mismatches.append(name + " vs. " + pkg.path) + + print("==> checking archs") + for name,pkg in repopkgs.iteritems(): + archs = verify_archs(name,pkg.repo,pkg.archs) + invalid_archs.extend(archs) + + deph,makedeph = [],[] + + print("==> checking dependencies") + for name,pkg in repopkgs.iteritems(): + (deps,missdeps,hierarchy) = verify_deps(name,pkg.repo,pkg.deps) pkgdeps[pkg] = deps -find_scc(repopkgs.values()) - -print("==> checking for differences between db files and pkgbuilds") -for repo in repos: - for pkg in dbpkgs[repo]: - if not (pkg in repopkgs and repopkgs[pkg].repo == repo): - dbonly.append("%s/%s" % (repo,pkg)) -for name,pkg in repopkgs.iteritems(): - if not name in dbpkgs[pkg.repo]: - absonly.append("%s/%s" % (pkg.repo,name)) - -print_results() + missing_deps.extend(missdeps) + deph.extend(hierarchy) + + print("==> checking makedepends") + for name,pkg in repopkgs.iteritems(): + (makedeps,missdeps,hierarchy) = verify_deps(name,pkg.repo,pkg.makedeps) + makepkgdeps[pkg] = makedeps + missing_makedeps.extend(missdeps) + makedeph.extend(hierarchy) + + print("==> checking hierarchy") + dep_hierarchy = check_hierarchy(deph) + makedep_hierarchy = check_hierarchy(makedeph) + + print("==> checking for circular dependencies") + # make sure pkgdeps is filled for every package + for name,pkg in packages.iteritems(): + if pkg not in pkgdeps: + (deps,missdeps,_) = verify_deps(name,pkg.repo,pkg.deps) + pkgdeps[pkg] = deps + find_scc(repopkgs.values()) + + print("==> checking for differences between db files and pkgbuilds") + for repo in repos: + for pkg in dbpkgs[repo]: + if not (pkg in repopkgs and repopkgs[pkg].repo == repo): + dbonly.append("%s/%s" % (repo,pkg)) + for name,pkg in repopkgs.iteritems(): + if not name in dbpkgs[pkg.repo]: + absonly.append("%s/%s" % (pkg.repo,name)) + + print_results() -- cgit v1.1-4-g5e80 From a8b219b325cd642a781a64d8e08a0e66d25c1b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Sat, 5 Nov 2011 19:18:00 +0100 Subject: The README file is no longer useful --- cron-jobs/check_archlinux/README | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 cron-jobs/check_archlinux/README diff --git a/cron-jobs/check_archlinux/README b/cron-jobs/check_archlinux/README deleted file mode 100644 index 03bb0e0..0000000 --- a/cron-jobs/check_archlinux/README +++ /dev/null @@ -1,2 +0,0 @@ -1) run the script -$ ./check_packages.py -h -- cgit v1.1-4-g5e80