summaryrefslogtreecommitdiffstats
path: root/mga-move-pkg
diff options
context:
space:
mode:
Diffstat (limited to 'mga-move-pkg')
-rwxr-xr-xmga-move-pkg327
1 files changed, 196 insertions, 131 deletions
diff --git a/mga-move-pkg b/mga-move-pkg
index 143d410..6662476 100755
--- a/mga-move-pkg
+++ b/mga-move-pkg
@@ -22,179 +22,244 @@ if [ "$1" = "--no-confirm" ]; then
fi
backport=
-if [ "$1" = "--backports" ]; then
- shift
- backport=$1
+if [ "$1" = "--backport" ]; then
+ backport=y
shift
fi
-if [ $# != 3 ]; then
- echo "Usage: $0 [--dry-run] [--sync] [--no-confirm] [--backport <bug>] <release> <section> <src-rpm-name>" >&2
+function usage()
+{
+ echo "Usage: $(basename $0) [--dry-run] [--sync] [--no-confirm] [--backport] <release>/<section>/<pkg> [<release>/<section>/<pkg>...]" >&2
exit 1
-fi
+}
+[ $# -lt 1 ] && usage
-valid_release "$1"
-valid_section "$2"
-
-release="$1"
-section="$2"
-srcname="$3"
-
-exactsrpm=
-sourcesubsection='updates_testing'
-destinationsubsection='updates'
-if [ 'cauldron' = "$release" ]; then
- if [ -n "$backport" ]; then
- echo "Error: Cannot use --backport with cauldron" >&2
- exit 1
- fi
- destinationsubsection='release'
-fi
+declare subsection='updates';
+[ -n "$backport" ] && subsection='backports';
-if [ -n "$backport" ]; then
- sourcesubsection='backports_testing'
- destinationsubsection='backports'
-fi
+declare -a _releases;
+declare -a _sections;
+declare -a _srcsubsections;
+declare -a _destsubsections;
+declare -a _pkgs;
+declare -a _pkgfiles;
+declare -a _oldpkgfiles;
-for file in "$distribdir/$release/SRPMS/$section/$sourcesubsection/"*.rpm; do
- pkg=$(rpm -qp --qf '%{NAME}' "$file")
+# Assume the input is the full srpm name (used to avoid validation)
+declare _fullsrpmname="y"
- # Check exact match
- bfile=$(basename "$file")
- if [ "$bfile" = "$srcname" ]; then
- exactsrpm=y
- srcname=$pkg
- srcpkg=$bfile
- break
- fi
+function parse_args()
+{
+ local -a tmptriplet;
+ local -i i=0;
- # Check for src package name
- if [ "$pkg" = "$srcname" ]; then
- srcpkg=$bfile
- break
- fi
-done
+ for arg in "$@"; do
+ OIFS="$IFS"; IFS=/; tmptriplet=($arg); IFS="$OIFS";
-if [ -z "$srcpkg" ]; then
- echo "The package '$srcname' could not be found in the '$release/$section/$sourcesubsection' repository." >&2
- exit 2
-fi
+ [ ${#tmptriplet[*]} -ne 3 ] && usage
+
+ _releases[$i]=${tmptriplet[0]}
+ _sections[$i]=${tmptriplet[1]}
+ _pkgs[$i]=${tmptriplet[2]}
-oldsrcpkg=
-if [ 'release' = "$destinationsubsection" ]; then
- # In cauldron we also have to move the old version from release to ~schedbot/old/
- # We know srcname is a %{name} now.
- for file in "$distribdir/$release/SRPMS/$section/release/"*.rpm; do
- pkg=$(rpm -qp --qf '%{NAME}' "$file")
- if [ "$pkg" = "$srcname" ]; then
- oldsrcpkg=$bfile
- break
+ valid_release ${_releases[$i]}
+ valid_section ${_sections[$i]}
+
+ _srcsubsections[$i]="${subsection}_testing"
+ _destsubsections[$i]=$subsection
+
+ # Special case in cauldron where we move updates_testing -> release
+ if [ 'cauldron' = "${_releases[$i]}" ]; then
+ if [ -n "$backport" ]; then
+ echo "Error: Cannot use --backport with cauldron" >&2
+ exit 1
+ fi
+ _destsubsections[$i]="release"
fi
+ ((++i))
done
+}
+parse_args "$@"
- # (cg) Is this a valid check? What if it's a new package introduced first into testing
- # Ultimately this is not very likely, so ignore it for now.
- if [ -z "$oldsrcpkg" ]; then
- echo "The package '$srcname' could not be found in the '$release/$section/$sourcesubsection' repository." >&2
- exit 2
- fi
-fi
+function find_srpms()
+{
+ local file
+ local pkg
+ local bfile
+ local exactsrpm
+ for ((i=0;i<${#_releases[*]};++i)); do
+ exactsrpm=
+ for file in "$distribdir/${_releases[$i]}/SRPMS/${_sections[$i]}/${_srcsubsections[$i]}/"*.rpm; do
+ pkg=$(rpm -qp --qf '%{NAME}' "$file")
+
+ # Check exact match
+ bfile=$(basename "$file")
+ if [ "$bfile" = "${_pkgs[$i]}" ]; then
+ exactsrpm=y
+ _pkgs[$i]=$pkg
+ _pkgfiles[$i]=$bfile
+ break
+ fi
+
+ # Check for src package name
+ if [ "$pkg" = "${_pkgs[$i]}" ]; then
+ _pkgfiles[$i]=$bfile
+ break
+ fi
+ done
+
+ # If we didn't find an exact srpm, then update our global var accordingly
+ [ -z "$exactsrpm" ] && _fullsrpmname=
+
+ if [ -z "${_pkgfiles[$i]}" ]; then
+ echo "The package '${_pkgs[$i]}' could not be found in the '${_releases[$i]}/${_sections[$i]}/${_srcsubsections[$i]}' repository." >&2
+ exit 2
+ fi
+
+ _oldpkgfiles[$i]=
+ if [ 'release' = "${_destsubsections[$i]}" ]; then
+ # In cauldron we also have to move the old version from release to ~schedbot/old/
+ # We know srcname is a %{name} now.
+ for file in "$distribdir/${_releases[$i]}/SRPMS/${_sections[$i]}/release/"*.rpm; do
+ pkg=$(rpm -qp --qf '%{NAME}' "$file")
+ if [ "$pkg" = "${_pkgs[$i]}" ]; then
+ _oldpkgfiles[$i]=$bfile
+ break
+ fi
+ done
+
+ # (cg) Is this a valid check? What if it's a new package introduced first into testing
+ # Ultimately this is not very likely, so ignore it for now.
+ if [ -z "${_oldpkgfiles[$i]}" ]; then
+ echo "The package '${_pkgs[$i]}' could not be found in the '${_releases[$i]}/${_sections[$i]}/${_srcsubsections[$i]}' repository." >&2
+ exit 2
+ fi
+ fi
+ done
+}
+find_srpms
# Safety check
-if [ -z "$exactsrpm" -o -z "$noconfirm" ]; then
- echo "This SRPM (and matching binaries) will be moved from '$sourcesubsection' to '$destinationsubsection':"
- echo "- $srcpkg"
- echo
- if [ 'release' = "$destinationsubsection" ]; then
- echo "This SRPM (and matching binaries) will be moved from 'release' to '\~schedbot/old':"
- echo "- $oldsrcpkg"
+function sanity_check()
+{
+ local cauldronmsg
+
+ if [ "$_fullsrpmname" != "y" -o -z "$noconfirm" ]; then
+ echo "The following SRPMs (and matching binaries) will be moved:"
+ for ((i=0;i<${#_releases[*]};++i)); do
+ echo "- ${_pkgfiles[$i]}"
+ if [ 'release' = "${_destsubsections[$i]}" -a -n "${_oldpkgfiles[$i]}" ]; then
+ cauldronmsg="${cauldronmsg}- ${_oldpkgfiles[$i]}\n"
+ fi
+ done
echo
+ if [ -n "$cauldronmsg" ]; then
+ echo "The following SRPMs (and matching binaries) will be moved from 'release' to '\~schedbot/old':"
+ echo "$cauldronmsg"
+ fi
+
+ read -n 1 -p "Are you sure? [Y/n] " yn
+ [ -n "$yn" ] && echo
+ [ -z "$yn" -o "Y" = "$yn" ] && yn=y
+ [ "y" != "$yn" ] && exit
fi
+ return 0
+}
+sanity_check
- read -n 1 -p "Are you sure? [Y/n] " yn
- [ -n "$yn" ] && echo
- [ -z "$yn" -o "Y" = "$yn" ] && yn=y
- [ "y" != "$yn" ] && exit
-fi
+declare _mailcontent=$(mktemp)
+declare _mailcommands=$(mktemp)
function movepkg()
{
- srcdir="$1"
- destdir="$2"
- srcpkg="$3"
- content="$4"
- commands="$5"
+ local srcdir="$1"
+ local destdir="$2"
+ local srcpkg="$3"
+ local file
+ local srpm
for file in "$srcdir/"*.rpm; do
srpm=$(rpm -qp --qf '%{SOURCERPM}' "$file")
if [ "$srpm" = "$srcpkg" ]; then
- echo " $(basename $file)" | tee -a "$content"
- $dryrun mv -v -f "$file" "$destdir" >>"$commands" 2>&1
+ echo " $(basename $file)" | tee -a "$_mailcontent"
+ $dryrun mv -v -f "$file" "$destdir" >>"$_mailcommands" 2>&1
fi
done
}
-mailcontent=$(mktemp)
-mailcommands=$(mktemp)
+function movepkgs()
+{
+ local arch
-if [ 'release' = "$destinationsubsection" ]; then
- echo ""
- echo "Moving binary and source rpms:" | tee -a "$mailcontent"
- for arch in $arches; do
- echo "- $arch:" | tee -a "$mailcontent"
- movepkg "$distribdir/$release/$arch/media/$section/release" "/var/lib/schedbot/old/" "$oldsrcpkg" "$mailcontent" "$mailcommands"
- movepkg "$distribdir/$release/$arch/media/debug/$section/release" "/var/lib/schedbot/old/" "$oldsrcpkg" "$mailcontent" "$mailcommands"
- done
- echo "- source:" | tee -a "$mailcontent"
- echo " $oldsrcpkg" | tee -a "$mailcontent"
- echo >> "$mailcontent"
- echo >> "$mailcontent"
- $dryrun mv -v -f "$distribdir/$release/SRPMS/$section/release/$oldsrcpkg" "/var/lib/schedbot/old/" >>"$mailcommands" 2>&1
-fi
+ for ((i=0;i<${#_releases[*]};++i)); do
+ if [ 'release' = "${_destsubsections[$i]}" -a -n "${_oldpkgfiles[$i]}" ]; then
+ echo ""
+ echo "Moving binary and source rpms:" | tee -a "$_mailcontent"
+ for arch in $arches; do
+ echo "- $arch:" | tee -a "$_mailcontent"
+ movepkg "$distribdir/${_releases[$i]}/$arch/media/${_sections[$i]}/release" "/var/lib/schedbot/old/" "${_oldpkgfiles[$i]}"
+ movepkg "$distribdir/${_releases[$i]}/$arch/media/debug/${_sections[$i]}/release" "/var/lib/schedbot/old/" "${_oldpkgfiles[$i]}"
+ done
+ echo "- source:" | tee -a "$_mailcontent"
+ echo " ${_oldpkgfiles[$i]}" | tee -a "$_mailcontent"
+ echo >> "$_mailcontent"
+ echo >> "$_mailcontent"
+ $dryrun mv -v -f "$distribdir/${_releases[$i]}/SRPMS/${_sections[$i]}/release/${_oldpkgfiles[$i]}" "/var/lib/schedbot/old/" >>"$_mailcommands" 2>&1
+ fi
-echo ""
-echo "Moving binary and source rpms:" | tee -a "$mailcontent"
-for arch in $arches; do
- echo "- $arch:" | tee -a "$mailcontent"
- movepkg "$distribdir/$release/$arch/media/$section/$sourcesubsection" "$distribdir/$release/$arch/media/$section/$destinationsubsection/" "$srcpkg" "$mailcontent" "$mailcommands"
- movepkg "$distribdir/$release/$arch/media/debug/$section/$sourcesubsection" "$distribdir/$release/$arch/media/debug/$section/$destinationsubsection/" "$srcpkg" "$mailcontent" "$mailcommands"
-done
-echo "- source:" | tee -a "$mailcontent"
-echo " $srcpkg" | tee -a "$mailcontent"
-echo >> "$mailcontent"
-echo >> "$mailcontent"
-$dryrun mv -v -f "$distribdir/$release/SRPMS/$section/$sourcesubsection/$srcpkg" "$distribdir/$release/SRPMS/$section/$destinationsubsection/" >>"$mailcommands" 2>&1
+ echo ""
+ echo "Moving binary and source rpms:" | tee -a "$_mailcontent"
+ for arch in $arches; do
+ echo "- $arch:" | tee -a "$_mailcontent"
+ movepkg "$distribdir/${_releases[$i]}/$arch/media/${_sections[$i]}/${_srcsubsections[$i]}" "$distribdir/${_releases[$i]}/$arch/media/${_sections[$i]}/${_destsubsections[$i]}/" "${_pkgfiles[$i]}" "$_mailcontent" "$_mailcommands"
+ movepkg "$distribdir/${_releases[$i]}/$arch/media/debug/${_sections[$i]}/${_srcsubsections[$i]}" "$distribdir/${_releases[$i]}/$arch/media/debug/${_sections[$i]}/${_destsubsections[$i]}/" "${_pkgfiles[$i]}" "$_mailcontent" "$_mailcommands"
+ done
+ echo "- source:" | tee -a "$_mailcontent"
+ echo " ${_pkgfiles[$i]}" | tee -a "$_mailcontent"
+ echo >> "$_mailcontent"
+ echo >> "$_mailcontent"
+ $dryrun mv -v -f "$distribdir/${_releases[$i]}/SRPMS/${_sections[$i]}/${_srcsubsections[$i]}/${_pkgfiles[$i]}" "$distribdir/${_releases[$i]}/SRPMS/${_sections[$i]}/${_destsubsections[$i]}/" >>"$_mailcommands" 2>&1
+ done
+}
+movepkgs
if [ -n "$dryrun" ]; then
echo
echo "Raw Commands:"
- cat "$mailcommands"
+ cat "$_mailcommands"
else
if [ -z "$sync" ]; then
- echo >>"$mailcontent"
- echo "Warning: hdlist update+sync was not performed during this move" >>"$mailcontent"
- echo >>"$mailcontent"
- echo >>"$mailcontent"
+ echo >>"$_mailcontent"
+ echo "Warning: hdlist update+sync was not performed during this move" >>"$_mailcontent"
+ echo >>"$_mailcontent"
+ echo >>"$_mailcontent"
fi
- if [ -n "$backport" ]; then
- export SIG="https://bugs.mageia.org/show_bug.cgi?id=$backport"
- $dryrun mutt -e 'set from="Mageia Backports <buildsystem-daemon@mageia.org>"' \
- -e 'set signature="echo $SIG|"' \
- -e 'set sig_dashes=no' \
- backports-announce@ml.mageia.org -s "Package Backport: MGA $release/$section: $srcname" \
- -i "$mailcontent"
- fi
-
- cat "$mailcommands" >>"$mailcontent"
- /usr/bin/mailx -s "$0 $release $section $srcname" -S "from=$moveupdate_mailfrom" "$moveupdate_mailto" < "$mailcontent"
+ cat "$_mailcommands" >>"$_mailcontent"
+ /usr/bin/mailx -s "$(basename $0) ${#_releases[*]} source package(s) moved" -S "from=$moveupdate_mailfrom" "$moveupdate_mailto" < "$_mailcontent"
if [ -n "$sync" ]; then
- update_distro_hdlist "$release" "$section" "$sourcesubsection"
- update_distro_hdlist "$release" "$section" "$destinationsubsection"
- update_common_MD5SUM "$release"
- mirror_repository "$release"
+ updated="xxxx"
+ for ((i=0;i<${#_releases[*]};++i)); do
+ if ! inlist "${_releases[$i]}/${_sections[$i]}/${_srcsubsections[$i]}" "$updated"; then
+ update_distro_hdlist "${_releases[$i]}" "${_sections[$i]}" "${_srcsubsections[$i]}"
+ updated="$updated ${_releases[$i]}/${_sections[$i]}/${_srcsubsections[$i]}"
+ fi
+ if ! inlist "${_releases[$i]}/${_sections[$i]}/${_destsubsections[$i]}" "$updated"; then
+ update_distro_hdlist "${_releases[$i]}" "${_sections[$i]}" "${_destsubsections[$i]}"
+ updated="$updated ${_releases[$i]}/${_sections[$i]}/${_destsubsections[$i]}"
+ fi
+ done
+
+ updated="xxxx"
+ for ((i=0;i<${#_releases[*]};++i)); do
+ if ! inlist "${_releases[$i]}" "$updated"; then
+ update_common_MD5SUM "${_release[$i]}"
+ mirror_repository "${_release[$i]}"
+ updated="$updated ${_release[$i]}"
+ fi
+ done
fi
fi
-rm -f "$mailcontent" "$mailcommands"
+rm -f "$_mailcontent" "$_mailcommands"