summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Heusel <christian@heusel.eu>2023-06-08 14:47:29 +0200
committerLevente Polyak <anthraxx@archlinux.org>2024-01-09 23:47:45 +0100
commit2b8033b91132d303603f370a54eef02949703750 (patch)
treeb1ac63fbeba77d66f9ff7a24bbb9dd6e2bccb29c
parent8f45c65830fc32e6dbbff0233dea3356acc96e57 (diff)
downloaddevtools-2b8033b91132d303603f370a54eef02949703750.tar.xz
feat(aur): add subcommand to drop a package from the repos to the AUR
Add an aur command to interact with the Arch User Repository including the drop-from-repo subommand which allows to drop packages from the official repository to the Arch User Repository in one go. Related to #143 Component: pkgctl aur drop-from-repo Co-authored-by: Levente Polyak <anthraxx@archlinux.org> Signed-off-by: Christian Heusel <christian@heusel.eu>
-rw-r--r--contrib/completion/bash/devtools.in13
-rw-r--r--contrib/completion/zsh/_devtools.in13
-rw-r--r--doc/man/pkgctl-aur-drop-from-repo.1.asciidoc41
-rw-r--r--doc/man/pkgctl-aur.1.asciidoc37
-rw-r--r--doc/man/pkgctl.1.asciidoc4
-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
9 files changed, 348 insertions, 1 deletions
diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in
index 4c7b73a..1fbd46c 100644
--- a/contrib/completion/bash/devtools.in
+++ b/contrib/completion/bash/devtools.in
@@ -135,6 +135,7 @@ complete -F _offload_build offload-build
_pkgctl_cmds=(
+ aur
auth
build
db
@@ -264,6 +265,17 @@ _pkgctl_release_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; }
_pkgctl_release_opts() { _filedir -d; }
+_pkgctl_aur_cmds=(
+ drop-from-repo
+)
+
+_pkgctl_aur_drop_from_repo_args=(
+ --no-disown
+ -f --force
+ -h --help
+)
+_pkgctl_aur_drop_from_repo_opts() { _filedir -d; }
+
_pkgctl_repo_cmds=(
clone
@@ -308,7 +320,6 @@ _pkgctl_repo_create_args=(
-h --help
)
-
_pkgctl_repo_switch_args=(
--discard-changes
-f --force
diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in
index b316346..5b51aff 100644
--- a/contrib/completion/zsh/_devtools.in
+++ b/contrib/completion/zsh/_devtools.in
@@ -96,6 +96,18 @@ _pkgctl_release_args=(
'*:git_dir:_files -/'
)
+_pkgctl_aur_cmds=(
+ "pkgctl aur command"
+ "drop-from-repo[Drop a package from the official repository to the AUR]"
+)
+
+_pkgctl_aur_drop_from_repo_args=(
+ '(-f --force)'{-f,--force}'[Force push to the AUR overwriting the remote repository]'
+ '--no-disown[Do not disown the package on the AUR]'
+ '(-h --help)'{-h,--help}'[Display usage]'
+ '*:git_dir:_files -/'
+)
+
_pkgctl_repo_cmds=(
"pkgctl repo command"
"clone[Clone a package repository]"
@@ -257,6 +269,7 @@ _devtools_completions_all_packages() {
_pkgctl_cmds=(
"pkgctl command"
+ "aur[Interact with the Arch User Repository (AUR)]"
"auth[Authenticate with services like GitLab]"
"build[Build packages inside a clean chroot]"
"db[Pacman database modification for package update, move etc]"
diff --git a/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc b/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc
new file mode 100644
index 0000000..a9d39c6
--- /dev/null
+++ b/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc
@@ -0,0 +1,41 @@
+pkgctl-aur-drop-from-repo(1)
+============================
+
+Name
+----
+pkgctl-aur-drop-from-repo - Drop a package from the official repository to the AUR
+
+Synopsis
+--------
+pkgctl aur drop-from-repo [OPTIONS] [PATH]...
+
+Description
+-----------
+
+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 a help text
+
+See Also
+--------
+
+linkman:pkgctl-db-remove[1]
+
+include::include/footer.asciidoc[]
diff --git a/doc/man/pkgctl-aur.1.asciidoc b/doc/man/pkgctl-aur.1.asciidoc
new file mode 100644
index 0000000..d69124a
--- /dev/null
+++ b/doc/man/pkgctl-aur.1.asciidoc
@@ -0,0 +1,37 @@
+pkgctl-aur(1)
+=============
+
+Name
+----
+pkgctl-aur - Interact with the Arch User Repository (AUR)
+
+Synopsis
+--------
+pkgctl aur [OPTIONS] [SUBCOMMAND]
+
+Description
+-----------
+
+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.
+
+Options
+-------
+
+*-h, --help*::
+ Show a help text
+
+Subcommands
+-----------
+
+pkgctl aur drop-from-repo::
+ Drop a package from the official repository to the AUR
+
+See Also
+--------
+
+linkman:pkgctl-aur-drop-from-repo[1]
+
+include::include/footer.asciidoc[]
diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc
index 1164561..24b0613 100644
--- a/doc/man/pkgctl.1.asciidoc
+++ b/doc/man/pkgctl.1.asciidoc
@@ -26,6 +26,9 @@ Options
Subcommands
-----------
+pkgctl aur::
+ Interact with the Arch User Repository
+
pkgctl auth::
Authenticate with services like GitLab
@@ -53,6 +56,7 @@ pkgctl version::
See Also
--------
+linkman:pkgctl-aur[1]
linkman:pkgctl-auth[1]
linkman:pkgctl-build[1]
linkman:pkgctl-db[1]
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