summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/aur.sh65
-rw-r--r--src/lib/aur/drop-from-repo.sh166
-rw-r--r--src/lib/common.sh1
-rw-r--r--src/pkgctl.in9
4 files changed, 241 insertions, 0 deletions
diff --git a/src/lib/aur.sh b/src/lib/aur.sh
new file mode 100644
index 0000000..24cbb62
--- /dev/null
+++ b/src/lib/aur.sh
@@ -0,0 +1,65 @@
+#!/hint/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_AUR_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_AUR_SH=1
+
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+
+set -eo pipefail
+
+
+pkgctl_aur_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [COMMAND] [OPTIONS]
+
+ Interact with the Arch User Repository (AUR).
+
+ Provides a suite of tools designed for managing and interacting with the Arch
+ User Repository (AUR). It simplifies various tasks related to AUR, including
+ importing repositories, managing packages, and transitioning packages between
+ the official repositories and the AUR.
+
+ COMMANDS
+ drop-from-repo Drop a package from the official repository to the AUR
+
+ OPTIONS
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} drop-from-repo libfoo
+_EOF_
+}
+
+pkgctl_aur() {
+ if (( $# < 1 )); then
+ pkgctl_aur_usage
+ exit 0
+ fi
+
+ # option checking
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_aur_usage
+ exit 0
+ ;;
+ drop-from-repo)
+ _DEVTOOLS_COMMAND+=" $1"
+ shift
+ # shellcheck source=src/lib/aur/drop-from-repo.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/aur/drop-from-repo.sh
+ pkgctl_aur_drop_from_repo "$@"
+ exit 0
+ ;;
+ -*)
+ die "invalid argument: %s" "$1"
+ ;;
+ *)
+ die "invalid command: %s" "$1"
+ ;;
+ esac
+ done
+}
diff --git a/src/lib/aur/drop-from-repo.sh b/src/lib/aur/drop-from-repo.sh
new file mode 100644
index 0000000..d70b559
--- /dev/null
+++ b/src/lib/aur/drop-from-repo.sh
@@ -0,0 +1,166 @@
+#!/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
+ git remote set-head origin 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
+
+ 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
+}
diff --git a/src/lib/common.sh b/src/lib/common.sh
index 17b91bc..a93e906 100644
--- a/src/lib/common.sh
+++ b/src/lib/common.sh
@@ -29,6 +29,7 @@ export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}"
export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}"
export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org
export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer
+export AUR_URL_SSH=aur@aur.archlinux.org
# check if messages are to be printed using color
if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then
diff --git a/src/pkgctl.in b/src/pkgctl.in
index 10a2348..070e0cd 100644
--- a/src/pkgctl.in
+++ b/src/pkgctl.in
@@ -19,6 +19,7 @@ usage() {
Unified command-line frontend for devtools.
COMMANDS
+ aur Interact with the Arch User Repository
auth Authenticate with services like GitLab
build Build packages inside a clean chroot
db Pacman database modification for package update, move etc
@@ -51,6 +52,14 @@ while (( $# )); do
usage
exit 0
;;
+ aur)
+ _DEVTOOLS_COMMAND+=" $1"
+ shift
+ # shellcheck source=src/lib/aur.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/aur.sh
+ pkgctl_aur "$@"
+ exit 0
+ ;;
build)
_DEVTOOLS_COMMAND+=" $1"
shift