Compare commits

...

172 Commits

Author SHA1 Message Date
Jan Alexander Steffens (heftig)
71502ae2eb Merge branch 'diffpkg-continue' into 'master'
diffpkg: Skip packages that fail to fetch

See merge request archlinux/devtools!156
2025-08-06 09:13:09 +00:00
Jakub Klinkovský
fc56ebedf3 fix(completion): fix bash completion for the license subcommand
Signed-off-by: Jakub Klinkovský <lahwaacz@archlinux.org>
2025-08-05 17:48:12 +02:00
Christian Heusel
01757e6904 fix(commitpkg): Quiet git ls-files output
So far all files in `needsversioning=(...)` have been printed to the
command line if they were found, which is not useful, especially now
that we have more files present there.

It makes sense however to keep the standard error output, as this gives
a actionable suggestion what one should to to fix the issue:

    > error: pathspec 'PKGBUILD' did not match any file(s) known to git
    > Did you forget to 'git add'?

Fixes #281

Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-08-01 11:26:57 +02:00
Daniel M. Capella
c5fe8ff3e6 feat(license): Extend matches for sysusers/tmpfiles configs
Eg. to match:
- sysusers.conf
- $pkgname.sysusers
- $pkgname.sysusers.conf
2025-07-28 23:38:32 -04:00
Christian Heusel
ad7dd50bf3 chore(release): version v1.4.0 2025-07-25 09:04:45 +02:00
Jakub Klinkovský
5a381835e8 feat(config): set default build flags for Fortran
This implements RFC 54: https://rfc.archlinux.page/0054-fortran-flags/
2025-07-25 08:54:49 +02:00
Sven-Hendrik Haase
b8c475b3f4 feat(commitpkg): Integrate with pkgctl license
This will check for license compliance before committing.
2025-07-22 20:27:54 +02:00
Sven-Hendrik Haase
74cd46f092 feat(license): Add subcommand to check and setup licenses
This implements a part of RFC52. The new pkgctl license check subcommand calls reuse lint on
the provided directories while pkgctl license setup tries to make packages compliant with RFC40
by adding a LICENSE file and by generating a REUSE.toml.

Component: pkgctl license
2025-07-22 20:27:46 +02:00
Bert Peters
40f31f98a3 fix(autocomplete): don't add extra = for message 2025-05-12 22:49:22 +02:00
Jan Alexander Steffens (heftig)
c6f5d72708 fix(common): Fix diffoscope looking at remote debug info
readelf will pull in remote debug info if allowed to. This is not really
what we expect for diffoscope diffs, especially when our server only has
debug info for one side of the diff.
2025-04-23 01:13:46 +02:00
Jakub Klinkovský
b4a5e5dbd9 fix(build): sync command description with the man page
The original wording sounded like `pkgctl build` by default updates the
checksums whenever `pkgver` is changed in PKGBUILD.
2025-04-18 15:56:51 +02:00
Levente Polyak
4926d9d8c5 chore(release): version v1.3.2 2025-02-25 22:05:15 +01:00
Levente Polyak
7165e0d73e chore(conf): add whitespace to RUSTFLAGS option for unified style 2025-02-25 21:51:37 +01:00
Levente Polyak
8776dd39e8 chore(makerepropkg): unify indention style of the file 2025-02-25 21:32:14 +01:00
Levente Polyak
fb4bf96d24 feat(makerepropkg): support conf.d makepkg config files from buildtool
Previously we have only copied the passed makepkg.conf file into the
chroot, which misses build flags for additional language specific files
that makepkg supports. Fix this by extracting all conf.d makepkg config
files from the detected devtools archive.

Component: makerepropkg
Co-authored-by: Christian Heusel <christian@heusel.eu>
2025-02-25 21:32:06 +01:00
Levente Polyak
96eff02801 feat(arch-nspawn): support conf.d makepkg config files
Previously we have only copied the passed makepkg.conf file into the
chroot, which misses build flags for additional language specific files
that makepkg supports. Fix this by also copying all config files that
match the `<file>.d/*.conf` glob.

Fixes #244

Component: arch-nspawn
Suggested-by: Rein Fernhout (Levitating) <me@levitati.ng>
Co-authored-by: Christian Heusel <christian@heusel.eu>
2025-02-25 21:20:31 +01:00
Levente Polyak
79c3162112 feat(config): provide vendored language specific makepkg.conf files
Vendor all language related makepkg.conf files which are also shipped by
makepkg itself. This makes sure we always have full control over the
build flags inside devtools and overlay any by the vendored config we
maintain in devtools.

Component: archbuild
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-02-15 11:43:14 +01:00
Levente Polyak
43cd68d73e feat(archbuild): automatically recreate chroot on version mismatch
For our own archbuild script which is used for package building from a
template chroot, automatically handle the case where the template root
is out of date. Check the version and enable the clean flag by default
in case a mismatch is detected.

Component: archbuild
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-02-15 11:43:14 +01:00
Levente Polyak
5c1948a357 chore(archroot): bump version to ensure fresh roots after config changes
We are currently facing reproducible builds issues as the
makepkg.conf.d/rust.conf file in the root chroot was leading to pacnew
files, which means the chroot did not use configs as expected from a
clean state. Work around this problem by bumping the chroot version and
ensure we get fresh chroots with expected configs

Component: archroot
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-02-15 11:24:31 +01:00
Bert Peters
acd6bda3ed Don't add extra "=" to repo completion 2025-02-01 15:45:36 +01:00
Christian Heusel
8af7a50c03 chore(release): version v1.3.1 2025-01-06 10:11:07 +01:00
Christian Heusel
bed2b5db28 fix(gitlab): prevent division by 0 for missing total pages
As it turns out the Gitlab api is not guaranteed to return the
x-total-pages header for larger query result which previously resulted
in a division by zero for pkgctl search as the utlity function assumed
that this value would always be set to a positive integer.

Fixes #255

Link: https://gitlab.com/gitlab-org/gitlab/-/issues/436373
Component: gitlab.sh
Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-01-05 20:19:33 +01:00
Levente Polyak
47d5ea1e89 fix(version): Disable Git user configs to avoid side-effects
The nvchecker upstream version checks are expected to work as is on any
machines without the need of manual Git user configuration. However,
certain user configuration may have a side-effect on version checks.
Subsequently we try to avoid this situation by always disabling Git
config locations.

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-01-03 23:35:59 +01:00
Jakub Klinkovský
8df81ecd7c fix: declare local arrays before using mapfile 2025-01-03 19:04:01 +01:00
Jakub Klinkovský
1101de9fb9 fix(offload-build): download logs even when the build fails
Fixes #260
2024-12-14 07:34:34 +01:00
Christian Heusel
d5e1c5fae3 fix: Display issue comments in chronological order
Fixes #259

Fixes: 0df36df ("feat(issue): add subcommand to list group and project issues")
Component: pkgctl issue view
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-12-13 21:33:51 +01:00
Zhou Qiankang
e8ab01d662 fix(checkpkg): add a default value for terminal width
* Ensures availability when $COLUMNS is not present

Signed-off-by: Zhou Qiankang <wszqkzqk@qq.com>
2024-12-08 23:51:12 +08:00
Christian Heusel
7d9c2e0648 chore(release): version v1.3.0 2024-12-04 22:37:59 +01:00
Christian Heusel
8bcbca830e fix(util): disable landlocking in fakeroot
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-12-04 18:15:13 +01:00
T.J. Townsend
68eb498347 chore: sync pacman configs with package defaults 2024-12-04 18:15:13 +01:00
Robin Candau
23f1314733 feat(release): Add a warning if nvchecker integration is not set
Hints to run `pkgctl version setup --help` to see how to set it up if needed.

Closes https://gitlab.archlinux.org/archlinux/devtools/-/issues/236
2024-12-03 22:32:59 +01:00
Levente Polyak
98b079f047 chore(doc): remove superfluous trailing whitespaces from pkgctl man 2024-12-03 22:19:58 +01:00
Levente Polyak
a319b0b852 feat(issue): add subcommand to edit an issue
The pkgctl issue edit command is used to modify an existing issue in Arch Linux
packaging projects. This command allows users to update the issue's title,
description, and various attributes, ensuring that the issue information
remains accurate and up-to-date. It also provides a streamlined facility
for bug wranglers to categorize and prioritize issues efficiently.

By default, the command operates within the current directory, but users can
specify a different package base if needed.

In case of a failed run, the command can automatically recover to ensure that
the editing process is completed without losing any data.

Component: pkgctl issue edit
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:19:51 +01:00
Levente Polyak
a1e443856d feat(issue): add subcommand to create a new issue
The create command is used to create a new issue for an Arch Linux package.
This command is suitable for reporting bugs, regressions, feature requests, or
any other issues related to a package. It provides a flexible way to document
and track new issues within the project's issue tracking system.

By default, the command operates within the current directory, but users can
specify a different package base if needed.

Users can provide a title for the issue directly through the command line.
The command allows setting various labels and attributes for the issue, such as
confidentiality, priority, scope, severity, and status.

In case of a failed run, the command can automatically recover to ensure that
the issue creation process is completed without losing any data.

Component: pkgctl issue create
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:19:36 +01:00
Levente Polyak
dfb65e95e3 feat(issue): add subcommand to move issues between projects
The move command allows users to transfer an issue from one project to another
within the Arch Linux packaging group. This is useful when an issue is
identified to be more relevant or better handled in a different project.

By default, the command operates within the current directory, but users can
specify a different package base from which to move the issue.

Users must specify the issue ID (IID) and the destination package to which the
issue should be moved. A comment message explaining the reason for the move can
be provided directly through the command line.

Component: pkgctl issue move
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:19:22 +01:00
Levente Polyak
4e7ec8b37f feat(issue): add subcommand to reopen issues
The reopen command is used to reopen a previously closed issue in Arch Linux
packaging projects. This command is useful when an issue needs to be revisited
or additional work is required after it was initially closed.

By default, the command operates within the current directory, but users can
specify a different package base if needed.

Users can provide a message directly through the command line to explain the
reason for reopening the issue.

Component: pkgctl issue reopen
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:19:07 +01:00
Levente Polyak
292920ac7e feat(issue): add subcommand to close issues
This command is used to close an issue in Arch Linux packaging projects. It
finalizes the issue by marking it as resolved and optionally providing a reason
for its closure.

By default, the command operates within the current directory, but users have
the option to specify a different package base.

Users can provide a message directly through the command line to explain the
reason for closing the issue. Additionally, a specific resolution label can be
set to categorize the closure reason, with the default label being "completed."

Component: pkgctl issue close
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:18:52 +01:00
Levente Polyak
dde6539971 feat(issue): add subcommand to comment on issues
This command allows users to add comments to an issue in Arch Linux packaging
projects. This command is useful for providing feedback, updates, or any
additional information related to an issue directly within the project's issue
tracking system.

By default, the command interacts with the current directory, but users can
specify a different package base if needed.

Component: pkgctl issue comment
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:18:38 +01:00
Levente Polyak
8803e5a57a feat(issue): add subcommand to view issue details and comments
This command is designed to display detailed information about a specific issue
in Arch Linux packaging projects. It gathers and pretty prints all relevant
data about the issue, providing a comprehensive view that includes the issue's
description, status as well as labels and creation date.

By default, the command operates within the current directory, but users have
the option to specify a different package base. Additionally, users can choose
to view the issue in a web browser for a more interactive experience.

Component: pkgctl issue view
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:18:23 +01:00
Levente Polyak
0df36dfa52 feat(issue): add subcommand to list group and project issues
The pkgctl issue list command is used to list issues associated with a specific
packaging project or the entire packaging subgroup in Arch Linux. This command
facilitates efficient issue management by allowing users to list and filter
issues based on various criteria.

Results can also be displayed directly in a web browser for easier navigation
and review.

Component: pkgctl issue list
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:17:39 +01:00
Levente Polyak
b9fe8ee947 chore(gitlab): move project name lookup to gitlab library functions
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-12-03 22:13:14 +01:00
Jakub Klinkovský
af56897f76 feat(offload-build): create or reuse a shared SSH socket with ControlMaster=auto 2024-11-28 15:06:29 +01:00
Jakub Klinkovský
99c6c26a1c fix(offload-build): add end-of-options token (--) to all ssh and rsync commands 2024-11-28 15:06:29 +01:00
Jakub Klinkovský
00f97fcd3d fix(offload-build): setup TEMPDIR in WORKDIR and fix trap override 2024-11-28 15:06:29 +01:00
Jakub Klinkovský
effe511952 fix(offload-build): fix quoting in sshopts and rsyncopts 2024-11-28 15:06:29 +01:00
Jakub Klinkovský
1cd213b2f5 fix(offload-build): ungolfing remote command execution
Instead of passing the command as one complex string to ssh, we create
an SSH master connection and use its control socket in multiple simpler
commands. The same socket is passed also to rsync to transfer the srcpkg
to the remote and to download the build artifacts.

Previously, the srcpkg was passed via stdin to ssh, which prevented
`pkgctl build --offload --inspect` from working. This change frees stdin
for proper remote ptty allocation.

However, it seems that ssh commands with and without the `-t` flag
cannot be multiplexed on a single connection, so there are technically
two SSH connections active for the offload-build execution.
2024-11-28 15:06:29 +01:00
Levente Polyak
b88dec322c feat(version): graceful config for packages without remote sources
Setup a blank config for packages without remote sources. This is
helpful so other commands like `pkgctl version check` operate gracefully
as well as we have easy way to find packages that miss nvchecker
config.

This must only be used for cases without an upstream, please reach out
to the developer team for guidance regarding upstream sources that are
hard to configure.

Component: pkgctl version setup
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-11-26 19:01:56 +01:00
Andreas Schleifer
e2ab07caff feat(version): add json output option to version check command
This allows for tools and data visualization to interface against pkgctl
with a machine readable output.

Fixes #237

Component: pkgctl version check
Signed-off-by: Andreas Schleifer <segaja@archlinux.org>
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
2024-11-23 17:53:12 +01:00
Celeste Liu
5c0f8d37d5 fix(arch-nspawn): add --timezone=off to avoid pollute build environment
From systemd-nspawn(1),

	--timezone=
		Configures how /etc/localtime inside of the container (i.e. local timezone synchronization from host to container) shall be handled. Takes one of "off", "copy", "bind", "symlink", "delete" or "auto". If set to "off" the /etc/localtime file in the container
		is left as it is included in the image, and neither modified nor bind mounted over. If set to "copy" the /etc/localtime file of the host is copied into the container. Similarly, if "bind" is used, the file is bind mounted from the host into the container. If
		set to "symlink", a symlink is created pointing from /etc/localtime in the container to the timezone file in the container that matches the timezone setting on the host. If set to "delete", the file in the container is deleted, should it exist. If set to
		"auto" and the /etc/localtime file of the host is a symlink, then "symlink" mode is used, and "copy" otherwise, except if the image is read-only in which case "bind" is used instead. Defaults to "auto".

		Added in version 239.

After this commit, we need to recreate all build environment to clean up
pollution already existed.

resolve #250

Signed-off-by: Celeste Liu <CoelacanthusHex@gmail.com>
2024-11-09 20:26:28 +08:00
Christian Heusel
e1401ce41c fix: disable confirmation when dropping packages
Since commit 1d433f6 ("feat(db): confirm list of all packages that will be removed") packages need confirmation by default when being dropped from the db. If we make it to the DB drop phase the package already is pushed to the AUR, so it is safe to remove from the database and not removing it would create a somewhat broken state, so we assume that the package should unconditionally be removed from the db.

Component: pkgctl aur drop-from-repo
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-09-29 12:40:22 +02:00
Orhun Parmaksız
8612b41a20 fix: update the personal access token URL
PAT settings are now under `user_settings` instead of `profile`

Component: pkgctl auth login
2024-09-25 13:20:46 +02:00
Jaroslav Lichtblau
fbb661645b doc: fix the example in the help text
Without the "--release" flag the example command fails with
==> ERROR: cannot use --message without --release.

Component: pkgctl build
2024-09-10 10:59:18 +02:00
Christian Heusel
f1dc2e18f7 fix: remove duplicate error message
It seems like nvchecker emits two log entries for errors:

    $ nvchecker --logger json -c .nvchecker.toml
    {"logger_name": "nvchecker.core", "name": "curl", "event": "token not given but it is required", "level": "error"}
    {"logger_name": "nvchecker.core", "name": "curl", "error": "token not given but it is required", "event": "no-result", "level": "error"}

This leads to a double error message as described in the related issue,
which we fix by narrowing the selector to filter for the error entry.

Fixes #235

Component: pkgctl version check
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-09-08 22:38:19 +02:00
Christian Heusel
c9d821448b fix(makechrootpkg): improve btrfs sanity checks
If the chroot was created in a way where it resides on a BTRFS file
system but "$copydir/root" is not a snapshot an error like the following
would be emitted:

  $ makechrootpkg -r ~/chroot
  ==> Synchronizing chroot copy [/home/chris/chroot/root] -> [chris]...ERROR: Not a Btrfs subvolume: Invalid argument
  ==> ERROR: Unable to create subvolume /home/chris/chroot/chris

Fix this by adding an additional check, which detects if the folder is
actually the root of a BTRFS snapshot before attempting to clone it.

Related to https://gitlab.archlinux.org/archlinux/devtools/-/merge_requests/259

Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-09-08 22:33:45 +02:00
Fox2Code
a620250535 doc: specify default chroot folder for pkgctl-build 2024-08-21 11:26:33 +02:00
Jaroslav Lichtblau
27eebe383d doc: fix the example command in the help text
the '--pkgver' argument is not space-separated but instead specified
with an equals sign.

Component: pkgctl build
2024-06-26 21:00:19 +02:00
Jakub Klinkovský
d6d416b653 feat(checkpkg): enhance diff command for comparing file lists
Replace `sdiff` with `diff` (also from `diffutils`) with the following
parameters:

- `--side-by-side` for the `sdiff`-like output
- `--suppress-common-lines` for the `sdiff -s` behavior
- `--width="$COLUMNS"` to use the full terminal width (long lines are
  still truncated but it is definitely better than the default width of
  130 chars)
- `--color=auto` just because 😉
2024-06-26 07:40:12 +02:00
Chih-Hsuan Yen
9ff63503b9 fix(pkgctl): make sure git signing uses PGP
Component: pkgctl repo configure
2024-06-19 17:37:18 +08:00
Christian Heusel
3f02a1a24c chore(release): version v1.2.1 2024-06-18 14:14:22 +02:00
Christian Heusel
1df0979da6 fix(common): guard the WORKDIR environment var
This avoids the unwanted removal of the folder if someone has already
pre-defined the variable.

Fixes #219

Suggested-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-06-15 14:55:18 +02:00
Christian Heusel
c1a3ed224b misc: add a editorconfig to devtools
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-06-11 22:04:58 +02:00
David Runge
144f9a871e fix(version): Ignore warnings when nvchecker ignores invalid versions
Since version 2.15.1 nvchecker emits a warning for version strings that
it consideres invalid (e.g. in the case of PyPI).
These warning messages get in the way (the first version emitted via a
warning is used as version to compare against) of retrieving the latest
version of an upstream and therefore we ignore them.

Component: pkgctl version check
Signed-off-by: David Runge <dvzrv@archlinux.org>
2024-06-09 14:36:47 +02:00
Christian Heusel
44328cd9a3 test: fix the testcases so they pass again
The expected output for these tests has now changed since git smash
(which we test against) has changed their version scheme.

Component: pkgctl version setup
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-06-08 17:35:46 +02:00
Christian Heusel
0e2b16b0ac fix: disable systemd-nspawn terminal coloring
Systemd 256 introduces functionality which colors the terminal
background on systemd-nspawn invocations which makes the pkgctl output
look weird.

Disable this bevaviour for pkgctl, so it stays active for arch-nspawn
(for now).

Component: pkgctl
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-05-22 12:33:09 +02:00
Maharshi Basu
6f0a8c345d doc: add manpage info for pkgctl, pkgctl-db(1) & pkgctl-build
Changes made:
- add description in doc/man/pkgctl.1.asciidoc
- add description in doc/man/pkgctl-db(1).asciidoc
- add manpage for pkgctl-db(1) in doc/man/pkgctl-db(1).asciidoc

Fixes #231

Signed-off-by: Maharshi Basu <basumaharshi10@gmail.com>
2024-05-18 20:36:09 +02:00
依云
5f19853414 feat: support bind mounting a tmpfs
A .cache can be bind mounted into the container to save the caches for
reuse, but sometimes we want to exclude specific caches (because they
don't work well, e.g. bazel's).

Component: makechrootpkg
2024-05-18 19:39:18 +02:00
Frédéric Pierret (fepitre)
2b62ac660d feat(mkarchroot): allow to specify file destination inside chroot
Co-authored-by: Christian Heusel <christian@heusel.eu>
2024-05-18 13:53:39 +02:00
Jan Alexander Steffens (heftig)
7cb72699f6 fix: consider all git repos inside the chroot safe
Git 2.45.1 expanded its security checks to deny cloning even local repos
that are owned by another user. Previously, this just affected network
filesystems.

