Compare commits

..

54 Commits

Author SHA1 Message Date
Levente Polyak
1b808b8e32 chore(release): version v1.0.1 2023-05-24 03:19:26 +02:00
Chih-Hsuan Yen
e4c40a9802 fix(completion): incorporate repo layout into offload-build completion
Use new repo names for build targets. This follows /usr/bin/*-build
links other than x86_64_v3 ones.
2023-05-24 03:06:03 +02:00
Levente Polyak
a08bc2acf4 feature(clone): add protocol option to force cloning over HTTPS
This is a rather quick and simple implementation to override the current
logic and force clone with HTTPS. Allowing to explicitly clone over HTTPS
is currently required to unblock reproducible builds where no ssh keys
and GitLab user accounts are set up as of now. Hence this quick solution
comes into play to mitigate the regression on reproducible builds
builders.

Revisit the overall auto detection and protocol logic approach for a
later release related to some ideas floating around in pending
merge-requests.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-24 02:50:08 +02:00
Morten Linderud
f11cb9018e feature(commitpkg): auto generate .SRCINFO if present
This currently makes .SRCINFO files opt-in and helps to keep the file up
to date if already present.

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
2023-05-23 03:03:39 +02:00
Jan Alexander Steffens (heftig)
d759eadb50 fix(diffpkg): Fix scoping of DIFFOPTIONS when comparing split pkgs
`diff_pkgs` needs to use a local variable for its options, otherwise
they will accumulate for each package diffed.

Whem comparing split packages this lead to earlier mutated DIFFOPTIONS
containing too many labels which resulted in a failure.
2023-05-23 02:20:03 +02:00
Jan Alexander Steffens (heftig)
1c399778f9 fix(commitpkg): reliably check tree status regardless of configuration
Check git status --porcelain, not --short.

`--short` is influenced by user configuration like `status.branch`
making it non-empty even on a clean tree. Use `--porcelain` to avoid
this.
2023-05-23 01:47:00 +02:00
Levente Polyak
edc14ef19c Version 1.0.0 2023-05-21 12:25:44 +02:00
Levente Polyak
6ce666a166 feature(parallel): run up to N jobs in parallel for repo clone/configure
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 16:12:45 +02:00
Levente Polyak
bf61b8472a chore(archroot): force build chroot recreation to adapt new configs
Bumping the chroot version will result in the chroots checking against
the local version and force recreation in case they do not match.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 15:11:16 +02:00
Levente Polyak
80a8cdcba2 chore(git): use default ssh port 22 url scheme
We only need to specifically use ssh:// protocol prefix if we want to
specify a special port. As we moved to support pulling directly over
port 22 from out GitLab instance we can change the url scheme to the
simple variant.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 12:20:36 +02:00
Levente Polyak
41d4624879 fix(archroot): pass along the real command and argv by the caller
Before modularizing the repo layout, we used m4_include to assemble
together sources into a single file. Now, we properly use a library
layout without assembling multiple files, which means we cannot anymore
rely on BASH_SOURCE inside the library file. Hence, pass along the
actual command and argv from the check_root caller.

Fixes: src: modularize repo layout into a library

Signed-off-by: Morten Linderud <foxboron@archlinux.org>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:20:41 +02:00
Felix Yan
4d3ab0b489 config: update pacman configs for new repository layout
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Levente Polyak
830dcde2d8 pkgctl build: support worker slots for none tty builds
Allow overriding the worker slot with a dedicated option. Furthermore
detect if the current tty is no pts and fall back to choosing a random
worker slot between 1 and number of available processing units.

Fixes #137

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Caleb Maclennan
1da97a8b36 doc: Fixup formatting issues in asciidoc man pages 2023-05-20 00:08:13 +02:00
Alexander Epaneshnikov
9330671825 archrelease: fix mangled release package status output
Git push will print its status, hence switch from a busy line
indicator to a single line message and allow Git to print its status
accordingly.

Otherwise we get:
==> Releasing package...Enumerating objects: 6, done.
2023-05-20 00:08:13 +02:00
Christian Heusel
8e3b6bcc5b pkgctl repo clone: add option to switch working tree
Add an option to call the switch command after clone. Switch to a
specified version. The working tree and the index are updated to match
the version.

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Christian Heusel
4289be212b build: allow release options only in combination with --release
It leads to weird expectations when using --db-update or --message
without --release. Make the behavior more user friendly, by aborting the
operation and explaining that release options only work in conjunction
with the release option.

Fixes #131

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-05-20 00:08:13 +02:00
Christian Heusel
ed96635141 pkgctl repo: introduce the switch subcommand
Signed-off-by: Christian Heusel <christian@heusel.eu>
Co-Authored-By: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Levente Polyak
f961e2e948 completion: implemented structured declarative bash completions
This will make it tremendously easier to add arguments, subcommands and
special positional option handling. Instead of the need to code the
nested structure via bash and switch cases, we can simply declare
functions and arrays with the matching names according to the
subcommands or argument labels.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:13 +02:00
Christian Heusel
645a5a9f04 pkgctl: introduce the version subcommand
Related to https://gitlab.archlinux.org/archlinux/devtools/-/issues/125

Closes #125

Signed-off-by: Christian Heusel <christian@heusel.eu>
Co-Authored-By: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
e1142935e5 completion: zsh: allow args even when the command has subcommands
This allows to show arguments on root level of commands that themselves
have subcommands available. Complete those when any - is used in the
completion word.
2023-05-20 00:08:12 +02:00
Levente Polyak
bc182032eb config: fixup file permissions to be more strict
Normally the default in Arch is that all home directories are private.
However, this may have been changed locally. To make sure we never
expose secrets, lets use a umask of 0077 when writing the config.

Additionally add some temporary fixup code to migrate the file and
directory permissions of already existing paths.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
f3518e248c build: support nocheck for initial bootstrap builds
Output a warning when this option is used to remind packagers to rebuild
the packages with checks once the bootstrap cycle has been completed.
2023-05-20 00:08:12 +02:00
Levente Polyak
6c2498750e doc: add dependency declaration to the README.md
This will help to make sure dependencies are explicitly stated and
reflected in the PKGBUILD.
2023-05-20 00:08:12 +02:00
Christian Heusel
5e22e4f81e config: allow suppying the gitlab token via env var
This would allow to supply the gitlab tokens via the env var
DEVTOOLS_GITLAB_TOKEN and therefore allow users to choose whatever
program they want to fill this env var.

Closes #113

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Campbell Jones
a981ef40e8 edit: improve editor presence checking
Adds a check for the configured Git editor (git config core.editor) in
both commitpkg and build.sh.

Additionally, instead of blindly executing vi when all other options are
exhausted, remove it instead as it is a none standard installed editor
anyway.

Closes #106

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
fe2eb3076d rebuildpkgs: drop legacy script, will be replaced with a smarter UX
Instead of trying to port this ancient script, which doesn't even seem
to work with community, let's instead remove it. We will be adding a
replacement script in pkgctl soon with a smarter and more convenient UX.
2023-05-20 00:08:12 +02:00
Levente Polyak
4ae857e665 doc: update manpage footer for GitLab and remove static list of maintainers
The list of all maintainers that have worked so far on devtools is
exceeding a sane amount making each manpage convulsed. The authors can
be pulled from GitLab directly without occupying lots of space on every
manpage. We would like to express gratitude to all our maintainers.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
eda3a4aea0 gitlab: add project path function to map special chars
Automatic path conversion is limited to GitLab API v4 and will be
removed in the future. It's expected that the caller does the path
conversion on caller side and only passes a valid path to the API within
its limitations.

Hence convert project names to valid paths:
  1. replace single '+' between word boundaries with '-'
  2. replace any other '+' with literal 'plus'
  3. replace any special chars other than '_', '-' and '.' with '-'
  4. replace consecutive '_-' chars with a single '-'
  5. replace 'tree' with 'unix-tree' due to GitLab reserved keyword

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:12 +02:00
Levente Polyak
f669a71e84 repo-configure: automatically determine protocol from packager identity
The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and
read-only HTTPS otherwise.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
1d7f997215 build: command to build packages inside a clean chroot 2023-05-20 00:08:11 +02:00
Levente Polyak
7954382401 commitpkg: error out if the repo is not configured to latest specs
This ensures the repository we try to commit and release from uses the
latest distro specs for its local git config. The check errors out early
before touching anything and prints a recommendation how to update the
repo.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
1ae09b43af commitpkg: print deprecation warning when executed directly 2023-05-20 00:08:11 +02:00
Levente Polyak
d402d5f308 archrelease: print deprecation warning when executed directly 2023-05-20 00:08:11 +02:00
Levente Polyak
c839d52793 test: added pkgctl devel wrapper for convenient development testing
For local development testing, there is a convenience wrapper for
`pkgctl` that will automatically build the project using make and proxy
all calls to the local build directory.

Either `./test/bin/pkgctl` can be run directly or the `test/bin`
directory can be added to the PATH.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
cddba60958 archrelease: add checks for valid remote and up-to-date branch ref
It's safest to probe for the validity of the remote origin and abort
early otherwise. This also allows to print some hints how to create or
configure new repositories at appropriate times.
Additionally fetch remote changes and check the local branch contains
the remote branch ref, otherwise abort and print a hint how to pull and
update the branch.

This should add all check needed for the average failure case that may
lead to a weird state or creation of a local tag that may not be
pushable.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
f1673c60ad build: replace m4 defines with sed scripts during build
There is no reason anymore to use m4 since we got rid of the includes by
using library files. Let's replace the last usage of m4 and completely
red rid of it.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-20 00:08:11 +02:00
Levente Polyak
e0307c7925 conf: move makepkg and pacman config into separate conf.d dirs
We have used the datadir like a kitchen sink, lets clean up a bit by
having a better and well structured layout. Put makepkg and pacman
configs in separate directories: makepkg.conf.d and pacman.conf.d.
2023-05-20 00:08:11 +02:00
Levente Polyak
5752488ef1 release: command to commit, tag and upload build artifacts
This is a smart and more convenient invocation of the classical
commitpkg and archrelease with auto-discovery for target repositories
and a shorthand option to directly call db-update.
2023-05-19 22:27:13 +02:00
Levente Polyak
b9db6160a2 git: convert repos and tags config to new repo layout 2023-05-19 22:27:13 +02:00
Levente Polyak
f834fc4700 db: command for Pacman database modification like update, move etc 2023-05-19 22:27:13 +02:00
Levente Polyak
8b5bcd01b4 commitpkg: add exported pgp keys with git 2023-05-19 22:27:13 +02:00
Levente Polyak
2a59c32bf4 repo: added command to create a new packaging repository 2023-05-19 22:27:13 +02:00
Levente Polyak
77d800eab2 auth: implemented module to authenticate against our GitLab
This helps to have a convenient way to manage and test our personal
GitLab tokens. Those are used for certain API calls like creating new
repositories.

prefill the access token web view as per
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#prefill-personal-access-token-name-and-scopes

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
d2245b1943 gitlab: implemented module for required API calls
We need to use API calls as we can't create repositories in protected
namespaces by simply pushing a none existing repository. For privacy
reasons this is limited to private personal repositories in GitLab.
2023-05-19 22:27:12 +02:00
Levente Polyak
f63d343e40 config: implemented simple config module to store token and settings 2023-05-19 22:27:12 +02:00
Levente Polyak
b5d5402e43 src: modularize repo layout into a library
This will greatly help us to structure the functionality and commands in
a more sane way. We will distribute the sources as actual libraries and
reuse code with imports instead of processing everything with m4 and
duplicating a lot of code.
2023-05-19 22:27:12 +02:00
Levente Polyak
a8be7423ef pkgctl: add a unified command-line frontend for devtools
This is the first step of a simple and highly structured unified
interface to devtools commands in a single wrapper.

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

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
d15bd29a9d pkgrepo: add subcommand to open the packaging repository's website
This can be quite handy if a packager quickly wants to check the GitLab
page for merge requests or but reports. Quickly calling a cli command
inside the current packaging clone or with the pkgname provided will
open the remote location inside the browser.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
95424a88eb pkgrepo: add option to clone all existing packages
This can be very handy for cache warming on the repo server or
to perform mass operations on all PKGBUILDs.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
3d3176beb6 pkgrepo: rename archco as a general purpose tool for packaging repos
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
6aa42e1f6e commitpkg: use library location for common server and remote properties
It makes a lot of sense to have them in a central place that can be
swapped and also re-used across different execution units. Hence lets
move the repos.archlinux.org host to lib/common.sh

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:12 +02:00
Levente Polyak
30616c4fde archco: add option to clone all packages of a maintainer
Query Archweb to retrieve a list of all packages of a maintainer by
their pkgbase. AFterwards loop through all packages and clone them.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:11 +02:00
Levente Polyak
5eb09a9cc9 archco: implement clone and configure subcommands
Manages Git packaging repositories and helps with their configuration
according to distro specs.

Git author information and the used signing key is set up from
makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.

The configure command can be used to synchronize the distro specs and
makepkg.conf settings for previously cloned repositories.

The unprivileged option can be used for cloning packaging repositories
without SSH access using read-only HTTPS.

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-05-19 22:27:11 +02:00
59 changed files with 1542 additions and 317 deletions

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash SHELL=/bin/bash
V=20230307 V=1.0.1
BUILDTOOLVER ?= $(V) BUILDTOOLVER ?= $(V)
PREFIX = /usr/local PREFIX = /usr/local
@@ -32,12 +32,16 @@ COMMITPKG_LINKS = \
gnome-unstablepkg gnome-unstablepkg
ARCHBUILD_LINKS = \ ARCHBUILD_LINKS = \
core-testing-x86_64-build \
core-testing-x86_64_v3-build \
core-staging-x86_64-build \
core-staging-x86_64_v3-build \
extra-x86_64-build \ extra-x86_64-build \
extra-x86_64_v3-build \ extra-x86_64_v3-build \
testing-x86_64-build \ extra-testing-x86_64-build \
testing-x86_64_v3-build \ extra-testing-x86_64_v3-build \
staging-x86_64-build \ extra-staging-x86_64-build \
staging-x86_64_v3-build \ extra-staging-x86_64_v3-build \
multilib-build \ multilib-build \
multilib-testing-build \ multilib-testing-build \
multilib-staging-build \ multilib-staging-build \
@@ -115,6 +119,7 @@ install: all
for l in ${ARCHBUILD_LINKS}; do ln -sf archbuild $(DESTDIR)$(PREFIX)/bin/$$l; done for l in ${ARCHBUILD_LINKS}; do ln -sf archbuild $(DESTDIR)$(PREFIX)/bin/$$l; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
install -Dm0644 $(BUILDDIR)/contrib/completion/bash/devtools $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools install -Dm0644 $(BUILDDIR)/contrib/completion/bash/devtools $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools
for f in $(notdir $(BINPROGS)); do ln -sf devtools $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$$f; done
install -Dm0644 $(BUILDDIR)/contrib/completion/zsh/_devtools $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools install -Dm0644 $(BUILDDIR)/contrib/completion/zsh/_devtools $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
for manfile in $(MANS); do \ for manfile in $(MANS); do \
install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \ install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \
@@ -123,12 +128,14 @@ install: all
uninstall: uninstall:
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done 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 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 for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done 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 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 for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done for l in ${ARCHBUILD_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/share/bash-completion/completions/$$f; done
rm -f $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools rm -f $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done; for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done;
@@ -136,7 +143,6 @@ uninstall:
$(DESTDIR)$(DATADIR)/setarch-aliases.d \ $(DESTDIR)$(DATADIR)/setarch-aliases.d \
$(DESTDIR)$(DATADIR)/makepkg.conf.d \ $(DESTDIR)$(DATADIR)/makepkg.conf.d \
$(DESTDIR)$(DATADIR)/pacman.conf.d \ $(DESTDIR)$(DATADIR)/pacman.conf.d \
$(DESTDIR)$(DATADIR)/lib \
$(DESTDIR)$(DATADIR) $(DESTDIR)$(DATADIR)
TODAY=$(shell date +"%Y%m%d") TODAY=$(shell date +"%Y%m%d")

View File

@@ -34,7 +34,7 @@ will automatically build the project and proxy all calls to the local build dire
## Dependencies ## Dependencies
### Runtime ### Runtime Dependencies
- arch-install-scripts - arch-install-scripts
- awk - awk
@@ -45,18 +45,19 @@ will automatically build the project and proxy all calls to the local build dire
- findutils - findutils
- grep - grep
- jq - jq
- ncurses
- openssh - openssh
- parallel - parallel
- rsync - rsync
- sed - sed
- systemd
- util-linux - util-linux
- bzr - bzr
- git - git
- mercurial - mercurial
- subversion - subversion
### Development ### Development Dependencies
- asciidoc - asciidoc
- make - make

View File

@@ -70,27 +70,24 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[staging] [core-staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-staging]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -70,27 +70,24 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[staging] [core-staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-staging]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -70,21 +70,18 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -70,21 +70,18 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -0,0 +1,95 @@
#
# /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 = x86_64_v3 x86_64
# 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
# 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.
[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
# 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,95 @@
#
# /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
# 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.
[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
# 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,89 @@
#
# /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 = x86_64_v3 x86_64
# 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
# 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.
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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,89 @@
#
# /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
# 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.
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
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

@@ -70,19 +70,16 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
#[testing] #[core-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] #[extra-testing]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[community] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for

View File

@@ -70,19 +70,16 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
#[testing] #[core-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] #[extra-testing]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[community] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for

View File

@@ -73,21 +73,18 @@ LocalFileSigLevel = Optional
[gnome-unstable] [gnome-unstable]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -73,21 +73,18 @@ LocalFileSigLevel = Optional
[kde-unstable] [kde-unstable]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for # An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories. # tips on creating your own repositories.
#[custom] #[custom]

View File

@@ -70,27 +70,24 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[staging] [core-staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-staging]
Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here. # enable the multilib repositories as required here.
[multilib-staging] [multilib-staging]

View File

@@ -70,21 +70,18 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
[testing] [core-testing]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here. # enable the multilib repositories as required here.
[multilib-testing] [multilib-testing]

View File

@@ -70,19 +70,16 @@ LocalFileSigLevel = Optional
# repo name header and Include lines. You can add preferred servers immediately # repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors. # after the header, and they will be used before the default mirrors.
#[testing] #[core-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[core] [core]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] #[extra-testing]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[community] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system, # If you want to run 32 bit applications on your x86_64 system,

View File

@@ -2,89 +2,468 @@
# #
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
_devtools_compgen() { _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
local i r # shellcheck source=src/lib/valid-tags.sh
COMPREPLY=($(compgen -W '$*' -- "$cur")) source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do # shellcheck source=src/lib/valid-repos.sh
for r in "${!COMPREPLY[@]}"; do source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
if [[ ${COMP_WORDS[i]} = "${COMPREPLY[r]}" ]]; then
unset 'COMPREPLY[r]'; break _binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
_makechrootpkg_args=(
-h
-c
-d
-D
-u
-r
-I
-l
-n
-T
-U
)
_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_U_opts() { :; }
_makechrootpkg() { __devtools_complete _makechrootpkg; }
complete -F _makechrootpkg makechrootpkg
_makerepropkg_args=(
-h
-d
-c
-M
)
_makerepropkg_args_c_opts() { _filedir -d; }
_makerepropkg_args_M_opts() { _filedir '*.conf'; }
_makerepropkg_opts() { _filedir '*.pkg.tar.*'; }
_makerepropkg() { __devtools_complete _makerepropkg; }
complete -F _makerepropkg makerepropkg
_mkarchroot_args=(
-U
-C
-M
-c
-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_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_filedir -d
elif (( args >= 1 )); then
_devtools_completions_all_packages
fi
}
_mkarchroot() { __devtools_complete _mkarchroot; }
complete -F _mkarchroot mkarchroot
_arch_nspawn_args=(
-C
-M
-c
-f
-s
-h
)
_arch_nspawn_args_C_opts() { _filedir '*.conf'; }
_arch_nspawn_args_M_opts() { _filedir '*.conf'; }
_arch_nspawn_args_c_opts() { _filedir -d; }
_arch_nspawn_args_f_opts() { _filedir; }
_arch_nspawn_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_filedir -d
fi
}
_arch_nspawn() { __devtools_complete _arch_nspawn; }
complete -F _arch_nspawn arch-nspawn
_sogrep_args=(
-v --verbose
-r --refresh
-h --help
)
_sogrep_opts() {
local args
args=$(__pkgctl_word_count_after_subcommand)
if (( args == 0 )); then
_devtools_completions_repo all
fi
}
_sogrep() { __devtools_complete _sogrep; }
complete -F _sogrep sogrep
_offload_build_args=(
-r --repo
-a --arch
-s --server
-h --help
)
_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_a_opts() { _offload_build_args__arch_opts; }
_offload_build_args__server_opts() { :; }
_offload_build_args_s_opts() { _offload_build_args__server_opts; }
_offload_build() { __devtools_complete _offload_build; }
complete -F _offload_build offload-build
_pkgctl_cmds=(
auth
build
db
diff
release
repo
version
)
_pkgctl_args=(
-V --version
-h --help
)
_pkgctl_auth_cmds=(
login
status
)
_pkgctl_auth_login_args=(
-g --gen-access-token
-h --help
)
_pkgctl_auth_status_args=(
-t --show-token
-h --help
)
_pkgctl_build_args=(
--arch
--repo
-s --staging
-t --testing
-o --offload
-c --clean
-w --worker
--pkgver
--pkgrel
--rebuild
-e --edit
-r --release
-m --message
-u --db-update
-h --help
)
_pkgctl_build_args__arch_opts() { _devtools_completions_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__pkgver_opts() { :; }
_pkgctl_build_args__pkgrel_opts() { :; }
_pkgctl_build_args__message_opts() { :; }
_pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; }
_pkgctl_build_opts() { _filedir -d; }
_pkgctl_db_cmds=(
move
remove
update
)
_pkgctl_db_move_args=(
-h --help
)
_pkgctl_db_move_opts() {
local subcommand args
subcommand=(db move)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
_devtools_completions_repo
elif (( args == 1 )); then
_devtools_completions_repo
elif (( args >= 2 )); then
_devtools_completions_all_packages
fi fi
done
done
} }
_pkgrepo_pkg() {
_devtools_compgen "$( _pkgctl_db_remove_args=(
command pacman "-$1" -a --arch
)" -h --help
)
_pkgctl_db_remove_opts() {
local subcommand args
subcommand=(db remove)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
_devtools_completions_repo
elif (( args >= 1 )); then
_devtools_completions_all_packages
fi
} }
_pkgrepo() {
_pkgctl_db_update_args=(
-h --help
)
_pkgctl_release_args=(
-m --message
-r --repo
-s --staging
-t --testing
-u --db-update
-h --help
)
_pkgctl_release_args__message_opts() { :; }
_pkgctl_release_args_m_opts() { _pkgctl_release_args__message_opts; }
_pkgctl_release_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; }
_pkgctl_release_opts() { _filedir -d; }
_pkgctl_repo_cmds=(
clone
configure
create
switch
web
)
_pkgctl_repo_clone_args=(
-m --maintainer
--protocol
--switch
-u --unprivileged
--universe
-j --jobs
-h --help
)
_pkgctl_repo_clone_args__maintainer_opts() { :; }
_pkgctl_repo_clone_args_m_opts() { _pkgctl_repo_clone_args__maintainer_opts; }
_pkgctl_repo_clone_args__protocol_opts() { _devtools_completions_protocol; }
_pkgctl_repo_clone_args__switch_opts() { :; }
_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_configure_args=(
--protocol
-j --jobs
-h --help
)
_pkgctl_repo_configure_args__protocol_opts() { _devtools_completions_protocol; }
_pkgctl_repo_configure_args__jobs_opts() { :; }
_pkgctl_repo_configure_args_j_opts() { _pkgctl_repo_clone_args__jobs_opts; }
_pkgctl_repo_configure_opts() { _filedir -d; }
_pkgctl_repo_create_args=(
-c --clone
-h --help
)
_pkgctl_repo_switch_args=(
--discard-changes
-f --force
-h --help
)
_pkgctl_repo_switch_opts() {
local subcommand args
subcommand=(repo switch)
args=$(__pkgctl_word_count_after_subcommand "${subcommand[@]}")
if (( args == 0 )); then
:
elif (( args >= 1 )); then
_filedir -d;
fi
}
_pkgctl_repo_web_args=(
-h --help
)
_pkgctl_repo_web_opts() { _filedir -d; }
_pkgctl_diff_args=(
-l --list
-d --diffoscope
-p --pkginfo
-b --buildinfo
-m --makepkg-config
-u -U --unified
-y --side-by-side
--color
-W --width
-P --pool
-v --verbose
-h --help
)
_pkgctl_diff_args__makepkg_config_opts() { _filedir '*.conf'; }
_pkgctl_diff_args_m_opts() { _pkgctl_diff_args__makepkg_config_opts; }
_pkgctl_diff_args__width_opts() { :; }
_pkgctl_diff_args_W_opts() { _pkgctl_diff_args__width_opts; }
_pkgctl_diff_args__color_opts() { _devtools_completions_color; }
_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_version_args=(
-h --help
)
_devtools_completions_color() {
mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur")
}
_devtools_completions_arch() {
mapfile -t COMPREPLY < <(compgen -W "${_arch[*]}" -- "$cur")
}
_devtools_completions_repo() {
local optional=${1:-}
mapfile -t COMPREPLY < <(compgen -W "${optional} ${_repos[*]}" -- "$cur")
}
_devtools_completions_build_repo() {
mapfile -t COMPREPLY < <(compgen -W "${_build_repos[*]}" -- "$cur")
}
_devtools_completions_all_packages() {
mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur")
}
_devtools_completions_protocol() {
mapfile -t COMPREPLY < <(compgen -W "https" -- "$cur")
}
__devtools_complete() {
local service=$1
local cur prev local cur prev
COMPREPLY=()
# Don't break words at : and =
COMP_WORDBREAKS=${COMP_WORDBREAKS//[:=]}
cur=$(_get_cword) cur=$(_get_cword)
prev=${COMP_WORDS[COMP_CWORD-1]} prev=${COMP_WORDS[COMP_CWORD-1]}
_pkgrepo_pkg Slq __pkgctl_handle_subcommands "${service}"
true
} &&
complete -F _pkgrepo pkgrepo
_makechrootpkg() {
local cur
COMPREPLY=()
_get_comp_words_by_ref cur
case $cur in
-*)
COMPREPLY=( $( compgen -W '-I -c -h -l -r -u' -- "$cur" ) )
;;
*)
_filedir
return 0 return 0
;; }
esac
true __pkgctl_has_func() {
} && declare -f -- "${1}" &>/dev/null
complete -F _makechrootpkg makechrootpkg }
_mkarchroot() { __pkgctl_has_array() {
local cur declare -p -- "${1}" &>/dev/null
COMPREPLY=() }
_get_comp_words_by_ref cur
case $cur in __pkgctl_is_subcommand() {
-*) __pkgctl_has_array "${1}"_args || \
COMPREPLY=( $( compgen -W '-C -M -c -h' -- "$cur" ) ) __pkgctl_has_array "${1}"_cmds
;; }
*)
_filedir
return 0
;;
esac
true __pkgctl_words_after_subcommand() {
} && local subcommand=("$@")
complete -F _mkarchroot mkarchroot local subcommand_idx=0
local word prev_word
for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do
word=${COMP_WORDS[i]}
prev_word=${COMP_WORDS[i-1]}
# skip options and the current typing
if [[ ${word} == -* ]] || [[ ${word} == "${cur}" ]]; then
continue
fi
# skip until we resolved the passed subcommand
if (( subcommand_idx < ${#subcommand[@]} )); then
if [[ $word == "${subcommand[$subcommand_idx]}" ]]; then
subcommand_idx=$(( subcommand_idx + 1 ))
fi
continue
fi
# skip previous options as they belong to the argument
if [[ ${prev_word} == -* ]] && __pkgctl_has_func "${service_name}_args${prev_word//-/_}_opts"; then
continue
fi
printf "%s\n" "${word}"
done
}
__pkgctl_word_count_after_subcommand() {
local subcommand=("$@")
mapfile -t words < <(__pkgctl_words_after_subcommand "${subcommand[@]}")
echo "${#words[@]}"
}
_arch-nspawn() { __pkgctl_handle_subcommands() {
local cur local service_name=${1}
COMPREPLY=() local index=${2:-0}
_get_comp_words_by_ref cur local word ref
case $cur in # recurse into nested subcommands
-*) for ((i = index + 1; i < ${#COMP_WORDS[@]}; ++i)); do
COMPREPLY=( $( compgen -W '-C -M -c -h' -- "$cur" ) ) word=${COMP_WORDS[i]}
;; if [[ ${word} == -* ]] || [[ ${word} == "${cur}" ]]; then
*) continue
_filedir fi
return 0 if __pkgctl_is_subcommand "${service_name}_${word}"; then
;; __pkgctl_handle_subcommands "${service_name}_${word}" "${i}"
esac return
fi
done
true # dynamic argument options
} && if [[ $prev == -* ]] && word=${prev//-/_} && __pkgctl_has_func "${service_name}_args${word}_opts"; then
complete -F _arch-nspawn arch-nspawn "${service_name}_args${word}_opts"
# ex:et ts=2 sw=2 ft=sh # dynamic subcommand options
elif [[ $cur != -* ]] && __pkgctl_has_func "${service_name}_opts"; then
"${service_name}_opts"
# subcommand argument array
elif ( ! __pkgctl_has_array "${service_name}"_cmds || [[ $cur == -* ]] ) && __pkgctl_has_array "${service_name}_args"; then
declare -n ref="${service_name}_args"
mapfile -t COMPREPLY < <(compgen -W "${ref[*]}" -- "$cur")
# subcommand array
elif __pkgctl_has_array "${service_name}"_cmds; then
declare -n ref="${service_name}_cmds"
mapfile -t COMPREPLY < <(compgen -W "${ref[*]}" -- "$cur")
fi
}
_pkgctl() { __devtools_complete _pkgctl; }
complete -F _pkgctl pkgctl
# ex:noet ts=4 sw=4 ft=sh

View File

@@ -42,6 +42,7 @@ _pkgctl_build_args=(
'(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]' '(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]'
'(-c --clean)'{-c,--clean}'[Recreate the chroot before building]' '(-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.*(.)"' '(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
'(-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]' '--nocheck[Do not run the check() function in the PKGBUILD]'
'--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:' '--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:'
'--pkgrel=[Set pkgrel to a given value]:pkgrel:' '--pkgrel=[Set pkgrel to a given value]:pkgrel:'
@@ -94,17 +95,30 @@ _pkgctl_repo_cmds=(
"clone[Clone a package repository]" "clone[Clone a package repository]"
"configure[Configure a clone according to distro specs]" "configure[Configure a clone according to distro specs]"
"create[Create a new GitLab package repository]" "create[Create a new GitLab package repository]"
"switch[Switch a package repository to a specified version]"
"web[Open the packaging repository's website]" "web[Open the packaging repository's website]"
) )
_pkgctl_repo_switch_args=(
'(-f --force --discard-changes)'{-f,--force,--discard-changes}'[Discard changes if index or working tree is dirty]'
'(-h --help)'{-h,--help}'[Display usage]'
'1:version'
'*:git_dir:_files -/'
)
_pkgctl_repo_clone_args=( _pkgctl_repo_clone_args=(
'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:' '(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
'--protocol[Clone the repository over https]:proto:(https)'
'--switch=[Switch the current working tree to a specified version]'
'--universe[Clone all existing packages, useful for cache warming]' '--universe[Clone all existing packages, useful for cache warming]'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
'*:packages:_devtools_completions_all_packages' '*:packages:_devtools_completions_all_packages'
) )
_pkgctl_repo_configure_args=( _pkgctl_repo_configure_args=(
'--protocol[Configure remote url to use https]:proto:(https)'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/' '*:git_dir:_files -/'
) )
@@ -231,6 +245,16 @@ _pkgctl_cmds=(
"diff[Compare package files using different modes]" "diff[Compare package files using different modes]"
"release[Release step to commit, tag and upload build artifacts]" "release[Release step to commit, tag and upload build artifacts]"
"repo[Manage Git packaging repositories and their configuration]" "repo[Manage Git packaging repositories and their configuration]"
"version[Show pkgctl version information]"
)
_pkgctl_args=(
'(-V --version)'{-V,--version}'[Show pkgctl version information]'
'(-h --help)'{-h,--help}'[Display usage]'
)
_pkgctl_version_args=(
'(-h --help)'{-h,--help}'[Display usage]'
) )
_pkgctl_diff_args=("${_diffpkg_args[@]}") _pkgctl_diff_args=("${_diffpkg_args[@]}")
@@ -243,8 +267,13 @@ _handle_subcommands() {
'*::arg:->args' '*::arg:->args'
case $state in case $state in
cmds) cmds)
if [[ "${line[-1]}" == -* ]] && typeset -p ${service_name}_args &> /dev/null; then
local argname="${service_name}_args[@]"
_arguments -s "${(P)argname}"
else
local service_cmds=${service_name}_cmds[@] local service_cmds=${service_name}_cmds[@]
_values "${(P)service_cmds}" _values "${(P)service_cmds}"
fi
;; ;;
args) args)
local service_sub=${service_name}_$line[1] local service_sub=${service_name}_$line[1]

View File

@@ -1,5 +1,5 @@
diffpkg(1) diffpkg(1)
=========== ==========
Name Name
---- ----

View File

@@ -1,5 +1,5 @@
makerepropkg(1) makerepropkg(1)
================ ===============
Name Name
---- ----

View File

@@ -1,5 +1,5 @@
mkarchroot(1) mkarchroot(1)
============== =============
Name Name
---- ----

View File

@@ -0,0 +1,40 @@
pkgctl-auth-login(1)
====================
Name
----
pkgctl-auth-login - Authenticate with the GitLab instance
Synopsis
--------
pkgctl auth login [OPTIONS]
Description
-----------
Interactively authenticate with the GitLab instance.
The minimum required scopes for the token are: 'api', 'write_repository'.
The GitLab API token can either be stored in a plaintext file in
'$XDG_CONFIG_HOME/devtools/gitlab.conf', or supplied via the
'DEVTOOLS_GITLAB_TOKEN' environment variable using any command (gpg, vault,
password manager) by declaring a shell alias:
$ alias pkgctl='DEVTOOLS_GITLAB_TOKEN="$(command to obtain token)" pkgctl'
Options
-------
*-g, --gen-access-token*::
Open the URL to generate a new personal access token
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-auth-status[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,32 @@
pkgctl-auth-status(1)
=====================
Name
----
pkgctl-auth-status - View authentication status
Synopsis
--------
pkgctl auth status [OPTIONS]
Description
-----------
Verifies and displays information about your authentication state of
services like the GitLab instance and reports issues if any.
Options
-------
*-t, --show-token*::
Display the auth token
*-h, --help*::
Show a help text
See Also
--------
linkman:pkgctl-auth-login[1]
include::include/footer.asciidoc[]

View File

@@ -0,0 +1,38 @@
pkgctl-auth(1)
==============
Name
----
pkgctl-auth - Authenticate with serivces like GitLab.
Synopsis
--------
pkgctl auth [OPTIONS] [SUBCOMMAND]
Description
-----------
Manage the authorization for the GitLab instance and show its current status.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl auth login::
Authenticate with the GitLab instance
pkgctl auth status::
View authentication status
See Also
--------
linkman:pkgctl-auth-login[1]
linkman:pkgctl-auth-status[1]
include::include/footer.asciidoc[]

View File

@@ -38,6 +38,12 @@ Build Options
*-I, --install* 'FILE':: *-I, --install* 'FILE'::
Install a package into the working copy of the chroot Install a package into the working copy of the chroot
*-w, --worker* 'SLOT'::
Name of the worker slot, useful for concurrent builds. By default the slot
is automatically assigned to the current tty pts number. In case the caller
is not a tty, choose a random slot between 1 and number of available
processing units.
*--nocheck*:: *--nocheck*::
Do not run the check() function in the PKGBUILD Do not run the check() function in the PKGBUILD
@@ -60,7 +66,9 @@ Release Options
--------------- ---------------
*-r, --release*:: *-r, --release*::
Automatically commit, tag and release after building Automatically commit, tag and release after building +
Specifying this option is required when using any of the following options
in this section
*-m, --message* 'MSG':: *-m, --message* 'MSG'::
Use the given <msg> as the commit message Use the given <msg> as the commit message

View File

@@ -1,5 +1,5 @@
pkgctl-repo-clone(1) pkgctl-repo-clone(1)
====================== ====================
Name Name
---- ----
@@ -25,9 +25,21 @@ Options
*-m, --maintainer* 'NAME':: *-m, --maintainer* 'NAME'::
Clone all packages of the named maintainer Clone all packages of the named maintainer
*--protocol* 'https'::
Clone the repository over https
*--universe*:: *--universe*::
Clone all existing packages, useful for cache warming Clone all existing packages, useful for cache warming
*--switch* 'VERSION'::
Switch to a specified version. The working tree and the index are updated to
match the version.
*-j, --jobs* 'N'::
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.
*-h, --help*:: *-h, --help*::
Show a help text Show a help text
@@ -35,5 +47,6 @@ See Also
-------- --------
linkman:pkgctl-repo-configure[1] linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-switch[1]
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

@@ -25,6 +25,14 @@ read-only HTTPS otherwise.
Options Options
------- -------
*--protocol* 'https'::
Configure remote url to use https
*-j, --jobs* 'N'::
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.
*-h, --help*:: *-h, --help*::
Show a help text Show a help text

View File

@@ -1,5 +1,5 @@
pkgctl-repo-create(1) pkgctl-repo-create(1)
====================== =====================
Name Name
---- ----

View File

@@ -0,0 +1,36 @@
pkgctl-repo-switch(1)
=====================
Name
----
pkgctl-repo-switch - Switch a package repository to a specified version
Synopsis
--------
pkgctl repo switch [OPTIONS] [VERSION] [PKGBASE]...
Description
-----------
Switch a package source repository to a specified version, tag or branch.
The working tree and the index are updated to match the specified ref.
If a version identifier is specified in the pacman version format, that
identifier is automatically translated to the Git tag name accordingly.
The current working directory is used if no PKGBASE is specified.
Options
-------
*--discard-changes*::
Proceed even if the index or the working tree differs from HEAD. Both the
index and working tree are restored to match the switching target.
*-f, --force*::
An alias for '--discard-changes'.
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -1,5 +1,5 @@
pkgctl-repo(1) pkgctl-repo(1)
================ ==============
Name Name
---- ----
@@ -41,6 +41,9 @@ pkgctl repo configure::
pkgctl repo create:: pkgctl repo create::
Create a new GitLab package repository Create a new GitLab package repository
pkgctl repo switch::
Switch a package repository to a specified version
pkgctl repo web:: pkgctl repo web::
Open the packaging repository's website Open the packaging repository's website
@@ -50,6 +53,7 @@ See Also
linkman:pkgctl-repo-clone[1] linkman:pkgctl-repo-clone[1]
linkman:pkgctl-repo-configure[1] linkman:pkgctl-repo-configure[1]
linkman:pkgctl-repo-create[1] linkman:pkgctl-repo-create[1]
linkman:pkgctl-repo-switch[1]
linkman:pkgctl-repo-web[1] linkman:pkgctl-repo-web[1]
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

@@ -0,0 +1,23 @@
pkgctl-version(1)
=================
Name
----
pkgctl-version - Show pkgctl version information
Synopsis
--------
pkgctl version [OPTIONS]
Description
-----------
Shows the current version information of pkgctl.
Options
-------
*-h, --help*::
Show a help text
include::include/footer.asciidoc[]

View File

@@ -14,6 +14,15 @@ Description
TODO TODO
Options
-------
*-V, --version*::
Show pkgctl version information
*-h, --help*::
Show a help text
Subcommands Subcommands
----------- -----------
@@ -35,6 +44,9 @@ pkgctl release::
pkgctl repo:: pkgctl repo::
Manage Git packaging repositories and their configuration Manage Git packaging repositories and their configuration
pkgctl version::
Show pkgctl version information
See Also See Also
-------- --------
@@ -44,5 +56,6 @@ linkman:pkgctl-db[1]
linkman:pkgctl-diff[1] linkman:pkgctl-diff[1]
linkman:pkgctl-release[1] linkman:pkgctl-release[1]
linkman:pkgctl-repo[1] linkman:pkgctl-repo[1]
linkman:pkgctl-version[1]
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

@@ -46,7 +46,7 @@ done
shift $((OPTIND - 1)) shift $((OPTIND - 1))
(( $# < 1 )) && die 'You must specify a directory.' (( $# < 1 )) && die 'You must specify a directory.'
check_root check_root "" "${BASH_SOURCE[0]}" "$@"
working_dir=$(readlink -f "$1") working_dir=$(readlink -f "$1")
shift 1 shift 1

View File

@@ -50,7 +50,7 @@ pacman_config="@pkgdatadir@/pacman.conf.d/${repo}.conf"
if [[ -f @pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf ]]; then if [[ -f @pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf ]]; then
pacman_config="@pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf" pacman_config="@pkgdatadir@/pacman.conf.d/${repo}-${arch}.conf"
fi fi
makepkg_config="@pkgdatadir@/makepkg.conf.d${arch}.conf" makepkg_config="@pkgdatadir@/makepkg.conf.d/${arch}.conf"
if [[ -f @pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf ]]; then if [[ -f @pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf ]]; then
makepkg_config="@pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf" makepkg_config="@pkgdatadir@/makepkg.conf.d/${repo}-${arch}.conf"
fi fi
@@ -74,7 +74,7 @@ while getopts 'hcr:' arg; do
esac esac
done done
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME "${BASH_SOURCE[0]}" "$@"
# Pass all arguments after -- right to makepkg # Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}") makechrootpkg_args+=("${@:$OPTIND}")

View File

@@ -89,7 +89,6 @@ if git tag --verify "$gittag" &> /dev/null; then
exit 0 exit 0
fi fi
stat_busy "Releasing package" msg "Releasing package"
git tag --sign --message="Package release ${pkgver}" "$gittag" || abort git tag --sign --message="Package release ${pkgver}" "$gittag" || abort
git push --tags --set-upstream origin main || abort git push --tags --set-upstream origin main || abort
stat_done

View File

@@ -173,7 +173,15 @@ done
# check for PKGBUILD standards # check for PKGBUILD standards
check_pkgbuild_validity check_pkgbuild_validity
if [[ -n $(git status --short --untracked-files=no) ]]; then # auto generate .SRCINFO if present
if [[ -f .SRCINFO ]]; then
stat_busy 'Generating .SRCINFO'
makepkg --printsrcinfo > .SRCINFO
git add .SRCINFO
stat_done
fi
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files' stat_busy 'Staging files'
for f in $(git ls-files --modified); do for f in $(git ls-files --modified); do
git add "$f" git add "$f"

View File

@@ -5,8 +5,6 @@
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh # shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/util/util.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/util.sh
usage() { usage() {
@@ -28,8 +26,6 @@ usage() {
OPTIONS OPTIONS
-M, --makepkg-config Set an alternate makepkg configuration file -M, --makepkg-config Set an alternate makepkg configuration file
-M, --pacman-config Set an alternate pacman configuration file
--dbpath Set an alternate pacman database path
-P, --pool=DIR Search diff target in pool dir (default '/srv/ftp/pool') -P, --pool=DIR Search diff target in pool dir (default '/srv/ftp/pool')
-v, --verbose Provide more detailed/unfiltered output -v, --verbose Provide more detailed/unfiltered output
-h, --help Show this help text -h, --help Show this help text
@@ -41,14 +37,12 @@ usage() {
-y, --side-by-side Output in two columns -y, --side-by-side Output in two columns
-W, --width=NUM Output at most NUM (default 'auto') print columns -W, --width=NUM Output at most NUM (default 'auto') print columns
NUM can be 'auto', 'columns' or a number NUM can be 'auto', 'columns' or a number
--summary Print a summary or warning message on disparity
MODES MODES
-l, --list Activate content list diff mode (default) -l, --list Activate content list diff mode (default)
-d, --diffoscope Activate diffoscope diff mode -d, --diffoscope Activate diffoscope diff mode
-p, --pkginfo Activate .PKGINFO diff mode -p, --pkginfo Activate .PKGINFO diff mode
-b, --buildinfo Activate .BUILDINFO diff mode -b, --buildinfo Activate .BUILDINFO diff mode
-s, --soname Activate library SONAME diff mode
_EOF_ _EOF_
} }
@@ -60,13 +54,11 @@ TARLIST=0
DIFFOSCOPE=0 DIFFOSCOPE=0
PKGINFO=0 PKGINFO=0
BUILDINFO=0 BUILDINFO=0
SONAME=0
SUMMARY=0
DIFFMODE=--side-by-side DIFFMODE=--side-by-side
DIFFCOLOR=--color=auto DIFFCOLOR=--color=auto
DIFFWIDTH=--width=auto DIFFWIDTH=--width=auto
DIFFOPTIONS=(--expand-tabs --suppress-common-lines) DIFFOPTIONS=(--expand-tabs)
# option checking # option checking
while (( $# )); do while (( $# )); do
@@ -96,18 +88,10 @@ while (( $# )); do
BUILDINFO=1 BUILDINFO=1
shift shift
;; ;;
-s|--soname)
SONAME=1
shift
;;
-v|--verbose) -v|--verbose)
VERBOSE=1 VERBOSE=1
shift shift
;; ;;
--summary)
SUMMARY=1
shift
;;
-u|-U|--unified) -u|-U|--unified)
DIFFMODE=--unified DIFFMODE=--unified
shift shift
@@ -151,7 +135,7 @@ while (( $# )); do
shift shift
break break
;; ;;
-*) -*|--*)
die "invalid argument: %s" "$1" die "invalid argument: %s" "$1"
;; ;;
*) *)
@@ -174,9 +158,6 @@ fi
if [[ $DIFFWIDTH != --width=auto ]]; then if [[ $DIFFWIDTH != --width=auto ]]; then
DIFFOPTIONS+=("${DIFFWIDTH}") DIFFOPTIONS+=("${DIFFWIDTH}")
fi fi
if [[ $DIFFCOLOR == --color=auto ]] && is_tty; then
DIFFCOLOR="--color=always"
fi
DIFFOPTIONS+=("${DIFFMODE}" "${DIFFCOLOR}") DIFFOPTIONS+=("${DIFFMODE}" "${DIFFCOLOR}")
if ! (( DIFFOSCOPE || TARLIST || PKGINFO || BUILDINFO )); then if ! (( DIFFOSCOPE || TARLIST || PKGINFO || BUILDINFO )); then
@@ -234,7 +215,8 @@ diff_pkgs() {
[[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}" [[ -f $oldpkg ]] || die "No such file: %s" "${oldpkg}"
[[ -f $newpkg ]] || die "No such file: %s" "${newpkg}" [[ -f $newpkg ]] || die "No such file: %s" "${newpkg}"
DIFFOPTIONS+=(--label "${oldpkg}" --label "${newpkg}") local -a diffoptions
diffoptions=("${DIFFOPTIONS[@]}" --label "${oldpkg}" --label "${newpkg}")
if (( TARLIST )); then if (( TARLIST )); then
tar_list "$oldpkg" > "$TMPDIR/old" tar_list "$oldpkg" > "$TMPDIR/old"
@@ -251,31 +233,23 @@ diff_pkgs() {
bsdtar xOqf "$newpkg" .BUILDINFO > "$TMPDIR/new" bsdtar xOqf "$newpkg" .BUILDINFO > "$TMPDIR/new"
fi fi
if (( SONAME )); then if (( TARLIST || PKGINFO || BUILDINFO )); then
find-libprovides "$oldpkg" 2>/dev/null | sort > "$TMPDIR/old"
find-libprovides "$newpkg" 2>/dev/null | sort > "$TMPDIR/new"
fi
if (( TARLIST || PKGINFO || BUILDINFO || SONAME )); then
# Resolve dynamic auto width one we know the content to diff # Resolve dynamic auto width one we know the content to diff
if [[ $DIFFWIDTH == --width=auto ]]; then if [[ $DIFFWIDTH == --width=auto ]]; then
AUTOLENGTH=$(file_diff_columns "$TMPDIR/old" "$TMPDIR/new") AUTOLENGTH=$(file_diff_columns "$TMPDIR/old" "$TMPDIR/new")
DIFFOPTIONS+=("--width=${AUTOLENGTH}") diffoptions+=("--width=${AUTOLENGTH}")
fi fi
if ! output=$(diff "${DIFFOPTIONS[@]}" "$TMPDIR/old" "$TMPDIR/new"); then
# Print a header for side-by-side view as it lacks labels # Print a header for side-by-side view as it lacks labels
if [[ $DIFFMODE == --side-by-side ]]; then if [[ $DIFFMODE == --side-by-side ]]; then
printf -- "%s--- %s\n+++ %s%s\n" "${BOLD}" "${oldpkg}" "${newpkg}" "${ALL_OFF}" printf -- "--- %s\n+++ %s\n" "${oldpkg}" "${newpkg}"
fi
printf "%s\n" "${output}"
return 1
fi fi
diff "${diffoptions[@]}" "$TMPDIR/old" "$TMPDIR/new"
fi fi
if (( DIFFOSCOPE )); then if (( DIFFOSCOPE )); then
diffoscope "${DIFFCOLOR/--color/--text-color}" "$oldpkg" "$newpkg" diffoscope "${DIFFCOLOR/--color/--text-color}" "$oldpkg" "$newpkg"
return $?
fi fi
} }
@@ -304,14 +278,13 @@ fetch_pkg() {
fi fi
# Search via pacman database if no pool file exists # Search via pacman database if no pool file exists
if [[ ! -f ${pkgurl} ]]; then if [[ ! -f ${pkgurl} ]]; then
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm -- "$pkg") || pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$pkg") ||
die "Couldn't download previous package for %s." "$pkg" die "Couldn't download previous package for %s." "$pkg"
# TODO: check and download via Swdd so we also do signatures checks before processing
fi fi
fi fi
pkg=${pkgurl##*/} pkg=${pkgurl##*/}
pkgdest=$(mktemp -t -d -- "${pkg}-XXXXXX")/${pkg} pkgdest=$(mktemp -t -d "${pkg}-XXXXXX")/${pkg}
if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then if [[ $pkgurl = file://* || ( $pkgurl = /* && -f $pkgurl ) ]]; then
ln -sf "${pkgurl#file://}" "$pkgdest" ln -sf "${pkgurl#file://}" "$pkgdest"
@@ -341,7 +314,6 @@ if (( $# < 2 )); then
CARCH='any' CARCH='any'
fi fi
ret=0
for _pkgname in "${pkgname[@]}"; do for _pkgname in "${pkgname[@]}"; do
comparepkg=$_pkgname comparepkg=$_pkgname
pkgurl= pkgurl=
@@ -359,13 +331,10 @@ if (( $# < 2 )); then
oldpkg=$(fetch_pkg "$comparepkg") || exit 1 oldpkg=$(fetch_pkg "$comparepkg") || exit 1
diff_pkgs "$oldpkg" "$pkgfile" diff_pkgs "$oldpkg" "$pkgfile"
ret+=$?
done done
exit $ret
else else
file1=$(fetch_pkg "$1") || exit 1 file1=$(fetch_pkg "$1") || exit 1
file2=$(fetch_pkg "$2") || exit 1 file2=$(fetch_pkg "$2") || exit 1
diff_pkgs "$file1" "$file2" diff_pkgs "$file1" "$file2"
exit $?
fi fi

View File

@@ -81,15 +81,25 @@ gitlab_api_get_user() {
return 0 return 0
} }
# Convert arbitrary project names to GitLab valid path names.
#
# GitLab has several limitations on project and group names and also maintains
# a list of reserved keywords as documented on their docs.
# https://docs.gitlab.com/ee/user/reserved_names.html
#
# 1. replace single '+' between word boundaries with '-' # 1. replace single '+' between word boundaries with '-'
# 2. replace any other '+' with literal 'plus' # 2. replace any other '+' with literal 'plus'
# 3. replace any special chars other than '_', '-' and '.' with '-' # 3. replace any special chars other than '_', '-' and '.' with '-'
# 4. replace consecutive '_-' chars with a single '-'
# 5. replace 'tree' with 'unix-tree' due to GitLab reserved keyword
gitlab_project_name_to_path() { gitlab_project_name_to_path() {
local name=$1 local name=$1
printf "%s" "${name}" \ printf "%s" "${name}" \
| sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \ | sed -E 's/([a-zA-Z0-9]+)\+([a-zA-Z]+)/\1-\2/g' \
| sed -E 's/\+/plus/g' \ | sed -E 's/\+/plus/g' \
| sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' | sed -E 's/[^a-zA-Z0-9_\-\.]/-/g' \
| sed -E 's/[_\-]{2,}/-/g' \
| sed -E 's/^tree$/unix-tree/g'
} }
gitlab_api_create_project() { gitlab_api_create_project() {

View File

@@ -4,18 +4,19 @@
: :
# shellcheck disable=2034 # shellcheck disable=2034
CHROOT_VERSION='v4' CHROOT_VERSION='v5'
## ##
# usage : check_root $keepenv # usage : check_root $keepenv
## ##
orig_argv=("${BASH_SOURCE[0]}" "$@")
check_root() { check_root() {
local keepenv=$1 local keepenv=$1
shift
local orig_argv=("$@")
(( EUID == 0 )) && return (( EUID == 0 )) && return
if type -P sudo >/dev/null; then if type -P sudo >/dev/null; then
exec sudo --preserve-env=$keepenv -- "${orig_argv[@]}" exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}"
else else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")" exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi fi

View File

@@ -23,9 +23,13 @@ pkgctl_auth_login_usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] Usage: ${COMMAND} [OPTIONS]
Authenticate with the GitLab instance. Interactively authenticate with the GitLab instance.
The minimum required scopes for the token are: "api", "write_repository". The minimum required scopes for the token are: 'api', 'write_repository'.
The GitLab API token can either be stored in a plaintext file, or
supplied via the DEVTOOLS_GITLAB_TOKEN environment variable using a
vault, see pkgctl-auth-login(1) for details.
OPTIONS OPTIONS
-g, --gen-access-token Open the URL to generate a new personal access token -g, --gen-access-token Open the URL to generate a new personal access token
@@ -59,13 +63,17 @@ pkgctl_auth_login() {
esac esac
done done
personal_access_token_url="https://${GITLAB_HOST}/-/profile/personal_access_tokens" personal_access_token_url="https://${GITLAB_HOST}/-/profile/personal_access_tokens?name=pkgctl+token&scopes=api,write_repository"
cat <<- _EOF_ cat <<- _EOF_
Logging into ${BOLD}${GITLAB_HOST}${ALL_OFF} Logging into ${BOLD}${GITLAB_HOST}${ALL_OFF}
Tip: you can generate a Personal Access Token here ${personal_access_token_url} Tip: you can generate a Personal Access Token here ${personal_access_token_url}
The minimum required scopes are 'api' and 'write_repository'. The minimum required scopes are 'api' and 'write_repository'.
If you do not want to store the token in a plaintext file, you can abort
the following prompt and supply the token via the DEVTOOLS_GITLAB_TOKEN
environment variable using a vault, see pkgctl-auth-login(1) for details.
_EOF_ _EOF_
if (( GEN_ACESS_TOKEN )); then if (( GEN_ACESS_TOKEN )); then

View File

@@ -25,6 +25,7 @@ source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh source /usr/share/makepkg/util/message.sh
set -e set -e
set -o pipefail
pkgctl_build_usage() { pkgctl_build_usage() {
@@ -47,6 +48,7 @@ pkgctl_build_usage() {
-o, --offload Build on a remote server and transfer artifacts afterwards -o, --offload Build on a remote server and transfer artifacts afterwards
-c, --clean Recreate the chroot before building -c, --clean Recreate the chroot before building
-I, --install FILE Install a package into the working copy of the chroot -I, --install FILE Install a package into the working copy of the chroot
-w, --worker SLOT Name of the worker slot, useful for concurrent builds (disables automatic names)
--nocheck Do not run the check() function in the PKGBUILD --nocheck Do not run the check() function in the PKGBUILD
PKGBUILD OPTIONS PKGBUILD OPTIONS
@@ -123,12 +125,11 @@ pkgctl_build() {
local RELEASE_OPTIONS=() local RELEASE_OPTIONS=()
local MAKEPKG_OPTIONS=() local MAKEPKG_OPTIONS=()
local PTS local WORKER=
PTS="$(tty | sed 's|/dev/pts/||')" local WORKER_SLOT=
local WORKER="${USER}-${PTS}"
# variables # variables
local path pkgbase pkgrepo source soname_changed=0 local path pkgbase pkgrepo source
while (( $# )); do while (( $# )); do
case $1 in case $1 in
@@ -169,6 +170,8 @@ pkgctl_build() {
shift shift
;; ;;
--rebuild) --rebuild)
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
pkgctl_build_check_option_group_ver '--rebuild' "${PKGVER}" "${PKGREL}" "${REBUILD}" pkgctl_build_check_option_group_ver '--rebuild' "${PKGVER}" "${PKGREL}" "${REBUILD}"
REBUILD=1 REBUILD=1
shift shift
@@ -222,6 +225,11 @@ pkgctl_build() {
DB_UPDATE=1 DB_UPDATE=1
shift shift
;; ;;
-w|--worker)
(( $# <= 1 )) && die "missing argument for %s" "$1"
WORKER_SLOT=$2
shift 2
;;
--) --)
shift shift
break break
@@ -236,6 +244,16 @@ pkgctl_build() {
esac esac
done done
# check if any release specific options were specified without releasing
if (( ! RELEASE )); then
if (( DB_UPDATE )); then
die "cannot use --db-update without --release"
fi
if [[ -n "${MESSAGE}" ]]; then
die "cannot use --message without --release"
fi
fi
# check if invoked without any path from within a packaging repo # check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then if [[ -f PKGBUILD ]]; then
@@ -246,6 +264,12 @@ pkgctl_build() {
fi fi
fi fi
# assign default worker slot
if [[ -z ${WORKER_SLOT} ]] && ! WORKER_SLOT="$(tty | sed 's|/dev/pts/||')"; then
WORKER_SLOT=$(( RANDOM % $(nproc) + 1 ))
fi
WORKER="${USER}-${WORKER_SLOT}"
# Update pacman cache for auto-detection # Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then if [[ -z ${REPO} ]]; then
update_pacman_repo_cache update_pacman_repo_cache
@@ -266,7 +290,6 @@ pkgctl_build() {
. ./PKGBUILD . ./PKGBUILD
pkgbase=${pkgbase:-$pkgname} pkgbase=${pkgbase:-$pkgname}
pkgrepo=${REPO} pkgrepo=${REPO}
soname_changed=0
msg "Building ${pkgbase}" msg "Building ${pkgbase}"
# auto-detection of build target # auto-detection of build target
@@ -279,11 +302,6 @@ pkgctl_build() {
fi fi
fi fi
# TODO: REMOVE AFTER POC
if [[ ${pkgrepo} == community ]]; then
pkgrepo=extra
fi
# special cases to resolve final build target # special cases to resolve final build target
if (( TESTING )); then if (( TESTING )); then
pkgrepo="${pkgrepo}-testing" pkgrepo="${pkgrepo}-testing"
@@ -305,8 +323,9 @@ pkgctl_build() {
fi fi
# print gathered build modes # print gathered build modes
msg2 "repo: ${pkgrepo}" msg2 " repo: ${pkgrepo}"
msg2 "arch: ${BUILD_ARCH[*]}" msg2 " arch: ${BUILD_ARCH[*]}"
msg2 "worker: ${WORKER}"
# increment pkgrel on rebuild # increment pkgrel on rebuild
if (( REBUILD )); then if (( REBUILD )); then
@@ -376,18 +395,8 @@ pkgctl_build() {
BUILDTOOL="${pkgrepo}-build" BUILDTOOL="${pkgrepo}-build"
fi fi
# TODO: REMOVE AFTER POC
offload_tool=${pkgrepo}
if [[ ${pkgrepo} == core-* ]]; then
BUILDTOOL=${BUILDTOOL/core-/}
offload_tool=${offload_tool/core-/}
elif [[ ${pkgrepo} == extra-* ]]; then
BUILDTOOL=${BUILDTOOL/extra-/}
offload_tool=${offload_tool/extra-/}
fi
if (( OFFLOAD )); then if (( OFFLOAD )); then
offload-build --repo "${offload_tool}" -- "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}" offload-build --repo "${pkgrepo}" -- "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}"
else else
"${BUILDTOOL}" "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}" "${BUILDTOOL}" "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}"
fi fi
@@ -395,11 +404,6 @@ pkgctl_build() {
# release the build # release the build
if (( RELEASE )); then if (( RELEASE )); then
if [[ ${pkgrepo} != *-staging ]] && ! diffpkg --soname >/dev/null; then
die "abort none staging auto-release: package contains soname differences"
fi
echo RELEASE, ABORT
exit 0
pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}" pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}"
fi fi

View File

@@ -22,15 +22,15 @@ export BUILDTOOLVER=@buildtoolver@
# Set common properties # Set common properties
export PACMAN_KEYRING_DIR=/etc/pacman.d/gnupg export PACMAN_KEYRING_DIR=/etc/pacman.d/gnupg
export GITLAB_HOST=gitlab.archlinux.org export GITLAB_HOST=gitlab.archlinux.org
export GIT_REPO_SPEC_VERSION=0 export GIT_REPO_SPEC_VERSION=1
export GIT_PACKAGING_NAMESPACE=bot-test/packages export GIT_PACKAGING_NAMESPACE=archlinux/packaging/packages
export GIT_PACKAGING_NAMESPACE_ID=11233 export GIT_PACKAGING_NAMESPACE_ID=11323
export GIT_PACKAGING_URL_SSH="ssh://git@${GITLAB_HOST}:222/${GIT_PACKAGING_NAMESPACE}" export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}"
export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}" export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}"
export PACKAGING_REPO_RELEASE_HOST=repos.sandbox.archlinux.org export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org
# check if messages are to be printed using color # check if messages are to be printed using color
if [[ -t 2 && "$TERM" != dumb ]]; then if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then
colorize colorize
else else
# shellcheck disable=2034 # shellcheck disable=2034

View File

@@ -34,8 +34,12 @@ load_devtools_config() {
save_devtools_config() { save_devtools_config() {
# temporary permission fixup # temporary permission fixup
if [[ -d "${XDG_DEVTOOLS_DIR}" ]]; then
chmod 700 "${XDG_DEVTOOLS_DIR}" chmod 700 "${XDG_DEVTOOLS_DIR}"
fi
if [[ -f "${XDG_DEVTOOLS_GITLAB_CONFIG}" ]]; then
chmod 600 "${XDG_DEVTOOLS_GITLAB_CONFIG}" chmod 600 "${XDG_DEVTOOLS_GITLAB_CONFIG}"
fi
( (
umask 0077 umask 0077
mkdir -p "${XDG_DEVTOOLS_DIR}" mkdir -p "${XDG_DEVTOOLS_DIR}"

View File

@@ -25,7 +25,7 @@ pkgctl_db_remove_usage() {
EXAMPLES EXAMPLES
$ ${COMMAND} core-testing libfoo libbar $ ${COMMAND} core-testing libfoo libbar
$ ${COMMAND} core --arch x86_64 libyay $ ${COMMAND} --arch x86_64 core libyay
_EOF_ _EOF_
} }

View File

@@ -145,11 +145,6 @@ pkgctl_release() {
fi fi
fi fi
# TODO: REMOVE AFTER POC
if [[ ${repo} == community ]]; then
repo=extra
fi
if (( TESTING )); then if (( TESTING )); then
repo="${repo}-testing" repo="${repo}-testing"
elif (( STAGING )); then elif (( STAGING )); then

View File

@@ -30,6 +30,7 @@ pkgctl_repo_usage() {
clone Clone a package repository clone Clone a package repository
configure Configure a clone according to distro specs configure Configure a clone according to distro specs
create Create a new GitLab package repository create Create a new GitLab package repository
switch Switch a package repository to a specified version
web Open the packaging repository's website web Open the packaging repository's website
OPTIONS OPTIONS
@@ -40,6 +41,7 @@ pkgctl_repo_usage() {
$ ${COMMAND} clone --maintainer mynickname $ ${COMMAND} clone --maintainer mynickname
$ ${COMMAND} configure * $ ${COMMAND} configure *
$ ${COMMAND} create libfoo $ ${COMMAND} create libfoo
$ ${COMMAND} switch 2:1.19.5-1 libfoo
$ ${COMMAND} web linux $ ${COMMAND} web linux
_EOF_ _EOF_
} }
@@ -81,6 +83,14 @@ pkgctl_repo() {
pkgctl_repo_create "$@" pkgctl_repo_create "$@"
exit 0 exit 0
;; ;;
switch)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
pkgctl_repo_switch "$@"
exit 0
;;
web) web)
_DEVTOOLS_COMMAND+=" $1" _DEVTOOLS_COMMAND+=" $1"
shift shift

View File

@@ -26,18 +26,22 @@ pkgctl_repo_clone_usage() {
Clone Git packaging repositories from the canonical namespace. Clone Git packaging repositories from the canonical namespace.
The configure command is subsequently invoked to synchronize the distro The configure command is subsequently invoked to synchronize the distro
specs and makepkg.conf settings. The unprivileged option can be used specs and makepkg.conf settings. The protocol option can be used
for cloning packaging repositories without SSH access using read-only for cloning packaging repositories without SSH access using read-only
HTTPS. HTTPS.
OPTIONS OPTIONS
-m, --maintainer=NAME Clone all packages of the named maintainer -m, --maintainer=NAME Clone all packages of the named maintainer
--protocol https Clone the repository over https
--switch VERSION Switch the current working tree to a specified version
--universe Clone all existing packages, useful for cache warming --universe Clone all existing packages, useful for cache warming
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} libfoo linux libbar $ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --maintainer mynickname $ ${COMMAND} --maintainer mynickname
$ ${COMMAND} --switch 1:1.0-2 libfoo
_EOF_ _EOF_
} }
@@ -51,10 +55,13 @@ pkgctl_repo_clone() {
local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH} local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
local CLONE_ALL=0 local CLONE_ALL=0
local MAINTAINER= local MAINTAINER=
local VERSION=
local CONFIGURE_OPTIONS=() local CONFIGURE_OPTIONS=()
local pkgbases local jobs=
jobs=$(nproc)
# variables # variables
local command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local project_path local project_path
while (( $# )); do while (( $# )); do
@@ -63,11 +70,21 @@ pkgctl_repo_clone() {
pkgctl_repo_clone_usage pkgctl_repo_clone_usage
exit 0 exit 0
;; ;;
-u|--unprivileged) --protocol=https)
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS} GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
CONFIGURE_OPTIONS+=("$1") CONFIGURE_OPTIONS+=("$1")
shift shift
;; ;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
else
die "unsupported protocol: %s" "$2"
fi
CONFIGURE_OPTIONS+=("$1" "$2")
shift 2
;;
-m|--maintainer) -m|--maintainer)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
MAINTAINER="$2" MAINTAINER="$2"
@@ -77,10 +94,28 @@ pkgctl_repo_clone() {
MAINTAINER="${1#*=}" MAINTAINER="${1#*=}"
shift shift
;; ;;
--switch)
(( $# <= 1 )) && die "missing argument for %s" "$1"
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
VERSION="$2"
shift 2
;;
--switch=*)
# shellcheck source=src/lib/repo/switch.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/switch.sh
VERSION="${1#*=}"
shift
;;
--universe) --universe)
CLONE_ALL=1 CLONE_ALL=1
shift shift
;; ;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--) --)
shift shift
break break
@@ -126,16 +161,39 @@ pkgctl_repo_clone() {
stat_done stat_done
fi fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then
# force colors in parallel if parent process is colorized
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
# assign command options
if [[ -n "${VERSION}" ]]; then
command+=" --switch '${VERSION}'"
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then
die 'Failed to clone some packages, please check the output'
exit 1
fi
exit 0
fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
if [[ ! -d ${pkgbase} ]]; then if [[ ! -d ${pkgbase} ]]; then
msg "Cloning ${pkgbase} ..." msg "Cloning ${pkgbase} ..."
project_path=$(gitlab_project_name_to_path "${pkgbase}") project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git" remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
git clone --origin origin "${remote_url}" "${pkgbase}" if ! git clone --origin origin "${remote_url}" "${pkgbase}"; then
die 'failed to clone %s' "${pkgbase}"
fi
else else
warning "Skip cloning ${pkgbase}: Directory exists" warning "Skip cloning ${pkgbase}: Directory exists"
fi fi
pkgctl_repo_configure "${CONFIGURE_OPTIONS[@]}" "${pkgbase}" pkgctl_repo_configure "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
if [[ -n "${VERSION}" ]]; then
pkgctl_repo_switch "${VERSION}" "${pkgbase}"
fi
done done
} }

View File

@@ -33,6 +33,8 @@ pkgctl_repo_configure_usage() {
read-only HTTPS otherwise. read-only HTTPS otherwise.
OPTIONS OPTIONS
--protocol https Configure remote url to use https
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
@@ -93,9 +95,13 @@ pkgctl_repo_configure() {
local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS} local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
local official=0 local official=0
local proto=https local proto=https
local proto_force=0
local jobs=
jobs=$(nproc)
local paths=() local paths=()
# variables # variables
local -r command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local path realpath pkgbase remote_url project_path local path realpath pkgbase remote_url project_path
local PACKAGER GPGKEY packager_name packager_email local PACKAGER GPGKEY packager_name packager_email
@@ -105,6 +111,24 @@ pkgctl_repo_configure() {
pkgctl_repo_configure_usage pkgctl_repo_configure_usage
exit 0 exit 0
;; ;;
--protocol=https)
proto_force=1
shift
;;
--protocol)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ $2 == https ]]; then
proto_force=1
else
die "unsupported protocol: %s" "$2"
fi
shift 2
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--) --)
shift shift
break break
@@ -143,10 +167,12 @@ pkgctl_repo_configure() {
fi fi
if is_packager_email_official "${packager_email}"; then if is_packager_email_official "${packager_email}"; then
official=1 official=1
if (( ! proto_force )); then
proto=ssh proto=ssh
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH} GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
fi fi
fi fi
fi
msg2 "name : ${packager_name:-${YELLOW}undefined${ALL_OFF}}" msg2 "name : ${packager_name:-${YELLOW}undefined${ALL_OFF}}"
msg2 "email : ${packager_email:-${YELLOW}undefined${ALL_OFF}}" msg2 "email : ${packager_email:-${YELLOW}undefined${ALL_OFF}}"
@@ -157,10 +183,21 @@ pkgctl_repo_configure() {
msg2 "protocol: ${YELLOW}${proto}${ALL_OFF}" msg2 "protocol: ${YELLOW}${proto}${ALL_OFF}"
fi fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then
die 'Failed to configure some packages, please check the output'
exit 1
fi
exit 0
fi
for path in "${paths[@]}"; do for path in "${paths[@]}"; do
if ! realpath=$(realpath -e "${path}"); then if ! realpath=$(realpath -e "${path}"); then
error "No such directory: ${path}" die "No such directory: ${path}"
continue
fi fi
pkgbase=$(basename "${realpath}") pkgbase=$(basename "${realpath}")
@@ -168,8 +205,7 @@ pkgctl_repo_configure() {
msg "Configuring ${pkgbase}" msg "Configuring ${pkgbase}"
if [[ ! -d "${path}/.git" ]]; then if [[ ! -d "${path}/.git" ]]; then
error "Not a Git repository: ${path}" die "Not a Git repository: ${path}"
continue
fi fi
pushd "${path}" >/dev/null pushd "${path}" >/dev/null
@@ -181,7 +217,7 @@ pkgctl_repo_configure() {
fi fi
# move the master branch to main # move the master branch to main
if [[ $(git symbolic-ref --short HEAD) == master ]]; then if [[ $(git symbolic-ref --quiet --short HEAD) == master ]]; then
git branch --move main git branch --move main
git config branch.main.merge refs/heads/main git config branch.main.merge refs/heads/main
fi fi

119
src/lib/repo/switch.sh Normal file
View File

@@ -0,0 +1,119 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_SWITCH_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_SWITCH_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
source /usr/share/makepkg/util/message.sh
set -e
pkgctl_repo_switch_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [VERSION] [PKGBASE]...
Switch a package source repository to a specified version, tag or
branch. The working tree and the index are updated to match the
specified ref.
If a version identifier is specified in the pacman version format, that
identifier is automatically translated to the Git tag name accordingly.
The current working directory is used if no PKGBASE is specified.
OPTIONS
--discard-changes Discard changes if index or working tree is dirty
-f, --force An alias for --discard-changes
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} 1.14.6-1 gopass gopass-jsonapi
$ ${COMMAND} --force 2:1.19.5-1
$ ${COMMAND} main
_EOF_
}
pkgctl_repo_switch() {
if (( $# < 1 )); then
pkgctl_repo_switch_usage
exit 0
fi
# options
local VERSION
local GIT_REF
local GIT_CHECKOUT_OPTIONS=()
local paths path realpath pkgbase
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_switch_usage
exit 0
;;
-f|--force|--discard-changes)
GIT_CHECKOUT_OPTIONS+=("--force")
shift
;;
--)
shift
break
;;
-*)
# - is special to switch back to previous version
if [[ $1 != - ]]; then
die "invalid argument: %s" "$1"
fi
;;&
*)
if [[ -n ${VERSION} ]]; then
break
fi
VERSION=$1
shift
;;
esac
done
if [[ -z ${VERSION} ]]; then
error "missing positional argument 'VERSION'"
pkgctl_repo_switch_usage
exit 1
fi
GIT_REF="$(get_tag_from_pkgver "${VERSION}")"
paths=("$@")
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
die "Not a package repository: $(realpath -- .)"
fi
fi
for path in "${paths[@]}"; do
if ! realpath=$(realpath -e -- "${path}"); then
die "No such directory: ${path}"
fi
pkgbase=$(basename "${realpath}")
if [[ ! -d "${path}/.git" ]]; then
error "Not a Git repository: ${path}"
continue
fi
if ! git -C "${path}" checkout "${GIT_CHECKOUT_OPTIONS[@]}" "${GIT_REF}"; then
die "Failed to switch ${pkgbase} to version ${VERSION}"
fi
msg "Successfully switched ${pkgbase} to version ${VERSION}"
done
}

View File

@@ -78,6 +78,7 @@ pkgctl_repo_web() {
fi fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
xdg-open "${GIT_PACKAGING_URL_HTTPS}/${pkgbase}" path=$(gitlab_project_name_to_path "${pkgbase}")
xdg-open "${GIT_PACKAGING_URL_HTTPS}/${path}"
done done
} }

View File

@@ -1,19 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_UTIL_UTIL_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_UTIL_UTIL_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
is_tty() {
if [ ! -t 1 ] || [ -p /dev/stdout ]; then
return 1
fi
if [[ $TERM == dumb ]]; then
return 1
fi
return 0
}

View File

@@ -14,7 +14,8 @@ _repos=(
# shellcheck disable=2034 # shellcheck disable=2034
_build_repos=( _build_repos=(
extra staging testing core-staging core-testing
extra extra-staging extra-testing
multilib multilib-staging multilib-testing multilib multilib-staging multilib-testing
gnome-unstable gnome-unstable
kde-unstable kde-unstable

View File

@@ -0,0 +1,47 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_VERSION_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_VERSION_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
source /usr/share/makepkg/util/message.sh
set -e
pkgctl_version_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS]
Shows the current version information of pkgctl
OPTIONS
-h, --help Show this help text
_EOF_
}
pkgctl_version_print() {
cat <<- _EOF_
pkgctl @buildtoolver@
_EOF_
}
pkgctl_version() {
while (( $# )); do
case $1 in
-h|--help)
pkgctl_version_usage
exit 0
;;
*)
die "invalid argument: %s" "$1"
;;
esac
done
pkgctl_version_print
}

View File

@@ -301,7 +301,7 @@ done
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.' [[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}} makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}}
check_root SOURCE_DATE_EPOCH,BUILDTOOL,BUILDTOOLVER,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER check_root SOURCE_DATE_EPOCH,BUILDTOOL,BUILDTOOLVER,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER "${BASH_SOURCE[0]}" "$@"
# Canonicalize chrootdir, getting rid of trailing / # Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir") chrootdir=$(readlink -e "$passeddir")

View File

@@ -137,7 +137,7 @@ while getopts 'dM:c:l:h' arg; do
done done
shift $((OPTIND - 1)) shift $((OPTIND - 1))
check_root check_root "" "${BASH_SOURCE[0]}" "$@"
[[ -f PKGBUILD ]] || { error "No PKGBUILD in current directory."; exit 1; } [[ -f PKGBUILD ]] || { error "No PKGBUILD in current directory."; exit 1; }

View File

@@ -52,7 +52,7 @@ shift $((OPTIND - 1))
(( $# < 2 )) && die 'You must specify a directory and one or more packages.' (( $# < 2 )) && die 'You must specify a directory and one or more packages.'
check_root check_root "" "${BASH_SOURCE[0]}" "$@"
working_dir="$(readlink -f "$1")" working_dir="$(readlink -f "$1")"
shift 1 shift 1

View File

@@ -102,9 +102,9 @@ mapfile -t files < <(
printf "\t%s\n" "$temp"/* printf "\t%s\n" "$temp"/*
} >&2 && } >&2 &&
makepkg_user_config="${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" && makepkg_user_config="${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" &&
makepkg_config="/usr/share/devtools/makepkg-'"${arch}"'.conf" && makepkg_config="/usr/share/devtools/makepkg.conf.d/'"${arch}"'.conf" &&
if [[ -f /usr/share/devtools/makepkg-'"${repo}"'-'"${arch}"'.conf ]]; then if [[ -f /usr/share/devtools/makepkg.conf.d/'"${repo}"'-'"${arch}"'.conf ]]; then
makepkg_config="/usr/share/devtools/makepkg-'"${repo}"'-'"${arch}"'.conf" makepkg_config="/usr/share/devtools/makepkg.conf.d/'"${repo}"'-'"${arch}"'.conf"
fi && fi &&
makepkg --config <(cat "${makepkg_user_config}" "${makepkg_config}" 2>/dev/null) --packagelist && makepkg --config <(cat "${makepkg_user_config}" "${makepkg_config}" 2>/dev/null) --packagelist &&
printf "%s\n" "${temp}/PKGBUILD" printf "%s\n" "${temp}/PKGBUILD"

View File

@@ -25,6 +25,7 @@ usage() {
diff Compare package files using different modes diff Compare package files using different modes
release Release step to commit, tag and upload build artifacts release Release step to commit, tag and upload build artifacts
repo Manage Git packaging repositories and their configuration repo Manage Git packaging repositories and their configuration
version Show pkgctl version information
OPTIONS OPTIONS
-h, --help Show this help text -h, --help Show this help text
@@ -88,11 +89,19 @@ while (( $# )); do
release) release)
_DEVTOOLS_COMMAND+=" $1" _DEVTOOLS_COMMAND+=" $1"
shift shift
# shellcheck source=src/lib/repo.sh # shellcheck source=src/lib/release.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
pkgctl_release "$@" pkgctl_release "$@"
exit 0 exit 0
;; ;;
version|--version|-V)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/version/version.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/version.sh
pkgctl_version "$@"
exit 0
;;
*) *)
die "invalid command: %s" "$1" die "invalid command: %s" "$1"
;; ;;