summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@parabola.nu>2018-06-16 00:03:40 -0400
committerLuke Shumaker <lukeshu@parabola.nu>2018-07-10 00:59:19 -0400
commit9c93af4b40ab20f15ba472fabb60f7499527a697 (patch)
tree6fd9804a68bfc16285c6645b8d2fafd0c41f6688
parent3e3e3d046fd5e47d40261ebfd1af03547d946f68 (diff)
db-move, db-remove: Don't parse PKGBUILD files
Don't try to parse PKGBUILD files from SVN; all of the information we need is already in the DBEXT files. Several programs use [[ -f PKGBUILD ]] or [[ -r PKGBUILD ]] on files from SVN; those checks can stay, just remove all instances of actually trying to *parse* those files. As an exception, don't modify parse_pkgbuilds.sh (which is called by check_packages.py, which is called by cron-jobs/integrity-check). Most of the attributes we need have been present in the DBEXT files for as long as `repo-add` has been part of pacman: attribute | git | git date | ver | ver date ----------+----------+------------+-------+----------- FILENAME | aa1c0ba9 | 2006-11-20 | 3.0.0 | 2007-03-25 NAME | aa1c0ba9 | 2006-11-20 | 3.0.0 | 2007-03-25 VERSION | aa1c0ba9 | 2006-11-20 | 3.0.0 | 2007-03-25 ARCH | aa1c0ba9 | 2006-11-20 | 3.0.0 | 2007-03-25 BASE | 4b21504f | 2009-07-22 | 3.3.0 | 2009-08-02 However, `BASE` for split packages is slightly newer, and its presence relies not only on the `repo-add` version, but also the `makepkg` version used to build the package. As of 2018-06-15, the oldest package in any of the Arch Linux repos is community/gimp-refocus, built on 2013-07-22; I don't believe it is necessary to handle packages from before that change was made (before `BASE` was set). "Ignore space change" might be useful when viewing this diff.
-rw-r--r--db-functions14
-rwxr-xr-xdb-move102
-rwxr-xr-xdb-remove11
3 files changed, 52 insertions, 75 deletions
diff --git a/db-functions b/db-functions
index f1d821a..0a0720d 100644
--- a/db-functions
+++ b/db-functions
@@ -6,9 +6,6 @@
shopt -s extglob globstar nullglob
-# Some PKGBUILDs need CARCH to be set
-CARCH="x86_64"
-
# Useful functions
UMASK=""
set_umask () {
@@ -319,6 +316,17 @@ dbquery() {
EOT
}
+# usage: getdbinfo repo arch <pkgbase|pkgname> fields
+getdbinfo() {
+ local repo=$1
+ local arch=$2
+ local pkgbase=$3
+ local fields=$4
+ dbquery "$repo" "$arch" \
+ "(pkg.base or pkg.name) == '$pkgbase'" \
+ "$fields"
+}
+
check_pkgfile() {
local pkgfile=$1
diff --git a/db-move b/db-move
index b644889..5fdf2f8 100755
--- a/db-move
+++ b/db-move
@@ -28,32 +28,14 @@ done
arch_svn checkout -q -N "${SVNREPO}" "${WORKDIR}/svn" >/dev/null
for pkgbase in "${args[@]:2}"; do
arch_svn up -q "${WORKDIR}/svn/${pkgbase}" >/dev/null
- for pkgarch in "${ARCHES[@]}" 'any'; do
- svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
- if [[ -r ${svnrepo_from}/PKGBUILD ]]; then
- pkgnames=($(. "${svnrepo_from}/PKGBUILD"; echo "${pkgname[@]}"))
- if (( ${#pkgnames[@]} < 1 )); then
- die "Could not read pkgname"
+ for tarch in "${ARCHES[@]}"; do
+ while read -r pkgarch pkgfile; do
+ svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
+ if [[ -r ${svnrepo_from}/PKGBUILD ]]; then
+ getpkgfile "${ftppath_from}/${tarch}/${pkgfile}" >/dev/null
+ continue 3
fi
-
- pkgver=$(. "${svnrepo_from}/PKGBUILD"; get_full_version)
- if [[ -z ${pkgver} ]]; then
- die "Could not read pkgver"
- fi
-
- if [[ "${pkgarch}" = any ]]; then
- tarches=("${ARCHES[@]}")
- else
- tarches=("${pkgarch}")
- fi
-
- for pkgname in "${pkgnames[@]}"; do
- for tarch in "${tarches[@]}"; do
- getpkgfile "${ftppath_from}/${tarch}/${pkgname}-${pkgver}-${pkgarch}"${PKGEXTS} >/dev/null
- done
- done
- continue 2
- fi
+ done < <(getdbinfo "$repo_from" "$tarch" "$pkgbase" 'f"{pkg.arch} {pkg.filename}"')
done
die "%s not found in %s" "$pkgbase" "$repo_from"
done
@@ -66,51 +48,39 @@ for arch in "${ARCHES[@]}"; do
done
for pkgbase in "${args[@]:2}"; do
tag_list=""
- for pkgarch in "${ARCHES[@]}" 'any'; do
- svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
- svnrepo_to="${WORKDIR}/svn/${pkgbase}/repos/${repo_to}-${pkgarch}"
-
- if [[ -f ${svnrepo_from}/PKGBUILD ]]; then
- if [[ ${pkgarch} = any ]]; then
- tarches=("${ARCHES[@]}")
- else
- tarches=("${pkgarch}")
- fi
- msg2 "%s (%s)" "$pkgbase" "${tarches[*]}"
- pkgnames=($(. "${svnrepo_from}/PKGBUILD"; echo "${pkgname[@]}"))
- pkgver=$(. "${svnrepo_from}/PKGBUILD"; get_full_version)
-
- if [[ -d ${svnrepo_to} ]]; then
- for file in $(arch_svn ls "${svnrepo_to}"); do
- arch_svn rm -q "${svnrepo_to}/$file@"
+ for tarch in "${ARCHES[@]}"; do
+ while read -r pkgname pkgver pkgarch pkgfile; do
+ svnrepo_from="${WORKDIR}/svn/${pkgbase}/repos/${repo_from}-${pkgarch}"
+ svnrepo_to="${WORKDIR}/svn/${pkgbase}/repos/${repo_to}-${pkgarch}"
+ if [[ -f ${svnrepo_from}/PKGBUILD ]]; then
+ msg2 "%s (%s)" "$pkgbase" "$pkgarch"
+
+ if [[ -d ${svnrepo_to} ]]; then
+ for file in $(arch_svn ls "${svnrepo_to}"); do
+ arch_svn rm -q "${svnrepo_to}/$file@"
+ done
+ else
+ mkdir "${svnrepo_to}"
+ arch_svn add -q "${svnrepo_to}"
+ fi
+
+ for file in $(arch_svn ls "${svnrepo_from}"); do
+ arch_svn mv -q -r HEAD "${svnrepo_from}/$file@" "${svnrepo_to}/"
done
- else
- mkdir "${svnrepo_to}"
- arch_svn add -q "${svnrepo_to}"
+ arch_svn rm --force -q "${svnrepo_from}"
+ tag_list+=", $pkgarch"
fi
- for file in $(arch_svn ls "${svnrepo_from}"); do
- arch_svn mv -q -r HEAD "${svnrepo_from}/$file@" "${svnrepo_to}/"
- done
- arch_svn rm --force -q "${svnrepo_from}"
- tag_list+=", $pkgarch"
+ declare -n add_pkgs="add_pkgs_${tarch}"
+ declare -n remove_pkgs="remove_pkgs_${tarch}"
- for tarch in "${tarches[@]}"; do
- declare -n add_pkgs="add_pkgs_${tarch}"
- declare -n remove_pkgs="remove_pkgs_${tarch}"
- for pkgname in "${pkgnames[@]}"; do
- pkgpath=$(getpkgfile "${ftppath_from}/${tarch}/${pkgname}-${pkgver}-${pkgarch}"${PKGEXTS})
- pkgfile="${pkgpath##*/}"
-
- ln -s "../../../${PKGPOOL}/${pkgfile}" "${ftppath_to}/${tarch}/"
- if [[ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile}.sig ]]; then
- ln -s "../../../${PKGPOOL}/${pkgfile}.sig" "${ftppath_to}/${tarch}/"
- fi
- add_pkgs+=("${FTP_BASE}/${PKGPOOL}/${pkgfile}")
- remove_pkgs+=("${pkgname}")
- done
- done
- fi
+ ln -s "../../../${PKGPOOL}/${pkgfile}" "${ftppath_to}/${tarch}/"
+ if [[ -f ${FTP_BASE}/${PKGPOOL}/${pkgfile}.sig ]]; then
+ ln -s "../../../${PKGPOOL}/${pkgfile}.sig" "${ftppath_to}/${tarch}/"
+ fi
+ add_pkgs+=("${FTP_BASE}/${PKGPOOL}/${pkgfile}")
+ remove_pkgs+=("${pkgname}")
+ done < <(getdbinfo "$repo_from" "$tarch" "$pkgbase" 'f"{pkg.name} {pkg.version} {pkg.arch} {pkg.filename}"')
done
tag_list="${tag_list#, }"
arch_svn commit -q "${WORKDIR}/svn/${pkgbase}" -m "${0##*/}: moved ${pkgbase} from [${repo_from}] to [${repo_to}] (${tag_list})"
diff --git a/db-remove b/db-remove
index ac9a168..710fd4f 100755
--- a/db-remove
+++ b/db-remove
@@ -32,17 +32,16 @@ done
remove_pkgs=()
for pkgbase in "${pkgbases[@]}"; do
msg "Removing %s from [%s]..." "$pkgbase" "$repo"
- arch_svn checkout -q "${SVNREPO}/${pkgbase}" "${WORKDIR}/svn/${pkgbase}" >/dev/null
+ mapfile -t pkgnames < <(getdbinfo "$repo" "${tarches[0]}" "$pkgbase" pkg.name)
+ remove_pkgs+=("${pkgnames[@]}")
+
+ arch_svn checkout -q "${SVNREPO}/${pkgbase}" "${WORKDIR}/svn/${pkgbase}" >/dev/null
if [[ -d ${WORKDIR}/svn/$pkgbase/repos/$svnrepo ]]; then
- remove_pkgs+=($(. "${WORKDIR}/svn/$pkgbase/repos/$svnrepo/PKGBUILD"; echo ${pkgname[@]}))
arch_svn rm --force -q "${WORKDIR}/svn/$pkgbase/repos/$svnrepo"
arch_svn commit -q "${WORKDIR}/svn/$pkgbase" -m "${0##*/}: $pkgbase removed by $(id -un)"
else
- warning "%s not found in %s" "$pkgbase" "$svnrepo"
- warning "Removing only %s from the repo" "$pkgbase"
- warning "If it was a split package you have to remove the others yourself!"
- remove_pkgs+=("$pkgbase")
+ warning "pkgbase '%s' not found in svn; unable to commit removal to svn" "$pkgbase"
fi
done