On our buildserver, this prevents makepkg from cloning repos from our
shared srcdest into the srcdir, if these repos were created by another
packager.

To disable this check, set `safe.directory` to `*`. This looks like a
glob, but is really just a special value. The only other option would be
to add each Git repository in srcdest to the configuration.

Component: makechrootpkg
2024-05-18 00:15:06 +02:00
Levente Polyak
d1790c295a fix(version): escape pkgbase in nvchecker toml
This fixes issues with packages containing plus signs, that need to be
escaped in toml as well as the extended grep regex.

Component: pkgctl version check
2024-05-10 21:22:23 +02:00
Levente Polyak
12a0d0c7b5 chore(release): version v1.2.0 2024-05-01 16:38:19 +02:00
Jakub Klinkovský
952f483574 feat(offload-build): fetch logs after building from the remote server
Since logs from offloaded builds are collected in a temporary directory
on the remote server, it is rather difficult/error-prone to get to them,
because the path changes in each rebuild. Fetching logs from the server
into $LOGDEST makes it easier to investigate them and also brings the
behavior of offload-build closer to archbuild.

Log files are always downloaded, even for failed builds.

Component: offload-build
Signed-off-by: Jakub Klinkovský <lahwaacz@archlinux.org>
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
2024-04-30 23:30:47 +02:00
Christian Heusel
c484a55cde fix(version): dont die if no PKGBUILD is found
So far the commands would stop execution if one of the target
directories did not contain a PKGBUILD instead of just reporting failure
for that directory. Fix this by replacing the 'die' calls with setting
the error for the spinner facility.

Component: pkgctl version check
Component: pkgctl version upgrade
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-04-29 19:04:46 +02:00
Robin Candau
a46b2d4fb7 feat(repo): add repo clean command to remove untracked files
This introduces the `pkgctl repo clean` command which removes every
untracked files from local package repositories (via `git clean`).

The usage is as simple as `pkgctl repo clean [OPTION] [PATH]` (where
"[PATH]" can be equal to a wildcard "*").

Component: pkgctl repo clean
2024-04-28 19:42:02 +02:00
Felix Yan
e828111ff7 feat(arch-nspawn): add support for pacman CacheServer
pacman 6.1 added support for CacheServer which allows us to download
packages faster and reduce the burden on tier0 server.

They won't be used to fetch databases so it should be pretty safe in the
repository consistency context.

Component: arch-nspawn
2024-04-28 17:06:46 +02:00
Levente Polyak
35b417d226 fix(db): check valid target repo on db remove
Return an error and abort operation when an invalid target repo is
passed.

Component: pkgctl db remove
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-04-28 15:56:00 +02:00
Levente Polyak
1d433f600e feat(db): confirm list of all packages that will be removed
Sometimes it isn't obvious which set of packages are removed from a
split package when the pkgbase matches also a subset of a pkgbase. This
can happen for example with bootstrapping packages, when the intention
is to just remove a partial part of the bootstrap pkgbase.

To make the intention more explicit, list all to be removed packages and
await for confirmation.

Component: pkgctl db remove
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-04-28 15:55:53 +02:00
Levente Polyak
7b553afcb2 feat(db): add partial split package option to db remove
By default passing a pkgbase removes all split packages, debug packages
as well as entries from the state repo for all existing architectures.

When using the `--partial` option it may most likely lead to undesired
effects by leaving debug packages behind as well as dangling entries in
the state repository. However, for specific use cases its required to
get rid of old split package parts.

Fixes #218

Component: pkgctl db remove
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-04-27 18:38:12 +02:00
sfan5
01614c6817 feat(arch-nspawn): set console mode to autopipe
systemd-nspawn sets up a pts in the container by default which build
scripts might use to ask for interactive input.  This is only okay if
the host side is also a TTY.  The 'autopipe' mode deals with this
situation appropriately.
2024-04-27 14:52:13 +02:00
Christian Heusel
dced77d23d fix(completion): fix erroneous completion variables
The architecture definition of the variable was using invalid bash
syntax and was previously unused:

    $ _binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1}
    bash: -1: substring expression < 0

We therefore fix the definition of the variable and use it for the
autocompletion of the offload-build command.

Furthermore fix wrongly named architecture variables that have been
missed from previous refactoring.

Fixes #222

Component: completion
Fixes: f961e2e ("completion: implemented structured declarative bash completions")
Fixes: 4173e0a ("chore: refactor variable names in valid-{tags,repos}.sh")
Signed-off-by: Christian Heusel <christian@heusel.eu>
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
2024-04-24 22:55:18 +02:00
Levente Polyak
5780ba0e38 fix(release): ensure we release split package uploads as one batch
Use a central location in common.sh to define the default rsync options.
Switch to use batched uploads by targeting a partial directory which is
not taken into account by db update. Instead, once all packages that
belong to a split package group are uploaded into the .partial
directory, all artifacts are moved in one batch into the staging
directory of the repo server. This reduced the window of opportunity for
a partial release significantly to a tiny window.

Component: pkgctl release
2024-04-23 22:48:55 +02:00
Levente Polyak
9a5181db5b feat(pkgctl): add internal update checksums to better control output
This allows us to have more control over the output and status logs.
Using this method we are able to avoid cluttering the version upgrade
subcommand while downloading sources for updating the checksums.

Having this internally will also allow us in the future to have smart
checksums updating by only trying to change the checksums of sources
that have actually changed, for example when adjusting a patch file we
should avoid trying to overwrite the archive checksums unintentionally.

Component: pkgctl version upgrade
2024-04-23 20:23:49 +02:00
Robin Candau
55c2ca1312 feat(version): let upgrade subcommand also update checksums
This commit aims to make 'pkgctl version upgrade' also update checksums
in addition of bumping the pkgver and reseting the pkgrel.

Component: pkgctl version upgrade
2024-04-23 20:23:42 +02:00
Vekhir --
ccee85b2ab fix: conflicting packages when using -I
Originally fixed in b7893a2ca8, that approach created another bug when packages have several providers. In that case, pacman expects a number, so "yes" is not a valid answer, leading to an infinite loop.

Using the undocumented, but stable option "--ask=4" allows to selectively change the default answer for conflicts, therefore properly fixing the underlying issue.
See also: https://gitlab.archlinux.org/pacman/pacman/-/issues/60
Fixes #163

Component: makechrootpkg
2024-04-16 23:50:12 +02:00
Levente Polyak
05bea3e922 test: add basic bats setup and test cases for version setup
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-03-23 23:57:46 +01:00
Levente Polyak
de0ea3b2f8 fix(version): do not prompt for input on terminal during check
In certain scenarios, like when an URL is checked that asks for
credentials or other kind of input, the process blocks and waits for
stdin input. This isn't particularly useful during scripted execution
and in our cases also just an indicator for like a none existing GitHub
repository.

To avoid this situation, disable git terminal prompts.

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-03-23 23:57:45 +01:00
Jelle van der Waa
81f5e7b3b3 feat(version): add command to automatically detect and setup nvchecker
Introduce a new version subcommand `setup` which does a best effort to
generate the most minimal required .nvchecker.toml file for specific
sources.

It supports a wide range of common sources like:
- Git, GitHub, GitLab, Hackage, NPM, PyPI, RubyGems, CPAN, crates.io

The creation logic is based on matching a domain for a source which is
something predictable and then simply passes an array of the url parts
for every source creator to extract the useful bits out of the url
array.

Component: pkgctl version setup
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Jelle van der Waa <jelle@archlinux.org>
2024-03-23 23:57:45 +01:00
Levente Polyak
01b6b0849e doc(man): fix cut off page names by switching to modern asciidoctor
Asciidoc is the old reference implementation in Python, which has some
shortcoming. Specifically we are hitting cut off page names for long
subcommands. Fix this by switching to a more modern implementation named
asciidoctor.

During the migration, get rid of the explicit asciidoc.conf file that
was required to define a linkman macro, which is now supported out of
the box.

Fixes #170

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-03-09 02:48:14 +01:00
Caleb Maclennan
7033554e45 fix(drop-from-repo): avoid Git trying to push tags to the AUR
If users have enabled push.followTags in their Git config then dropping
packages to the AUR spews errors because all the release tags from
official repos are rejected by AUR repos.
2024-03-09 01:33:56 +01:00
Morten Linderud
40f476c649 fix(pkgctl): skip path arguments that are not directories
Several subcommands accept multiple paths in a way that passing a
wildcard is an expected use case. Previously this wasn't possible if the
main directory contained any text files or scripts.
Fix this by skipping none directory paths for such commands.

Component: pkgctl
Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2024-03-09 00:49:24 +01:00
Levente Polyak
509dd24bdc fix(completion): allow multi opts more than once in zsh
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-29 23:35:29 +01:00
Frederik “Freso” S. Olesen
7a9ef3bc57 feat(makepkg.conf): Add no-omit-frame-pointer flags by default
RFC-26 proposes to add -fno-omit-frame-pointer and
-mno-omit-leaf-frame-pointer to the default compilation flags
to improve the effectiveness of profiling and debugging tools.

See https://rfc.archlinux.page/0026-fno-omit-frame-pointer/
2024-02-29 21:39:22 +01:00
Levente Polyak
354c9dcd12 fix(drop-from-repo): avoid error when updating remote head
We can only update the local ref to the remote head from main to master
once we have actually pushed the master branch to the remote. If we do
this too early, the call will simply error out.

Instead, only update the local head for the configured remote after we
have successfully renamed the branch and pushed it to the AUR.

Fixes #212

Component: pkgctl aur drop-from-repo
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-29 21:20:31 +01:00
Orhun Parmaksız
39eaeaa4b2 feat(offload-build): use rsync instead of scp
This commit simply replaces the usage of `scp` with `rsync`
for faster file transfer.

Signed-off-by: Orhun Parmaksız <orhunparmaksiz@gmail.com>
2024-02-15 22:23:54 +01:00
kpcyrd
c79a993148 feat(makepkg.conf): Increase _FORTIFY_SOURCE level to 3
RFC: https://rfc.archlinux.page/0017-increase-fortification-level/
2024-02-14 02:08:01 +01:00
Levente Polyak
6d0ac6b9a8 chore(release): version v1.1.1 2024-02-14 01:40:16 +01:00
Levente Polyak
66a4357f3e fix(common): ensure TERM is always set with a fallback to dumb
This avoids some corner cases that some applications behave ill when
TERM is completely unset. Instead, ensure we set TERM to dumb as a
fallback, which should serve better than not having any term defined.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-14 01:28:40 +01:00
Christian Heusel
db2f82bf19 feat(offload-build): preserve the TERM variable
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-02-14 01:28:34 +01:00
Christian Heusel
e0a84aefc3 fix(common): check before using tput with a fallback for colors
The latest release of devtools has included some pretty printing
capabilities and fancy terminal stuff with the spinner and so on.

It seems like the existing safeguards to disable this for incapable
terminals were not enough though, therefore we saw two types of errors:

- offload-build:
  ```
  ==> Building in chroot for [extra] (x86_64)...
  tput: unknown terminal "unknown"
  tput: unknown terminal "unknown"
  tput: unknown terminal "unknown"
  ```
- repro builders:
  ```
  ==> Successfully switched <package> to version <version>
  tput: No value for $TERM and no -T specified
  ERROR: Failed checkout <package>
  ```

The recently included fail option made this error populate to the
command level and therefore increased its impact from a not so nice
logging message to a more severe problem which made the command abort.

We fix this by checking if tput is supported or else use the raw escape
sequences instead of tput commands.

Fixes: fedfc80 ("feat(term): add terminal utils to handle a dynamic spinner")
Fixes: 66e83c9 ("feat(version): pretty print and group together version check results")
Fixes: d0dc0e1 ("feat(search): add optional plain output formatting")
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-02-14 01:21:28 +01:00
Jakub Klinkovský
98bd7e3760 fix(build): explicitly add --nosign when building a srcpkg
We should explicitly instruct makepkg to not sign the source package,
even when the BUILDENV array in makepkg.conf contains 'sign'. The
devtools workflow is to always sign separately from building, which is
different from makepkg and it should not depend on its configuration.

Furthermore, this function is currently used only in offload-build to
collect sources that are transferred to the server before the build
itself. Signing this source package does not provide any benefits.
2024-02-11 13:37:49 +01:00
Christian Heusel
3e79cb8f4a doc: add pacman-contrib to optdeps in the README
We are depending on updpkgsums for the --update-checksums option used in
pkgctl build. Document this requirement.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-02-10 20:13:15 +01:00
Levente Polyak
1cf402eae9 fix(build): forward target repo options to the release subcommand
The adequate target repo options are not appropriately forwarded to the
release subcommand if the auto-release options is activated. Previously
we did not restrict the --repo option, which the build option has used
as a shortcut. Since last release, this option is restricted to new
packages that are not in any official repository yet.

Fix this issue by forwarding the same target repo options that have been
used during the build command and not forcefully the --repo options.

Fixes #209

Component: pkgctl build
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-09 20:18:30 +01:00
Levente Polyak
0469d3c902 fix(build): avoid trying to download none existing debug packages
Since last release, offload building now has proper error handling
enabled. This unfortunately lead to a regression for packages, like any
packages, where makepkg claims debug packages are available during
--packagelist while none were actually built. This leads to the scp
command failing when trying to download the none existing packages
which ultimately leads to a termination of the build script.

Fix this by filtering out package files that do not exist before trying
to download them.

Fixes #208

Component: pkgctl build
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-08 22:08:54 +01:00
Christian Heusel
f6b1b1ba45 doc: add curl to the dependencies in the README
We use curl all over pkgctl, i.e. to do the Gitlab API calls.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-02-08 02:01:55 +01:00
Christian Heusel
36ece44b12 chore(release): version v1.1.0 2024-02-08 01:31:00 +01:00
Levente Polyak
fc05ea19d9 fix(build): allow unstable repositories to override repo target
This works around the fact that we are currently not auto detecting
unstable repository targets while providing a stability layer option on
the subcommand. Soften the --repo option rules by allowing unstable
repositories to use that flag for building and releasing against the
unstable repositories.

This will be replaced in the near future by proper integration of target
repository auto-detection that in aware of unstable repositories while
providing a unstable stability layer options.

Component: pkgctl build
Component: pkgctl release
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-08 01:21:40 +01:00
Levente Polyak
3ecba314fc feat(build): consolidate repo flags in build and release subcommand
Previously the behavior was inconsistent and not fully fulfilling its
purpose of only using --repo once when initially pushing a new and
unknown package to the official repositories.

Consolidate the behavior by only allowing to use --repo during the
initial packaging and disallow any subsequent usage. The expected user
experience is to subsequently use --testing or --staging to influence
the auto-detection of the build target. This avoids any kind of human
error which leads to releasing core packages to extra-testing by
accident.

Furthermore, allow the build subcommand to automatically fallback to
extra as the default stable repository target which greatly improves the
usability for AUR or local override builds.

Fixes #193
Fixes #191

Component: pkgctl build
Component: pkgctl release
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-08 00:52:20 +01:00
Christian Heusel
5042dcaeb4 feat(build): allow to test-install the built packages
This change introduces the new --install-to-host flag to pkgctl build,
which can be used with one of the modes 'all' or 'auto'. Depending on
the mode either all or just already installed packages are installed to
the host system.

BREAKING CHANGE: the --install flag is renamed to --install-to-chroot
to avoid confusion with the newly introduced flag.

Component: pkgctl build
Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-06 19:38:50 +01:00
Levente Polyak
67fdb58758 feat(search): add status spinner to long running GitLab calls
This helps people to be slightly more patient as the progress status
update includes the current percentage.

Component: pkgctl search
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-02-06 17:37:17 +01:00
Carl Smedstad
eabb1a9313 fix(doc): Correct typo in version check error message
Change 'none pkgbase' to 'non-pkgbase' as the sentence refers sections
that are not the pkgbase section, rather than an empty pkgbase section
or something of that sort that could be misconstrued by using the word
'none'.

Component: pkgctl version check
2024-02-05 12:25:18 +01:00
Carl Smedstad
a7a2f25fb0 fix(version): Handle pkgbase with '.' correctly
For pkgbases with '.' in the name, the TOML-section must be wrapped in
double quotes in order for it not to be parsed as a supersection and a
subsection. This case was not properly handled by checks for if the
TOML-file contains a pkgbase section, and for if the TOML-file contains
superfluous sections. Address this by handling optional double quotes in
the greps related to said checks.

This was discovered in the AUR package ruby-cool.io and the issue can be
reproduced with the following minimal PKGBUILD and .nvchecker.toml file:

    $ cat PKGBUILD
    pkgname=ruby-cool.io
    pkgver=1.8.0
    $ cat .nvchecker.toml
    ["ruby-cool.io"]
    source = "gems"
    gems = "cool.io"

Before the fix:

    $ pkgctl version check
    Failure
     x ruby-cool.io: missing pkgbase section in .nvchecker.toml: ruby-cool.io

After the fix:

    $ pkgctl version check
    GEN lib/version/check.sh
    Out-of-date
     ✓ ruby-cool.io: current version 1.8.0 is latest

Component: pkgctl version check
2024-02-05 12:25:18 +01:00
Jelle van der Waa
800cf9b56b fix(version): fix typo never should be newer
Component: pkgctl version check
Component: pkgctl version update
2024-02-05 11:54:55 +01:00
Levente Polyak
4d72f4560c doc(version): extensively revamp documentation for version subcommands
Enhanced and overhauled the documentation for the 'version' subcommand.
The improvements include comprehensive details on the subcommand's
behavior, usage, and a variety of scenarios it handles.

Added a central section within the pkgctl-version manpage that documents
the nvchecker configuration and rules.

Component: pkgctl version
Singled-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-22 19:45:16 +01:00
Levente Polyak
e3edf25554 feat(version): use exit code for check to indicate out-of-date versions
It can be handy to have an exit code that allows better status
indication or chaining.

On exit, return one of the following codes:

- 0: Normal exit condition, all checked versions are up-to-date
- 1: Unknown cause of failure
- 2: Normal exit condition, but there are out-of-date versions
- 3: Failed to run some version checks

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-22 19:45:10 +01:00
Levente Polyak
b258bb3b7c feat(version): add verbose option to display up-to-date versions
Sometimes it can be desired to get a results for each entry even if the
current version is up-to-date. Add a --verbose option to print this
optional detail.

Component: pkgctl version check
Component: pkgctl version upgrade
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-22 19:45:04 +01:00
Levente Polyak
08ece1640b feat(version): add spinner while checking upstream versions
It may take quite some time to check a lot of upstream versions.
However, we still want to nicely group the results together. To avoid
just showing a static status message it makes much more sense to show a
dynamic spinner with a summary of the progress.

Component: pkgctl version check
Component: pkgctl version upgrade
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-22 19:44:57 +01:00
Levente Polyak
fedfc80ca1 feat(term): add terminal utils to handle a dynamic spinner
The spinner uses a status file that can be used to dynamically update
the message. The spinner itself buffers the output in a frame buffer
variable before flushing a frame in one go.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-22 19:44:51 +01:00
Levente Polyak
66e83c950c feat(version): pretty print and group together version check results
Collect all check results in arrays and pretty print the results after
grouping them together based on out-of-date, up-to-date and failures.
Print a summary that shows a brief statistic about the results when
processing multiple check items.

Component: pkgctl version check
Component: pkgctl version upgrade
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-21 23:28:29 +01:00
Levente Polyak
96f39525bf feat(version): support nvchecker keyfile from user config home
This adds support for global keyfile from the user config home
XDG_CONFIG_HOME which allows to set tokens for GitHub and GitLab for
certain nvchecker configuration.

When ~/.config/nvchecker/keyfile.toml exists, it will automatically be
appended as keyfile of the local .nvchecker.toml file.

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-21 23:28:29 +01:00
Levente Polyak
03d5c928cf fix(version): add error handling to version check subcommand
Add defensive programming to the execution chain of the version check
subcommand for graceful error handling of subprocesses as well as errors
returned from nvchecker itself indicated in the returned JSON.

Furthermore this fixes a bug when processing multiple packages where the
pkgbase variable is stuck for subsequent packages that do not declare a
pkgbase variable itself.

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-21 23:28:29 +01:00
Christian Heusel
6054c869e1 feat(upgrade): introduce the version upgrade subcommand
This subcommand applies the detected upstream version upgrades to a
PKGBUILD.

Component: pkgctl version upgrade
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-01-21 23:28:29 +01:00
Christian Heusel
313c5b4d32 chore(check): factor out function to get upstream version
Component: pkgctl version check
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-01-21 23:28:28 +01:00
Christian Heusel
db8c157eea chore(build): factor out functions to modify PKGBUILDs
Component: pkgctl build
Signed-off-by: Christian Heusel <christian@heusel.eu>
2024-01-21 23:28:28 +01:00
Levente Polyak
343a2b5d4c chore(search): correct typo in optional dependency bat 2024-01-18 19:38:42 +01:00
Levente Polyak
7a8f0eb47e fix(doc): correct typo in optional dependency bat
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-18 03:02:18 +01:00
Jelle van der Waa
e6f7aa395f feat(version): introduce version check subcommand
The version subcommand handles pkgver related commands, the first
subcommand being `check`. Check runs nvchecker if a `.nvchecker.toml`
file exists and compares the current pkgver with the latest release.

