pkgctl: add a unified command-line frontend for devtools

This is the first step of a simple and highly structured unified
interface to devtools commands in a single wrapper.

The split is based on groups like `repo`, `build` and `diff`

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
This commit is contained in:
Levente Polyak 2022-09-12 01:34:08 +02:00
parent d15bd29a9d
commit a8be7423ef
No known key found for this signature in database
GPG Key ID: FC1B547C8D8172C8
12 changed files with 365 additions and 29 deletions

View File

@ -1,4 +1,4 @@
#compdef archbuild pkgrepo arch-nspawn archrelease commitpkg diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
#compdef archbuild pkgrepo arch-nspawn archrelease commitpkg pkgctl diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
#
# SPDX-License-Identifier: GPL-3.0-or-later
@ -149,31 +149,47 @@ _devtools_completions_all_packages() {
compadd - "${(@)packages}"
}
_devtools() {
local service_func=_${service//-/_}
local service_cmds=${service_func}_cmds
if typeset -p ${service_cmds} &> /dev/null; then
_pkgctl_cmds=(
"pkgctl command"
"diff[Compare package files using different modes]"
"repo[Manage Git packaging repositories and their configuration]"
)
_pkgctl_diff_args=("${_diffpkg_args[@]}")
_pkgctl_repo_cmds=("${_pkgrepo_cmds[@]}")
_pkgctl_repo_clone_args=("${_pkgrepo_clone_args[@]}")
_pkgctl_repo_configure_args=("${_pkgrepo_configure_args[@]}")
_handle_subcommands() {
local service_name=${1}
if typeset -p ${service_name}_cmds &> /dev/null; then
_arguments -C \
"1: :->cmds" \
'*::arg:->args'
case $state in
cmds)
local service_cmds_array=${service_cmds}[@]
_values "${(P)service_cmds_array}"
local service_cmds=${service_name}_cmds[@]
_values "${(P)service_cmds}"
;;
args)
local cmd_args_array=${service_func}_$line[1]_args
if typeset -p ${cmd_args_array} &> /dev/null; then
local cmd_args=${cmd_args_array}[@]
local service_sub=${service_name}_$line[1]
if typeset -p ${service_sub}_args &> /dev/null; then
local cmd_args=${service_sub}_args[@]
_arguments -s "${(P)cmd_args}"
elif typeset -p ${service_sub}_cmds &> /dev/null; then
_handle_subcommands "${service_sub}"
fi
;;
esac
return 0
elif typeset -p ${service_name}_args &> /dev/null; then
local argname="${service_name}_args[@]"
_arguments -s "${(P)argname}"
fi
local argname="${service_func}_args[@]"
_arguments -s "${(P)argname}"
}
_devtools() {
_handle_subcommands _${service//-/_}
}
_devtools

View File

@ -8,16 +8,22 @@ devtools - Developer tools for the Arch Linux distribution
Description
-----------
Devtools contains tools for package maintenance in Arch Linux. The toolset
varies from tools for building packages in a clean chroot ('mkarchroot',...),
packaging related tools for sonames ('sogrep', 'lddd') and tools for
repository management such as ('pkgrepo')
Devtools contains tools for package maintenance in Arch Linux. It comes with a
unified command-line frontend called 'pkgctl' that aids to conveniently
interact with all the different tools this collection provides.
The toolset varies from tools for building packages in a clean chroot
('mkarchroot', 'archbuild', ...), packaging related tools ('sogrep', 'diffpkg',
'lddd') and tools for repository management such as ('pkgrepo').
Programs
--------
The list below gives a short overview; see the respective documentation
for details.
linkman:pkgctl[1]
Unified command-line frontend for devtools
linkman:archbuild[1]
Build an Arch Linux package inside a clean chroot
@ -27,6 +33,12 @@ linkman:arch-nspawn[1]
linkman:checkpkg[1]
Compare the current build package with the repository version
linkman:diffpkg[1]
Compare package files using different modes
linkman:export-pkgbuild-keys[1]
Export valid source signing keys from a PKGBUILD
linkman:find-libdeps[1]
Find soname dependencies for a package

View File

@ -30,7 +30,6 @@ Options
*-M, --makepkg-config*::
Set an alternate makepkg configuration file
*-P, --pool*='DIR'::
Search diff target in pool dir (default `'/srv/ftp/pool'`)
@ -71,7 +70,4 @@ Modes
*-b, --buildinfo*::
Activate .BUILDINFO diff mode
See Also
--------
include::include/footer.asciidoc[]

View File

@ -0,0 +1,73 @@
pkgctl-diff(1)
==============
Name
----
pkgctl-diff - Compare package files using different modes.
Synopsis
--------
pkgctl diff [OPTIONS] [MODES] [FILE|PKGNAME...]
Description
-----------
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
It then compares the package archives using different modes while using
simple tar content list by default.
When given one package, use it to diff against the locally built one.
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the cache
or pool, and 'pkgctl diff' will proceed as though this filename was initially
specified.
Options
-------
*-M, --makepkg-config*::
Set an alternate makepkg configuration file
*-P, --pool*='DIR'::
Search diff target in pool dir (default `'/srv/ftp/pool'`)
*-v, --verbose*::
Provide more detailed/unfiltered output
*-h, --help*::
Show a help text
Output Options
--------------
*--color*[='WHEN']::
Color output; 'WHEN' is `'never'`, `'always'`, or `'auto'`; Plain *--color* means *--color='auto'*
*-u, -U, --unified*::
Output 3 lines of unified context
*-y, --side-by-side*::
Output in two columns
*-W, --width*[='NUM']::
Output at most 'NUM' (default `'auto'`) print columns; 'NUM' can be `'auto'`, `'columns'` or a number.
`'auto'` will be resolved to the maximum line length of both files, guaranteeing the diff to be uncut.
Modes
-----
*-l, --list*::
Activate tar content list diff mode (default)
*-d, --diffoscope*::
Activate diffoscope diff mode
*-p, --pkginfo*::
Activate .PKGINFO diff mode
*-b, --buildinfo*::
Activate .BUILDINFO diff mode
include::include/footer.asciidoc[]

View File

@ -0,0 +1,42 @@
pkgctl-repo-clone(1)
======================
Name
----
pkgctl-repo-clone - Clone a package repository
Synopsis
--------
pkgctl repo clone [OPTIONS] [PKGNAME...]
Description
-----------
Clone Git packaging repositories from the canonical namespace.
The configure command is subsequently invoked to synchronize the distro
specs and makepkg.conf settings. The unprivileged option can be used
for cloning packaging repositories without SSH access using read-only
HTTPS.
Options
-------
*-m, --maintainer* 'NAME'::
Clone all packages of the named maintainer
*-u, --unprivileged*::
Clone package with read-only access and without packager info as Git author
*--universe*::
Clone all existing packages, useful for cache warming
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-repo-configure[1]
include::include/footer.asciidoc[]

View File

@ -0,0 +1,32 @@
pkgctl-repo-configure(1)
========================
Name
----
pkgctl-repo-configure - Configure a clone according to distro specs
Synopsis
--------
pkgctl repo configure [OPTIONS] [PATH...]
Description
-----------
Configure Git packaging repositories according to distro specs and
'makepkg.conf' settings.
Git author information and the used signing key is set up from
'makepkg.conf' read from any valid location like '/etc' or 'XDG_CONFIG_HOME'.
The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.
Options
-------
*-u, --unprivileged*::
Configure read-only repo without packager info as Git author
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@ -0,0 +1,24 @@
pkgctl-repo-web(1)
==================
Name
----
pkgctl-repo-web - Open the packaging repository's website
Synopsis
--------
pkgctl repo web [OPTIONS] [PKGBASE...]
Description
-----------
Open the packaging repository's website via xdg-open. If called with
no arguments, open the package cloned in the current working directory.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@ -0,0 +1,51 @@
pkgctl-repo(1)
================
Name
----
pkgctl-repo - Manage Git packaging repositories and their configuration
Synopsis
--------
pkgctl repo [OPTIONS] [SUBCOMMAND]
Description
-----------
Manage Git packaging repositories and helps with their configuration
according to distro specs.
Git author information and the used signing key is set up from
'makepkg.conf' read from any valid location like '/etc' or 'XDG_CONFIG_HOME'.
The configure command can be used to synchronize the distro specs and
makepkg.conf settings for previously cloned repositories.
The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl repo clone::
Clone a package repository
pkgctl repo configure::
Configure a clone according to distro specs
pkgctl repo web::
Open the packaging repository's website
See Also
--------
linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-web[1]
include::include/footer.asciidoc[]

32
doc/man/pkgctl.1.asciidoc Normal file
View File

@ -0,0 +1,32 @@
pkgctl(1)
=========
Name
----
pkgctl - Unified command-line frontend for devtools
Synopsis
--------
pkgctl [SUBCOMMAND] [OPTIONS]
Description
-----------
TODO
Subcommands
-----------
pkgctl diff::
Compare package files using different modes
pkgctl repo::
Manage Git packaging repositories and their configuration
See Also
--------
linkman:pkgctl-diff[1]
linkman:pkgctl-repo[1]
include::include/footer.asciidoc[]

View File

@ -5,8 +5,9 @@
m4_include(lib/common.sh)
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] [MODES] [FILE|PKGNAME...]
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [MODES] [FILE|PKGNAME...]
Searches for a locally built package corresponding to the PKGBUILD, and
downloads the last version of that package from the Pacman repositories.
@ -17,8 +18,8 @@ usage() {
When given two packages, diff both packages against each other.
In either case, a package name will be converted to a filename from the
cache, and diffpkg will proceed as though this filename was initially
specified.
cache, and '${COMMAND}' will proceed as though this filename was
initially specified.
OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file
@ -300,7 +301,7 @@ shopt -u extglob
if (( $# < 2 )); then
if [[ ! -f PKGBUILD ]]; then
die "This must be run in the directory of a built package.\nTry '$(basename "$0") --help' for more information."
die "This must be run in the directory of a built package.\nTry '${COMMAND} --help' for more information."
fi
# shellcheck source=contrib/makepkg/PKGBUILD.proto

56
src/pkgctl.in Normal file
View File

@ -0,0 +1,56 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
m4_include(lib/common.sh)
set -e
usage() {
local -r COMMAND=${BASH_SOURCE[0]##*/}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Unified command-line frontend for devtools.
COMMANDS
diff Compare package files using different modes
repo Manage Git packaging repositories and their configuration
OPTIONS
-h, --help Show this help text
_EOF_
}
if (( $# < 1 )); then
usage
exit 1
fi
export _DEVTOOLS_COMMAND='pkgctl'
# command checking
while (( $# )); do
case $1 in
-h|--help)
usage
exit 0
;;
repo)
_DEVTOOLS_COMMAND+=" $1"
shift
pkgrepo "$@"
exit 0
;;
diff)
_DEVTOOLS_COMMAND+=" $1"
shift
diffpkg "$@"
exit 0
;;
*)
die "invalid command: %s" "$1"
;;
esac
done

View File

@ -9,10 +9,11 @@ source /usr/share/makepkg/util/message.sh
set -e
COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [COMMAND] [OPTIONS]
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Manage Git packaging repositories and helps with their configuration
according to distro specs.
@ -37,7 +38,7 @@ _EOF_
usage_clone() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} clone [OPTIONS] [PKGNAME...]
Usage: ${COMMAND} clone [OPTIONS] [PKGNAME...]
Clone Git packaging repositories from the canonical namespace.
@ -57,7 +58,7 @@ _EOF_
usage_configure() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} configure [OPTIONS] [PATH...]
Usage: ${COMMAND} configure [OPTIONS] [PATH...]
Configure Git packaging repositories according to distro specs and
makepkg.conf settings.