summaryrefslogtreecommitdiff
path: root/src/lib/aur/drop-from-repo.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/aur/drop-from-repo.sh')
-rw-r--r--src/lib/aur/drop-from-repo.sh168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/lib/aur/drop-from-repo.sh b/src/lib/aur/drop-from-repo.sh
new file mode 100644
index 0000000..6ebe12a
--- /dev/null
+++ b/src/lib/aur/drop-from-repo.sh
@@ -0,0 +1,168 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_SH=1
+
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/db/remove.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/remove.sh
+# shellcheck source=src//lib/util/pacman.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
+
+source /usr/share/makepkg/util/message.sh
+
+set -eo pipefail
+
+
+pkgctl_aur_drop_from_repo_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [OPTIONS] [PATH]...
+
+ Drops a specified package from the official repositories to the Arch
+ User Repository.
+
+ This command requires a local Git clone of the package repository. It
+ reconfigures the repository for AUR compatibility and pushes it to the
+ AUR. Afterwards, the package is removed from the official repository.
+
+ By default, the package is automatically disowned in the AUR.
+
+ OPTIONS
+ --no-disown Do not disown the package on the AUR
+ -f, --force Force push to the AUR overwriting the remote repository
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} foo
+ $ ${COMMAND} --no-disown --force
+_EOF_
+}
+
+pkgctl_aur_drop_from_repo() {
+ # options
+ local paths=()
+ local DISOWN=1
+ local FORCE=0
+
+ # variables
+ local path realpath pkgbase pkgrepo remote_url
+
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_aur_drop_from_repo_usage
+ exit 0
+ ;;
+ --no-disown)
+ DISOWN=0
+ shift
+ ;;
+ -f|--force)
+ FORCE=1
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ die "Invalid argument: %s" "$1"
+ ;;
+ *)
+ paths=("$@")
+ break
+ ;;
+ esac
+ done
+
+ # check if invoked without any path from within a packaging repo
+ if (( ${#paths[@]} == 0 )); then
+ if [[ -f PKGBUILD ]]; then
+ paths=(".")
+ else
+ pkgctl_aur_drop_from_repo_usage
+ exit 1
+ fi
+ fi
+
+ for path in "${paths[@]}"; do
+ if ! realpath=$(realpath -e "${path}"); then
+ die "No such directory: ${path}"
+ fi
+
+ pkgbase=$(basename "${realpath}")
+ pkgbase=${pkgbase%.git}
+
+ if [[ ! -d "${path}/.git" ]]; then
+ die "Not a Git repository: ${path}"
+ fi
+
+ pushd "${path}" >/dev/null
+
+ if [[ ! -f PKGBUILD ]]; then
+ die 'PKGBUILD not found in %s' "${path}"
+ fi
+
+ msg "Dropping ${pkgbase} to the AUR"
+
+ remote_url="${AUR_URL_SSH}:${pkgbase}.git"
+ if ! git remote add origin "${remote_url}" &>/dev/null; then
+ git remote set-url origin "${remote_url}"
+ fi
+
+ # move the main branch to master
+ if [[ $(git symbolic-ref --quiet --short HEAD) == main ]]; then
+ git branch --move master
+ git config branch.master.merge refs/heads/master
+ fi
+
+ # auto generate .SRCINFO if not already present
+ if [[ -z "$(git ls-tree -r HEAD --name-only .SRCINFO)" ]]; then
+ stat_busy 'Generating .SRCINFO'
+ makepkg --printsrcinfo > .SRCINFO
+ stat_done
+
+ git add --force -- .SRCINFO
+ git commit --quiet --message "Adding .SRCINFO" -- .SRCINFO
+ fi
+
+ msg "Pushing ${pkgbase} to the AUR"
+ if (( FORCE )); then
+ AUR_OVERWRITE=1 \
+ GIT_SSH_COMMAND="ssh -o SendEnv=AUR_OVERWRITE" \
+ git push --force origin master
+ else
+ git push origin master
+ fi
+
+ # update the local default branch in case this clone is used in the future
+ git remote set-head origin master
+
+ if (( DISOWN )); then
+ msg "Disowning ${pkgbase} on the AUR"
+ # shellcheck disable=SC2029
+ ssh "${AUR_URL_SSH}" disown "${pkgbase}"
+ fi
+
+ # auto-detection of the repo to remove from
+ if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
+ die 'Failed to get pacman repo'
+ fi
+
+ msg "Deleting ${pkgbase} from the official repository"
+ if [[ -z "${pkgrepo}" ]]; then
+ warning 'Did not find %s in any repository, please delete manually' "${pkgbase}"
+ else
+ msg2 " repo: ${pkgrepo}"
+ pkgctl_db_remove "${pkgrepo}" "${pkgbase}"
+ fi
+
+ popd >/dev/null
+ done
+}