Introduces nvchecker as optional dependency which has to be installed in
order to use this particular subcommand.

BREAKING CHANGE: formerly pkgctl version would output the version of the
pkgctl tool, now it is used as a version related subcommand.

Fixes #140

Component: pkgctl version
Component: pkgctl version check
Co-authored-by: Christian Heusel <christian@heusel.eu>
2024-01-10 19:44:15 +01:00
Levente Polyak
e413b65df3 fix(build): re-source the PKGBUILD to update changed values
During certain operations like --edit, --pkgver etc the PKGBUILD
may change since last sourced. If a modified checksum of the PKGBUILD
is detected, re-source it before processing.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-10 00:14:20 +01:00
Levente Polyak
ef04960b98 feat(build): update srcinfo file after build
The srcinfo file is essentially a representation of the current build
recipes, hence generate an up to date version by adding it as secondary
build artifact to the build process.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-10 00:14:14 +01:00
Levente Polyak
d210079037 feat(util): add library function to generate source packages 2024-01-10 00:14:08 +01:00
Levente Polyak
b264c7f1c7 feat(util): parallelize srcinfo generation
Heavily improve the runtime of huge split packages, by creating an own
parallelized high level implementation of the makepkg low level building
blocks for srcinfo generation.

This reduces the runtine to generate the srcinfo file for thunderbird
from 24 seconds down to 1 second.
2024-01-10 00:14:01 +01:00
Christian Heusel
2b8033b911 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>
2024-01-09 23:47:45 +01:00
Levente Polyak
8f45c65830 fix(completion): support subcommands that have multiple dashes
Dashes are not supported in function names and underscores were not
automatically translated. Replace all dashes of the current completion
token, if it is an arg which allows subcommands to use underscores
instead of dashes to declare their completion handlers.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-07 19:32:30 +01:00
Levente Polyak
d0dc0e1a32 feat(search): add optional plain output formatting
This allows to run the search command without bats, which is not used in
the default pretty output format.

Component: pkgctl search
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-07 02:38:42 +01:00
Levente Polyak
0e538cf498 fix(util): open lock file in append mode to avoid overwriting files
Previously if we opened a lock on an existing file with useful content
we overwrote it with an empty file. This is obviously not desired, hence
open the file handle in append mode preserving its content.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-07 02:38:34 +01:00
Jelle van der Waa
4673ad6c89 feat(search): add subcommand to search across the packaging group
Search for an expression across the GitLab packaging group. To use a
filter, include it in your query. You may use wildcards (*) to use glob
matching. Available filters for the blobs scope: path, extension.

Every usage of the search command must be authenticated. Consult the
'pkgctl auth' command to authenticate with GitLab or view the
authentication status.

This command uses bats for pretty printing the results including line
numbers and syntax highlighting.

Component: pkgctl search
Co-authored-by: Christian Heusel <christian@heusel.eu>
Co-authored-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-07 02:35:18 +01:00
Levente Polyak
78dd150996 chore(offload-build): deprecate in favor of pkgctl build --offload
Emit a warning when offload-build is invoked to warn about future
removal.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-05 01:07:39 +01:00
Levente Polyak
4425913e4f chore(build): use more intuitive update-checksums option for humans
The philosophy of our CLI is to provide options that better match human
expectations in an intuitive way rather than mimic wording of previous
tools with abbreviation.

Component: pkgctl build
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2024-01-05 01:01:52 +01:00
Levente Polyak
2a1e8aebaf chore(make): suppress output when copying git hooks directory 2023-12-19 20:27:01 +01:00
Levente Polyak
3933f20001 fix(cliff): trim fix separator before checking merge request id
The fix separator contains a whitespace, which made the check never
match. We now trim the separator before checking, making it resilient
against any kind of spaces.

Fixes b7984c6073
2023-12-19 20:06:26 +01:00
Levente Polyak
0f14d630bc feat(cliff): add label for breaking changes to changelog 2023-12-19 20:06:26 +01:00
Levente Polyak
d00a2b9890 feat(configure): ship default ignore via exclude
BREAKING CHANGE: Increments the repo spec version which requires to
reconfigure all existing packaging repo clones.

Fixes #129

Component: pkgctl repo configure
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-12-19 20:06:26 +01:00
Christian Heusel
c2d73d73ae fix(commitpkg): prefer core.editor over $EDITOR and $VISUAL
This is done to closer mimick the behaviour of git here, as it prefers
core.editor setting over the other editor options as per git-var(1):

> The order of preference is the $GIT_EDITOR environment variable, then
> core.editor configuration, then $VISUAL, then $EDITOR, and then the
> default chosen at compile time, which is usually vi.

Fixes #192
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-12-03 22:02:13 +01:00
Levente Polyak
f2cafa3cb0 feat(clone): speedup maintainer and universe clone query
There is a single endpoint now to list all pkgbases and their current
maintainers. Use this endpoint for speeding up the clone of all packages
of a maintainer by only issuing a single API call.

Component: pkgctl repo clone
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-12-03 21:51:59 +01:00
Jan Alexander Steffens (heftig)
c356995dc1 feat(config): Add -z pack-relative-relocs to LDFLAGS
This moves relative relocations from the `.rela.dyn` section into a new
`.relr.dyn` section with a significantly more compact encoding,
supported since glibc 2.36, GNU Binutils 2.38 and LLVM 15.

This can reduce the size of libraries a lot, e.g. the installed size of
`libphonenumber` dropped from about 17 MB to 7 MB.

For more info, see
https://gitlab.archlinux.org/archlinux/rfcs/-/merge_requests/23.

Signed-off-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
2023-12-03 20:11:24 +01:00
Jan Alexander Steffens (heftig)
1535a69af6 chore(config): Use one -Wl in LDFLAGS per logical flag
This will separate logical flags with whitespace and make it easier to
split the flags across multiple lines.

Signed-off-by: Jan Alexander Steffens (heftig) <heftig@archlinux.org>
2023-12-03 20:11:21 +01:00
Christian Heusel
9a356eae82 feat(web): implement option to print the URL instead of opening it
In certain situations, users may encounter limitations when unable to
utilize xdg-open (e.g., when connected to an Arch machine via SSH).
Consequently, this commit introduces the option to simply print the
repository link to copy or click on it.

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-11-26 18:23:17 +01:00
kpcyrd
ae14c246b8 feat(makerepropkg): Add option to skip running check for speedup
Add -n to allow running makepkg with --nocheck. This is useful to reduce
the time required to reproduce a package, as they should not depend on
running the check function for being reproducible.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-11-26 16:48:15 +01:00
Levente Polyak
cc369e86d2 feat(makechrootpkg): add option to interactively inspect the chroot
Implement the -x option for makechrootpkg which allows to get an
interactive shell in the chroot after building the package. Useful to
ease the debugging of a package build.

Depending on the argument, the interactive shell is either always
spawned or only when an error occurred during build.

This option is also forwarded from `pkgctl build` via the `--inspect`
flag.

Component: pkgctl build
Component: makechrootpkg
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-11-26 01:28:20 +01:00
David Runge
c9de6a18b9 fix(make): Specify GITLAB_HOST for glab to avoid default host confusion
Specify the upstream instance hostname for glab using the `GITLAB_HOST`
environment variable.
Without it `glab` will use whatever is set as host using the `host`
key in its configuration and silently break the links of all uploaded
assets.

Signed-off-by: David Runge <dvzrv@archlinux.org>
2023-11-24 22:27:14 +01:00
Christian Heusel
9f8ca5df1a chore(release): nicely format multiple "Component:" trailers
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-11-24 02:32:02 +01:00
Christian Heusel
7825f9fb02 chore(docs): correct the manpage for pkgctl db update
Turns out the manpages of pkgctl db update and pkgctl db move were just switched without having the page title adjusted.
Fixing the initial error therefore turned out to create the same problem for the manpage of pkgctl db update, which this commit re-fixes.

Fixes: 5e3ab4b321 ("chore(docs): correct the manpage for pkgctl db move")
Fixes: f834fc4700 ("db: command for Pacman database modification like update, move etc")
Fixes #195
Component: pkgctl db update
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-11-24 02:17:10 +01:00
Christian Heusel
b7984c6073 chore(release): allow fixes tags without cluttering the changelog
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-11-20 15:10:48 +01:00
Christian Heusel
5e3ab4b321 chore(docs): correct the manpage for pkgctl db move
So far the manpage for pkgctl db move seemed to be a copy of the pkgctl db update manpage
which caused an error upon install as the move page was not created.
Instead compiling this manpage overwrote the one for pkgctl db update
which this commit fixes.

Fixes: f834fc4700 ("db: command for Pacman database modification like update, move etc")
Fixes #195
Component: pkgctl db move
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-11-20 15:10:41 +01:00
Christian Heusel
e7b82f36ef feat(build): add --updpkgsums option
This is useful so people who update patches etc. can update their checksums on building.
The functionality itself was already implemented for --pkgver, but was not available separately.

Fixes #168
Component: pkgctl build
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-11-20 15:00:21 +01:00
Orhun Parmaksız
4d7364ed1b fix(cliff): update the tag_pattern to use regex 2023-10-31 16:55:14 +01:00
Levente Polyak
e0ab20d05c fix(build): use correct variable to reference available architectures
The referenced places were missing in a previous refactoring commit and
hence broke the build command in multiple ways.

Fixes 0669315821
2023-10-17 23:23:36 +02:00
Antonio Rojas
5cbe9ad612 fix(build): allow using --install and --offload simultaneously
Don't take the full (local) path of the package to install when using
--offload.

Fixes #194
Component: pkgctl build
2023-10-14 00:00:52 +02:00
Christian Heusel
6f106e7cd6 chore: refactor loop variable name
Component: pkgctl build
Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-10-02 11:37:06 +02:00
Christian Heusel
0669315821 chore: refactor variable names in valid-{tags,repos}.sh
Even though the variables in these files are globablly used they have a weirdly local sounding name.
This commit fixes this by refactoring all usages throughout our codebase.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-10-02 11:29:03 +02:00
Levente Polyak
a6d43aca01 chore(release): streamline release make target with git-cliff and glab
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-27 01:12:53 +02:00
Levente Polyak
02bc8bfbc0 chore(release): version v1.0.4 2023-09-27 00:38:17 +02:00
Levente Polyak
f632659563 fix(clone): ssh connection may require user input (key unlocking etc)
Anything that requires user input (such as a key unlock or hostkey
verify) will block the terminal and wait for input which will never
come.

When cloning or configuring a repo via ssh we therefore initially
connect to gitlab to warm the connection.

Afterwards users are expected to either have setup a ssh ControlMaster
or use something like a ssh agent.

Fixes #148

Component: pkgctl repo clone/configure

Co-Authored-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-26 22:44:58 +02:00
Christian Heusel
7e41adf00b chore: add a config file for git cliff
This is done so that the generated changelog carries more information
(i.e. the scope of the change).

Co-Authored-by: Levente Polyak <anthraxx@archlinux.org>
Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-26 21:13:08 +02:00
Levente Polyak
a316b50f88 fix(makepkg.conf): use breezy for the bzr protocol in makepkg.conf
Pacman does not resolve provides for the protocol packages, hence we
need to switch to the new package name for bzr.

Related-to: https://gitlab.archlinux.org/pacman/pacman/-/merge_requests/78
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-19 01:32:22 +02:00
Levente Polyak
547961681a fix(pkgctl): avoid pacman db dependency checks during repo detection
By default the sync operation enables dependency checks during the
preparation of the transaction. This isn't necessary for the print
option, but is done nevertheless, which leads to issues for example
during soname dependency problems. The result is a none functional
automatic repo detection.

Fix this by explicitly disabling dependency version checks. We specify
this option twice to skip all dependency checks.

Fixes #189

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-10 00:03:42 +02:00
Jelle van der Waa
8190a22480 feat(release): always generate a .SRCINFO file on release
When releasing a package always generate a .SRCINFO file so we can build
tooling based upon these files instead of having to parse bash in a
non-bash language.

Some tests have shown around 30 seconds or generating the metadata on
packages like thunderbird. The implementation in makepkg becomes semi
slow for some split packages that provide a huge number of individual
packages, but it seems reasonably fast so we can instead have a uniform
state of always providing .SRCINFO files.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-09-04 23:41:00 +02:00
Christian Heusel
f31ea3a48e fix(build): fix repo detection for special chars in package name
Currently we used grep -E, in a way that special characters in the
package name such as the '+' in 'ls++' also became part of the regex.

This commit switches this to become a literal string matching using awk.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-08-27 17:08:23 +02:00
Christian Heusel
9f7808c26e fix(build): installing packages into the chroot fails for relative links
As the relative links are relative to the pkgctl invocations PWD and not
necessarily relative to the location where makechrootpkg is invoked from
this fails unexpectedly.

This commit fixes this by just using the full path when passing the
location to makechrootpkg.

Fixes https://gitlab.archlinux.org/archlinux/devtools/-/issues/181

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-08-27 16:55:50 +02:00
Jan Alexander Steffens (heftig)
5f4fd52e38 feat(arch-nspawn): Use a unique scope name instead of --keep-unit
`--keep-unit` is really only for use in services like
`systemd-nspawn@.service`.

The parameter was added in commit 000ea6c7bb because
systemd-nspawn defaults the name of the machine (and thus the generated
scope) to the name of the working directory, which is not unique. Thus
spawning a container from `archbuild/extra-x86_64/foo` while
`archbuild/testing-x86_64/foo` is already running would fail.

We can avoid the unit conflict by giving the container a unique machine
name. Creating a scope also allows us to place the container in a slice
hierarchy for resource control.
2023-07-21 19:41:22 +02:00
Jan Alexander Steffens (heftig)
1b25190176 chore(arch-nspawn): Simplify args construction for systemd-nspawn 2023-07-21 19:41:22 +02:00
Christian Heusel
030e6af880 chore: fix spelling mistake packge -> package
it seems like the mistake was copied to a few locations, this commit
fixes it.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-07-06 15:30:49 +02:00
Levente Polyak
662d6c5274 fix(make): use correct version variable for release target 2023-07-05 18:45:54 +02:00
Jan Alexander Steffens (heftig)
058e68a7b5 diffpkg: Skip packages that fail to fetch
New (split) packages won't exist in the repos. If we fail to fetch a
package, don't die but complain and proceed with the next pkgname.
2023-05-21 16:50:49 +02:00
204 changed files with 10028 additions and 449 deletions

15
.editorconfig Normal file
View File

@@ -0,0 +1,15 @@
# EditorConfig configuration for devtools
# https://editorconfig.org
# Top-most EditorConfig file
root = true
# Unix-style newlines without trailing whitespaces, but with a newline
# ending every file, utf-8 charset, set indent to tabs
[*]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
indent_style = tab
tab_width = 4

View File

@@ -8,14 +8,37 @@ build:
stage: build
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoc
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoctor
- make PREFIX=/usr
- make PREFIX=/usr DESTDIR=build install
check:
lint:
stage: test
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoc shellcheck
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils asciidoctor shellcheck
- make check || true
- SHELLCHECK_OPTS="-S error" make check
test:
stage: test
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats
- make test BATS_EXTRA_ARGS='--formatter junit'
artifacts:
reports:
junit: build/coverage/bats-report.xml
coverage:
stage: test
needs: []
script:
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats kcov jq
- make coverage
coverage: '/Percent covered\s+\d+\.\d+/'
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: build/coverage/bats.*/cobertura.xml

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash
SHELL=/bin/bash -o pipefail
V=1.0.3
V=1.4.0
BUILDTOOLVER ?= $(V)
PREFIX = /usr/local
@@ -16,8 +16,10 @@ LIBRARY_SRC = $(call rwildcard,src/lib,*.sh)
LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC))))
MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*)
GIT_CONFIGS = $(wildcard config/git/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
MANS = $(addprefix $(BUILDDIR)/,$(patsubst %.asciidoc,%,$(wildcard doc/man/*.asciidoc)))
DATA_FILES = $(wildcard data/*)
COMMITPKG_LINKS = \
core-testingpkg \
@@ -51,7 +53,14 @@ ARCHBUILD_LINKS = \
COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
all: binprogs library conf completion man
CASES ?= test/case
JOBS ?= $(shell nproc)
BATS_EXTRA_ARGS ?=
BATS_ARGS ?= --jobs $(JOBS) $(BATS_EXTRA_ARGS) --verbose-run
COVERAGE_DIR ?= $(BUILDDIR)/coverage
all: binprogs library conf completion man data
binprogs: $(BINPROGS)
library: $(LIBRARY)
completion: $(COMPLETIONS)
@@ -91,15 +100,22 @@ $(eval $(call buildInScript,build/bin,src/,.in,755))
$(eval $(call buildInScript,build/lib,src/lib/,,644))
$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
$(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/asciidoc.conf doc/man/include/footer.asciidoc
$(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/man/include/footer.asciidoc
$(GEN_MSG)
@mkdir -p $(BUILDDIR)/doc/man
@a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $<
@asciidoctor --backend=manpage --destination-dir=$(BUILDDIR)/doc/man --attribute pkgdatadir=$(DATADIR) $<
conf:
@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/pacman.conf.d
@cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@install -d $(BUILDDIR)/makepkg.conf.d
@cp -ra $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@install -d $(BUILDDIR)/pacman.conf.d
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
@install -d $(BUILDDIR)/git.conf.d
@cp -a $(GIT_CONFIGS) $(BUILDDIR)/git.conf.d
data:
@install -d $(BUILDDIR)/data
@cp -ra $(DATA_FILES) $(BUILDDIR)/data
clean:
rm -rf $(BUILDDIR)
@@ -111,8 +127,11 @@ install: all
install -dm0755 $(DESTDIR)$(DATADIR)/pacman.conf.d
install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin
install -dm0755 $(DESTDIR)$(DATADIR)/lib
install -dm0755 $(DESTDIR)$(DATADIR)/data
cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib
for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
cp -a $(BUILDDIR)/git.conf.d -t $(DESTDIR)$(DATADIR)
cp -ra $(BUILDDIR)/makepkg.conf.d -t $(DESTDIR)$(DATADIR)
cp -ra $(BUILDDIR)/data -t $(DESTDIR)$(DATADIR)
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
for l in ${COMMITPKG_LINKS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
@@ -129,7 +148,9 @@ uninstall:
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done
rm -rf $(DESTDIR)$(DATADIR)/lib
for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
rm -rf $(DESTDIR)$(DATADIR)/git.conf.d
rm -rf $(DESTDIR)$(DATADIR)/makepkg.conf.d
rm -rf $(DESTDIR)$(DATADIR)/data
for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done
for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
@@ -141,11 +162,11 @@ uninstall:
for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done;
rmdir --ignore-fail-on-non-empty \
$(DESTDIR)$(DATADIR)/setarch-aliases.d \
$(DESTDIR)$(DATADIR)/makepkg.conf.d \
$(DESTDIR)$(DATADIR)/pacman.conf.d \
$(DESTDIR)$(DATADIR)
tag:
git cliff --strip=all --unreleased
@echo "current version: v$(V)"
@read -r -p "tag version: v" VERSION && \
sed -E "s|^V=.+|V=$$VERSION|" -i Makefile && \
@@ -153,14 +174,25 @@ tag:
git tag --sign --message "Version v$$VERSION" v$$VERSION
release: dist
glab release create v$(RELEASE) devtools-$(RELEASE).tar.gz*
git push --tags origin master
git cliff --version >/dev/null
GITLAB_HOST=gitlab.archlinux.org glab release create v$(V) devtools-$(V).tar.gz* --milestone v$(V) --notes-file <(git cliff --strip=all --latest)
dist:
git archive --format=tar --prefix=devtools-$(V)/ v$(V) | gzip > devtools-$(V).tar.gz
gpg --detach-sign --use-agent devtools-$(V).tar.gz
test: binprogs library conf completion man
@mkdir -p $(COVERAGE_DIR)
bats $(BATS_ARGS) $(CASES) | tee $(COVERAGE_DIR)/bats-report.xml
coverage: binprogs library conf completion man
kcov --include-path=src $(COVERAGE_DIR) bats $(BATS_ARGS) $(CASES)
jq -r '. | ["Percent covered", .percent_covered], ["Covered lines", .covered_lines], ["Total lines", .total_lines], ["Percent low", .percent_low], ["Percent high", .percent_high] | @tsv' \
$(COVERAGE_DIR)/bats.*/coverage.json
check: $(BINPROGS_SRC) $(LIBRARY_SRC) contrib/completion/bash/devtools.in config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
shellcheck $^
.PHONY: all binprogs library completion conf man clean install uninstall tag dist upload check
.PHONY: all binprogs library completion conf man data clean install uninstall tag dist upload test coverage check
.DELETE_ON_ERROR:

View File

@@ -23,6 +23,34 @@ will automatically build the project and proxy all calls to the local build dire
./test/bin/pkgctl --help
```
### Commit messages
All commits must follow [conventional commits](https://www.conventionalcommits.org).
The following groups are allowed:
- chore
- feat
- fix
- doc
- perf
- test
To override the scope for the changelog entry use the `Component:` trailer.
Example:
```
feat(db): yay mega cool feature
Very long and useful description.
Fixes #1
Fixes #2
Component: pkgctl db remove
```
## Releasing
1. bump the version in the Makefile
@@ -41,10 +69,14 @@ will automatically build the project and proxy all calls to the local build dire
- bash
- binutils
- coreutils
- curl
- diffutils
- expac
- fakeroot
- findutils
- glow
- grep
- gum
- jq
- ncurses
- openssh
@@ -58,11 +90,18 @@ will automatically build the project and proxy all calls to the local build dire
- mercurial
- subversion
### Optional Dependencies
- bat (pretty printing)
- nvchecker (version checking)
- reuse (license compliance)
### Development Dependencies
- asciidoc
- asciidoctor
- make
- shellcheck
- bats
## License

45
cliff.toml Normal file
View File

@@ -0,0 +1,45 @@
[changelog]
header = "# Changelog\n\n"
body = """
{%- if version -%}
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{%- else -%}
## [unreleased]
{%- endif %}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits | sort(attribute="message") %}
- {% set component = commit.footers | filter(attribute="token", value="Component") | map(attribute="value") | join(sep=", ") %}
{%- if component %}{{ component }}: {% elif commit.scope %}{{ commit.scope }}: {% endif %}
{{- commit.message | upper_first }}
{%- if commit.breaking %} (breaking){% endif %}
{%- set fixes = commit.footers | filter(attribute="token", value="Fixes") %}
{%- for fix in fixes %}{% if fix.separator|trim == '#' %}{{ fix.separator }}{{ fix.value }}{% endif %}{% endfor %}
{%- endfor %}
{% endfor %}
"""
footer = ""
# remove the leading and trailing whitespaces from the template
trim = true
[git]
# allow only conventional commits
# https://www.conventionalcommits.org
conventional_commits = true
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^chore\\(release\\): version", skip = true},
{ message = "^feat", group = "Features"},
{ message = "^fix", group = "Bug Fixes"},
{ message = "^doc", group = "Documentation"},
{ message = "^perf", group = "Performance"},
{ message = "^test", group = "Testing"},
{ message = "^chore", group = "Miscellaneous Tasks"},
{ body = ".*security", group = "Security"},
]
# filter out the commits that are not matched by commit parsers
filter_commits = false
# regex for matching git tags
tag_pattern = "^v[0-9]+\\.[0-9]+\\.[0-9]+.*"

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1 @@
#!/bin/sh

View File

@@ -0,0 +1,29 @@
/pkg
/src
/*/
!/keys/
!/LICENSES/
/*.log
/*.tar.*
/*.tar
/*.tgz
/*.zst
/*.gz
/*.xz
/*.bz2
/*.zip
/*.xpi
/*.jar
/*.whl
/*.war
/*.deb
/*.ttf
/*.dat
/*.iso
/*.asc
/*.sig
/*.signature
/*.sign
/*.SHA256SUMS
/*.sha256

View File

@@ -0,0 +1,22 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf.d/fortran.conf
#
#########################################################################
# FORTRAN LANGUAGE SUPPORT
#########################################################################
# Flags used for the Fortran compiler, similar in spirit to CFLAGS. Read
# linkman:gfortran[1] for more details on the available flags.
FFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt \
-Wp,-D_FORTIFY_SOURCE=3 -fstack-clash-protection -fcf-protection \
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
FCFLAGS="$FFLAGS"
# Additional compiler flags appended to `FFLAGS` and `FCFLAGS` for use in debugging. Usually
# this would include: ``-g''. Read linkman:gfortran[1] for more details on the wide
# variety of compiler flags available.
DEBUG_FFLAGS="-g"

View File

@@ -0,0 +1,19 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf.d/rust.conf
#
#########################################################################
# RUST LANGUAGE SUPPORT
#########################################################################
# Flags used for the Rust compiler, similar in spirit to CFLAGS. Read
# linkman:rustc[1] for more details on the available flags.
RUSTFLAGS="-C force-frame-pointers=yes"
# Additional compiler flags appended to `RUSTFLAGS` for use in debugging.
# Usually this would include: ``-C debuginfo=2''. Read linkman:rustc[1] for
# more details on the available flags.
DEBUG_RUSTFLAGS="-C debuginfo=2"

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
VCSCLIENTS=('bzr::breezy'
'fossil::fossil'
'git::git'
'hg::mercurial'
@@ -41,18 +41,18 @@ CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
#CPPFLAGS=""
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection"
-Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection \
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \
-Wl,-z,pack-relative-relocs"
LTOFLAGS="-flto=auto"
RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g"
DEBUG_CXXFLAGS="$DEBUG_CFLAGS"
DEBUG_RUSTFLAGS="-C debuginfo=2"
#########################################################################
# BUILD ENVIRONMENT
@@ -81,7 +81,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -93,6 +93,7 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- purge: Remove files specified by PURGE_TARGETS
#-- debug: Add debugging flags as specified in DEBUG_* variables
#-- lto: Add compile flags for building with link time optimization
#-- autodeps: Automatically add depends/provides
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge debug lto)
@@ -112,6 +113,8 @@ DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#-- Prefix and directories for library autodeps
LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32')
#########################################################################
# PACKAGE OUTPUT

View File

@@ -0,0 +1 @@
../conf.d/fortran.conf

View File

@@ -0,0 +1 @@
../conf.d/rust.conf

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
VCSCLIENTS=('bzr::breezy'
'fossil::fossil'
'git::git'
'hg::mercurial'
@@ -41,18 +41,18 @@ CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
#CPPFLAGS=""
CFLAGS="-march=x86-64-v3 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection"
-Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection \
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \
-Wl,-z,pack-relative-relocs"
LTOFLAGS="-flto=auto"
RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
#-- Debugging flags
DEBUG_CFLAGS="-g"
DEBUG_CXXFLAGS="$DEBUG_CFLAGS"
DEBUG_RUSTFLAGS="-C debuginfo=2"
#########################################################################
# BUILD ENVIRONMENT
@@ -81,7 +81,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto)
# Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -93,6 +93,7 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- purge: Remove files specified by PURGE_TARGETS
#-- debug: Add debugging flags as specified in DEBUG_* variables
#-- lto: Add compile flags for building with link time optimization
#-- autodeps: Automatically add depends/provides
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge debug lto)
@@ -112,6 +113,8 @@ DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#-- Prefix and directories for library autodeps
LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32')
#########################################################################
# PACKAGE OUTPUT

View File

@@ -0,0 +1 @@
../conf.d/fortran.conf

View File

@@ -0,0 +1 @@
../conf.d/rust.conf

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

View File

@@ -36,6 +36,8 @@ NoProgressBar
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.

114
config/pacman/universe.conf Normal file
View File

@@ -0,0 +1,114 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
[core-staging]
Include = /etc/pacman.d/mirrorlist
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
[multilib-staging]
Include = /etc/pacman.d/mirrorlist
[multilib-testing]
Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -0,0 +1,85 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
NoProgressBar
# We cannot check disk space from within a chroot environment
#CheckSpace
VerbosePkgLists
ParallelDownloads = 5
DownloadUser = alpm
#DisableSandbox
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Arch Linux
# packagers with `pacman-key --populate archlinux`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The testing repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -3,12 +3,21 @@
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-build-install.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-inspect.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
# shellcheck source=src/lib/valid-search.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh
# shellcheck source=src/lib/valid-version.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-version.sh
# shellcheck source=src/lib/valid-issue.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-issue.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
@@ -22,15 +31,19 @@ _makechrootpkg_args=(
-I
-l
-n
-t
-T
-U
-x
)
_makechrootpkg_args_d_opts() { _filedir -d; }
_makechrootpkg_args_D_opts() { _filedir -d; }
_makechrootpkg_args_r_opts() { _filedir -d; }
_makechrootpkg_args_I_opts() { _filedir '*.pkg.tar.*'; }
_makechrootpkg_args_l_opts() { _filedir -d; }
_makechrootpkg_args_t_opts() { _filedir -d; }
_makechrootpkg_args_U_opts() { :; }
_makechrootpkg_args_x_opts() { _devtools_completions_inspect; }
_makechrootpkg() { __devtools_complete _makechrootpkg; }
complete -F _makechrootpkg makechrootpkg
@@ -38,6 +51,7 @@ complete -F _makechrootpkg makechrootpkg
_makerepropkg_args=(
-h
-d
-n
-c
-M
)
@@ -53,12 +67,14 @@ _mkarchroot_args=(
-C
-M
-c
-f
-h
)
_mkarchroot_args_U_opts() { _filedir '*.pkg.tar.*'; }
_mkarchroot_args_C_opts() { _filedir '*.conf'; }
_mkarchroot_args_M_opts() { _filedir '*.conf'; }
_mkarchroot_args_c_opts() { _filedir -d; }
_mkarchroot_args_f_opts() { _filedir -d; }
_mkarchroot_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
@@ -119,7 +135,7 @@ _offload_build_args=(
)
_offload_build_args__repo_opts() { _devtools_completions_build_repo; }
_offload_build_args_r_opts() { _offload_build_args__repo_opts; }
_offload_build_args__arch_opts() { _devtools_completions_arch; }
_offload_build_args__arch_opts() { _devtools_completions_binary_arch; }
_offload_build_args_a_opts() { _offload_build_args__arch_opts; }
_offload_build_args__server_opts() { :; }
_offload_build_args_s_opts() { _offload_build_args__server_opts; }
@@ -128,12 +144,16 @@ complete -F _offload_build offload-build
_pkgctl_cmds=(
aur
auth
build
db
diff
issue
license
release
repo
search
version
)
_pkgctl_args=(
@@ -169,10 +189,14 @@ _pkgctl_build_args=(
-o --offload
-c --clean
-w --worker
--inspect
-I --install-to-chroot
-i --install-to-host
--pkgver
--pkgrel
--rebuild
--update-checksums
-e --edit
-r --release
@@ -181,15 +205,23 @@ _pkgctl_build_args=(
-h --help
)
_pkgctl_build_args__arch_opts() { _devtools_completions_arch; }
_pkgctl_build_args__arch_opts() { _devtools_completions_binary_arch; }
_pkgctl_build_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_build_args__worker_opts() { :; }
_pkgctl_build_args_w_opts() { _pkgctl_build_args__worker_opts; }
_pkgctl_build_args__inspect_opts() { _devtools_completions_inspect; }
_pkgctl_build_args__pkgver_opts() { :; }
_pkgctl_build_args__pkgrel_opts() { :; }
_pkgctl_build_args__install_to_host_opts() { _pkgctl_build_completions_install_mode; }
_pkgctl_build_args_i_opts() { _pkgctl_build_args__install_to_host_opts; }
_pkgctl_build_args__install_to_chroot_opts() { _makechrootpkg_args_I_opts; }
_pkgctl_build_args_I_opts() { _pkgctl_build_args__install_to_chroot_opts; }
_pkgctl_build_args__message_opts() { :; }
_pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; }
_pkgctl_build_opts() { _filedir -d; }
_pkgctl_build_completions_install_mode() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILD_INSTALL[*]}" -- "$cur")
}
_pkgctl_db_cmds=(
@@ -218,9 +250,13 @@ _pkgctl_db_move_opts() {
_pkgctl_db_remove_args=(
--partial
--noconfirm
-a --arch
-h --help
)
_pkgctl_db_remove_args__arch_opts() { _devtools_completions_binary_arch; }
_pkgctl_db_remove_args_a_opts() { _pkgctl_db_remove_args__arch_opts; }
_pkgctl_db_remove_opts() {
local subcommand args
subcommand=(db remove)
@@ -253,8 +289,20 @@ _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=(
clean
clone
configure
create
@@ -280,6 +328,12 @@ _pkgctl_repo_clone_args__jobs_opts() { :; }
_pkgctl_repo_clone_args_j_opts() { _pkgctl_repo_clone_args__jobs_opts; }
_pkgctl_repo_clone_opts() { _devtools_completions_all_packages; }
_pkgctl_repo_clean_args=(
-i --interactive
-n --dry-run
-h --help
)
_pkgctl_repo_clean_opts() { _filedir -d; }
_pkgctl_repo_configure_args=(
--protocol
@@ -297,7 +351,6 @@ _pkgctl_repo_create_args=(
-h --help
)
_pkgctl_repo_switch_args=(
--discard-changes
-f --force
@@ -315,13 +368,81 @@ _pkgctl_repo_switch_opts() {
fi
}
_pkgctl_license_cmds=(
check
setup
)
_pkgctl_license_check_args=(
-h --help
)
_pkgctl_license_check_opts() { _filedir -d; }
_pkgctl_license_setup_args=(
--no-check
-f --force
-h --help
)
_pkgctl_license_setup_opts() { _filedir -d; }
_pkgctl_version_cmds=(
check
setup
upgrade
)
_pkgctl_version_check_args=(
-v --verbose
-h --help
--json
-F --format
)
_pkgctl_version_check_opts() { _filedir -d; }
_pkgctl_version_check_args__format_opts() { _devtools_completions_version_output_format; }
_pkgctl_version_check_args_F_opts() { _devtools_completions_version_output_format; }
_pkgctl_version_setup_args=(
--prefer-platform-api
--url
--no-check
--no-upstream
-f --force
-h --help
)
_pkgctl_version_setup_opts() { _filedir -d; }
_pkgctl_version_setup_args__url_opts() { :; }
_pkgctl_version_upgrade_args=(
--no-update-checksums
-v --verbose
-h --help
)
_pkgctl_version_upgrade_opts() { _filedir -d; }
_pkgctl_repo_web_args=(
--print
-h --help
)
_pkgctl_repo_web_opts() { _filedir -d; }
_pkgctl_search_args=(
--no-default-filter
--json
-F --format
-N --no-line-number
-h --help
)
_pkgctl_search_opts() { :; }
_pkgctl_search_args__format_opts() { _devtools_completions_search_format; }
_pkgctl_search_args_F_opts() { _devtools_completions_search_format; }
_pkgctl_diff_args=(
-l --list
-d --diffoscope
@@ -345,6 +466,185 @@ _pkgctl_diff_args__pool_opts() { _filedir -d; }
_pkgctl_diff_args_P_opts() { _pkgctl_diff_args__pool_opts; }
_pkgctl_diff_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_cmds=(
close
comment
create
edit
list
move
reopen
view
)
_pkgctl_issue_args=(
-h --help
)
_pkgctl_issue_close_args=(
-p --package
-m --message
-e --edit
-r --resolution
-h --help
)
_pkgctl_issue_close_opts() { :; }
_pkgctl_issue_close_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_close_args_p_opts() { _pkgctl_issue_close_args__package_opts; }
_pkgctl_issue_close_args__message_opts() { :; }
_pkgctl_issue_close_args_m_opts() { _pkgctl_issue_close_args__message_opts; }
_pkgctl_issue_close_args__resolution_opts() { _devtools_completions_issue_resolution; }
_pkgctl_issue_close_args_r_opts() { _pkgctl_issue_close_args__resolution_opts; }
_pkgctl_issue_comment_args=(
-p --package
-m --message
-e --edit
-h --help
)
_pkgctl_issue_comment_opts() { :; }
_pkgctl_issue_comment_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_comment_args_p_opts() { _pkgctl_issue_comment_args__package_opts; }
_pkgctl_issue_comment_args__message_opts() { :; }
_pkgctl_issue_comment_args_m_opts() { _pkgctl_issue_comment_args__message_opts; }
_pkgctl_issue_create_args=(
-p --package
-t --title
-F --file
-e --edit
-w --web
--recover
--confidentiality
--priority
--scope
--severity
--status
-h --help
)
_pkgctl_issue_create_opts() { :; }
_pkgctl_issue_create_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_create_args_p_opts() { _pkgctl_issue_create_args__package_opts; }
_pkgctl_issue_create_args__title_opts() { :; }
_pkgctl_issue_create_args_t_opts() { _pkgctl_issue_create_args__title_opts; }
_pkgctl_issue_create_args__confidentiality_opts() { _devtools_completions_issue_confidentiality; }
_pkgctl_issue_create_args__priority_opts() { _devtools_completions_issue_priority; }
_pkgctl_issue_create_args__scope_opts() { _devtools_completions_issue_scope; }
_pkgctl_issue_create_args__severity_opts() { _devtools_completions_issue_severity; }
_pkgctl_issue_create_args__status_opts() { _devtools_completions_issue_status; }
_pkgctl_issue_edit_args=(
-p --package
-t --title
-e --edit
--recover
--confidentiality
--priority
--resolution
--scope
--severity
--status
-h --help
)
_pkgctl_issue_edit_opts() { :; }
_pkgctl_issue_edit_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_edit_args_p_opts() { _pkgctl_issue_edit_args__package_opts; }
_pkgctl_issue_edit_args__title_opts() { :; }
_pkgctl_issue_edit_args_t_opts() { _pkgctl_issue_edit_args__title_opts; }
_pkgctl_issue_edit_args__confidentiality_opts() { _devtools_completions_issue_confidentiality; }
_pkgctl_issue_edit_args__priority_opts() { _devtools_completions_issue_priority; }
_pkgctl_issue_edit_args__resolution_opts() { _devtools_completions_issue_resolution; }
_pkgctl_issue_edit_args__scope_opts() { _devtools_completions_issue_scope; }
_pkgctl_issue_edit_args__severity_opts() { _devtools_completions_issue_severity; }
_pkgctl_issue_edit_args__status_opts() { _devtools_completions_issue_status; }
_pkgctl_issue_list_args=(
-g --group
-w --web
-A --all
-c --closed
-U --unconfirmed
--search
--in
-l --label
--confidentiality
--priority
--resolution
--scope
--severity
--status
--assignee
--assigned-to-me
--author
--created-by-me
-h --help
)
_pkgctl_issue_list_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_list_args__search_opts() { :; }
_pkgctl_issue_list_args__in_opts() { _devtools_completions_issue_search_location; }
_pkgctl_issue_list_args__label_opts() { :; }
_pkgctl_issue_list_args_l_opts() { _pkgctl_issue_list_args__label_opts; }
_pkgctl_issue_list_args__confidentiality_opts() { _devtools_completions_issue_confidentiality; }
_pkgctl_issue_list_args__priority_opts() { _devtools_completions_issue_priority; }
_pkgctl_issue_list_args__resolution_opts() { _devtools_completions_issue_resolution; }
_pkgctl_issue_list_args__scope_opts() { _devtools_completions_issue_scope; }
_pkgctl_issue_list_args__severity_opts() { _devtools_completions_issue_severity; }
_pkgctl_issue_list_args__status_opts() { _devtools_completions_issue_status; }
_pkgctl_issue_list_args__assignee_opts() { :; }
_pkgctl_issue_list_args__author_opts() { :; }
_pkgctl_issue_move_args=(
-p --package
-m --message
-e --edit
-h --help
)
_pkgctl_issue_move_opts() {
local subcommand args
subcommand=(repo switch)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
:
elif (( args >= 1 )); then
_devtools_completions_all_packages
fi
}
_pkgctl_issue_move_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_move_args_p_opts() { _pkgctl_issue_move_args__package_opts; }
_pkgctl_issue_move_args__message_opts() { :; }
_pkgctl_issue_move_args_m_opts() { _pkgctl_issue_move_args__message_opts; }
_pkgctl_issue_reopen_args=(
-p --package
-m --message
-e --edit
-h --help
)
_pkgctl_issue_reopen_opts() { :; }
_pkgctl_issue_reopen_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_reopen_args_p_opts() { _pkgctl_issue_reopen_args__package_opts; }
_pkgctl_issue_reopen_args__message_opts() { :; }
_pkgctl_issue_reopen_args_m_opts() { _pkgctl_issue_reopen_args__message_opts; }
_pkgctl_issue_view_args=(
-p --package
-c --comments
-w --web
-h --help
)
_pkgctl_issue_view_opts() { :; }
_pkgctl_issue_view_args__package_opts() { _devtools_completions_all_packages; }
_pkgctl_issue_view_args_p_opts() { _pkgctl_issue_view_args__package_opts; }
_pkgctl_version_args=(
-h --help
@@ -355,14 +655,17 @@ _devtools_completions_color() {
mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur")
}
_devtools_completions_arch() {
mapfile -t COMPREPLY < <(compgen -W "${_arch[*]}" -- "$cur")
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ARCHES[*]}" -- "$cur")
}
_devtools_completions_binary_arch() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BINARY_ARCHES[*]}" -- "$cur")
}
_devtools_completions_repo() {
local optional=${1:-}
mapfile -t COMPREPLY < <(compgen -W "${optional} ${_repos[*]}" -- "$cur")
mapfile -t COMPREPLY < <(compgen -W "${optional} ${DEVTOOLS_VALID_REPOS[*]}" -- "$cur")
}
_devtools_completions_build_repo() {
mapfile -t COMPREPLY < <(compgen -W "${_build_repos[*]}" -- "$cur")
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILDREPOS[*]}" -- "$cur")
}
_devtools_completions_all_packages() {
mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur")
@@ -370,6 +673,36 @@ _devtools_completions_all_packages() {
_devtools_completions_protocol() {
mapfile -t COMPREPLY < <(compgen -W "https" -- "$cur")
}
_devtools_completions_inspect() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_INSPECT_MODES[*]}" -- "$cur")
}
_devtools_completions_search_format() {
mapfile -t COMPREPLY < <(compgen -W "${valid_search_output_format[*]}" -- "$cur")
}
_devtools_completions_version_output_format() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_VERSION_OUTPUT_FORMAT[*]}" -- "$cur")
}
_devtools_completions_issue_severity() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_SEVERITY[*]}" -- "$cur")
}
_devtools_completions_issue_status() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_STATUS[*]}" -- "$cur")
}
_devtools_completions_issue_scope() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_SCOPE[*]}" -- "$cur")
}
_devtools_completions_issue_search_location() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_SEARCH_LOCATION[*]}" -- "$cur")
}
_devtools_completions_issue_resolution() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_RESOLUTION[*]}" -- "$cur")
}
_devtools_completions_issue_priority() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_PRIORITY[*]}" -- "$cur")
}
_devtools_completions_issue_confidentiality() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ISSUE_CONFIDENTIALITY[*]}" -- "$cur")
}
__devtools_complete() {
local service=$1

View File

@@ -3,12 +3,21 @@
# SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-build-install.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-inspect.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
# shellcheck source=src/lib/valid-search.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh
# shellcheck source=src/lib/valid-version.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-version.sh
# shellcheck source=src/lib/valid-issue.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-issue.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
_archbuild_args=(
@@ -35,21 +44,24 @@ _pkgctl_auth_status_args=(
)
_pkgctl_build_args=(
"--arch=[Specify architectures to build for (disables auto-detection)]:arch:($_arch[*])"
"--repo=[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
"--arch[Specify architectures to build for (disables auto-detection)]:arch:($DEVTOOLS_VALID_BINARY_ARCHES[*])"
"--repo[Specify a target repository (disables auto-detection)]:repo:($DEVTOOLS_VALID_REPOS[*])"
'(-s --staging)'{-s,--staging}'[Build against the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]'
'(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]'
'(-c --clean)'{-c,--clean}'[Recreate the chroot before building]'
'(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
"--inspect[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])"
'*'{-I,--install-to-chroot}'[Install a package to the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
'*'{-i,--install-to-host}"[Install the built packages to the host system]:mode:($DEVTOOLS_VALID_BUILD_INSTALL[*])"
'(-w --worker)'{-w,--worker}'[Name of the worker slot, useful for concurrent builds (disables auto-detection)]:slot:'
'--nocheck[Do not run the check() function in the PKGBUILD]'
'--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:'
'--pkgrel=[Set pkgrel to a given value]:pkgrel:'
'--rebuild[Increment the pkgrel variable]'
'--update-checksums[Force computation and update of the checksums (disables auto-detection)]'
'(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]'
'(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]'
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-m --message)'{-m,--message}"[Use the given <msg> as the commit message]:message:"
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database as last action]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
@@ -64,15 +76,17 @@ _pkgctl_db_cmds=(
_pkgctl_db_move_args=(
'(-h --help)'{-h,--help}'[Display usage]'
"1:src-repo:($_repos[*])"
"2:target-repo:($_repos[*])"
"1:src-repo:($DEVTOOLS_VALID_REPOS[*])"
"2:target-repo:($DEVTOOLS_VALID_REPOS[*])"
'*:pkgbase:_devtools_completions_all_packages'
)
_pkgctl_db_remove_args=(
'(-a --arch=)'{-a,--arch=}"[Override the architecture (disables auto-detection)]:arch:($_arch[*])"
'--partial[Remove only partial pkgnames from a split package]'
'--noconfirm[Bypass any confirmation messages, should only be used with caution]'
'(-a --arch)'{-a,--arch}"[Override the architecture (disables auto-detection)]:arch:($DEVTOOLS_VALID_BINARY_ARCHES[*])"
'(-h --help)'{-h,--help}'[Display usage]'
"1:repo:($_repos[*])"
"1:repo:($DEVTOOLS_VALID_REPOS[*])"
'*:pkgbase:_devtools_completions_all_packages'
)
@@ -80,9 +94,115 @@ _pkgctl_db_update_args=(
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_issue_cmds=(
"pkgctl issue command"
"close[Close an issue]"
"comment[Comment on an issue]"
"create[Create a new issue]"
"edit[Edit and modify an issue]"
"list[List project or group issues]"
"move[Move an issue to another project]"
"reopen[Reopen a closed issue]"
"view[Display information about an issue]"
)
_pkgctl_issue_close_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-m --message)'{-m,--message}'[Use the provided message as the comment]:message:'
'(-e --edit)'{-e,--edit}'[Edit the comment using an editor]'
'(-r --resolution)'{-r,--resolution}"[Set a specific resolution label]:resolution:($DEVTOOLS_VALID_ISSUE_RESOLUTION[*])"
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
)
_pkgctl_issue_comment_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-m --message)'{-m,--message}'[Use the provided message as the comment]:message:'
'(-e --edit)'{-e,--edit}'[Edit the comment using an editor]'
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
)
_pkgctl_issue_create_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-t --title)'{-t,--title}'[Use the provided title for the issue]:title:'
'(-F --file)'{-F,--file}'[Take issue description from <file>]:file:_files'
'(-e --edit)'{-e,--edit}'[Edit the issue title and description using an editor]'
'(-w --web)'{-w,--web}'[Continue issue creation with the web interface]'
"--recover[Automatically recover from a failed run]"
"--confidentiality[Set the issue confidentiality]:confidential:($DEVTOOLS_VALID_ISSUE_CONFIDENTIALITY[*])"
"--priority[Set the priority label]:priority:($DEVTOOLS_VALID_ISSUE_PRIORITY[*])"
"--scope[Set the scope label]:scope:($DEVTOOLS_VALID_ISSUE_SCOPE[*])"
"--severity[Set the severity label]:severity:($DEVTOOLS_VALID_ISSUE_SEVERITY[*])"
"--status[Set the status label]:status:($DEVTOOLS_VALID_ISSUE_STATUS[*])"
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_issue_edit_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-t --title)'{-t,--title}'[Use the provided title for the issue]:title:'
'(-e --edit)'{-e,--edit}'[Edit the issue title and description using an editor]'
"--recover[Automatically recover from a failed run]"
"--confidentiality[Set the issue confidentiality]:confidential:($DEVTOOLS_VALID_ISSUE_CONFIDENTIALITY[*])"
"--priority[Set the priority label]:priority:($DEVTOOLS_VALID_ISSUE_PRIORITY[*])"
"--resolution[Set the resolution label]:resolution:($DEVTOOLS_VALID_ISSUE_RESOLUTION[*])"
"--scope[Set the scope label]:scope:($DEVTOOLS_VALID_ISSUE_SCOPE[*])"
"--severity[Set the severity label]:severity:($DEVTOOLS_VALID_ISSUE_SEVERITY[*])"
"--status[Set the status label]:status:($DEVTOOLS_VALID_ISSUE_STATUS[*])"
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
)
_pkgctl_issue_list_args=(
'(-g --group)'{-g,--group}'[Get issues from the whole packaging subgroup]'
'(-w --web)'{-w,--web}'[View results in a browser]'
'(-A --all)'{-A,--all}'[Get all issues including closed]'
'(-c --closed)'{-c,--closed}'[Get only closed issues]'
'(-U --unconfirmed)'{-U,--unconfirmed}'[Shorthand to filter by unconfirmed status label]'
'--search[Search in the fields defined by --in]:search:'
"--in[Search in title or description]:location:($DEVTOOLS_VALID_ISSUE_SEARCH_LOCATION[*])"
"--confidentiality[Filter by confidentiality]:confidential:($DEVTOOLS_VALID_ISSUE_CONFIDENTIALITY[*])"
"--priority[Shorthand to filter by priority label]:priority:($DEVTOOLS_VALID_ISSUE_PRIORITY[*])"
"--resolution[Shorthand to filter by resolution label]:resolution:($DEVTOOLS_VALID_ISSUE_RESOLUTION[*])"
"--scope[Shorthand to filter by scope label]:scope:($DEVTOOLS_VALID_ISSUE_SCOPE[*])"
"--severity[Shorthand to filter by severity label]:severity:($DEVTOOLS_VALID_ISSUE_SEVERITY[*])"
"--status[Shorthand to filter by status label]:status:($DEVTOOLS_VALID_ISSUE_STATUS[*])"
'--assignee[Filter issues assigned to the given username]:username:'
'--assigned-to-me[Shorthand to filter issues assigned to you]'
'--author[Filter issues authored by the given username]:username:'
'--created-by-me[Shorthand to filter issues created by you]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:pkgbase:_devtools_completions_all_packages'
)
_pkgctl_issue_move_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-m --message)'{-m,--message}'[Use the provided message as the comment]:message:'
'(-e --edit)'{-e,--edit}'[Edit the comment using an editor]'
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
'1:pkgbase:_devtools_completions_all_packages'
)
_pkgctl_issue_reopen_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-m --message)'{-m,--message}'[Use the provided message as the comment]:message:'
'(-e --edit)'{-e,--edit}'[Edit the comment using an editor]'
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
)
_pkgctl_issue_view_args=(
'(-p --package)'{-p,--package}'[Interact with <pkgbase> instead of the current directory]:pkgbase:_devtools_completions_all_packages'
'(-c --comments)'{-c,--comments}'[Show issue comments and activities]'
'(-w --web)'{-w,--web}'[View results in a browser]'
'(-h --help)'{-h,--help}'[Display usage]'
"1:issue_iid:"
)
_pkgctl_release_args=(
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
'(-m --message)'{-m,--message}"[Use the given <msg> as the commit message]:message:"
'(-r --repo)'{-r,--repo}"[Specify a target repository for new packages]:repo:($DEVTOOLS_VALID_REPOS[*])"
'(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]'
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]'
@@ -90,8 +210,21 @@ _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"
"clean[Remove untracked files from the working tree]"
"clone[Clone a package repository]"
"configure[Configure a clone according to distro specs]"
"create[Create a new GitLab package repository]"
@@ -106,6 +239,13 @@ _pkgctl_repo_switch_args=(
'*:git_dir:_files -/'
)
_pkgctl_repo_clean_args=(
'(-i --interactive)'{-i,--interactive}'[Show what would be done and clean files interactively]'
'(-n --dry-run)'{-n,--dry-run}"[Don't remove anything, just show what would be done]"
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_clone_args=(
'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
'--protocol[Clone the repository over https]:proto:(https)'
@@ -130,15 +270,25 @@ _pkgctl_repo_create_args=(
)
_pkgctl_repo_web_args=(
'--print[Print the url instead of opening it with xdg-open]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_search_args=(
'--no-default-filter[Do not apply default filter (like -path:keys/pgp/*.asc)]'
'--json[Enable printing results in JSON]'
'(-F --format)'{-F,--format}"[Controls the formatting of the results]:format:($valid_search_output_format[*])"
'(-N --no-line-number)'{-N,--no-line-number}"[Don't show line numbers when formatting results]"
'(-h --help)'{-h,--help}'[Display usage]'
'1:query'
)
_arch_nspawn_args=(
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-f[Copy file from the host to the chroot]:copy_file:_files'
'*-c[Set pacman cache]:pacman_cache:_files -/'
'*-f[Copy file from the host to the chroot]:copy_file:_files'
'-s[Do not run setarch]'
'-h[Display usage]'
'1:chroot_dir:_files -/'
@@ -146,14 +296,14 @@ _arch_nspawn_args=(
_archrelease_args=(
'-f[Force release without checks]'
"*:arch:($_tags[*])"
"*:arch:($DEVTOOLS_VALID_TAGS[*])"
)
_commitpkg_args=(
'-f[Force release without checks]'
'-s[Target repo server]'
'-l[Set bandwidth limit]:limit'
"-a[Release to a specific architecture only]:arch:($_arch[*])"
"-a[Release to a specific architecture only]:arch:($DEVTOOLS_VALID_ARCHES[*])"
'1:commit_msg'
)
@@ -180,15 +330,17 @@ _finddeps_args=(
_makechrootpkg_args=(
'-h[Display usage]'
'-c[Clean the chroot before building]'
'-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/'
'-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/'
'*-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/'
'*-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/'
'*-t[Mount a tmpfs at directory]:tmpfs_dir:_files -/'
'-u[Update the working copy of the chroot before building]'
'-r[The chroot dir to use]:chroot_dir:_files -/'
'-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'*-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'-l[The directory to use as the working copy]:copy_dir:_files -/'
'-n[Run namcap on the package]'
'-T[Build in a temporary directory]'
'-U[Run makepkg as a specified user]:makepkg_user'
"-x[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])"
)
_mkarchroot_args=(
@@ -196,6 +348,7 @@ _mkarchroot_args=(
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-f[Copy src file from the host to the chroot]:target:_files -/'
'-h[Display usage]'
'1:working_dir:_files -/'
'*:packages:_devtools_completions_all_packages'
@@ -212,19 +365,20 @@ _sogrep_args=(
'(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]'
'(-r --refresh)'{-r,--refresh}'[Refresh the links databases]'
'(-h --help)'{-h,--help}'[Display usage]'
'1:repo:(all $_repos[*])'
'1:repo:(all $DEVTOOLS_VALID_REPOS[*])'
'2:libname'
)
_offload_build_args=(
'(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($_build_repos[*])'
'(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${_binary_arch[*]})'
'(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($DEVTOOLS_VALID_BUILDREPOS[*])'
'(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${DEVTOOLS_VALID_BINARY_ARCHES[*]})'
'(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:'
'(-h --help)'{-h,--help}'[Display usage]'
)
_makerepropkg_args=(
'-d[Run diffoscope if the package is unreproducible]'
'-n[Do not run the check() function in the PKGBUILD]'
'-c[Set pacman cache]:pacman_cache:_files -/'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-h[Display usage]'
@@ -239,13 +393,17 @@ _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 packge update, move etc]"
"db[Pacman database modification for package update, move etc]"
"diff[Compare package files using different modes]"
"issue[Work with GitLab packaging issues]"
"license[Check and manage package license compliance]"
"release[Release step to commit, tag and upload build artifacts]"
"repo[Manage Git packaging repositories and their configuration]"
"version[Show pkgctl version information]"
"search[Search for an expression across the GitLab packaging group]"
"version[Check and manage package versions against upstream]"
)
_pkgctl_args=(
@@ -253,8 +411,54 @@ _pkgctl_args=(
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_version_args=(
_pkgctl_license_cmds=(
"pkgctl license command"
"check[Checks package licensing compliance using REUSE]"
"setup[Automatically detect and setup a basic REUSE config]"
)
_pkgctl_license_check_args=(
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_license_setup_args=(
'(-f --force)'{-f,--force}'[Overwrite existing REUSE config]'
'--no-check[Do not run license check after setup]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_version_cmds=(
"pkgctl version command"
"check[Compares local package versions against upstream versions]"
"setup[Automatically detect and setup a basic nvchecker config]"
"upgrade[Adjust the PKGBUILD to match the latest upstream version]"
)
_pkgctl_version_check_args=(
'(-h --help)'{-h,--help}'[Display usage]'
'(-v --verbose)'{-v,--verbose}'[Display all results including up-to-date versions]'
'--json[Enable printing results in JSON]'
'(-F --format)'{-F,--format}"[Controls the output format of the results]:format:($DEVTOOLS_VALID_VERSION_OUTPUT_FORMAT[*])"
'*:git_dir:_files -/'
)
_pkgctl_version_setup_args=(
'(-f --force)'{-f,--force}'[Do not prompt before overwriting]'
'--prefer-platform-api[Prefer platform specific GitHub/GitLab API for complex cases]'
'--url[Derive check target from URL instead of source array]:url:'
'--no-check[Do not run version check after setup]'
'--no-upstream[Setup a blank config for packages without upstream sources]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_version_upgrade_args=(
'--no-update-checksums[Disable computation and update of the checksums]'
'(-v --verbose)'{-v,--verbose}'[Display results including up-to-date versions]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_diff_args=("${_diffpkg_args[@]}")
@@ -276,7 +480,7 @@ _handle_subcommands() {
fi
;;
args)
local service_sub=${service_name}_$line[1]
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}"

12
data/LICENSE Normal file
View File

@@ -0,0 +1,12 @@
Copyright Arch Linux Contributors
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

View File

@@ -1,37 +0,0 @@
## linkman: macro
# Inspired by/borrowed from the GIT source tree at Documentation/asciidoc.conf
#
# Usage: linkman:command[manpage-section]
#
# Note, {0} is the manpage section, while {target} is the command.
#
# Show man link as: <command>(<section>); if section is defined, else just show
# the command.
[macros]
(?su)[\\]?(?P<name>linkman):(?P<target>\S*?)\[(?P<attrlist>.*?)\]=
[attributes]
asterisk=&#42;
plus=&#43;
caret=&#94;
startsb=&#91;
endsb=&#93;
backslash=&#92;
tilde=&#126;
apostrophe=&#39;
backtick=&#96;
litdd=&#45;&#45;
ifdef::backend-docbook[]
[linkman-inlinemacro]
{0%{target}}
{0#<citerefentry>}
{0#<refentrytitle>{target}</refentrytitle><manvolnum>{0}</manvolnum>}
{0#</citerefentry>}
endif::backend-docbook[]
ifdef::backend-xhtml11[]
[linkman-inlinemacro]
<a href="{target}.{0}.html">{target}{0?({0})}</a>
endif::backend-xhtml11[]

View File

@@ -23,13 +23,15 @@ Options
Location of a pacman config file
*-M* <file>::
Location of a makepkg config file
Location of a makepkg config file. Specific additions (e.g. build flags for
additional languages) can be placed in '<file>.d/*.conf'.
*-c* <dir>::
Set pacman cache, if no directory is specified the passed pacman.conf's cachedir is used with a fallback to '/etc/pacman.conf'
*-f* <file>::
Copy file from the host to the chroot
*-f* <src>[:<dst>]::
Copy file from the host to the chroot.
If 'dst' is not provided, it defaults to 'src' inside of the chroot.
*-s*::
Do not run setarch

View File

@@ -43,6 +43,6 @@ Options
See Also
--------
linkman:devtools[7]
devtools(7)
include::include/footer.asciidoc[]

View File

@@ -38,6 +38,6 @@ Options
See Also
--------
linkman:find-libprovides[1]
find-libprovides(1)
include::include/footer.asciidoc[]

View File

@@ -21,47 +21,47 @@ Programs
The list below gives a short overview; see the respective documentation
for details.
linkman:pkgctl[1]
pkgctl(1)
Unified command-line frontend for devtools
linkman:archbuild[1]
archbuild(1)
Build an Arch Linux package inside a clean chroot
linkman:arch-nspawn[1]
arch-nspawn(1)
Run a command or OS in a light-weight namespace container
linkman:checkpkg[1]
checkpkg(1)
Compare the current build package with the repository version
linkman:diffpkg[1]
diffpkg(1)
Compare package files using different modes
linkman:export-pkgbuild-keys[1]
export-pkgbuild-keys(1)
Export valid source signing keys from a PKGBUILD
linkman:find-libdeps[1]
find-libdeps(1)
Find soname dependencies for a package
linkman:find-libprovides[1]
find-libprovides(1)
Find soname's which are provided by a package
linkman:lddd[1]
lddd(1)
Find broken library links on your system
linkman:mkarchroot[1]
mkarchroot(1)
Creates an arch chroot in a specified location with a specified set of
packages
linkman:makechrootpkg[1]
makechrootpkg(1)
Build a PKGBUILD in a given chroot environment
linkman:makerepropkg[1]
makerepropkg(1)
Rebuild a package to see if it is reproducible
linkman:offload-build[1]
offload-build(1)
Build a PKGBUILD on a remote server using makechrootpkg
linkman:sogrep[1]
sogrep(1)
Find packages using a linked to a given shared library
include::include/footer.asciidoc[]

View File

@@ -20,6 +20,6 @@ collected data is written to a temporary directory created by mktemp.
See Also
--------
linkman:ldd[1]
ldd(1)
include::include/footer.asciidoc[]

View File

@@ -45,6 +45,9 @@ Options
*-D* <dir>::
Bind directory into build chroot as read-only
*-t* <dir>[:opts]::
Mount a tmpfs at 'dir'. See the '--tmpfs' argument in systemd-nspawn(1) for more details.
*-u*::
Update the working copy of the chroot before building
This is useful for rebuilds without dirtying the pristine
@@ -73,4 +76,12 @@ Options
*-U*::
Run makepkg as a specified user
*-x* <when>::
Inspect chroot after build, possible modes are 'never' (default), 'always' or 'failure'
See Also
--------
systemd-nspawn(1)
include::include/footer.asciidoc[]

View File

@@ -16,7 +16,7 @@ Given the path to a built pacman package(s), attempt to rebuild it using the
PKGBUILD in the current directory. The package will be built in an environment
as closely matching the environment of the initial package as possible, by
building up a chroot to match the information exposed in the package's
linkman:BUILDINFO[5] manifest. On success, the resulting package will be
BUILDINFO(5) manifest. On success, the resulting package will be
compared to the input package, and makerepropkg will report whether the
artifacts are identical.
@@ -42,11 +42,15 @@ Options
*-d*::
If packages are not reproducible, compare them using diffoscope.
*-n*::
Do not run the check() function in the PKGBUILD.
*-c*::
Set the pacman cache directory.
*-M* <file>::
Location of a makepkg config file.
Location of a makepkg config file. Specific additions (e.g. build flags for
additional languages) can be placed in '<file>.d/*.conf'.
*-l* <chroot>::
The directory name to use as the chroot namespace

View File

@@ -32,8 +32,9 @@ Options
*-c* <dir>::
Set pacman cache.
*-f* <file>::
*-f* <src>[:<dst>]::
Copy file from the host to the chroot.
If 'dst' is not provided, it defaults to 'src' inside of the chroot.
*-s*::
Do not run setarch.
@@ -44,6 +45,6 @@ Options
See Also
--------
linkman:pacman[1]
pacman(1)
include::include/footer.asciidoc[]

View File

@@ -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
--------
pkgctl-db-remove(1)
include::include/footer.asciidoc[]

View File

@@ -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
--------
pkgctl-aur-drop-from-repo(1)
include::include/footer.asciidoc[]

View File

@@ -35,6 +35,6 @@ Options
See Also
--------
linkman:pkgctl-auth-status[1]
pkgctl-auth-status(1)
include::include/footer.asciidoc[]

View File

@@ -27,6 +27,6 @@ Options
See Also
--------
linkman:pkgctl-auth-login[1]
pkgctl-auth-login(1)
include::include/footer.asciidoc[]

View File

@@ -32,7 +32,7 @@ pkgctl auth status::
See Also
--------
linkman:pkgctl-auth-login[1]
linkman:pkgctl-auth-status[1]
pkgctl-auth-login(1)
pkgctl-auth-status(1)
include::include/footer.asciidoc[]

View File

@@ -12,7 +12,10 @@ pkgctl build [OPTIONS] [PATH...]
Description
-----------
TODO
Build packages in clean chroot environment, offering various options
and functionalities to customize the package building process.
By default, chroot environments are located in '/var/lib/archbuild/'.
Build Options
-------------
@@ -21,7 +24,10 @@ Build Options
Specify architectures to build for (disables auto-detection)
*--repo* 'REPO'::
Specify a target repository (disables auto-detection)
Specify target repository for new packages not in any official repo.
Fallback to `'extra'` when building packages that are not present in any
official repository yet. Using this option is disallowed if the package is
already released, as it would circumvent the auto-detection safeguard.
*-s, --staging*::
Build against the staging counterpart of the auto-detected repo
@@ -35,8 +41,9 @@ Build Options
*-c, --clean*::
Recreate the chroot before building
*-I, --install* 'FILE'::
Install a package into the working copy of the chroot
*--inspect* 'WHEN'::
Spawn an interactive shell to inspect the chroot after building. Useful to ease the debugging of a package build. +
Possible values for 'WHEN' are `'never'`, `'always'` or `'failure'`
*-w, --worker* 'SLOT'::
Name of the worker slot, useful for concurrent builds. By default the slot
@@ -47,6 +54,17 @@ Build Options
*--nocheck*::
Do not run the check() function in the PKGBUILD
Install Options
---------------
*-I, --install-to-chroot* 'FILE'::
Install a package to the working copy of the chroot
*-i, --install-to-host* 'MODE'::
Install the built packages to the host system. Useful when one wants to verify that the package works as intended.
* When 'MODE' is 'all', this installs all built packages
* When 'MODE' is 'auto', this installs all built packages which are currently installed
PKGBUILD Options
----------------
@@ -59,6 +77,13 @@ PKGBUILD Options
*--rebuild*::
Increment the current pkgrel variable
*--update-checksums*::
Force computation and update of the checksums by disabling auto-detection. +
Should only be used in special circumstances, like when adding new patch
files to the source array. During regular packaging operations, checksums
are either automatically updated when upgrading a package using `--pkgver`
or should remain immutable during rebuilds.
*-e, --edit*::
Edit the PKGBUILD before building
@@ -85,7 +110,7 @@ Options
See Also
--------
linkman:pkgctl-release[1]
linkman:pkgctl-db-update[1]
pkgctl-release(1)
pkgctl-db-update(1)
include::include/footer.asciidoc[]

View File

@@ -3,17 +3,16 @@ pkgctl-db-move(1)
Name
----
pkgctl-db-update - Update the binary repository as final release step
pkgctl-db-move - Move packages between binary repositories.
Synopsis
--------
pkgctl db update [OPTIONS]
pkgctl db move [OPTIONS] [SOURCE_REPO] [TARGET_REPO] [PKGBASE]...
Description
-----------
Update the pacman database as final release step for packages that
have been transfered and staged on 'repos.archlinux.org'.
Move packages between binary repositories i.e. from 'extra-testing' to 'extra'.
Options
-------

View File

@@ -12,13 +12,27 @@ pkgctl db remove [OPTIONS] [REPO] [PKGBASE]...
Description
-----------
Remove packages from pacman repositories.
Remove packages from pacman repositories. By default passing a pkgbase removes
all split packages, debug packages as well as entries from the state repo for
all existing architectures.
Beware when using the `--partial` option, as it may most likely lead to
undesired effects by leaving debug packages behind as well as dangling entries
in the state repository.
Options
-------
*--partial*::
Remove only partial pkgnames from a split package. This leaves debug
packages behind and pkgbase entries in the state repo.
*-a, --arch* 'ARCH'::
Override the architecture (disables auto-detection)
Remove only one specific architecture (disables auto-detection).
By default all architectures are removed when this option is not used.
*--noconfirm*::
Bypass any confirmation messages, should only be used with caution.
*-h, --help*::
Show a help text

View File

@@ -1,18 +1,19 @@
pkgctl-db-move(1)
=================
pkgctl-db-update(1)
===================
Name
----
pkgctl-db-move - Move packages between binary repositories
pkgctl-db-update - Update the binary repository as final release step
Synopsis
--------
pkgctl db move [OPTIONS] [SOURCE_REPO] [TARGET_REPO] [PKGBASE]...
pkgctl db update [OPTIONS]
Description
-----------
Move packages between pacman repositories.
Update the pacman database as final release step for packages that
have been transfered and staged on 'repos.archlinux.org'.
Options
-------

View File

@@ -0,0 +1,43 @@
pkgctl-db(1)
============
NAME
----
pkgctl-db - Pacman database modification utility for package updates, moves, and more.
SYNOPSIS
--------
pkgctl db [OPTIONS] [SUBCOMMAND]
DESCRIPTION
-----------
Managing the Pacman database and facilitate the modification of packages and their metadata
within the database
OPTIONS
-------
*-h, --help*::
Display usage information and available options.
Subcommands
-----------
pkgctl db update::
Update the binary repository as final release step
pkgctl db move::
Move packages between binary repositories
pkgctl db remove::
Remove packages from binary repositories
SEE ALSO
--------
pkgctl-db-update(1)
pkgctl-db-move(1)
pkgctl-db-remove(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,47 @@
pkgctl-issue-close(1)
=====================
Name
----
pkgctl-issue-close - Close an issue
Synopsis
--------
pkgctl issue close [OPTIONS] [IID]
Description
-----------
This command is used to close an issue in Arch Linux packaging projects. It
finalizes the issue by marking it as resolved and optionally providing a reason
for its closure.
To edit an issue, users must specify the issue ID (IID). By default, the
command operates within the current directory, but users have the option to
specify a different package base.
Users can provide a message directly through the command line to explain the
reason for closing the issue. For more detailed or precise reasons, users can
opt to edit the closure message using a text editor before submitting it.
Additionally, a specific resolution label can be set to categorize the closure
reason, with the default label being "completed."
Options
-------
*-p, --package* 'PKGBASE'::
Interact with `PKGBASE` instead of the current directory
*-m, --message* 'MSG'::
Use the provided message as the reason for closing
*-e, --edit*::
Edit the reason for closing using an editor
*-r, --resolution* 'REASON'::
Set a specific resolution label (default: completed)
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,43 @@
pkgctl-issue-comment(1)
=======================
Name
----
pkgctl-issue-comment - Comment on an issue
Synopsis
--------
pkgctl issue comment [OPTIONS] [IID]
Description
-----------
This command allows users to add comments to an issue in Arch Linux packaging
projects. This command is useful for providing feedback, updates, or any
additional information related to an issue directly within the project's issue
tracking system.
By default, the command interacts with the current directory, but users can
specify a different package base if needed.
Users can provide a comment message directly through the command line, ensuring
quick and efficient communication. Additionally, for more detailed or formatted
comments, users have the option to edit their comment using a text editor
before submitting it.
Options
-------
*-p, --package PKGBASE*::
Interact with `PKGBASE` instead of the current directory
*-m, --message MSG*::
Use the provided message as the comment
*-e, --edit*::
Edit the comment using an editor
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,77 @@
pkgctl-issue-create(1)
======================
Name
----
pkgctl-issue-create - Create a new issue
Synopsis
--------
pkgctl issue create [OPTIONS]
Description
-----------
The create command is used to create a new issue for an Arch Linux package.
This command is suitable for reporting bugs, regressions, feature requests, or
any other issues related to a package. It provides a flexible way to document
and track new issues within the project's issue tracking system.
By default, the command operates within the current directory, but users can
specify a different package base if needed.
Users can provide a title for the issue directly through the command line. The
issue description can be supplied from a file or edited using a text editor.
Alternatively, users can opt to continue the issue creation process using the
web interface for a more interactive experience.
The command allows setting various labels and attributes for the issue, such as
confidentiality, priority, scope, severity, and status. These options help
categorize and prioritize the issue appropriately within the tracking system.
In case of a failed run, the command can automatically recover to ensure that
the issue creation process is completed without losing any data.
This command is essential for maintainers, contributors, and users who need to
report new issues related to Arch Linux packages.
Options
-------
*-p, --package* 'PKGBASE'::
Interact with `PKGBASE` instead of the current directory
*-t, --title* 'TITLE'::
Use the provided title for the issue
*-F, --file* 'FILE'::
Take issue description from <file>
*-e, --edit*::
Edit the issue description using an editor
*-w, --web*::
Continue issue creation with the web interface
*--recover*::
Automatically recover from a failed run
*--confidentiality* 'TYPE'::
Set the issue confidentiality
*--priority* 'PRIORITY'::
Set the priority label
*--scope* 'SCOPE'::
Set the scope label
*--severity* 'SEVERITY'::
Set the severity label
*--status* 'STATUS'::
Set the status label
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,75 @@
pkgctl-issue-edit(1)
====================
Name
----
pkgctl-issue-edit - Edit and modify an issue
Synopsis
--------
pkgctl issue edit [OPTIONS] [IID]
Description
-----------
The pkgctl issue edit command is used to modify an existing issue in Arch Linux
packaging projects. This command allows users to update the issue's title,
description, and various attributes, ensuring that the issue information
remains accurate and up-to-date. It also provides a streamlined facility
for bug wranglers to categorize and prioritize issues efficiently.
To edit an issue, users must specify the issue ID (IID). By default, the
command operates within the current directory, but users can specify a
different package base if needed.
The command allows for direct updates to the issue title and description. For
more extensive changes, users can edit these details using a text editor. The
command provides various options to set or update labels and attributes such as
confidentiality, priority, resolution, scope, severity, and status. These
options help maintain clear and organized issue management.
In case of a failed run, the command can automatically recover to ensure that
the editing process is completed without losing any data.
This command is particularly useful for maintainers and contributors who need
to update the details of an issue to reflect new information or changes in
status. It ensures that all issue details are accurately maintained,
facilitating efficient tracking and resolution.
Options
-------
*-p, --package* 'PKGBASE'::
Interact with `PKGBASE` instead of the current directory
*-t, --title* 'TITLE'::
Use the provided title for the issue
*-e, --edit*::
Edit the issue title and description using an editor
*--recover*::
Automatically recover from a failed run
*--confidentiality* 'TYPE'::
Set the issue confidentiality
*--priority* 'PRIORITY'::
Set the priority label
*--resolution* 'REASON'::
Set the resolution label
*--scope* 'SCOPE'::
Set the scope label
*--severity* 'SEVERITY'::
Set the severity label
*--status* 'STATUS'::
Set the status label
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,100 @@
pkgctl-issue-list(1)
====================
Name
----
pkgctl-issue-list - List project or group issues
Synopsis
--------
pkgctl issue list [OPTIONS] [PKGBASE]
Description
-----------
The pkgctl issue list command is used to list issues associated with a specific
packaging project or the entire packaging subgroup in Arch Linux. This command
facilitates efficient issue management by allowing users to list and filter
issues based on various criteria.
Results can also be displayed directly in a web browser for easier navigation
and review.
The command offers filtering options to refine the results. Users can include
closed issues, filter exclusively for unconfirmed issues, or focus on issues
with specific labels such as priority, confidentiality, resolution, scope,
severity, and status.
Additionally, users can search within issue titles or descriptions and filter
issues by the assignee or author. There are also convenient shortcuts to filter
issues assigned to or created by the current user.
This command is particularly useful for package maintainers and contributors in
the Arch Linux community who need to track and manage issues efficiently. It
provides a comprehensive view of the project's or group's issue landscape,
enabling maintainers to address and prioritize issues effectively.
Options
-------
*-g, --group*::
Get issues from the whole packaging subgroup
*-w, --web*::
View results in a browser
*-h, --help*::
Show a help text
Filter Options
--------------
*-A, --all*::
Get all issues including closed
*-c, --closed*::
Get only closed issues
*-U, --unconfirmed*::
Shorthand to filter by unconfirmed status label
*--search* 'SEARCH'::
Search <string> in the fields defined by --in
*--in* 'LOCATION'::
Search in title or description (default: all)
*-l, --label* 'NAME'::
Filter issue by label <name>
*--confidentiality* 'TYPE'::
Filter by confidentiality
*--priority* 'PRIORITY'::
Shorthand to filter by priority label
*--resolution* 'REASON'::
Shorthand to filter by resolution label
*--scope* 'SCOPE'::
Shorthand to filter by scope label
*--severity* 'SEVERITY'::
Shorthand to filter by severity label
*--status* 'STATUS'::
Shorthand to filter by status label
*--assignee* 'USERNAME'::
Filter issues assigned to the given username
*--assigned-to-me*::
Shorthand to filter issues assigned to you
*--author* 'USERNAME'::
Filter issues authored by the given username
*--created-by-me*::
Shorthand to filter issues created by you
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,43 @@
pkgctl-issue-move(1)
====================
Name
----
pkgctl-issue-move - Move an issue to another project
Synopsis
--------
pkgctl issue move [OPTIONS] [IID] [DESTINATION_PACKAGE]
Description
-----------
The move command allows users to transfer an issue from one project to another
within the Arch Linux packaging group. This is useful when an issue is
identified to be more relevant or better handled in a different project.
By default, the command operates within the current directory, but users can
specify a different package base from which to move the issue.
Users must specify the issue ID (IID) and the destination package to which the
issue should be moved. A comment message explaining the reason for the move can
be provided directly through the command line. For more detailed explanations
or additional context, users have the option to edit the move comment using a
text editor before submitting it.
Options
-------
*-p, --package* 'PKGBASE'::
Move from `PKGBASE` instead of the current directory
*-m, --message* 'MSG'::
Use the provided message as the comment
*-e, --edit*::
Edit the comment using an editor
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,43 @@
pkgctl-issue-reopen(1)
======================
Name
----
pkgctl-issue-reopen - Reopen a closed issue
Synopsis
--------
pkgctl issue reopen [OPTIONS] [IID]
Description
-----------
The reopen command is used to reopen a previously closed issue in Arch Linux
packaging projects. This command is useful when an issue needs to be revisited
or additional work is required after it was initially closed.
To edit an issue, users must specify the issue ID (IID). By default, the
command operates within the current directory, but users can specify a
different package base if needed.
Users can provide a message directly through the command line to explain the
reason for reopening the issue. For more detailed explanations or to provide
additional context, users have the option to edit the reopening comment using a
text editor before submitting it.
Options
-------
*-p, --package* 'PKGBASE'::
Interact with `PKGBASE` instead of the current directory
*-m, --message* 'MSG'::
Use the provided message as the comment
*-e, --edit*::
Edit the comment using an editor
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,43 @@
pkgctl-issue-view(1)
====================
Name
----
pkgctl-issue-view - Display information about an issue
Synopsis
--------
pkgctl issue view [OPTIONS]
Description
-----------
This command is designed to display detailed information about a specific issue
in Arch Linux packaging projects. It gathers and pretty prints all relevant
data about the issue, providing a comprehensive view that includes the issue's
description, status as well as labels and creation date.
By default, the command operates within the current directory, but users have
the option to specify a different package base. Additionally, users can choose
to view the issue in a web browser for a more interactive experience.
For those requiring deeper insights, the command can also display all comments
and activities related to the issue, providing a full historical context and
ongoing discussions.
Options
-------
*-p, --package* 'PKGBASE'::
Interact with `PKGBASE` instead of the current directory
*-c, --comments*::
Show issue comments and activities
*-w, --web*::
Open issue in a browser
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,62 @@
pkgctl-issue(1)
===============
Name
----
pkgctl-issue - Work with GitLab packaging issues
Synopsis
--------
pkgctl issue [SUBCOMMAND] [OPTIONS]
Description
-----------
Work with GitLab packaging issues.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl issue close::
Close an issue
pkgctl issue comment::
Comment on an issue
pkgctl issue create::
Create a new issue
pkgctl issue edit::
Edit and modify an issue
pkgctl issue list::
List project or group issues
pkgctl issue move::
Move an issue to another project
pkgctl issue reopen::
Reopen a closed issue
pkgctl issue view::
Display information about an issue
See Also
--------
pkgctl-issue-close(1)
pkgctl-issue-comment(1)
pkgctl-issue-create(1)
pkgctl-issue-edit(1)
pkgctl-issue-list(1)
pkgctl-issue-move(1)
pkgctl-issue-reopen(1)
pkgctl-issue-view(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,54 @@
pkgctl-license-check(1)
=======================
Name
----
pkgctl-license-check - Checks package licensing compliance using REUSE
Synopsis
--------
pkgctl license check [OPTIONS] [PKGBASE...]
Description
-----------
Checks package licensing compliance using REUSE and also verifies whether
a LICENSE file with the expected Arch Linux-specific 0BSD license text exists.
Configuration
-------------
Uses reuse(1) and a `REUSE.toml` file located alongside the PKGBUILD(5). Refer
to the configuration section in pkgctl-license(1).
If no `PKGBASE` is specified, the command defaults to using the current working
directory.
Options
-------
*-h, --help*::
Show a help text
Exit Codes
----------
On exit, return one of the following codes:
*0*::
Normal exit condition, all checked packages are compliant
*1*::
Unknown cause of failure
*2*::
Normal exit condition, but some packages are not compliant
See Also
--------
pkgctl-license(1)
reuse(1)
PKGBUILD(5)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,55 @@
pkgctl-license-setup(1)
=======================
Name
----
pkgctl-license-setup - Automatically detect and setup a basic REUSE
configuration
Synopsis
--------
pkgctl license setup [OPTIONS] [PKGBASE...]
Description
-----------
This subcommand automates the creation of the Arch Linux 0BSD package license
file as well as a basic reuse(1) configuration by applying simple heuristics.
It comes in especially handy when initially setting up licensing for a package
without the need to manually write a `REUSE.toml` file.
If any `.patch` files are detected and the PKGBUILD(5) has only a single entry
in the `license=()` array, this subcommand assumes the patches are licensed
under that license and generates annotations for them.
In case there are no patches, no additional annotations are generated.
Manual annotations are necessary in case the subcommand can't generate a
configuration that accounts for all files. In this case, `reuse lint` will fail
with a descriptive error of which files are missing an annotation.
If no `PKGBASE` is specified, the command defaults to using the current working
directory.
Options
-------
*-f, --force*::
Overwrite existing reuse(1) configuration
*--no-check*::
Do not run pkgctl-license-check(1) after setup
*-h, --help*::
Show a help text
See Also
--------
pkgctl-license(1)
pkgctl-license-check(1)
reuse(1)
PKGBUILD(5)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,54 @@
pkgctl-license(1)
=================
Name
----
pkgctl-license - Check and manage package license compliance
Synopsis
--------
pkgctl license [OPTIONS] [SUBCOMMAND]
Description
-----------
Commands related to package licenses, including checks for compliance.
Uses reuse(1) and a `REUSE.toml` file located alongside the PKGBUILD(5).
Configuration
-------------
The `REUSE.toml` file must contain annotations for all regular files expected
to be present in an Arch Linux package repository.
Use pkgctl-license-setup(1) to automatically detect and setup a basic REUSE
config file based on the files in the package repository.
For detailed information on the various configuration options available for the
`REUSE.toml` file, refer to the REUSE Specification (https://reuse.software/spec).
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl license check::
Checks package licensing compliance using REUSE
pkgctl license setup::
Automatically detect and setup a basic REUSE config
See Also
--------
pkgctl-license-check(1)
pkgctl-license-setup(1)
reuse(1)
PKGBUILD(5)
include::include/footer.asciidoc[]

View File

@@ -27,7 +27,9 @@ Options
Use the given <msg> as the commit message
*-r, --repo* 'REPO'::
Specify a target repository (disables auto-detection)
Specify target repository for new packages not in any official repo.
Using this option is disallowed if the package is already released, as it
would circumvent the auto-detection safeguard.
*-s, --staging*::
Build against the staging counterpart of the auto-detected repo
@@ -44,6 +46,6 @@ Options
See Also
--------
linkman:pkgctl-db-update[1]
pkgctl-db-update(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,40 @@
pkgctl-repo-clean(1)
====================
Name
----
pkgctl-repo-clean - Remove untracked files from the working tree
Synopsis
--------
pkgctl repo clean [OPTION] [PATH]...
Description
-----------
Cleans the working tree by recursively removing files that are not under
version control, starting from the current directory.
Files unknown to Git as well as ignored files are removed. This can, for
example, be useful to remove all build products.
Options
-------
*-i, --interactive*::
Show what would be done and clean files interactively
*-n, --dry-run*::
Don't actually remove anything, just show what would be done
*-h, --help*::
Show a help text
See Also
--------
git-clean(1)
include::include/footer.asciidoc[]

View File

@@ -46,7 +46,7 @@ Options
See Also
--------
linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-switch[1]
pkgctl-repo-configure(1)
pkgctl-repo-switch(1)
include::include/footer.asciidoc[]

View File

@@ -22,6 +22,8 @@ The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and
read-only HTTPS otherwise.
Git default excludes and hooks are applied to the configured repo.
Options
-------

View File

@@ -33,8 +33,8 @@ Options
See Also
--------
linkman:pkgctl-auth[1]
linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1]
pkgctl-auth(1)
pkgctl-repo-clone(1)
pkgctl-repo-configure(1)
include::include/footer.asciidoc[]

View File

@@ -18,6 +18,9 @@ no arguments, open the package cloned in the current working directory.
Options
-------
*--print*::
Print the url instead of opening it with xdg-open
*-h, --help*::
Show a help text

View File

@@ -32,6 +32,9 @@ Options
Subcommands
-----------
pkgctl repo clean::
Remove untracked files from the working tree
pkgctl repo clone::
Clone a package repository
@@ -50,10 +53,11 @@ pkgctl repo web::
See Also
--------
linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-create[1]
linkman:pkgctl-repo-switch[1]
linkman:pkgctl-repo-web[1]
pkgctl-repo-clean(1)
pkgctl-repo-clone(1)
pkgctl-repo-configure(1)
pkgctl-repo-create(1)
pkgctl-repo-switch(1)
pkgctl-repo-web(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,71 @@
pkgctl-search(1)
================
Name
----
pkgctl-search - Search for an expression across the GitLab packaging group
Synopsis
--------
pkgctl search [OPTIONS] QUERY
Description
-----------
Search for an expression across the GitLab packaging group.
To use a filter, include it in your query. You may use wildcards (*) to
use glob matching.
Available filters for the blobs scope: path, extension
Every usage of the search command must be authenticated. Consult the
`'pkgctl auth'` command to authenticate with GitLab or view the authentication
status.
Search Tips
-----------
Syntax Description Example
───────────────────────────────────────
" Exact search "gem sidekiq"
~ Fuzzy search J~ Doe
| Or display | banner
+ And display +banner
- Exclude display -banner
* Partial bug error 50*
\ Escape \*md
# Issue ID #23456
! Merge request !23456
Options
-------
*-h, --help*::
Show a help text
Filter Options
--------------
*--no-default-filter*::
Do not apply default filter (like -path:keys/pgp/*.asc)
Output Options
--------------
*--json*::
Enable printing in JSON; Shorthand for `'--format json'`
*-F, --format* 'FORMAT'::
Controls the formatting of the results; `FORMAT` is `'pretty'`, `'plain'`,
or `'json'` (default `pretty`)
*-N, --no-line-number*::
Don't show line numbers when formatting results
See Also
--------
pkgctl-auth(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,79 @@
pkgctl-version-check(1)
=======================
Name
----
pkgctl-version-check - Compares local package versions against upstream
Synopsis
--------
pkgctl version check [OPTIONS] [PKGBASE...]
Description
-----------
Compares the versions of packages in the local packaging repository against
their latest upstream versions.
Upon execution, it generates a grouped list that provides detailed insights
into each package's status. For each package, it displays the current local
version alongside the latest version available upstream.
Outputs a summary of up-to-date packages, out-of-date packages, and any check
failures.
This simplifies the maintenance of PKGBUILD files, reducing the manual effort
required to track version changes from upstream sources.
Configuration
-------------
Uses nvchecker(1) and a `.nvchecker.toml` file located alongside the
PKGBUILD. Refer to the configuration section in pkgctl-version(1).
Options
-------
*-h, --help*::
Show a help text
Filter Options
--------------
*-v, --verbose*::
Display all results including up-to-date versions
Output Options
--------------
*--json*::
Enable printing in JSON; Shorthand for `'--format json'`
*-F, --format* 'FORMAT'::
Controls the output format of the results; `FORMAT` is `'pretty'`,
or `'json'` (default `pretty`)
Exit Codes
----------
On exit, return one of the following codes:
*0*::
Normal exit condition, all checked versions are up-to-date
*1*::
Unknown cause of failure
*2*::
Normal exit condition, but there are out-of-date versions
*3*::
Failed to run some version checks
See Also
--------
pkgctl-version(1)
nvchecker(1)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,125 @@
pkgctl-version-setup(1)
=======================
Name
----
pkgctl-version-setup - Automatically detect and setup a basic nvchecker config
Synopsis
--------
pkgctl version setup [OPTIONS] [PKGBASE...]
Description
-----------
This subcommand automates the creation of a basic nvchecker(1) configuration
file by analyzing the source array specified in the PKGBUILD(1) file of a
package. This command intelligently detects various platforms and APIs (e.g.,
GitHub, GitLab, PyPI) used by the package sources and generates a corresponding
`.nvchecker.toml` configuration based on its best guess.
This is particularly useful for initializing nvchecker(1) settings for a
package without manually crafting the `.nvchecker.toml` file. It simplifies the
process of setting up version checks, especially when transitioning a package's
monitoring from one source platform to another or starting version checks for a
new package.
If no `PKGBASE` is specified, the command defaults to using the current working
directory.
To obtain a list of supported sources and their expected URL formats, please
consult the sources section.
Options
-------
*-f, --force*::
Overwrite existing nvchecker(1) configuration
*--prefer-platform-api*::
Prefer platform specific GitHub/GitLab API over git for complex cases
*--url* 'URL'::
Derive check target from the given URL instead of the source array entries
*--no-check*::
Do not run pkgctl-version-check(1) after setup
*--no-upstream*::
Setup a blank config for packages without upstream sources, like meta
packages. This must only be used for cases without an upstream, please
reach out to the developer team for guidance regarding upstream sources
that are hard to configure.
*-h, --help*::
Show a help text
Sources
-------
Here are the currently supported platforms and sources, along with examples of
URL formats that enable their automatic detection as specific source types:
*Git*::
* https://github.com/example/project
* https://gitlab.com/example/group/project
* git://git.foobar.org/example
* git+https://git.foobar.org/example
*GitHub*::
* https://github.com/example/project
* https://github.com/example/project/archive/v1.0/project-v1.0.tar.gz
*GitLab*::
* https://gitlab.com/example/group/project
* https://gitlab.archlinux.org/archlinux/devtools.git
* https://gitlab.archlinux.org/archlinux/devtools/-/releases/v1.1.0/downloads/devtools-v1.1.0.tar.gz
*Hackage*::
* https://hackage.haskell.org/package/xmonad
* https://hackage.haskell.org/package/xmonad-0.18.0/xmonad-0.18.0.tar.gz
* https://hackage.haskell.org/packages/archive/xmonad/0.18.0/xmonad-0.18.0.tar.gz
*NPM*::
* https://registry.npmjs.org/node-gyp/-/node-gyp-10.0.1.tgz
* https://www.npmjs.com/package/node-gyp
*PyPI*::
* https://pypi.io/packages/source/p/pyflakes
* https://pypi.org/packages/source/b/bleach
* https://files.pythonhosted.org/packages/source/p/pyflakes
* https://pypi.org/project/SQLAlchemy/
*RubyGems*::
* https://rubygems.org/downloads/diff-lcs-1.5.1.gem
* https://rubygems.org/gems/diff-lcs
*CPAN*::
* https://search.cpan.org/CPAN/authors/id/C/CO/COSIMO/Locale-PO-0.27.tar.gz
* https://cpan.metacpan.org/authors/id/C/CO/COSIMO/Locale-PO-0.27.tar.gz
*crates.io*::
* https://static.crates.io/crates/shotgun/shotgun-1.0.crate
* https://crates.io/api/v1/crates/shotgun/1.0/download
* https://crates.io/crates/git-smash
Examples
--------
*pkgctl version setup*::
Detects the source from the current directory's PKGBUILD(1) and
sets up a basic `.nvchecker.toml`.
*pkgctl version setup --url https://github.com/example/project*::
Generates an `.nvchecker.toml` for the current PKGBUILD(1) but
overrides the source URL with the specified GitHub project.
See Also
--------
pkgctl-version(1)
pkgctl-version-check(1)
nvchecker(1)
PKGBUILD(5)
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,53 @@
pkgctl-version-upgrade(1)
=========================
Name
----
pkgctl-version-upgrade - Adjust the PKGBUILD to match the latest upstream version
Synopsis
--------
pkgctl version upgrade [OPTIONS] [PKGBASE...]
Description
-----------
Streamlines the process of keeping PKGBUILD files up-to-date with the latest
upstream versions.
Upon execution, it automatically adjusts the PKGBUILD file, ensuring that the
pkgver field is set to match the latest version available from the upstream
source. In addition to updating the pkgver, this command also resets the pkgrel
to 1 and updates checksums.
Outputs a summary of upgraded packages, up-to-date packages, and any check
failures.
This simplifies the maintenance of PKGBUILD files, reducing the manual effort
required to track and implement version changes from upstream sources.
Configuration
-------------
Uses nvchecker(1) and a `.nvchecker.toml` file located alongside the
PKGBUILD. Refer to the configuration section in pkgctl-version(1).
Options
-------
*--no-update-checksums*::
Disable computation and update of the checksums
*-v, --verbose*::
Display results including up-to-date versions
*-h, --help*::
Show a help text
See Also
--------
pkgctl-version(1)
nvchecker(1)
include::include/footer.asciidoc[]

View File

@@ -3,16 +3,41 @@ pkgctl-version(1)
Name
----
pkgctl-version - Show pkgctl version information
pkgctl-version - Check and manage package versions against upstream
Synopsis
--------
pkgctl version [OPTIONS]
pkgctl version [OPTIONS] [SUBCOMMAND]
Description
-----------
Shows the current version information of pkgctl.
Commands related to package versions, including checks for outdated packages.
Uses nvchecker(1) and a `.nvchecker.toml` file located alongside the
PKGBUILD.
Configuration
-------------
The `.nvchecker.toml` file must contain a section that matches the
package's pkgbase. The pkgbase section within the `.nvchecker.toml` file
specifies the source and method for checking the latest version of the
corresponding package.
Use pkgctl-version-setup(1) to automatically detect and setup a basic nvchecker
config based on the source array of the package PKGBUILD.
For detailed information on the various configuration options available for the
`.nvchecker.toml` file, refer to the configuration files section in
nvchecker(1). This documentation provides insights into the possible
options that can be utilized to customize the version checking process.
To supply GitHub or GitLab tokens to nvchecker, a `keyfile.toml` should be
placed in the `$XDG_CONFIG_HOME`/nvchecker` directory. This keyfile is
used for providing the necessary authentication tokens required for
accessing the GitHub or GitLab API.
Options
-------
@@ -20,4 +45,23 @@ Options
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl version check::
Compares local package versions against upstream
pkgctl version setup::
Automatically detect and setup a basic nvchecker config
pkgctl version upgrade::
Adjust the PKGBUILD to match the latest upstream version
See Also
--------
pkgctl-version-check(1)
pkgctl-version-setup(1)
pkgctl-version-upgrade(1)
include::include/footer.asciidoc[]

View File

@@ -12,7 +12,12 @@ pkgctl [SUBCOMMAND] [OPTIONS]
Description
-----------
TODO
Command-line utility serving as a unified interface for multiple development tools.
This tool aims to simplify and optimize interactions with devtools by offering
various subcommands for executing tasks related to package management, repository management,
version control, among others.
Utilizing pkgctl enables users to efficiently administer their development workflows.
Options
-------
@@ -26,6 +31,9 @@ Options
Subcommands
-----------
pkgctl aur::
Interact with the Arch User Repository
pkgctl auth::
Authenticate with services like GitLab
@@ -33,29 +41,38 @@ pkgctl build::
Build packages inside a clean chroot
pkgctl db::
Pacman database modification for packge update, move etc
Pacman database modification for package update, move etc
pkgctl diff::
Compare package files using different modes
pkgctl issue::
Work with GitLab packaging issues
pkgctl release::
Release step to commit, tag and upload build artifacts
pkgctl repo::
Manage Git packaging repositories and their configuration
pkgctl search::
Search for an expression across the GitLab packaging group
pkgctl version::
Show pkgctl version information
Check and manage package versions against upstream
See Also
--------
linkman:pkgctl-auth[1]
linkman:pkgctl-build[1]
linkman:pkgctl-db[1]
linkman:pkgctl-diff[1]
linkman:pkgctl-release[1]
linkman:pkgctl-repo[1]
linkman:pkgctl-version[1]
pkgctl-aur(1)
pkgctl-auth(1)
pkgctl-build(1)
pkgctl-db(1)
pkgctl-diff(1)
pkgctl-issue(1)
pkgctl-release(1)
pkgctl-repo(1)
pkgctl-search(1)
pkgctl-version(1)
include::include/footer.asciidoc[]

View File

@@ -16,19 +16,19 @@ umask 0022
working_dir=''
files=()
mount_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
echo "A wrapper around systemd-nspawn. Provides support for pacman."
echo
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -h This message'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
echo ' -f <src>[:<dst>] Copy src file from the host to the chroot.'
echo ' If dst file is not provided, it defaults to src'
echo ' -s Do not run setarch'
echo ' -h This message'
exit 1
}
@@ -56,12 +56,25 @@ shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
nspawn_args=(
--quiet
--directory="$working_dir"
--setenv="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin"
--register=no
--slice="devtools-$(systemd-escape "${SUDO_USER:-$USER}")"
--machine="arch-nspawn-$$"
--as-pid2
--console=autopipe
--timezone=off
)
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi
# shellcheck disable=2016
host_mirrors=($(pacman-conf --repo extra Server 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#'))
host_cachemirrors=($(pacman-conf --repo extra CacheServer 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#'))
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
@@ -83,10 +96,10 @@ while read -r line; do
done
done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
mount_args+=("--bind=${cache_dirs[0]//:/\\:}")
nspawn_args+=(--bind="${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("--bind-ro=${cache_dir//:/\\:}")
nspawn_args+=(--bind-ro="${cache_dir//:/\\:}")
done
# {{{ functions
@@ -96,13 +109,23 @@ copy_hostconf () {
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $host_cachemirrors ]] && printf 'CacheServer = %s\n' "${host_cachemirrors[@]}" >>"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
if [[ -n $makepkg_conf ]]; then
cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
if [[ -d "${makepkg_conf}.d" ]] && is_globfile "${makepkg_conf}.d"/*.conf; then
mkdir --parents "$working_dir/etc/makepkg.conf.d/"
cp "${makepkg_conf}.d/"*.conf "$working_dir/etc/makepkg.conf.d/"
fi
fi
local file
for file in "${files[@]}"; do
mkdir -p "$(dirname "$working_dir$file")"
cp -T "$file" "$working_dir$file"
src="${file%%:*}"
dst="${file#*:}"
mkdir -p "$(dirname "$working_dir$dst")"
cp -T "$src" "$working_dir$dst"
done
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf"
@@ -129,9 +152,4 @@ else
set_arch="${CARCH}"
fi
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn -q \
-D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \
"${mount_args[@]}" \
"$@"
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn "${nspawn_args[@]}" "$@"

View File

@@ -79,6 +79,13 @@ check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAG
# Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}")
# Automatically recreate the root chroot if a version mismatch is detected
CURRENT_CHROOT_VERSION=$(cat "${chroots}/${repo}-${arch}/root/.arch-chroot")
if [[ -f "${chroots}/${repo}-${arch}/root/.arch-chroot" ]] && [[ "$CURRENT_CHROOT_VERSION" != "$CHROOT_VERSION" ]]; then
warning "Recreating chroot '%s' (%s) as it is not at version %s" "${chroots}/${repo}-${arch}/root" "$CURRENT_CHROOT_VERSION" "$CHROOT_VERSION"
clean_first=true
fi
if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}"

View File

@@ -35,7 +35,7 @@ fi
# validate repo is really repo-arch
if [[ -z $FORCE ]]; then
for tag in "$@"; do
if ! in_array "$tag" "${_tags[@]}"; then
if ! in_array "$tag" "${DEVTOOLS_VALID_TAGS[@]}"; then
die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag"
fi
done

View File

@@ -140,7 +140,7 @@ for _pkgname in "${pkgname[@]}"; do
bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
diff --side-by-side --suppress-common-lines --width="${COLUMNS:-130}" --color=auto "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"

View File

@@ -5,9 +5,13 @@
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/util/srcinfo.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh
source /usr/share/makepkg/util/util.sh
set -eo pipefail
check_pkgbuild_validity() {
# shellcheck source=contrib/makepkg/PKGBUILD.proto
@@ -70,6 +74,12 @@ if ! repo_spec=$(git config --local devtools.version) || [[ ${repo_spec} != "${G
exit 1
fi
if ! repo_variant=$(git config --local devtools.variant) || [[ ${repo_variant} != canonical ]]; then
error "cannot release from a repository with none canonical specs (%s), try:" "${repo_variant:-development}"
msg2 'pkgctl repo configure'
exit 1
fi
if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then
die 'must be run from the main branch'
fi
@@ -110,8 +120,20 @@ if (( ${#validpgpkeys[@]} != 0 )); then
git add --force -- keys/pgp/*
fi
needsversioning=()
if [[ ! -e REUSE.toml || ! -e LICENSE || ! -d LICENSES ]]; then
# TODO: Make this a hard failure in the future after packagers have had
# some time to add licenses to all packages.
warning "package doesn't have proper licensing information, set it up using:"
msg2 'pkgctl license setup'
else
pkgctl license check
needsversioning+=(REUSE.toml LICENSE LICENSES/*)
fi
# find files which should be under source control
needsversioning=(PKGBUILD)
needsversioning+=(PKGBUILD)
for s in "${source[@]}"; do
[[ $s != *://* ]] && needsversioning+=("$s")
done
@@ -133,7 +155,7 @@ if (( ${#needsversioning[*]} )); then
if [[ ! -f "${file}" ]]; then
continue
fi
if ! git ls-files --error-unmatch "$file"; then
if ! git ls-files --error-unmatch "$file" >/dev/null; then
die "%s is not under version control" "$file"
fi
done
@@ -141,7 +163,7 @@ fi
server=${PACKAGING_REPO_RELEASE_HOST}
rsyncopts=(-e ssh -p '--chmod=ug=rw,o=r' -c -h -L --progress --partial -y)
rsyncopts=("${RSYNC_OPTS[@]}" --perms --chmod='ug=rw,o=r')
archreleaseopts=()
while getopts ':l:a:s:f' flag; do
case $flag in
@@ -177,13 +199,10 @@ done
# check for PKGBUILD standards
check_pkgbuild_validity
# auto generate .SRCINFO if present
if [[ -f .SRCINFO ]]; then
stat_busy 'Generating .SRCINFO'
makepkg --printsrcinfo > .SRCINFO
git add .SRCINFO
stat_done
fi
# auto generate .SRCINFO
# shellcheck disable=SC2119
write_srcinfo_file
git add --force .SRCINFO
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'
@@ -206,14 +225,14 @@ if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
echo "$msgtemplate" > "$msgfile"
if [[ -n $GIT_EDITOR ]]; then
$GIT_EDITOR "$msgfile" || die
elif giteditor=$(git config --get core.editor); then
$giteditor "$msgfile" || die
elif [[ -n $VISUAL ]]; then
$VISUAL "$msgfile" || die
elif [[ -n $EDITOR ]]; then
$EDITOR "$msgfile" || die
elif giteditor=$(git config --get core.editor); then
$giteditor "$msgfile" || die
else
die "No usable editor found (tried \$GIT_EDITOR, \$VISUAL, \$EDITOR, git config [core.editor])."
die "No usable editor found (tried \$GIT_EDITOR, git config [core.editor], \$VISUAL, \$EDITOR)."
fi
[[ -s $msgfile ]] || die
stat_busy 'Committing changes'

View File

@@ -328,7 +328,7 @@ if (( $# < 2 )); then
comparepkg="$1"
fi
oldpkg=$(fetch_pkg "$comparepkg") || exit 1
oldpkg=$(fetch_pkg "$comparepkg") || continue
diff_pkgs "$oldpkg" "$pkgfile"
done

60
src/lib/api/archweb.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_API_ARCHWEB_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_API_ARCHWEB_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -e
set -o pipefail
archweb_query_all_packages() {
local -a pkgbases
[[ -z ${WORKDIR:-} ]] && setup_workdir
stat_busy "Query all released packages"
mapfile -t pkgbases < <(
curl --location --show-error --no-progress-meter --fail --retry 3 --retry-delay 3 \
"${PKGBASE_MAINTAINER_URL}" 2> "${WORKDIR}/error" \
| jq --raw-output --exit-status 'keys[]' 2> "${WORKDIR}/error"
)
if ! wait $!; then
stat_failed
print_workdir_error
return 1
fi
stat_done
printf "%s\n" "${pkgbases[@]}"
return 0
}
archweb_query_maintainer_packages() {
local maintainer=$1
local -a pkgbases
[[ -z ${WORKDIR:-} ]] && setup_workdir
stat_busy "Query maintainer packages"
mapfile -t pkgbases < <(
curl --location --show-error --no-progress-meter --fail --retry 3 --retry-delay 3 \
"${PKGBASE_MAINTAINER_URL}" 2> "${WORKDIR}/error" \
| jq --raw-output --exit-status '. as $parent | keys[] | select(. as $key | $parent[$key] | index("'"${maintainer}"'"))' 2> "${WORKDIR}/error"
)
if ! wait $!; then
stat_failed
print_workdir_error
return 1
fi
stat_done
printf "%s\n" "${pkgbases[@]}"
return 0
}

View File

@@ -8,18 +8,72 @@ DEVTOOLS_INCLUDE_API_GITLAB_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/cache.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/cache.sh
# shellcheck source=src/lib/config.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/config.sh
# shellcheck source=src/lib/valid-issue.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-issue.sh
set -e
graphql_api_call() {
local outfile=$1
local request=$2
local node_type=$3
local data=$4
local hasNextPage cursor
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
msg_error " api call failed: No token provided"
return 1
fi
[[ -z ${WORKDIR:-} ]] && setup_workdir
api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX)
# normalize graphql data and prepare query
data="${data//\"/\\\"}"
data='{
"query": "'"${data}"'"
}'
data="${data//$'\t'/ }"
data="${data//$'\n'/}"
cursor=""
hasNextPage=true
while [[ ${hasNextPage} == true ]]; do
data=$(sed -E 's|after: \\"[a-zA-Z0-9]*\\"|after: \\"'"${cursor}"'\\"|' <<< "${data}")
result="${api_workdir}/result.${cursor}"
if ! curl --request "${request}" \
--url "https://${GITLAB_HOST}/api/graphql" \
--header "Authorization: Bearer ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data "${data}" \
--output "${result}" \
--silent; then
msg_error " api call failed: $(cat "${outfile}")"
return 1
fi
hasNextPage=$(jq --raw-output ".data | .${node_type} | .pageInfo | .hasNextPage" < "${result}")
cursor=$(jq --raw-output ".data | .${node_type} | .pageInfo | .endCursor" < "${result}")
cp "${result}" "${api_workdir}/tmp"
jq ".data.${node_type}.nodes" "${api_workdir}/tmp" > "${result}"
done
jq --slurp add "${api_workdir}"/result.* > "${outfile}"
return 0
}
gitlab_api_call() {
local outfile=$1
local request=$2
local endpoint=$3
local data=${4:-}
local error
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
@@ -38,27 +92,124 @@ gitlab_api_call() {
return 1
fi
if ! gitlab_check_api_errors "${outfile}"; then
return 1
fi
return 0
}
gitlab_api_call_paged() {
local outfile=$1
local status_file=$2
local request=$3
local endpoint=$4
local data=${5:-}
local result header
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
msg_error " api call failed: No token provided"
return 1
fi
[[ -z ${WORKDIR:-} ]] && setup_workdir
api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX)
tmp_file=$(mktemp --tmpdir="${api_workdir}" spinner.tmp.XXXXXXXXXX)
local next_page=1
local total_pages=1
local known_total_pages=1
local percentage=100
while [[ -n "${next_page}" ]]; do
percentage=$(( 100 * next_page / total_pages ))
printf "📡 Querying GitLab: %s/%s [%s] %%spinner%%" \
"${BOLD}${next_page}" "${known_total_pages}" "${percentage}%${ALL_OFF}" \
> "${tmp_file}"
mv "${tmp_file}" "${status_file}"
result="${api_workdir}/result.${next_page}"
header="${api_workdir}/header"
if ! curl --request "${request}" \
--get \
--url "https://${GITLAB_HOST}/api/v4/${endpoint}&per_page=100&page=${next_page}" \
--header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data-urlencode "${data}" \
--dump-header "${header}" \
--output "${result}" \
--silent; then
msg_error " api call failed: $(cat "${result}")"
return 1
fi
if ! gitlab_check_api_errors "${result}"; then
return 1
fi
next_page=$(grep "x-next-page" "${header}" | tr -d '\r' | awk '{ print $2 }')
total_pages=$(grep "x-total-pages" "${header}" | tr -d '\r' | awk '{ print $2 }')
# The api is not guaranteed to return x-total-pages for larger query results
# https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/23931
# https://gitlab.com/gitlab-org/gitlab/-/issues/436373
if (( total_pages == 0 )); then
total_pages=${next_page}
known_total_pages="?"
else
known_total_pages=${total_pages}
fi
done
jq --slurp add "${api_workdir}"/result.* > "${outfile}"
return 0
}
gitlab_check_api_errors() {
local file=$1
local error
# search API only returns an array, no errors
if [[ $(jq --raw-output 'type' < "${file}") == "array" ]]; then
return 0
fi
# check for general purpose api error
if error=$(jq --raw-output --exit-status '.error' < "${outfile}"); then
if error=$(jq --raw-output --exit-status '.error' < "${file}"); then
msg_error " api call failed: ${error}"
return 1
fi
# check for api specific error messages
if ! jq --raw-output --exit-status '.id' < "${outfile}" >/dev/null; then
if jq --raw-output --exit-status '.message | keys[]' < "${outfile}" &>/dev/null; then
if ! jq --raw-output --exit-status '.id' < "${file}" >/dev/null; then
if jq --raw-output --exit-status '.message | keys[]' < "${file}" &>/dev/null; then
while read -r error; do
msg_error " api call failed: ${error}"
done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${outfile}")
elif error=$(jq --raw-output --exit-status '.message' < "${outfile}"); then
done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${file}")
elif error=$(jq --raw-output --exit-status '.message' < "${file}"); then
msg_error " api call failed: ${error}"
fi
return 1
fi
return 0
}
graphql_check_api_errors() {
local file=$1
local error
# early exit if we do not have errors
if ! jq --raw-output --exit-status '.errors[]' < "${file}" &>/dev/null; then
return 0
fi
# check for api specific error messages
while read -r error; do
msg_error " api call failed: ${error}"
done < <(jq --raw-output --exit-status '.errors[].message' < "${file}")
return 1
}
gitlab_api_get_user() {
local outfile username
@@ -81,6 +232,118 @@ gitlab_api_get_user() {
return 0
}
gitlab_api_get_project_name_mapping() {
local query=$1
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
# query user details
if ! graphql_api_call "${outfile}" POST projects "${query}"; then
msg_warn " Invalid token provided?"
exit 1
fi
cat "${outfile}"
return 0
}
gitlab_lookup_project_names() {
local status_file=$1; shift
local project_ids=("$@")
local graphql_lookup_batch=200
local project_name_cache_file tmp_file from length percentage
local project_slice query projects mapping_output
# collect project ids whose name needs to be looked up
project_name_cache_file=$(get_cache_file gitlab/project_id_to_name)
lock 11 "${project_name_cache_file}" "Locking project name cache"
# early exit if there is nothing new to look up
if (( ! ${#project_ids[@]} )); then
cat "${project_name_cache_file}"
# close project name cache lock
lock_close 11
return
fi
# reduce project_ids to uncached entries
mapfile -t project_ids < <(
printf "%s\n" "${project_ids[@]}" | \
grep --invert-match --file <(awk '{ print $1 }' < "${project_name_cache_file}" ))
# look up project names
tmp_file=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api-spinner.tmp.XXXXXXXXXX)
local entries="${#project_ids[@]}"
local until=0
while (( until < entries )); do
from=${until}
until=$(( until + graphql_lookup_batch ))
if (( until > entries )); then
until=${entries}
fi
length=$(( until - from ))
percentage=$(( 100 * until / entries ))
printf "📡 Querying GitLab project names: %s/%s [%s] %%spinner%%" \
"${BOLD}${until}" "${entries}" "${percentage}%${ALL_OFF}" \
> "${tmp_file}"
mv "${tmp_file}" "${status_file}"
project_slice=("${project_ids[@]:${from}:${length}}")
printf -v projects '"gid://gitlab/Project/%s",' "${project_slice[@]}"
query='{
projects(after: "" ids: ['"${projects}"']) {
pageInfo {
startCursor
endCursor
hasNextPage
}
nodes {
id
name
}
}
}'
mapping_output=$(gitlab_api_get_project_name_mapping "${query}")
# update cache
while read -r project_id project_name; do
printf "%s %s\n" "${project_id}" "${project_name}" >> "${project_name_cache_file}"
done < <(jq --raw-output \
'.[] | "\(.id | rindex("/") as $lastSlash | .[$lastSlash+1:]) \(.name)"' \
<<< "${mapping_output}")
done
cat "${project_name_cache_file}"
# close project name cache lock
lock_close 11
}
longest_package_name_from_ids() {
local project_ids=("$@")
local longest=0
# collect project ids whose name needs to be looked up
project_name_cache_file=$(get_cache_file gitlab/project_id_to_name)
lock 11 "${project_name_cache_file}" "Locking project name cache"
# read project_id to name mapping from cache
while read -r project_id project_name; do
if (( ${#project_name} > longest )) && in_array "${project_id}" "${project_ids[@]}"; then
longest="${#project_name}"
fi
done < "${project_name_cache_file}"
# close project name cache lock
lock_close 11
printf "%s" "${longest}"
}
# Convert arbitrary project names to GitLab valid path names.
#
# GitLab has several limitations on project and group names and also maintains
@@ -130,3 +393,511 @@ gitlab_api_create_project() {
printf "%s" "${path}"
return 0
}
# TODO: parallelize
# https://docs.gitlab.com/ee/api/search.html#scope-blobs
gitlab_api_search() {
local search=$1
local status_file=$2
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/groups/archlinux%2fpackaging%2fpackages/search?scope=blobs" "search=${search}"; then
return 1
fi
cat "${outfile}"
return 0
}
# https://docs.gitlab.com/ee/api/projects.html#get-single-project
gitlab_project() {
local project=$1
local outfile project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${project}")
if ! gitlab_api_call "${outfile}" GET "projects/archlinux%2fpackaging%2fpackages%2f${project_path}/"; then
return 1
fi
cat "${outfile}"
return 0
}
# TODO: parallelize
# https://docs.gitlab.com/ee/api/issues.html#list-project-issues
gitlab_projects_issues_list() {
local project=$1
local status_file=$2
local params=${3:-}
local data=${4:-}
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/projects/archlinux%2fpackaging%2fpackages%2f${project}/issues?${params}" "${data}"; then
return 1
fi
cat "${outfile}"
return 0
}
# TODO: parallelize
# https://docs.gitlab.com/ee/api/issues.html#list-project-issues
gitlab_group_issue_list() {
local group=$1
local status_file=$2
local params=${3:-}
local data=${4:-}
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
group=${group//\//%2f}
params=${params//\[/%5B}
params=${params//\]/%5D}
if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/groups/${group}/issues?${params}" "${data}"; then
return 1
fi
cat "${outfile}"
}
# https://docs.gitlab.com/ee/api/issues.html#single-project-issue
gitlab_project_issue() {
local pkgbase=$1
local iid=$2
local outfile data path project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
if ! gitlab_api_call "${outfile}" GET "projects/archlinux%2fpackaging%2fpackages%2f${project_path}/issues/${iid}"; then
return 1
fi
if ! path=$(jq --raw-output --exit-status '.title' < "${outfile}"); then
msg_error " failed to query path: $(cat "${outfile}")"
return 1
fi
cat "${outfile}"
return 0
}
gitlab_project_issue_create() {
local pkgbase=$1
local title=$2
local description=$3
local confidential=$4
shift 4
local labels=("${@}")
local outfile data iid project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
data=$(jq --null-input \
--arg title "${title}" \
--arg description "${description}" \
--arg confidential "${confidential}" \
--arg labels "$(join_by , "${labels[@]}")" \
'$ARGS.named')
if ! gitlab_api_call "${outfile}" POST "/projects/archlinux%2fpackaging%2fpackages%2f${project_path}/issues" "${data}"; then
return 1
fi
if ! iid=$(jq --raw-output --exit-status '.iid' < "${outfile}"); then
msg_error " failed to query note: $(cat "${outfile}")"
return 1
fi
cat "${outfile}"
return 0
}
# TODO: parallelize
# https://docs.gitlab.com/ee/api/notes.html#list-project-issue-notes
gitlab_project_issue_notes() {
local project=$1
local iid=$2
local status_file=$3
local params=${4:-}
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/projects/archlinux%2fpackaging%2fpackages%2f${project}/issues/${iid}/notes?${params}"; then
return 1
fi
cat "${outfile}"
return 0
}
# https://docs.gitlab.com/ee/api/issues.html#edit-an-issue
gitlab_project_issue_edit() {
local pkgbase=$1
local iid=$2
local params=$3
local data=${4:-}
local outfile data path project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
if ! gitlab_api_call "${outfile}" PUT "/projects/archlinux%2fpackaging%2fpackages%2f${project_path}/issues/${iid}?${params}" "${data}"; then
return 1
fi
if ! path=$(jq --raw-output --exit-status '.title' < "${outfile}"); then
msg_error " failed to query path: $(cat "${outfile}")"
return 1
fi
cat "${outfile}"
return 0
}
gitlab_create_project_issue_note() {
local pkgbase=$1
local iid=$2
local body=$3
local outfile data path project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
data=$(jq --null-input --arg body "${body}" '$ARGS.named')
if ! gitlab_api_call "${outfile}" POST "/projects/archlinux%2fpackaging%2fpackages%2f${project_path}/issues/${iid}/notes" "${data}"; then
return 1
fi
if ! path=$(jq --raw-output --exit-status '.body' < "${outfile}"); then
msg_error " failed to query note: $(cat "${outfile}")"
return 1
fi
cat "${outfile}"
return 0
}
gitlab_project_issue_move() {
local pkgbase=$1
local iid=$2
local to_project_id=$3
local outfile path project_path
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
if ! gitlab_api_call "${outfile}" POST "/projects/archlinux%2fpackaging%2fpackages%2f${project_path}/issues/${iid}/move?to_project_id=${to_project_id}"; then
return 1
fi
if ! path=$(jq --raw-output --exit-status '.title' < "${outfile}"); then
msg_error " failed to move issue: $(cat "${outfile}")"
return 1
fi
cat "${outfile}"
return 0
}
gitlab_severity_from_labels() {
local labels=("$@")
local severity="unknown"
local label
for label in "${labels[@]}"; do
if [[ ${label} == severity::* ]]; then
severity="${label#*-}"
fi
done
printf "%s" "${severity}"
}
severity_as_gitlab_label() {
local severity=$1
case "${severity}" in
lowest)
printf "severity::5-%s" "${severity}" ;;
low)
printf "severity::4-%s" "${severity}" ;;
medium)
printf "severity::3-%s" "${severity}" ;;
high)
printf "severity::2-%s" "${severity}" ;;
critical)
printf "severity::1-%s" "${severity}" ;;
*)
return 1 ;;
esac
return 0
}
gitlab_priority_from_labels() {
local labels=("$@")
local priority="normal"
local label
for label in "${labels[@]}"; do
if [[ ${label} == priority::* ]]; then
priority="${label#*-}"
fi
done
printf "%s" "${priority}"
}
priority_as_gitlab_label() {
local priority=$1
case "${priority}" in
low)
printf "priority::4-%s" "${priority}" ;;
normal)
printf "priority::3-%s" "${priority}" ;;
high)
printf "priority::2-%s" "${priority}" ;;
urgent)
printf "priority::1-%s" "${priority}" ;;
*)
return 1 ;;
esac
return 0
}
gitlab_scope_from_labels() {
local labels=("$@")
local scope="unknown"
local label
for label in "${labels[@]}"; do
if [[ ${label} == scope::* ]]; then
scope="${label#*::}"
fi
done
printf "%s" "${scope}"
}
scope_as_gitlab_label() {
local scope=$1
if ! in_array "${scope}" "${DEVTOOLS_VALID_ISSUE_SCOPE[@]}"; then
return 1
fi
printf "scope::%s" "${scope}"
}
gitlab_scope_short() {
local scope=$1
case "${scope}" in
regression)
scope=regress ;;
enhancement)
scope=enhance ;;
documentation)
scope=doc ;;
reproducibility)
scope=repro ;;
out-of-date)
scope=ood ;;
esac
printf "%s" "${scope}"
}
gitlab_scope_color() {
local scope=$1
local color="${GRAY}"
case "${scope}" in
bug)
color="${DARK_RED}" ;;
feature)
color="${DARK_BLUE}" ;;
security)
color="${RED}" ;;
question)
color="${PURPLE}" ;;
regression)
color="${DARK_RED}" ;;
enhancement)
color="${DARK_BLUE}" ;;
documentation)
color="${ALL_OFF}" ;;
reproducibility)
color="${DARK_GREEN}" ;;
out-of-date)
color="${DARK_YELLOW}" ;;
esac
printf "%s" "${color}"
}
status_as_gitlab_label() {
local status=$1
if ! in_array "${status}" "${DEVTOOLS_VALID_ISSUE_STATUS[@]}"; then
return 1
fi
printf "status::%s" "${status}"
return 0
}
gitlab_issue_state_display() {
local state=$1
if [[ ${state} == opened ]]; then
state=open
fi
printf "%s" "${state}"
}
gitlab_issue_status_from_labels() {
local labels=("$@")
local status=unconfirmed
local label
for label in "${labels[@]}"; do
if [[ ${label} == status::* ]]; then
status="${label#*::}"
fi
done
printf "%s" "${status}"
}
gitlab_issue_status_short() {
local status=$1
if [[ ${status} == waiting-* ]]; then
status=waiting
fi
printf "%s" "${status}"
}
gitlab_issue_status_color() {
local status=$1
local color="${GRAY}"
case "${status}" in
confirmed)
color="${GREEN}" ;;
in-progress)
color="${YELLOW}" ;;
in-review)
color="${PURPLE}" ;;
on-hold|unconfirmed)
color="${GRAY}" ;;
waiting-input|waiting-upstream)
color="${DARK_BLUE}" ;;
esac
printf "%s" "${color}"
}
resolution_as_gitlab_label() {
local resolution=$1
if ! in_array "${resolution}" "${DEVTOOLS_VALID_ISSUE_RESOLUTION[@]}"; then
return 1
fi
printf "resolution::%s" "${resolution}"
}
gitlab_resolution_from_labels() {
local labels=("$@")
local label
for label in "${labels[@]}"; do
if [[ ${label} == resolution::* ]]; then
printf "%s" "${label#*::}"
return 0
fi
done
return 1
}
gitlab_resolution_color() {
local resolution=$1
local color=""
case "${resolution}" in
cant-reproduce)
color="${DARK_YELLOW}" ;;
completed)
color="${GREEN}" ;;
duplicate)
color="${GRAY}" ;;
invalid)
color="${DARK_YELLOW}" ;;
not-a-bug)
color="${GRAY}" ;;
upstream)
color="${PURPLE}" ;;
wont-fix)
color="${DARK_BLUE}" ;;
esac
printf "%s" "${color}"
}
gitlab_severity_color() {
local severity=$1
local color="${PURPLE}"
case "${severity}" in
lowest)
color="${DARK_GREEN}" ;;
low)
color="${GREEN}" ;;
medium)
color="${YELLOW}" ;;
high)
color="${RED}" ;;
critical)
color="${RED}${UNDERLINE}" ;;
esac
printf "%s" "${color}"
}
gitlab_priority_color() {
local priority=$1
local color="${PURPLE}"
case "${priority}" in
low)
color="${DARK_GREEN}" ;;
normal)
color="${GREEN}" ;;
high)
color="${YELLOW}" ;;
urgent)
color="${RED}" ;;
esac
printf "%s" "${color}"
}
gitlab_issue_state_color() {
local state=$1
local state_color="${DARK_GREEN}"
if [[ ${state} == closed ]]; then
state_color="${DARK_RED}"
fi
printf "%s" "${state_color}"
}

View File

@@ -4,7 +4,7 @@
:
# shellcheck disable=2034
CHROOT_VERSION='v5'
CHROOT_VERSION='v6'
##
# usage : check_root $keepenv

65
src/lib/aur.sh Normal file
View File

@@ -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
}

Some files were not shown because too many files have changed in this diff Show More