Compare commits

..

39 Commits

Author SHA1 Message Date
Levente Polyak
aa938224d1 wip getopt 2023-04-17 23:28:25 +02:00
Levente Polyak
02d04a7c43 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-04-15 23:03:39 +02:00
Christian Heusel
9860819976 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-04-15 23:03:39 +02:00
Levente Polyak
c2271745c4 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-04-15 23:03:39 +02:00
Levente Polyak
4aaa7e67fd WIP: REMOVE after POC, map community to extra 2023-04-15 23:03:38 +02:00
Levente Polyak
653759343a WIP: set git packaging namespace to bot-test for testing 2023-04-15 23:03:38 +02:00
Levente Polyak
900f675385 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-04-15 23:03:38 +02:00
Levente Polyak
9d009de849 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-04-15 23:03:38 +02:00
Levente Polyak
7003aecba1 doc: add dependency declaration to the README.md
This will help to make sure dependencies are explicitly stated and
reflected in the PKGBUILD.
2023-04-15 23:03:38 +02:00
Christian Heusel
6517dd780e 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>
2023-04-15 23:03:38 +02:00
Campbell Jones
f484f9eccb 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-04-15 23:03:38 +02:00
Levente Polyak
3a41c91524 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-04-15 23:03:38 +02:00
Levente Polyak
fbe8028e82 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-04-15 23:03:38 +02:00
Levente Polyak
7659b2f6ab 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 '-'

Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-04-15 23:03:38 +02:00
Levente Polyak
9f75e17adf 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-04-15 23:03:38 +02:00
Levente Polyak
e21f2085b2 build: command to build packages inside a clean chroot 2023-04-15 23:03:38 +02:00
Levente Polyak
3d4bb4a0b3 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-03-19 22:04:48 +01:00
Levente Polyak
4527874b8e commitpkg: print deprecation warning when executed directly 2023-03-19 22:04:48 +01:00
Levente Polyak
3f7fda02a1 archrelease: print deprecation warning when executed directly 2023-03-19 22:04:48 +01:00
Levente Polyak
52e937a498 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-03-19 22:04:48 +01:00
Levente Polyak
38a56a056a 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-03-19 22:04:48 +01:00
Levente Polyak
bf64b5750c 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-03-19 22:04:47 +01:00
Levente Polyak
199c0dffcc 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-03-19 22:04:47 +01:00
Levente Polyak
8d46f05c1f 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-03-19 22:04:47 +01:00
Levente Polyak
a90f2074ee git: convert repos and tags config to new repo layout 2023-03-19 22:04:47 +01:00
Levente Polyak
3ea2367693 db: command for Pacman database modification like update, move etc 2023-03-19 22:04:47 +01:00
Levente Polyak
8569687ced commitpkg: add exported pgp keys with git 2023-03-19 22:04:47 +01:00
Levente Polyak
8202b3aed6 repo: added command to create a new packaging repository 2023-03-19 22:04:47 +01:00
Levente Polyak
9922beb1df 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.
2023-03-19 22:04:47 +01:00
Levente Polyak
cd6eb29035 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-03-19 22:04:47 +01:00
Levente Polyak
f8ca042b0f config: implemented simple config module to store token and settings 2023-03-19 22:04:47 +01:00
Levente Polyak
83a0587bc5 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-03-19 22:04:47 +01:00
Levente Polyak
4e82d313c6 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-03-19 22:02:05 +01:00
Levente Polyak
a5cc17a61f 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-03-19 22:02:05 +01:00
Levente Polyak
080bef6012 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-03-19 22:02:05 +01:00
Levente Polyak
ea47d22c20 pkgrepo: rename archco as a general purpose tool for packaging repos
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-03-19 22:02:05 +01:00
Levente Polyak
727fba8eb4 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-03-19 22:02:05 +01:00
Levente Polyak
126d99ac9a 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-03-19 22:02:05 +01:00
Levente Polyak
79eb6680dd 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-03-19 22:02:05 +01:00
175 changed files with 595 additions and 6453 deletions

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash -o pipefail SHELL=/bin/bash
V=1.2.1 V=20230307
BUILDTOOLVER ?= $(V) BUILDTOOLVER ?= $(V)
PREFIX = /usr/local PREFIX = /usr/local
@@ -16,7 +16,6 @@ LIBRARY_SRC = $(call rwildcard,src/lib,*.sh)
LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC)))) LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC))))
MAKEPKG_CONFIGS=$(wildcard config/makepkg/*) MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*) PACMAN_CONFIGS=$(wildcard config/pacman/*)
GIT_CONFIGS = $(wildcard config/git/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
MANS = $(addprefix $(BUILDDIR)/,$(patsubst %.asciidoc,%,$(wildcard doc/man/*.asciidoc))) MANS = $(addprefix $(BUILDDIR)/,$(patsubst %.asciidoc,%,$(wildcard doc/man/*.asciidoc)))
@@ -33,16 +32,12 @@ 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 \
extra-testing-x86_64-build \ testing-x86_64-build \
extra-testing-x86_64_v3-build \ testing-x86_64_v3-build \
extra-staging-x86_64-build \ staging-x86_64-build \
extra-staging-x86_64_v3-build \ staging-x86_64_v3-build \
multilib-build \ multilib-build \
multilib-testing-build \ multilib-testing-build \
multilib-staging-build \ multilib-staging-build \
@@ -52,13 +47,6 @@ ARCHBUILD_LINKS = \
COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*))) COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
CASES ?= test/case
JOBS ?= $(shell nproc)
BATS_EXTRA_ARGS ?=
BATS_ARGS ?= --jobs $(JOBS) $(BATS_EXTRA_ARGS) --verbose-run
COVERAGE_DIR ?= $(BUILDDIR)/coverage
all: binprogs library conf completion man all: binprogs library conf completion man
binprogs: $(BINPROGS) binprogs: $(BINPROGS)
library: $(LIBRARY) library: $(LIBRARY)
@@ -99,18 +87,15 @@ $(eval $(call buildInScript,build/bin,src/,.in,755))
$(eval $(call buildInScript,build/lib,src/lib/,,644)) $(eval $(call buildInScript,build/lib,src/lib/,,644))
$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444))) $(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
$(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/man/include/footer.asciidoc $(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/asciidoc.conf doc/man/include/footer.asciidoc
$(GEN_MSG) $(GEN_MSG)
@mkdir -p $(BUILDDIR)/doc/man @mkdir -p $(BUILDDIR)/doc/man
@asciidoctor --backend=manpage --destination-dir=$(BUILDDIR)/doc/man --attribute pkgdatadir=$(DATADIR) $< @a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $<
conf: conf:
@install -d $(BUILDDIR)/makepkg.conf.d @install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/pacman.conf.d
@cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d @cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@install -d $(BUILDDIR)/pacman.conf.d
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d @cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
@install -d $(BUILDDIR)/git.conf.d
@cp -a $(GIT_CONFIGS) $(BUILDDIR)/git.conf.d
clean: clean:
rm -rf $(BUILDDIR) rm -rf $(BUILDDIR)
@@ -123,7 +108,6 @@ install: all
install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin
install -dm0755 $(DESTDIR)$(DATADIR)/lib install -dm0755 $(DESTDIR)$(DATADIR)/lib
cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib
cp -a $(BUILDDIR)/git.conf.d -t $(DESTDIR)$(DATADIR)
for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
@@ -131,7 +115,6 @@ 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##*.}; \
@@ -140,15 +123,12 @@ 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
rm -rf $(DESTDIR)$(DATADIR)/git.conf.d
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;
@@ -156,36 +136,24 @@ 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")
tag: tag:
git cliff --strip=all --unreleased @sed -E "s|^V=[0-9]{8}|V=$(TODAY)|" -i Makefile
@echo "current version: v$(V)" @git commit --gpg-sign --message "Version $(TODAY)" Makefile
@read -r -p "tag version: v" VERSION && \ @git tag --sign --message "Version $(TODAY)" $(TODAY)
sed -E "s|^V=.+|V=$$VERSION|" -i Makefile && \
git commit --gpg-sign --message "chore(release): version v$$VERSION" Makefile && \
git tag --sign --message "Version v$$VERSION" v$$VERSION
release: dist
git push --tags origin master
git cliff --version >/dev/null
GITLAB_HOST=gitlab.archlinux.org glab release create v$(V) devtools-$(V).tar.gz* --milestone v$(V) --notes-file <(git cliff --strip=all --latest)
dist: dist:
git archive --format=tar --prefix=devtools-$(V)/ v$(V) | gzip > devtools-$(V).tar.gz git archive --format=tar --prefix=devtools-$(V)/ $(V) | gzip > devtools-$(V).tar.gz
gpg --detach-sign --use-agent devtools-$(V).tar.gz gpg --detach-sign --use-agent devtools-$(V).tar.gz
test: binprogs library conf completion man upload:
@mkdir -p $(COVERAGE_DIR) scp devtools-$(V).tar.gz devtools-$(V).tar.gz.sig repos.archlinux.org:/srv/ftp/other/devtools/
bats $(BATS_ARGS) $(CASES) | tee $(COVERAGE_DIR)/bats-report.xml
coverage: binprogs library conf completion man
kcov --include-path=src $(COVERAGE_DIR) bats $(BATS_ARGS) $(CASES)
jq -r '. | ["Percent covered", .percent_covered], ["Covered lines", .covered_lines], ["Total lines", .total_lines], ["Percent low", .percent_low], ["Percent high", .percent_high] | @tsv' \
$(COVERAGE_DIR)/bats.*/coverage.json
check: $(BINPROGS_SRC) $(LIBRARY_SRC) contrib/completion/bash/devtools.in config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto check: $(BINPROGS_SRC) $(LIBRARY_SRC) contrib/completion/bash/devtools.in config/makepkg/x86_64.conf contrib/makepkg/PKGBUILD.proto
shellcheck $^ shellcheck $^
.PHONY: all binprogs library completion conf man clean install uninstall tag dist upload test coverage check .PHONY: all binprogs library completion conf man clean install uninstall tag dist upload check
.DELETE_ON_ERROR: .DELETE_ON_ERROR:

View File

@@ -23,34 +23,6 @@ will automatically build the project and proxy all calls to the local build dire
./test/bin/pkgctl --help ./test/bin/pkgctl --help
``` ```
### Commit messages
All commits must follow [conventional commits](https://www.conventionalcommits.org).
The following groups are allowed:
- chore
- feat
- fix
- doc
- perf
- test
To override the scope for the changelog entry use the `Component:` trailer.
Example:
```
feat(db): yay mega cool feature
Very long and useful description.
Fixes #1
Fixes #2
Component: pkgctl db remove
```
## Releasing ## Releasing
1. bump the version in the Makefile 1. bump the version in the Makefile
@@ -62,43 +34,33 @@ Component: pkgctl db remove
## Dependencies ## Dependencies
### Runtime Dependencies ### Runtime
- arch-install-scripts - arch-install-scripts
- awk - awk
- bash - bash
- binutils - binutils
- coreutils - coreutils
- curl
- diffutils - diffutils
- expac
- fakeroot
- 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
### Optional Dependencies ### Development
- bat (pretty printing) - asciidoc
- nvchecker (version checking)
### Development Dependencies
- asciidoctor
- make - make
- shellcheck - shellcheck
- bats
## License ## License

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources #-- The package required by makepkg to download VCS sources
# Format: 'protocol::package' # Format: 'protocol::package'
VCSCLIENTS=('bzr::breezy' VCSCLIENTS=('bzr::bzr'
'fossil::fossil' 'fossil::fossil'
'git::git' 'git::git'
'hg::mercurial' 'hg::mercurial'
@@ -41,14 +41,12 @@ CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags #-- Compiler and Linker Flags
#CPPFLAGS="" #CPPFLAGS=""
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection \ -fstack-clash-protection -fcf-protection"
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
-Wl,-z,pack-relative-relocs"
LTOFLAGS="-flto=auto" LTOFLAGS="-flto=auto"
RUSTFLAGS="-Cforce-frame-pointers=yes" RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems #-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2" #MAKEFLAGS="-j2"
#-- Debugging flags #-- Debugging flags

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources #-- The package required by makepkg to download VCS sources
# Format: 'protocol::package' # Format: 'protocol::package'
VCSCLIENTS=('bzr::breezy' VCSCLIENTS=('bzr::bzr'
'fossil::fossil' 'fossil::fossil'
'git::git' 'git::git'
'hg::mercurial' 'hg::mercurial'
@@ -41,14 +41,12 @@ CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags #-- Compiler and Linker Flags
#CPPFLAGS="" #CPPFLAGS=""
CFLAGS="-march=x86-64-v3 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ CFLAGS="-march=x86-64-v3 -mtune=generic -O2 -pipe -fno-plt -fexceptions \
-Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
-fstack-clash-protection -fcf-protection \ -fstack-clash-protection -fcf-protection"
-fno-omit-frame-pointer -mno-omit-leaf-frame-pointer"
CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS"
LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \ LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
-Wl,-z,pack-relative-relocs"
LTOFLAGS="-flto=auto" LTOFLAGS="-flto=auto"
RUSTFLAGS="-Cforce-frame-pointers=yes" RUSTFLAGS=""
#-- Make Flags: change this for DistCC/SMP systems #-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2" #MAKEFLAGS="-j2"
#-- Debugging flags #-- Debugging flags

View File

@@ -1,95 +0,0 @@
#
# /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

@@ -1,89 +0,0 @@
#
# /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

@@ -1,95 +0,0 @@
#
# /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

@@ -1,89 +0,0 @@
#
# /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,16 +70,19 @@ 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.
#[core-testing] #[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] [extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[extra] [community]
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,16 +70,19 @@ 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.
#[core-testing] #[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] [extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[extra] [community]
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,16 +73,19 @@ LocalFileSigLevel = Optional
[gnome-unstable] [gnome-unstable]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core-testing] [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] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] [community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
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,16 +73,19 @@ LocalFileSigLevel = Optional
[kde-unstable] [kde-unstable]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core-testing] [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] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] [community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
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,24 +70,27 @@ 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.
[core-staging] [staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core-testing] [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,16 +70,19 @@ 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.
[core-testing] [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] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] [community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
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

@@ -70,16 +70,19 @@ 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.
#[core-testing] #[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] [extra]
Include = /etc/pacman.d/mirrorlist
#[community-testing]
#Include = /etc/pacman.d/mirrorlist #Include = /etc/pacman.d/mirrorlist
[extra] [community]
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

@@ -70,24 +70,27 @@ 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.
[core-staging] [staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core-testing] [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,24 +70,27 @@ 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.
[core-staging] [staging]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[core-testing] [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,16 +70,19 @@ 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.
[core-testing] [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] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] [community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
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,16 +70,19 @@ 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.
[core-testing] [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] [extra]
Include = /etc/pacman.d/mirrorlist Include = /etc/pacman.d/mirrorlist
[extra] [community-testing]
Include = /etc/pacman.d/mirrorlist
[community]
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

@@ -1,112 +0,0 @@
#
# /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.
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
[core-staging]
Include = /etc/pacman.d/mirrorlist
[core-testing]
Include = /etc/pacman.d/mirrorlist
[core]
Include = /etc/pacman.d/mirrorlist
[extra-staging]
Include = /etc/pacman.d/mirrorlist
[extra-testing]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the multilib repositories as required here.
[multilib-staging]
Include = /etc/pacman.d/mirrorlist
[multilib-testing]
Include = /etc/pacman.d/mirrorlist
[multilib]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -1,83 +0,0 @@
#
# /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.
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist
[kde-unstable]
Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs

View File

@@ -3,17 +3,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-build-install.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh
# shellcheck source=src/lib/valid-tags.sh # shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh # shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-inspect.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
# shellcheck source=src/lib/valid-search.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto) _colors=(never always auto)
@@ -27,19 +22,15 @@ _makechrootpkg_args=(
-I -I
-l -l
-n -n
-t
-T -T
-U -U
-x
) )
_makechrootpkg_args_d_opts() { _filedir -d; } _makechrootpkg_args_d_opts() { _filedir -d; }
_makechrootpkg_args_D_opts() { _filedir -d; } _makechrootpkg_args_D_opts() { _filedir -d; }
_makechrootpkg_args_r_opts() { _filedir -d; } _makechrootpkg_args_r_opts() { _filedir -d; }
_makechrootpkg_args_I_opts() { _filedir '*.pkg.tar.*'; } _makechrootpkg_args_I_opts() { _filedir '*.pkg.tar.*'; }
_makechrootpkg_args_l_opts() { _filedir -d; } _makechrootpkg_args_l_opts() { _filedir -d; }
_makechrootpkg_args_t_opts() { _filedir -d; }
_makechrootpkg_args_U_opts() { :; } _makechrootpkg_args_U_opts() { :; }
_makechrootpkg_args_x_opts() { _devtools_completions_inspect; }
_makechrootpkg() { __devtools_complete _makechrootpkg; } _makechrootpkg() { __devtools_complete _makechrootpkg; }
complete -F _makechrootpkg makechrootpkg complete -F _makechrootpkg makechrootpkg
@@ -47,7 +38,6 @@ complete -F _makechrootpkg makechrootpkg
_makerepropkg_args=( _makerepropkg_args=(
-h -h
-d -d
-n
-c -c
-M -M
) )
@@ -63,14 +53,12 @@ _mkarchroot_args=(
-C -C
-M -M
-c -c
-f
-h -h
) )
_mkarchroot_args_U_opts() { _filedir '*.pkg.tar.*'; } _mkarchroot_args_U_opts() { _filedir '*.pkg.tar.*'; }
_mkarchroot_args_C_opts() { _filedir '*.conf'; } _mkarchroot_args_C_opts() { _filedir '*.conf'; }
_mkarchroot_args_M_opts() { _filedir '*.conf'; } _mkarchroot_args_M_opts() { _filedir '*.conf'; }
_mkarchroot_args_c_opts() { _filedir -d; } _mkarchroot_args_c_opts() { _filedir -d; }
_mkarchroot_args_f_opts() { _filedir -d; }
_mkarchroot_opts() { _mkarchroot_opts() {
local args local args
args=$(__pkgctl_word_count_after_subcommand) args=$(__pkgctl_word_count_after_subcommand)
@@ -131,7 +119,7 @@ _offload_build_args=(
) )
_offload_build_args__repo_opts() { _devtools_completions_build_repo; } _offload_build_args__repo_opts() { _devtools_completions_build_repo; }
_offload_build_args_r_opts() { _offload_build_args__repo_opts; } _offload_build_args_r_opts() { _offload_build_args__repo_opts; }
_offload_build_args__arch_opts() { _devtools_completions_binary_arch; } _offload_build_args__arch_opts() { _devtools_completions_arch; }
_offload_build_args_a_opts() { _offload_build_args__arch_opts; } _offload_build_args_a_opts() { _offload_build_args__arch_opts; }
_offload_build_args__server_opts() { :; } _offload_build_args__server_opts() { :; }
_offload_build_args_s_opts() { _offload_build_args__server_opts; } _offload_build_args_s_opts() { _offload_build_args__server_opts; }
@@ -140,14 +128,12 @@ complete -F _offload_build offload-build
_pkgctl_cmds=( _pkgctl_cmds=(
aur
auth auth
build build
db db
diff diff
release release
repo repo
search
version version
) )
_pkgctl_args=( _pkgctl_args=(
@@ -182,15 +168,10 @@ _pkgctl_build_args=(
-t --testing -t --testing
-o --offload -o --offload
-c --clean -c --clean
-w --worker
--inspect
-I --install-to-chroot
-i --install-to-host
--pkgver --pkgver
--pkgrel --pkgrel
--rebuild --rebuild
--update-checksums
-e --edit -e --edit
-r --release -r --release
@@ -199,23 +180,13 @@ _pkgctl_build_args=(
-h --help -h --help
) )
_pkgctl_build_args__arch_opts() { _devtools_completions_binary_arch; } _pkgctl_build_args__arch_opts() { _devtools_completions_arch; }
_pkgctl_build_args__repo_opts() { _devtools_completions_repo; } _pkgctl_build_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_build_args__worker_opts() { :; }
_pkgctl_build_args_w_opts() { _pkgctl_build_args__worker_opts; }
_pkgctl_build_args__inspect_opts() { _devtools_completions_inspect; }
_pkgctl_build_args__pkgver_opts() { :; } _pkgctl_build_args__pkgver_opts() { :; }
_pkgctl_build_args__pkgrel_opts() { :; } _pkgctl_build_args__pkgrel_opts() { :; }
_pkgctl_build_args__install_to_host_opts() { _pkgctl_build_completions_install_mode; }
_pkgctl_build_args_i_opts() { _pkgctl_build_args__install_to_host_opts; }
_pkgctl_build_args__install_to_chroot_opts() { _makechrootpkg_args_I_opts; }
_pkgctl_build_args_I_opts() { _pkgctl_build_args__install_to_chroot_opts; }
_pkgctl_build_args__message_opts() { :; } _pkgctl_build_args__message_opts() { :; }
_pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; } _pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; }
_pkgctl_build_opts() { _filedir -d; } _pkgctl_build_opts() { _filedir -d; }
_pkgctl_build_completions_install_mode() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILD_INSTALL[*]}" -- "$cur")
}
_pkgctl_db_cmds=( _pkgctl_db_cmds=(
@@ -244,13 +215,9 @@ _pkgctl_db_move_opts() {
_pkgctl_db_remove_args=( _pkgctl_db_remove_args=(
--partial
--noconfirm
-a --arch -a --arch
-h --help -h --help
) )
_pkgctl_db_remove_args__arch_opts() { _devtools_completions_binary_arch; }
_pkgctl_db_remove_args_a_opts() { _pkgctl_db_remove_args__arch_opts; }
_pkgctl_db_remove_opts() { _pkgctl_db_remove_opts() {
local subcommand args local subcommand args
subcommand=(db remove) subcommand=(db remove)
@@ -283,60 +250,29 @@ _pkgctl_release_args__repo_opts() { _devtools_completions_repo; }
_pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; } _pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; }
_pkgctl_release_opts() { _filedir -d; } _pkgctl_release_opts() { _filedir -d; }
_pkgctl_aur_cmds=(
drop-from-repo
)
_pkgctl_aur_drop_from_repo_args=(
--no-disown
-f --force
-h --help
)
_pkgctl_aur_drop_from_repo_opts() { _filedir -d; }
_pkgctl_repo_cmds=( _pkgctl_repo_cmds=(
clean
clone clone
configure configure
create create
switch
web web
) )
_pkgctl_repo_clone_args=( _pkgctl_repo_clone_args=(
-m --maintainer -m --maintainer
--protocol
--switch
-u --unprivileged -u --unprivileged
--universe --universe
-j --jobs
-h --help -h --help
) )
_pkgctl_repo_clone_args__maintainer_opts() { :; } _pkgctl_repo_clone_args__maintainer_opts() { :; }
_pkgctl_repo_clone_args_m_opts() { _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_clone_opts() { _devtools_completions_all_packages; }
_pkgctl_repo_clean_args=(
-i --interactive
-n --dry-run
-h --help
)
_pkgctl_repo_clean_opts() { _filedir -d; }
_pkgctl_repo_configure_args=( _pkgctl_repo_configure_args=(
--protocol
-j --jobs
-h --help -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_configure_opts() { _filedir -d; }
@@ -345,74 +281,13 @@ _pkgctl_repo_create_args=(
-h --help -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_version_cmds=(
check
setup
upgrade
)
_pkgctl_version_check_args=(
-v --verbose
-h --help
)
_pkgctl_version_check_opts() { _filedir -d; }
_pkgctl_version_setup_args=(
--prefer-platform-api
--url
--no-check
-f --force
-h --help
)
_pkgctl_version_setup_opts() { _filedir -d; }
_pkgctl_version_setup_args__url_opts() { :; }
_pkgctl_version_upgrade_args=(
--no-update-checksums
-v --verbose
-h --help
)
_pkgctl_version_upgrade_opts() { _filedir -d; }
_pkgctl_repo_web_args=( _pkgctl_repo_web_args=(
--print
-h --help -h --help
) )
_pkgctl_repo_web_opts() { _filedir -d; } _pkgctl_repo_web_opts() { _filedir -d; }
_pkgctl_search_args=(
--no-default-filter
--json
-F --format
-N --no-line-number
-h --help
)
_pkgctl_search_opts() { :; }
_pkgctl_search_args__format_opts() { _devtools_completions_search_format; }
_pkgctl_search_args_F_opts() { _devtools_completions_search_format; }
_pkgctl_diff_args=( _pkgctl_diff_args=(
-l --list -l --list
-d --diffoscope -d --diffoscope
@@ -446,30 +321,18 @@ _devtools_completions_color() {
mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur") mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur")
} }
_devtools_completions_arch() { _devtools_completions_arch() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ARCHES[*]}" -- "$cur") mapfile -t COMPREPLY < <(compgen -W "${_arch[*]}" -- "$cur")
}
_devtools_completions_binary_arch() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BINARY_ARCHES[*]}" -- "$cur")
} }
_devtools_completions_repo() { _devtools_completions_repo() {
local optional=${1:-} local optional=${1:-}
mapfile -t COMPREPLY < <(compgen -W "${optional} ${DEVTOOLS_VALID_REPOS[*]}" -- "$cur") mapfile -t COMPREPLY < <(compgen -W "${optional} ${_repos[*]}" -- "$cur")
} }
_devtools_completions_build_repo() { _devtools_completions_build_repo() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILDREPOS[*]}" -- "$cur") mapfile -t COMPREPLY < <(compgen -W "${_build_repos[*]}" -- "$cur")
} }
_devtools_completions_all_packages() { _devtools_completions_all_packages() {
mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur") mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur")
} }
_devtools_completions_protocol() {
mapfile -t COMPREPLY < <(compgen -W "https" -- "$cur")
}
_devtools_completions_inspect() {
mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_INSPECT_MODES[*]}" -- "$cur")
}
_devtools_completions_search_format() {
mapfile -t COMPREPLY < <(compgen -W "${valid_search_output_format[*]}" -- "$cur")
}
__devtools_complete() { __devtools_complete() {
local service=$1 local service=$1

View File

@@ -3,17 +3,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-build-install.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh
# shellcheck source=src/lib/valid-tags.sh # shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh # shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-inspect.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
# shellcheck source=src/lib/valid-search.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto) _colors=(never always auto)
_archbuild_args=( _archbuild_args=(
@@ -40,21 +35,17 @@ _pkgctl_auth_status_args=(
) )
_pkgctl_build_args=( _pkgctl_build_args=(
"--arch[Specify architectures to build for (disables auto-detection)]:arch:($DEVTOOLS_VALID_BINARY_ARCHES[*])" "--arch=[Specify architectures to build for (disables auto-detection)]:arch:($_arch[*])"
"--repo[Specify a target repository (disables auto-detection)]:repo:($DEVTOOLS_VALID_REPOS[*])" "--repo=[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
'(-s --staging)'{-s,--staging}'[Build against the staging counterpart of the auto-detected repo]' '(-s --staging)'{-s,--staging}'[Build against the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]' '(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]'
'(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]' '(-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]'
"--inspect[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])" '(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
'*'{-I,--install-to-chroot}'[Install a package to the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"'
'*'{-i,--install-to-host}"[Install the built packages to the host system]:mode:($DEVTOOLS_VALID_BUILD_INSTALL[*])"
'(-w --worker)'{-w,--worker}'[Name of the worker slot, useful for concurrent builds (disables auto-detection)]:slot:'
'--nocheck[Do not run the check() function in the PKGBUILD]' '--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:'
'--rebuild[Increment the pkgrel variable]' '--rebuild[Increment the pkgrel variable]'
'--update-checksums[Force computation and update of the checksums (disables auto-detection)]'
'(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]' '(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]'
'(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]' '(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]'
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:" '(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
@@ -72,17 +63,15 @@ _pkgctl_db_cmds=(
_pkgctl_db_move_args=( _pkgctl_db_move_args=(
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
"1:src-repo:($DEVTOOLS_VALID_REPOS[*])" "1:src-repo:($_repos[*])"
"2:target-repo:($DEVTOOLS_VALID_REPOS[*])" "2:target-repo:($_repos[*])"
'*:pkgbase:_devtools_completions_all_packages' '*:pkgbase:_devtools_completions_all_packages'
) )
_pkgctl_db_remove_args=( _pkgctl_db_remove_args=(
'--partial[Remove only partial pkgnames from a split package]' '(-a --arch=)'{-a,--arch=}"[Override the architecture (disables auto-detection)]:arch:($_arch[*])"
'--noconfirm[Bypass any confirmation messages, should only be used with caution]'
'(-a --arch)'{-a,--arch}"[Override the architecture (disables auto-detection)]:arch:($DEVTOOLS_VALID_BINARY_ARCHES[*])"
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
"1:repo:($DEVTOOLS_VALID_REPOS[*])" "1:repo:($_repos[*])"
'*:pkgbase:_devtools_completions_all_packages' '*:pkgbase:_devtools_completions_all_packages'
) )
@@ -92,7 +81,7 @@ _pkgctl_db_update_args=(
_pkgctl_release_args=( _pkgctl_release_args=(
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:" '(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-r --repo=)'{-r,--repo=}"[Specify a target repository for new packages]:repo:($DEVTOOLS_VALID_REPOS[*])" '(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($_repos[*])"
'(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]' '(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]' '(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]'
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]' '(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]'
@@ -100,55 +89,22 @@ _pkgctl_release_args=(
'*:git_dir:_files -/' '*:git_dir:_files -/'
) )
_pkgctl_aur_cmds=(
"pkgctl aur command"
"drop-from-repo[Drop a package from the official repository to the AUR]"
)
_pkgctl_aur_drop_from_repo_args=(
'(-f --force)'{-f,--force}'[Force push to the AUR overwriting the remote repository]'
'--no-disown[Do not disown the package on the AUR]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_cmds=( _pkgctl_repo_cmds=(
"pkgctl repo command" "pkgctl repo command"
"clean[Remove untracked files from the working tree]"
"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_clean_args=(
'(-i --interactive)'{-i,--interactive}'[Show what would be done and clean files interactively]'
'(-n --dry-run)'{-n,--dry-run}"[Don't remove anything, just show what would be done]"
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_clone_args=( _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 -/'
) )
@@ -160,25 +116,15 @@ _pkgctl_repo_create_args=(
) )
_pkgctl_repo_web_args=( _pkgctl_repo_web_args=(
'--print[Print the url instead of opening it with xdg-open]'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/' '*:git_dir:_files -/'
) )
_pkgctl_search_args=(
'--no-default-filter[Do not apply default filter (like -path:keys/pgp/*.asc)]'
'--json[Enable printing results in JSON]'
'(-F --format)'{-F,--format}"[Controls the formatting of the results]:format:($valid_search_output_format[*])"
'(-N --no-line-number)'{-N,--no-line-number}"[Don't show line numbers when formatting results]"
'(-h --help)'{-h,--help}'[Display usage]'
'1:query'
)
_arch_nspawn_args=( _arch_nspawn_args=(
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"' '-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"' '-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'*-c[Set pacman cache]:pacman_cache:_files -/' '-c[Set pacman cache]:pacman_cache:_files -/'
'*-f[Copy file from the host to the chroot]:copy_file:_files' '-f[Copy file from the host to the chroot]:copy_file:_files'
'-s[Do not run setarch]' '-s[Do not run setarch]'
'-h[Display usage]' '-h[Display usage]'
'1:chroot_dir:_files -/' '1:chroot_dir:_files -/'
@@ -186,14 +132,14 @@ _arch_nspawn_args=(
_archrelease_args=( _archrelease_args=(
'-f[Force release without checks]' '-f[Force release without checks]'
"*:arch:($DEVTOOLS_VALID_TAGS[*])" "*:arch:($_tags[*])"
) )
_commitpkg_args=( _commitpkg_args=(
'-f[Force release without checks]' '-f[Force release without checks]'
'-s[Target repo server]' '-s[Target repo server]'
'-l[Set bandwidth limit]:limit' '-l[Set bandwidth limit]:limit'
"-a[Release to a specific architecture only]:arch:($DEVTOOLS_VALID_ARCHES[*])" "-a[Release to a specific architecture only]:arch:($_arch[*])"
'1:commit_msg' '1:commit_msg'
) )
@@ -220,17 +166,15 @@ _finddeps_args=(
_makechrootpkg_args=( _makechrootpkg_args=(
'-h[Display usage]' '-h[Display usage]'
'-c[Clean the chroot before building]' '-c[Clean the chroot before building]'
'*-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/' '-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/'
'*-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/' '-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/'
'*-t[Mount a tmpfs at directory]:tmpfs_dir:_files -/'
'-u[Update the working copy of the chroot before building]' '-u[Update the working copy of the chroot before building]'
'-r[The chroot dir to use]:chroot_dir:_files -/' '-r[The chroot dir to use]:chroot_dir:_files -/'
'*-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"' '-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
'-l[The directory to use as the working copy]:copy_dir:_files -/' '-l[The directory to use as the working copy]:copy_dir:_files -/'
'-n[Run namcap on the package]' '-n[Run namcap on the package]'
'-T[Build in a temporary directory]' '-T[Build in a temporary directory]'
'-U[Run makepkg as a specified user]:makepkg_user' '-U[Run makepkg as a specified user]:makepkg_user'
"-x[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])"
) )
_mkarchroot_args=( _mkarchroot_args=(
@@ -238,7 +182,6 @@ _mkarchroot_args=(
'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"' '-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"' '-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-c[Set pacman cache]:pacman_cache:_files -/' '-c[Set pacman cache]:pacman_cache:_files -/'
'-f[Copy src file from the host to the chroot]:target:_files -/'
'-h[Display usage]' '-h[Display usage]'
'1:working_dir:_files -/' '1:working_dir:_files -/'
'*:packages:_devtools_completions_all_packages' '*:packages:_devtools_completions_all_packages'
@@ -255,20 +198,19 @@ _sogrep_args=(
'(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]' '(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]'
'(-r --refresh)'{-r,--refresh}'[Refresh the links databases]' '(-r --refresh)'{-r,--refresh}'[Refresh the links databases]'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
'1:repo:(all $DEVTOOLS_VALID_REPOS[*])' '1:repo:(all $_repos[*])'
'2:libname' '2:libname'
) )
_offload_build_args=( _offload_build_args=(
'(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($DEVTOOLS_VALID_BUILDREPOS[*])' '(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($_build_repos[*])'
'(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${DEVTOOLS_VALID_BINARY_ARCHES[*]})' '(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${_binary_arch[*]})'
'(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:' '(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
) )
_makerepropkg_args=( _makerepropkg_args=(
'-d[Run diffoscope if the package is unreproducible]' '-d[Run diffoscope if the package is unreproducible]'
'-n[Do not run the check() function in the PKGBUILD]'
'-c[Set pacman cache]:pacman_cache:_files -/' '-c[Set pacman cache]:pacman_cache:_files -/'
'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"' '-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
'-h[Display usage]' '-h[Display usage]'
@@ -283,15 +225,13 @@ _devtools_completions_all_packages() {
_pkgctl_cmds=( _pkgctl_cmds=(
"pkgctl command" "pkgctl command"
"aur[Interact with the Arch User Repository (AUR)]"
"auth[Authenticate with services like GitLab]" "auth[Authenticate with services like GitLab]"
"build[Build packages inside a clean chroot]" "build[Build packages inside a clean chroot]"
"db[Pacman database modification for package update, move etc]" "db[Pacman database modification for packge update, move etc]"
"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]"
"search[Search for an expression across the GitLab packaging group]" "version[Show pkgctl version information]"
"version[Check and manage package versions against upstream]"
) )
_pkgctl_args=( _pkgctl_args=(
@@ -299,33 +239,8 @@ _pkgctl_args=(
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
) )
_pkgctl_version_cmds=( _pkgctl_version_args=(
"pkgctl version command"
"check[Compares local package versions against upstream versions]"
"setup[Automatically detect and setup a basic nvchecker config]"
"upgrade[Adjust the PKGBUILD to match the latest upstream version]"
)
_pkgctl_version_check_args=(
'(-v --verbose)'{-v,--verbose}'[Display results including up-to-date versions]'
'(-h --help)'{-h,--help}'[Display usage]' '(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_version_setup_args=(
'(-f --force)'{-f,--force}'[Do not prompt before overwriting]'
'--prefer-platform-api[Prefer platform specific GitHub/GitLab API for complex cases]'
'--url[Derive check target from URL instead of source array]:url:'
'--no-check[Do not run version check after setup]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_version_upgrade_args=(
'--no-update-checksums[Disable computation and update of the checksums]'
'(-v --verbose)'{-v,--verbose}'[Display results including up-to-date versions]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
) )
_pkgctl_diff_args=("${_diffpkg_args[@]}") _pkgctl_diff_args=("${_diffpkg_args[@]}")
@@ -347,7 +262,7 @@ _handle_subcommands() {
fi fi
;; ;;
args) args)
local service_sub=${service_name}_${line[1]//-/_} local service_sub=${service_name}_$line[1]
if typeset -p ${service_sub}_args &> /dev/null; then if typeset -p ${service_sub}_args &> /dev/null; then
local cmd_args=${service_sub}_args[@] local cmd_args=${service_sub}_args[@]
_arguments -s "${(P)cmd_args}" _arguments -s "${(P)cmd_args}"

37
doc/asciidoc.conf Normal file
View File

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

View File

@@ -28,9 +28,8 @@ Options
*-c* <dir>:: *-c* <dir>::
Set pacman cache, if no directory is specified the passed pacman.conf's cachedir is used with a fallback to '/etc/pacman.conf' Set pacman cache, if no directory is specified the passed pacman.conf's cachedir is used with a fallback to '/etc/pacman.conf'
*-f* <src>[:<dst>]:: *-f* <file>::
Copy file from the host to the chroot. Copy file from the host to the chroot
If 'dst' is not provided, it defaults to 'src' inside of the chroot.
*-s*:: *-s*::
Do not run setarch Do not run setarch

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
makerepropkg(1) makerepropkg(1)
=============== ================
Name Name
---- ----
@@ -16,7 +16,7 @@ Given the path to a built pacman package(s), attempt to rebuild it using the
PKGBUILD in the current directory. The package will be built in an environment PKGBUILD in the current directory. The package will be built in an environment
as closely matching the environment of the initial package as possible, by as closely matching the environment of the initial package as possible, by
building up a chroot to match the information exposed in the package's building up a chroot to match the information exposed in the package's
BUILDINFO(5) manifest. On success, the resulting package will be linkman:BUILDINFO[5] manifest. On success, the resulting package will be
compared to the input package, and makerepropkg will report whether the compared to the input package, and makerepropkg will report whether the
artifacts are identical. artifacts are identical.
@@ -42,9 +42,6 @@ Options
*-d*:: *-d*::
If packages are not reproducible, compare them using diffoscope. If packages are not reproducible, compare them using diffoscope.
*-n*::
Do not run the check() function in the PKGBUILD.
*-c*:: *-c*::
Set the pacman cache directory. Set the pacman cache directory.

View File

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

View File

@@ -1,41 +0,0 @@
pkgctl-aur-drop-from-repo(1)
============================
Name
----
pkgctl-aur-drop-from-repo - Drop a package from the official repository to the AUR
Synopsis
--------
pkgctl aur drop-from-repo [OPTIONS] [PATH]...
Description
-----------
Drops a specified package from the official repositories to the Arch User
Repository.
This command requires a local Git clone of the package repository. It
reconfigures the repository for AUR compatibility and pushes it to the
AUR. Afterwards, the package is removed from the official repository.
By default, the package is automatically disowned in the AUR.
Options
-------
*--no-disown*::
Do not disown the package on the AUR
*-f, --force*::
Force push to the AUR overwriting the remote repository
*-h, --help*::
Show a help text
See Also
--------
pkgctl-db-remove(1)
include::include/footer.asciidoc[]

View File

@@ -1,37 +0,0 @@
pkgctl-aur(1)
=============
Name
----
pkgctl-aur - Interact with the Arch User Repository (AUR)
Synopsis
--------
pkgctl aur [OPTIONS] [SUBCOMMAND]
Description
-----------
Provides a suite of tools designed for managing and interacting with the Arch
User Repository (AUR). It simplifies various tasks related to AUR, including
importing repositories, managing packages, and transitioning packages between
the official repositories and the AUR.
Options
-------
*-h, --help*::
Show a help text
Subcommands
-----------
pkgctl aur drop-from-repo::
Drop a package from the official repository to the AUR
See Also
--------
pkgctl-aur-drop-from-repo(1)
include::include/footer.asciidoc[]

View File

@@ -1,40 +0,0 @@
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
--------
pkgctl-auth-status(1)
include::include/footer.asciidoc[]

View File

@@ -1,32 +0,0 @@
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
--------
pkgctl-auth-login(1)
include::include/footer.asciidoc[]

View File

@@ -1,38 +0,0 @@
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
--------
pkgctl-auth-login(1)
pkgctl-auth-status(1)
include::include/footer.asciidoc[]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
pkgctl-repo-clone(1) pkgctl-repo-clone(1)
==================== ======================
Name Name
---- ----
@@ -25,28 +25,15 @@ 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
See Also See Also
-------- --------
pkgctl-repo-configure(1) linkman:pkgctl-repo-configure[1]
pkgctl-repo-switch(1)
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

@@ -22,19 +22,9 @@ The remote protocol is automatically determined from the author email
address by choosing SSH for all official packager identities and address by choosing SSH for all official packager identities and
read-only HTTPS otherwise. read-only HTTPS otherwise.
Git default excludes and hooks are applied to the configured repo.
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
---- ----
@@ -33,8 +33,8 @@ Options
See Also See Also
-------- --------
pkgctl-auth(1) linkman:pkgctl-auth[1]
pkgctl-repo-clone(1) linkman:pkgctl-repo-clone[1]
pkgctl-repo-configure(1) linkman:pkgctl-repo-configure[1]
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

@@ -1,36 +0,0 @@
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

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

View File

@@ -1,5 +1,5 @@
pkgctl-repo(1) pkgctl-repo(1)
============== ================
Name Name
---- ----
@@ -32,9 +32,6 @@ Options
Subcommands Subcommands
----------- -----------
pkgctl repo clean::
Remove untracked files from the working tree
pkgctl repo clone:: pkgctl repo clone::
Clone a package repository Clone a package repository
@@ -44,20 +41,15 @@ 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
See Also See Also
-------- --------
pkgctl-repo-clean(1) linkman:pkgctl-repo-clone[1]
pkgctl-repo-clone(1) linkman:pkgctl-repo-configure[1]
pkgctl-repo-configure(1) linkman:pkgctl-repo-create[1]
pkgctl-repo-create(1) linkman:pkgctl-repo-web[1]
pkgctl-repo-switch(1)
pkgctl-repo-web(1)
include::include/footer.asciidoc[] include::include/footer.asciidoc[]

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

46
opts.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
# NOTE: This requires GNU getopt
if ! ARGS=$(getopt --options vdm:D: \
--long verbose,debug,memory:,debugfile: \
--name 'pkgctl foo' -- "$@"); then
exit 1
fi
eval set -- "$ARGS"
echo "${ARGS}"
while (( $# )); do
case "$1" in
-v | --verbose ) echo verbose; shift ;;
-d | --debug ) echo debug; shift ;;
-m | --memory ) echo "memory=$2"; shift 2 ;;
-D | --debugfile ) echo "debugfile=$2"; shift 2 ;;
--)
echo --
shift
break
;;
-*)
echo "invalid argument: %s" "$1"
exit 1
;;
*)
echo STAR "$1"
shift
;;
esac
done
echo main
if (( ! $# )); then
echo missing positional param: version
exit 1
fi
version=$1
shift
echo "version $version"
echo "$@"

View File

@@ -16,6 +16,7 @@ umask 0022
working_dir='' working_dir=''
files=() files=()
mount_args=()
usage() { usage() {
echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]" echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
@@ -25,16 +26,12 @@ usage() {
echo ' -C <file> Location of a pacman config file' echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file' echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache' echo ' -c <dir> Set pacman cache'
echo ' -f <src>[:<dst>] Copy src file from the host to the chroot.' echo ' -f <file> Copy file from the host to the chroot'
echo ' If dst file is not provided, it defaults to src'
echo ' -s Do not run setarch' echo ' -s Do not run setarch'
echo ' -h This message' echo ' -h This message'
exit 1 exit 1
} }
# save all args for check_root
orig_args=("$@")
while getopts 'hC:M:c:f:s' arg; do while getopts 'hC:M:c:f:s' arg; do
case "$arg" in case "$arg" in
C) pac_conf="$OPTARG" ;; C) pac_conf="$OPTARG" ;;
@@ -49,31 +46,19 @@ done
shift $((OPTIND - 1)) shift $((OPTIND - 1))
(( $# < 1 )) && die 'You must specify a directory.' (( $# < 1 )) && die 'You must specify a directory.'
check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" check_root
working_dir=$(readlink -f "$1") working_dir=$(readlink -f "$1")
shift 1 shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.' [[ -z $working_dir ]] && die 'Please specify a working directory.'
nspawn_args=(
--quiet
--directory="$working_dir"
--setenv="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin"
--register=no
--slice="devtools-$(systemd-escape "${SUDO_USER:-$USER}")"
--machine="arch-nspawn-$$"
--as-pid2
--console=autopipe
)
if (( ${#cache_dirs[@]} == 0 )); then if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir) mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi fi
# shellcheck disable=2016 # shellcheck disable=2016
host_mirrors=($(pacman-conf --repo extra Server 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#')) host_mirrors=($(pacman-conf --repo extra Server 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#'))
host_cachemirrors=($(pacman-conf --repo extra CacheServer 2> /dev/null | sed -r 's#(.*/)extra/os/.*#\1$repo/os/$arch#'))
for host_mirror in "${host_mirrors[@]}"; do for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then if [[ $host_mirror == *file://* ]]; then
@@ -95,10 +80,10 @@ while read -r line; do
done done
done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list) done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
nspawn_args+=(--bind="${cache_dirs[0]//:/\\:}") mount_args+=("--bind=${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do for cache_dir in "${cache_dirs[@]:1}"; do
nspawn_args+=(--bind-ro="${cache_dir//:/\\:}") mount_args+=("--bind-ro=${cache_dir//:/\\:}")
done done
# {{{ functions # {{{ functions
@@ -108,17 +93,13 @@ copy_hostconf () {
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist" printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $host_cachemirrors ]] && printf 'CacheServer = %s\n' "${host_cachemirrors[@]}" >>"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf" [[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf" [[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
local file local file
for file in "${files[@]}"; do for file in "${files[@]}"; do
src="${file%%:*}" mkdir -p "$(dirname "$working_dir$file")"
dst="${file#*:}" cp -T "$file" "$working_dir$file"
mkdir -p "$(dirname "$working_dir$dst")"
cp -T "$src" "$working_dir$dst"
done done
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf" sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "$working_dir/etc/pacman.conf"
@@ -145,4 +126,9 @@ else
set_arch="${CARCH}" set_arch="${CARCH}"
fi fi
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn "${nspawn_args[@]}" "$@" exec ${CARCH:+setarch "$set_arch"} systemd-nspawn -q \
-D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \
"${mount_args[@]}" \
"$@"

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 "${BASH_SOURCE[0]}" "$@" check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
# Pass all arguments after -- right to makepkg # Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}") makechrootpkg_args+=("${@:$OPTIND}")

View File

@@ -35,7 +35,7 @@ fi
# validate repo is really repo-arch # validate repo is really repo-arch
if [[ -z $FORCE ]]; then if [[ -z $FORCE ]]; then
for tag in "$@"; do for tag in "$@"; do
if ! in_array "$tag" "${DEVTOOLS_VALID_TAGS[@]}"; then if ! in_array "$tag" "${_tags[@]}"; then
die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag" die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag"
fi fi
done done
@@ -89,6 +89,7 @@ if git tag --verify "$gittag" &> /dev/null; then
exit 0 exit 0
fi fi
msg "Releasing package" stat_busy "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

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

View File

@@ -5,13 +5,9 @@
_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/srcinfo.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh
source /usr/share/makepkg/util/util.sh source /usr/share/makepkg/util/util.sh
set -eo pipefail
check_pkgbuild_validity() { check_pkgbuild_validity() {
# shellcheck source=contrib/makepkg/PKGBUILD.proto # shellcheck source=contrib/makepkg/PKGBUILD.proto
@@ -74,12 +70,6 @@ if ! repo_spec=$(git config --local devtools.version) || [[ ${repo_spec} != "${G
exit 1 exit 1
fi fi
if ! repo_variant=$(git config --local devtools.variant) || [[ ${repo_variant} != canonical ]]; then
error "cannot release from a repository with none canonical specs (%s), try:" "${repo_variant:-development}"
msg2 'pkgctl repo configure'
exit 1
fi
if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then
die 'must be run from the main branch' die 'must be run from the main branch'
fi fi
@@ -121,7 +111,7 @@ if (( ${#validpgpkeys[@]} != 0 )); then
fi fi
# find files which should be under source control # find files which should be under source control
needsversioning=(PKGBUILD) needsversioning=()
for s in "${source[@]}"; do for s in "${source[@]}"; do
[[ $s != *://* ]] && needsversioning+=("$s") [[ $s != *://* ]] && needsversioning+=("$s")
done done
@@ -139,10 +129,6 @@ done
# assert that they really are controlled by git # assert that they really are controlled by git
if (( ${#needsversioning[*]} )); then if (( ${#needsversioning[*]} )); then
for file in "${needsversioning[@]}"; do for file in "${needsversioning[@]}"; do
# skip none existing files
if [[ ! -f "${file}" ]]; then
continue
fi
if ! git ls-files --error-unmatch "$file"; then if ! git ls-files --error-unmatch "$file"; then
die "%s is not under version control" "$file" die "%s is not under version control" "$file"
fi fi
@@ -151,7 +137,7 @@ fi
server=${PACKAGING_REPO_RELEASE_HOST} server=${PACKAGING_REPO_RELEASE_HOST}
rsyncopts=("${RSYNC_OPTS[@]}" --perms --chmod='ug=rw,o=r') rsyncopts=(-e ssh -p '--chmod=ug=rw,o=r' -c -h -L --progress --partial -y)
archreleaseopts=() archreleaseopts=()
while getopts ':l:a:s:f' flag; do while getopts ':l:a:s:f' flag; do
case $flag in case $flag in
@@ -187,12 +173,7 @@ done
# check for PKGBUILD standards # check for PKGBUILD standards
check_pkgbuild_validity check_pkgbuild_validity
# auto generate .SRCINFO if [[ -n $(git status --short --untracked-files=no) ]]; then
# shellcheck disable=SC2119
write_srcinfo_file
git add --force .SRCINFO
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"
@@ -213,14 +194,14 @@ if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
echo "$msgtemplate" > "$msgfile" echo "$msgtemplate" > "$msgfile"
if [[ -n $GIT_EDITOR ]]; then if [[ -n $GIT_EDITOR ]]; then
$GIT_EDITOR "$msgfile" || die $GIT_EDITOR "$msgfile" || die
elif giteditor=$(git config --get core.editor); then
$giteditor "$msgfile" || die
elif [[ -n $VISUAL ]]; then elif [[ -n $VISUAL ]]; then
$VISUAL "$msgfile" || die $VISUAL "$msgfile" || die
elif [[ -n $EDITOR ]]; then elif [[ -n $EDITOR ]]; then
$EDITOR "$msgfile" || die $EDITOR "$msgfile" || die
elif giteditor=$(git config --get core.editor); then
$giteditor "$msgfile" || die
else else
die "No usable editor found (tried \$GIT_EDITOR, git config [core.editor], \$VISUAL, \$EDITOR)." die "No usable editor found (tried \$GIT_EDITOR, \$VISUAL, \$EDITOR, git config [core.editor])."
fi fi
[[ -s $msgfile ]] || die [[ -s $msgfile ]] || die
stat_busy 'Committing changes' stat_busy 'Committing changes'

View File

@@ -215,8 +215,7 @@ 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}"
local -a diffoptions DIFFOPTIONS+=(--label "${oldpkg}" --label "${newpkg}")
diffoptions=("${DIFFOPTIONS[@]}" --label "${oldpkg}" --label "${newpkg}")
if (( TARLIST )); then if (( TARLIST )); then
tar_list "$oldpkg" > "$TMPDIR/old" tar_list "$oldpkg" > "$TMPDIR/old"
@@ -237,7 +236,7 @@ diff_pkgs() {
# 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
# Print a header for side-by-side view as it lacks labels # Print a header for side-by-side view as it lacks labels
@@ -245,7 +244,7 @@ diff_pkgs() {
printf -- "--- %s\n+++ %s\n" "${oldpkg}" "${newpkg}" printf -- "--- %s\n+++ %s\n" "${oldpkg}" "${newpkg}"
fi fi
diff "${diffoptions[@]}" "$TMPDIR/old" "$TMPDIR/new" diff "${DIFFOPTIONS[@]}" "$TMPDIR/old" "$TMPDIR/new"
fi fi
if (( DIFFOSCOPE )); then if (( DIFFOSCOPE )); then

View File

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

View File

@@ -13,63 +13,13 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/config.sh
set -e set -e
graphql_api_call() {
local outfile=$1
local request=$2
local node_type=$3
local data=$4
local hasNextPage cursor
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
msg_error " api call failed: No token provided"
return 1
fi
[[ -z ${WORKDIR:-} ]] && setup_workdir
api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX)
# normalize graphql data and prepare query
data="${data//\"/\\\"}"
data='{
"query": "'"${data}"'"
}'
data="${data//$'\t'/ }"
data="${data//$'\n'/}"
cursor=""
hasNextPage=true
while [[ ${hasNextPage} == true ]]; do
data=$(sed -E 's|after: \\"[a-zA-Z0-9]*\\"|after: \\"'"${cursor}"'\\"|' <<< "${data}")
result="${api_workdir}/result.${cursor}"
if ! curl --request "${request}" \
--url "https://${GITLAB_HOST}/api/graphql" \
--header "Authorization: Bearer ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data "${data}" \
--output "${result}" \
--silent; then
msg_error " api call failed: $(cat "${outfile}")"
return 1
fi
hasNextPage=$(jq --raw-output ".data | .${node_type} | .pageInfo | .hasNextPage" < "${result}")
cursor=$(jq --raw-output ".data | .${node_type} | .pageInfo | .endCursor" < "${result}")
cp "${result}" "${api_workdir}/tmp"
jq ".data.${node_type}.nodes" "${api_workdir}/tmp" > "${result}"
done
jq --slurp add "${api_workdir}"/result.* > "${outfile}"
return 0
}
gitlab_api_call() { gitlab_api_call() {
local outfile=$1 local outfile=$1
local request=$2 local request=$2
local endpoint=$3 local endpoint=$3
local data=${4:-} local data=${4:-}
local error
# empty token # empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then if [[ -z "${GITLAB_TOKEN}" ]]; then
@@ -88,113 +38,27 @@ gitlab_api_call() {
return 1 return 1
fi fi
if ! gitlab_check_api_errors "${outfile}"; then
return 1
fi
return 0
}
gitlab_api_call_paged() {
local outfile=$1
local status_file=$2
local request=$3
local endpoint=$4
local data=${5:-}
local result header
# empty token
if [[ -z "${GITLAB_TOKEN}" ]]; then
msg_error " api call failed: No token provided"
return 1
fi
[[ -z ${WORKDIR:-} ]] && setup_workdir
api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX)
tmp_file=$(mktemp --tmpdir="${api_workdir}" spinner.tmp.XXXXXXXXXX)
local next_page=1
local total_pages=1
while [[ -n "${next_page}" ]]; do
percentage=$(( 100 * next_page / total_pages ))
printf "📡 Querying GitLab: %s/%s [%s] %%spinner%%" \
"${BOLD}${next_page}" "${total_pages}" "${percentage}%${ALL_OFF}" \
> "${tmp_file}"
mv "${tmp_file}" "${status_file}"
result="${api_workdir}/result.${next_page}"
header="${api_workdir}/header"
if ! curl --request "${request}" \
--get \
--url "https://${GITLAB_HOST}/api/v4/${endpoint}&per_page=100&page=${next_page}" \
--header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \
--header "Content-Type: application/json" \
--data-urlencode "${data}" \
--dump-header "${header}" \
--output "${result}" \
--silent; then
msg_error " api call failed: $(cat "${result}")"
return 1
fi
if ! gitlab_check_api_errors "${result}"; then
return 1
fi
next_page=$(grep "x-next-page" "${header}" | tr -d '\r' | awk '{ print $2 }')
total_pages=$(grep "x-total-pages" "${header}" | tr -d '\r' | awk '{ print $2 }')
done
jq --slurp add "${api_workdir}"/result.* > "${outfile}"
return 0
}
gitlab_check_api_errors() {
local file=$1
local error
# search API only returns an array, no errors
if [[ $(jq --raw-output 'type' < "${file}") == "array" ]]; then
return 0
fi
# check for general purpose api error # check for general purpose api error
if error=$(jq --raw-output --exit-status '.error' < "${file}"); then if error=$(jq --raw-output --exit-status '.error' < "${outfile}"); then
msg_error " api call failed: ${error}" msg_error " api call failed: ${error}"
return 1 return 1
fi fi
# check for api specific error messages # check for api specific error messages
if ! jq --raw-output --exit-status '.id' < "${file}" >/dev/null; then if ! jq --raw-output --exit-status '.id' < "${outfile}" >/dev/null; then
if jq --raw-output --exit-status '.message | keys[]' < "${file}" &>/dev/null; then if jq --raw-output --exit-status '.message | keys[]' < "${outfile}" &>/dev/null; then
while read -r error; do while read -r error; do
msg_error " api call failed: ${error}" msg_error " api call failed: ${error}"
done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${file}") done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${outfile}")
elif error=$(jq --raw-output --exit-status '.message' < "${file}"); then elif error=$(jq --raw-output --exit-status '.message' < "${outfile}"); then
msg_error " api call failed: ${error}" msg_error " api call failed: ${error}"
fi fi
return 1 return 1
fi fi
return 0 return 0
} }
graphql_check_api_errors() {
local file=$1
local error
# early exit if we do not have errors
if ! jq --raw-output --exit-status '.errors[]' < "${file}" &>/dev/null; then
return 0
fi
# check for api specific error messages
while read -r error; do
msg_error " api call failed: ${error}"
done < <(jq --raw-output --exit-status '.errors[].message' < "${file}")
return 1
}
gitlab_api_get_user() { gitlab_api_get_user() {
local outfile username local outfile username
@@ -217,42 +81,15 @@ gitlab_api_get_user() {
return 0 return 0
} }
gitlab_api_get_project_name_mapping() {
local query=$1
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
# query user details
if ! graphql_api_call "${outfile}" POST projects "${query}"; then
msg_warn " Invalid token provided?"
exit 1
fi
cat "${outfile}"
return 0
}
# 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() {
@@ -283,22 +120,3 @@ gitlab_api_create_project() {
printf "%s" "${path}" printf "%s" "${path}"
return 0 return 0
} }
# TODO: parallelize
# https://docs.gitlab.com/ee/api/search.html#scope-blobs
gitlab_api_search() {
local search=$1
local status_file=$2
local outfile
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/groups/archlinux%2fpackaging%2fpackages/search?scope=blobs" "search=${search}"; then
return 1
fi
cat "${outfile}"
return 0
}

View File

@@ -4,19 +4,18 @@
: :
# shellcheck disable=2034 # shellcheck disable=2034
CHROOT_VERSION='v5' CHROOT_VERSION='v4'
## ##
# 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

@@ -1,65 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_AUR_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_AUR_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
set -eo pipefail
pkgctl_aur_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS]
Interact with the Arch User Repository (AUR).
Provides a suite of tools designed for managing and interacting with the Arch
User Repository (AUR). It simplifies various tasks related to AUR, including
importing repositories, managing packages, and transitioning packages between
the official repositories and the AUR.
COMMANDS
drop-from-repo Drop a package from the official repository to the AUR
OPTIONS
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} drop-from-repo libfoo
_EOF_
}
pkgctl_aur() {
if (( $# < 1 )); then
pkgctl_aur_usage
exit 0
fi
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_aur_usage
exit 0
;;
drop-from-repo)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/aur/drop-from-repo.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/aur/drop-from-repo.sh
pkgctl_aur_drop_from_repo "$@"
exit 0
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
die "invalid command: %s" "$1"
;;
esac
done
}

View File

@@ -1,173 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/db/remove.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/remove.sh
# shellcheck source=src//lib/util/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
source /usr/share/makepkg/util/message.sh
set -eo pipefail
pkgctl_aur_drop_from_repo_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PATH]...
Drops a specified package from the official repositories to the Arch
User Repository.
This command requires a local Git clone of the package repository. It
reconfigures the repository for AUR compatibility and pushes it to the
AUR. Afterwards, the package is removed from the official repository.
By default, the package is automatically disowned in the AUR.
OPTIONS
--no-disown Do not disown the package on the AUR
-f, --force Force push to the AUR overwriting the remote repository
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} foo
$ ${COMMAND} --no-disown --force
_EOF_
}
pkgctl_aur_drop_from_repo() {
# options
local paths=()
local DISOWN=1
local FORCE=0
# variables
local path realpath pkgbase pkgrepo remote_url
while (( $# )); do
case $1 in
-h|--help)
pkgctl_aur_drop_from_repo_usage
exit 0
;;
--no-disown)
DISOWN=0
shift
;;
-f|--force)
FORCE=1
shift
;;
--)
shift
break
;;
-*)
die "Invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
paths=(".")
else
pkgctl_aur_drop_from_repo_usage
exit 1
fi
fi
for path in "${paths[@]}"; do
# resolve symlink for basename
if ! realpath=$(realpath --canonicalize-existing -- "${path}"); then
die "No such directory: ${path}"
fi
# skip paths that are not directories
if [[ ! -d "${realpath}" ]]; then
continue
fi
pkgbase=$(basename "${realpath}")
pkgbase=${pkgbase%.git}
if [[ ! -d "${realpath}/.git" ]]; then
die "Not a Git repository: ${path}"
fi
pushd "${path}" >/dev/null
if [[ ! -f PKGBUILD ]]; then
die 'PKGBUILD not found in %s' "${path}"
fi
msg "Dropping ${pkgbase} to the AUR"
remote_url="${AUR_URL_SSH}:${pkgbase}.git"
if ! git remote add origin "${remote_url}" &>/dev/null; then
git remote set-url origin "${remote_url}"
fi
# move the main branch to master
if [[ $(git symbolic-ref --quiet --short HEAD) == main ]]; then
git branch --move master
git config branch.master.merge refs/heads/master
fi
# auto generate .SRCINFO if not already present
if [[ -z "$(git ls-tree -r HEAD --name-only .SRCINFO)" ]]; then
stat_busy 'Generating .SRCINFO'
makepkg --printsrcinfo > .SRCINFO
stat_done
git add --force -- .SRCINFO
git commit --quiet --message "Adding .SRCINFO" -- .SRCINFO
fi
msg "Pushing ${pkgbase} to the AUR"
if (( FORCE )); then
AUR_OVERWRITE=1 \
GIT_SSH_COMMAND="ssh -o SendEnv=AUR_OVERWRITE" \
git push --force --no-follow-tags origin master
else
git push --no-follow-tags origin master
fi
# update the local default branch in case this clone is used in the future
git remote set-head origin master
if (( DISOWN )); then
msg "Disowning ${pkgbase} on the AUR"
# shellcheck disable=SC2029
ssh "${AUR_URL_SSH}" disown "${pkgbase}"
fi
# auto-detection of the repo to remove from
if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'Failed to get pacman repo'
fi
msg "Deleting ${pkgbase} from the official repository"
if [[ -z "${pkgrepo}" ]]; then
warning 'Did not find %s in any repository, please delete manually' "${pkgbase}"
else
msg2 " repo: ${pkgrepo}"
pkgctl_db_remove --noconfirm "${pkgrepo}" "${pkgbase}"
fi
popd >/dev/null
done
}

View File

@@ -23,13 +23,9 @@ pkgctl_auth_login_usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] Usage: ${COMMAND} [OPTIONS]
Interactively authenticate with the GitLab instance. 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
@@ -63,17 +59,13 @@ pkgctl_auth_login() {
esac esac
done done
personal_access_token_url="https://${GITLAB_HOST}/-/user_settings/personal_access_tokens?name=pkgctl+token&scopes=api,write_repository" personal_access_token_url="https://${GITLAB_HOST}/-/profile/personal_access_tokens"
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

@@ -14,25 +14,17 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
# shellcheck source=src/lib/util/git.sh # shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
# shellcheck source=src/lib/util/srcinfo.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh
# shellcheck source=src/lib/util/pacman.sh # shellcheck source=src/lib/util/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/util/pkgbuild.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pkgbuild.sh
# shellcheck source=src/lib/valid-build-install.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh
# shellcheck source=src/lib/valid-repos.sh # shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
# shellcheck source=src/lib/valid-tags.sh # shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-inspect.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh
source /usr/share/makepkg/util/config.sh source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh source /usr/share/makepkg/util/message.sh
set -eo pipefail set -e
pkgctl_build_usage() { pkgctl_build_usage() {
@@ -49,25 +41,18 @@ pkgctl_build_usage() {
BUILD OPTIONS BUILD OPTIONS
--arch ARCH Specify architectures to build for (disables auto-detection) --arch ARCH Specify architectures to build for (disables auto-detection)
--repo REPO Specify target repository for new packages not in any official repo --repo REPO Specify a target repository (disables auto-detection)
-s, --staging Build against the staging counterpart of the auto-detected repo -s, --staging Build against the staging counterpart of the auto-detected repo
-t, --testing Build against the testing counterpart of the auto-detected repo -t, --testing Build against the testing counterpart of the auto-detected repo
-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
--inspect WHEN Spawn an interactive shell to inspect the chroot (never, always, failure) -I, --install FILE Install a package into the working copy of the chroot
--offline MODE Run a part of the build process offline (build, check)
-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
INSTALL OPTIONS
-I, --install-to-chroot FILE Install a package to the working copy of the chroot
-i, --install-to-host MODE Install the built package to the host system, possible modes are 'all' and 'auto'
PKGBUILD OPTIONS PKGBUILD OPTIONS
--pkgver=PKGVER Set pkgver, reset pkgrel and update checksums --pkgver=PKGVER Set pkgver, reset pkgrel and update checksums
--pkgrel=PKGREL Set pkgrel to a given value --pkgrel=PKGREL Set pkgrel to a given value
--rebuild Increment the current pkgrel variable --rebuild Increment the current pkgrel variable
--update-checksums Force computation and update of the checksums (disables auto-detection)
-e, --edit Edit the PKGBUILD before building -e, --edit Edit the PKGBUILD before building
RELEASE OPTIONS RELEASE OPTIONS
@@ -80,8 +65,8 @@ pkgctl_build_usage() {
EXAMPLES EXAMPLES
$ ${COMMAND} $ ${COMMAND}
$ ${COMMAND} --rebuild --staging --release --message 'libyay 0.42 rebuild' libfoo libbar $ ${COMMAND} --rebuild --staging --message 'libyay 0.42 rebuild' libfoo libbar
$ ${COMMAND} --pkgver=1.42 --release --db-update $ ${COMMAND} --pkgver 1.42 --release --db-update
_EOF_ _EOF_
} }
@@ -90,7 +75,8 @@ pkgctl_build_check_option_group_repo() {
local repo=$2 local repo=$2
local testing=$3 local testing=$3
local staging=$4 local staging=$4
if [[ -n "${repo}" ]] || (( testing )) || (( staging )); then if ( (( testing )) && (( staging )) ) ||
( [[ $repo =~ ^.*-(staging|testing)$ ]] && ( (( testing )) || (( staging )) )); then
die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}" die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}"
exit 1 exit 1
fi fi
@@ -116,7 +102,7 @@ pkgctl_build() {
exit 1 exit 1
fi fi
local UPDATE_CHECKSUMS=0 local UPDPKGSUMS=0
local EDIT=0 local EDIT=0
local REBUILD=0 local REBUILD=0
local OFFLOAD=0 local OFFLOAD=0
@@ -124,7 +110,6 @@ pkgctl_build() {
local TESTING=0 local TESTING=0
local RELEASE=0 local RELEASE=0
local DB_UPDATE=0 local DB_UPDATE=0
local INSTALL_TO_HOST=none
local REPO= local REPO=
local PKGVER= local PKGVER=
@@ -137,13 +122,13 @@ pkgctl_build() {
local MAKECHROOT_OPTIONS=() local MAKECHROOT_OPTIONS=()
local RELEASE_OPTIONS=() local RELEASE_OPTIONS=()
local MAKEPKG_OPTIONS=() local MAKEPKG_OPTIONS=()
local INSTALL_HOST_PACKAGES=()
local WORKER= local PTS
local WORKER_SLOT= PTS="$(tty | sed 's|/dev/pts/||')"
local WORKER="${USER}-${PTS}"
# variables # variables
local _arch path pkgbase pkgrepo source pkgbuild_checksum current_checksum local path pkgbase pkgrepo source
while (( $# )); do while (( $# )); do
case $1 in case $1 in
@@ -153,19 +138,18 @@ pkgctl_build() {
;; ;;
--repo) --repo)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
pkgctl_build_check_option_group_repo '--repo' "${REPO}" "${TESTING}" "${STAGING}"
REPO="${2}" REPO="${2}"
RELEASE_OPTIONS+=("--repo" "${REPO}") pkgctl_build_check_option_group_repo '--repo' "${REPO}" "${TESTING}" "${STAGING}"
shift 2 shift 2
;; ;;
--arch) --arch)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
if [[ ${2} == all ]]; then if [[ ${2} == all ]]; then
BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[@]::${#DEVTOOLS_VALID_ARCHES[@]}-1}") BUILD_ARCH=("${_arch[@]::${#_arch[@]}-1}")
elif [[ ${2} == any ]]; then elif [[ ${2} == any ]]; then
BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[0]}") BUILD_ARCH=("${_arch[0]}")
elif ! in_array "${2}" "${BUILD_ARCH[@]}"; then elif ! in_array "${2}" "${BUILD_ARCH[@]}"; then
if ! in_array "${2}" "${DEVTOOLS_VALID_ARCHES[@]}"; then if ! in_array "${2}" "${_arch[@]}"; then
die 'invalid architecture: %s' "${2}" die 'invalid architecture: %s' "${2}"
fi fi
BUILD_ARCH+=("${2}") BUILD_ARCH+=("${2}")
@@ -176,7 +160,7 @@ pkgctl_build() {
pkgctl_build_check_option_group_ver '--pkgver' "${PKGVER}" "${PKGREL}" "${REBUILD}" pkgctl_build_check_option_group_ver '--pkgver' "${PKGVER}" "${PKGREL}" "${REBUILD}"
PKGVER="${1#*=}" PKGVER="${1#*=}"
PKGREL=1 PKGREL=1
UPDATE_CHECKSUMS=1 UPDPKGSUMS=1
shift shift
;; ;;
--pkgrel=*) --pkgrel=*)
@@ -184,10 +168,6 @@ pkgctl_build() {
PKGREL="${1#*=}" PKGREL="${1#*=}"
shift shift
;; ;;
--update-checksums)
UPDATE_CHECKSUMS=1
shift
;;
--rebuild) --rebuild)
# shellcheck source=src/lib/util/git.sh # shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
@@ -199,46 +179,28 @@ pkgctl_build() {
EDIT=1 EDIT=1
shift shift
;; ;;
--offline)
MAKECHROOT_OPTIONS+=("-o" "$2")
shift 2
;;
-o|--offload) -o|--offload)
OFFLOAD=1 OFFLOAD=1
shift shift
;; ;;
-s|--staging) -s|--staging)
pkgctl_build_check_option_group_repo '--staging' "${REPO}" "${TESTING}" "${STAGING}"
STAGING=1 STAGING=1
RELEASE_OPTIONS+=("--staging") pkgctl_build_check_option_group_repo '--staging' "${REPO}" "${TESTING}" "${STAGING}"
shift shift
;; ;;
-t|--testing) -t|--testing)
pkgctl_build_check_option_group_repo '--testing' "${REPO}" "${TESTING}" "${STAGING}"
TESTING=1 TESTING=1
RELEASE_OPTIONS+=("--testing") pkgctl_build_check_option_group_repo '--testing' "${REPO}" "${TESTING}" "${STAGING}"
shift shift
;; ;;
-c|--clean) -c|--clean)
BUILD_OPTIONS+=("-c") BUILD_OPTIONS+=("-c")
shift shift
;; ;;
-I|--install-to-chroot) -I|--install)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
if (( OFFLOAD )); then
MAKECHROOT_OPTIONS+=("-I" "$2") MAKECHROOT_OPTIONS+=("-I" "$2")
else warning 'installing packages into the chroot may break reproducible builds, use with caution!'
MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")")
fi
warning 'installing packages to the chroot may break reproducible builds, use with caution!'
shift 2
;;
-i|--install-to-host)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if ! in_array "$2" "${DEVTOOLS_VALID_BUILD_INSTALL[@]}"; then
die 'invalid install mode: %s' "${2}"
fi
INSTALL_TO_HOST=$2
shift 2 shift 2
;; ;;
--nocheck) --nocheck)
@@ -246,14 +208,6 @@ pkgctl_build() {
warning 'not running checks is disallowed for official packages, except for bootstrapping. Please rebuild after bootstrapping is completed!' warning 'not running checks is disallowed for official packages, except for bootstrapping. Please rebuild after bootstrapping is completed!'
shift shift
;; ;;
--inspect)
(( $# <= 1 )) && die "missing argument for %s" "$1"
if ! in_array "${2}" "${DEVTOOLS_VALID_INSPECT_MODES[@]}"; then
die "Invalid inspect mode: %s" "${2}"
fi
MAKECHROOT_OPTIONS+=("-x" "${2}")
shift 2
;;
-r|--release) -r|--release)
# shellcheck source=src/lib/release.sh # shellcheck source=src/lib/release.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
@@ -270,11 +224,6 @@ 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
@@ -289,16 +238,6 @@ 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
@@ -309,25 +248,15 @@ 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 multilib update_pacman_repo_cache
# Check valid repos if not resolved dynamically # Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then elif ! in_array "${REPO}" "${_repos[@]}"; then
die "Invalid repository target: %s" "${REPO}" die "Invalid repository target: %s" "${REPO}"
fi fi
for path in "${paths[@]}"; do for path in "${paths[@]}"; do
# skip paths that are not directories
if [[ ! -d "${path}" ]]; then
continue
fi
pushd "${path}" >/dev/null pushd "${path}" >/dev/null
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
@@ -339,29 +268,20 @@ pkgctl_build() {
. ./PKGBUILD . ./PKGBUILD
pkgbase=${pkgbase:-$pkgname} pkgbase=${pkgbase:-$pkgname}
pkgrepo=${REPO} pkgrepo=${REPO}
pkgbuild_checksum=$(b2sum PKGBUILD | awk '{print $1}')
msg "Building ${pkgbase}" msg "Building ${pkgbase}"
# auto-detect target repository # auto-detection of build target
if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then if [[ -z ${pkgrepo} ]]; then
die 'Failed to query pacman repo' if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'failed to get pacman repo'
fi fi
if [[ -z "${pkgrepo}" ]]; then
# fail if an existing package specifies --repo die 'unknown repo, please specify --repo for new packages'
if [[ -n "${repo}" ]] && [[ -n ${pkgrepo} ]]; then
# allow unstable to use --repo
if [[ ${pkgrepo} == *unstable ]]; then
repo=${pkgrepo}
else
die 'Using --repo for packages that exist in official repositories is disallowed'
fi fi
fi fi
# assign auto-detected target repository # TODO: REMOVE AFTER POC
if [[ -n ${repo} ]]; then if [[ ${pkgrepo} == community ]]; then
pkgrepo=${repo}
# fallback to extra for unreleased packages
elif [[ -z ${pkgrepo} ]]; then
pkgrepo=extra pkgrepo=extra
fi fi
@@ -379,26 +299,19 @@ pkgctl_build() {
BUILD_ARCH=("") BUILD_ARCH=("")
elif (( ${#BUILD_ARCH[@]} == 0 )); then elif (( ${#BUILD_ARCH[@]} == 0 )); then
if in_array any "${arch[@]}"; then if in_array any "${arch[@]}"; then
BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[0]}") BUILD_ARCH=("${_arch[0]}")
else else
for _arch in "${arch[@]}"; do BUILD_ARCH+=("${arch[@]}")
if in_array "${_arch}" "${DEVTOOLS_VALID_ARCHES[@]}"; then
BUILD_ARCH+=("$_arch")
else
warning 'invalid architecture, not building for: %s' "${_arch}"
fi
done
fi fi
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
# try to figure out if pkgrel has been changed # try to figure out of pkgrel has been changed
if ! old_pkgrel=$(git_diff_tree HEAD PKGBUILD | grep --perl-regexp --only-matching --max-count=1 '^-pkgrel=\K\w+'); then if ! old_pkgrel=$(git_diff_tree HEAD PKGBUILD | grep --perl-regexp --only-matching --max-count=1 '^-pkgrel=\K\w+'); then
old_pkgrel=${pkgrel} old_pkgrel=${pkgrel}
fi fi
@@ -415,14 +328,20 @@ pkgctl_build() {
# update pkgver # update pkgver
if [[ -n ${PKGVER} ]]; then if [[ -n ${PKGVER} ]]; then
if [[ $(type -t pkgver) == function ]]; then
# TODO: check if die or warn, if we provide _commit _gitcommit setter maybe?
warning 'setting pkgver variable has no effect if the PKGBUILD has a pkgver() function'
fi
msg "Bumping pkgver to ${PKGVER}" msg "Bumping pkgver to ${PKGVER}"
pkgbuild_set_pkgver "${PKGVER}" grep --extended-regexp --quiet --max-count=1 "^pkgver=${pkgver}$" PKGBUILD || die "Non-standard pkgver declaration"
sed --regexp-extended "s|^(pkgver=)${pkgver}$|\1${PKGVER}|g" -i PKGBUILD
fi fi
# update pkgrel # update pkgrel
if [[ -n ${PKGREL} ]]; then if [[ -n ${PKGREL} ]]; then
msg "Bumping pkgrel to ${PKGREL}" msg "Bumping pkgrel to ${PKGREL}"
pkgbuild_set_pkgrel "${PKGREL}" grep --extended-regexp --quiet --max-count=1 "^pkgrel=${pkgrel}$" PKGBUILD || die "Non-standard pkgrel declaration"
sed --regexp-extended "s|^(pkgrel=)${pkgrel}$|\1${PKGREL}|g" -i PKGBUILD
fi fi
# edit PKGBUILD # edit PKGBUILD
@@ -442,19 +361,10 @@ pkgctl_build() {
stat_done stat_done
fi fi
# update checksums if any sources are declared
if (( UPDATE_CHECKSUMS )) && (( ${#source[@]} >= 1 )); then
if ! result=$(pkgbuild_update_checksums /dev/stderr); then
die "${result}"
fi
fi
# re-source the PKGBUILD if it changed # update checksums if any sources are declared
current_checksum="$(b2sum PKGBUILD | awk '{print $1}')" if (( UPDPKGSUMS )) && (( ${#source[@]} >= 1 )); then
if [[ ${pkgbuild_checksum} != "${current_checksum}" ]]; then updpkgsums
pkgbuild_checksum=${current_checksum}
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
fi fi
# execute build # execute build
@@ -467,48 +377,26 @@ 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 "${pkgrepo}" -- "${BUILD_OPTIONS[@]}" -- "${MAKECHROOT_OPTIONS[@]}" -l "${WORKER}" -- "${MAKEPKG_OPTIONS[@]}" offload-build --repo "${offload_tool}" -- "${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
done done
# re-source the PKGBUILD if it changed
current_checksum="$(b2sum PKGBUILD | awk '{print $1}')"
if [[ ${pkgbuild_checksum} != "${current_checksum}" ]]; then
pkgbuild_checksum=${current_checksum}
# shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
fi
# auto generate .SRCINFO
# shellcheck disable=SC2119
write_srcinfo_file
# test-install (some of) the produced packages
if [[ ${INSTALL_TO_HOST} == auto ]] || [[ ${INSTALL_TO_HOST} == all ]]; then
# shellcheck disable=2119
load_makepkg_config
# this is inspired by print_all_package_names from libmakepkg
local version pkg_architecture pkg pkgfile
version=$(get_full_version)
for pkg in "${pkgname[@]}"; do
pkg_architecture=$(get_pkg_arch "$pkg")
pkgfile=$(realpath "$(printf "%s/%s-%s-%s%s\n" "${PKGDEST:-.}" "$pkg" "$version" "$pkg_architecture" "$PKGEXT")")
# check if we install all packages or if the (split-)package is already installed
if [[ ${INSTALL_TO_HOST} == all ]] || ( [[ ${INSTALL_TO_HOST} == auto ]] && pacman -Qq -- "$pkg" &>/dev/null ); then
INSTALL_HOST_PACKAGES+=("$pkgfile")
fi
done
fi
# release the build # release the build
if (( RELEASE )); then if (( RELEASE )); then
pkgctl_release "${RELEASE_OPTIONS[@]}" pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}"
fi fi
# reset common PKGBUILD variables # reset common PKGBUILD variables
@@ -516,12 +404,6 @@ pkgctl_build() {
popd >/dev/null popd >/dev/null
done done
# install all collected packages to the host system
if (( ${#INSTALL_HOST_PACKAGES[@]} )); then
msg "Installing built packages to the host system"
sudo pacman -U -- "${INSTALL_HOST_PACKAGES[@]}"
fi
# update the binary package repo db as last action # update the binary package repo db as last action
if (( RELEASE )) && (( DB_UPDATE )); then if (( RELEASE )) && (( DB_UPDATE )); then
# shellcheck disable=2119 # shellcheck disable=2119

View File

@@ -1,22 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_CACHE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_CACHE_SH=1
set -e
readonly XDG_DEVTOOLS_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/devtools"
get_cache_file() {
local filename=$1
local path="${XDG_DEVTOOLS_CACHE_DIR}/${filename}"
mkdir --parents -- "$(dirname -- "$path")"
if [[ ! -f ${path} ]]; then
touch -- "${path}"
fi
printf '%s' "${path}"
}

View File

@@ -13,10 +13,7 @@ set +u +o posix
$DEVTOOLS_INCLUDE_COMMON_SH $DEVTOOLS_INCLUDE_COMMON_SH
# Avoid any encoding problems # Avoid any encoding problems
export LANG=C.UTF-8 export LANG=C
# Avoid systemd trying to color the terminal on systemd-nspawn
export SYSTEMD_TINT_BACKGROUND=no
# Set buildtool properties # Set buildtool properties
export BUILDTOOL=devtools export BUILDTOOL=devtools
@@ -25,44 +22,19 @@ 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=2 export GIT_REPO_SPEC_VERSION=0
export GIT_PACKAGING_NAMESPACE=archlinux/packaging/packages export GIT_PACKAGING_NAMESPACE=bot-test/packages
export GIT_PACKAGING_NAMESPACE_ID=11323 export GIT_PACKAGING_NAMESPACE_ID=11233
export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}" export GIT_PACKAGING_URL_SSH="ssh://git@${GITLAB_HOST}:222/${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.archlinux.org export PACKAGING_REPO_RELEASE_HOST=repos.sandbox.archlinux.org
export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer
export AUR_URL_SSH=aur@aur.archlinux.org
export RSYNC_OPTS=(
--rsh=ssh
--checksum
--copy-links
--human-readable
--progress
--partial
--partial-dir=.partial
--delay-updates
)
# ensure TERM is set with a fallback to dumb
export TERM=${TERM:-dumb}
# check if messages are to be printed using color # check if messages are to be printed using color
if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then if [[ -t 2 && "$TERM" != dumb ]]; then
colorize colorize
if tput setaf 0 &>/dev/null; then
PURPLE="$(tput setaf 5)"
DARK_GREEN="$(tput setaf 2)"
UNDERLINE="$(tput smul)"
else
PURPLE="\e[35m"
DARK_GREEN="\e[32m"
UNDERLINE="\e[4m"
fi
else else
# shellcheck disable=2034 # shellcheck disable=2034
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' PURPLE='' DARK_GREEN='' UNDERLINE='' declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
fi fi
stat_busy() { stat_busy() {
@@ -81,11 +53,6 @@ stat_done() {
printf "${BOLD}done${ALL_OFF}\n" >&2 printf "${BOLD}done${ALL_OFF}\n" >&2
} }
stat_failed() {
# shellcheck disable=2059
printf "${BOLD}${RED}failed${ALL_OFF}\n" >&2
}
msg_success() { msg_success() {
local msg=$1 local msg=$1
local padding local padding
@@ -110,18 +77,7 @@ msg_warn() {
printf "%s %s\n" "${padding}${YELLOW}!${ALL_OFF}" "${msg}" >&2 printf "%s %s\n" "${padding}${YELLOW}!${ALL_OFF}" "${msg}" >&2
} }
print_workdir_error() {
if [[ ! -f "${WORKDIR}"/error ]]; then
return
fi
while read -r LINE; do
error '%s' "${LINE}"
done < "${WORKDIR}/error"
}
_setup_workdir=false _setup_workdir=false
# Ensure that there is no outside value for WORKDIR leaking in
unset WORKDIR
setup_workdir() { setup_workdir() {
[[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
_setup_workdir=true _setup_workdir=true
@@ -133,9 +89,6 @@ cleanup() {
if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
rm -rf "$WORKDIR" rm -rf "$WORKDIR"
fi fi
if tput setaf 0 &>/dev/null; then
tput cnorm >&2
fi
exit "${1:-0}" exit "${1:-0}"
} }
@@ -167,7 +120,7 @@ lock() {
# Only reopen the FD if it wasn't handed to us # Only reopen the FD if it wasn't handed to us
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
mkdir -p -- "$(dirname -- "$2")" mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>>"'"$2"' eval "exec $1>"'"$2"'
fi fi
if ! flock -n "$1"; then if ! flock -n "$1"; then
@@ -358,17 +311,3 @@ is_debug_package() {
pkgdesc="$(getpkgdesc "${pkgfile}")" pkgdesc="$(getpkgdesc "${pkgfile}")"
[[ ${pkgdesc} == "Detached debugging symbols for "* && ${pkgbase}-debug = "${pkgname}" ]] [[ ${pkgdesc} == "Detached debugging symbols for "* && ${pkgbase}-debug = "${pkgname}" ]]
} }
# Proxy function to check if a file exists. Using [[ -f ... ]] directly is not
# always wanted because we might want to expand bash globs first. This way we
# can pass unquoted globs to is_globfile() and have them expanded as function
# arguments before being checked.
is_globfile() {
[[ -f $1 ]]
}
join_by() {
local IFS="$1"
shift
echo "$*"
}

View File

@@ -34,12 +34,8 @@ 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

@@ -15,7 +15,7 @@ pkgctl_db_usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [COMMAND] [OPTIONS] Usage: ${COMMAND} [COMMAND] [OPTIONS]
Pacman database modification for package update, move etc Pacman database modification for packge update, move etc
COMMANDS COMMANDS
move Move packages between pacman repositories move Move packages between pacman repositories

View File

@@ -8,12 +8,6 @@ DEVTOOLS_INCLUDE_DB_REMOVE_SH=1
_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/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/util/term.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
set -e set -e
@@ -23,36 +17,22 @@ pkgctl_db_remove_usage() {
cat <<- _EOF_ cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [REPO] [PKGBASE]... Usage: ${COMMAND} [OPTIONS] [REPO] [PKGBASE]...
Remove packages from pacman repositories. By default passing a pkgbase removes Remove packages from binary repositories.
all split packages, debug packages as well as entries from the state repo for
all existing architectures.
Beware when using the --partial option, as it may most likely lead to
undesired effects by leaving debug packages behind as well as dangling entries
in the state repository.
OPTIONS OPTIONS
-a, --arch Remove only one specific architecture (disables auto-detection) -a, --arch Override the architecture (disables auto-detection)
--partial Remove only partial pkgnames from a split package. This leaves
debug packages behind and pkgbase entries in the state repo.
--noconfirm Bypass any confirmation messages, should only be used with caution
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} core-testing libfoo libbar $ ${COMMAND} core-testing libfoo libbar
$ ${COMMAND} --arch x86_64 core libyay $ ${COMMAND} core --arch x86_64 libyay
_EOF_ _EOF_
} }
pkgctl_db_remove() { pkgctl_db_remove() {
local REPO="" local REPO=""
local ARCH=any
local PKGBASES=() local PKGBASES=()
local pkgnames=()
local partial=0
local confirm=1
local dbscripts_options=()
local lookup_repo=multilib
local pkgname
# option checking # option checking
while (( $# )); do while (( $# )); do
@@ -61,20 +41,11 @@ pkgctl_db_remove() {
pkgctl_db_remove_usage pkgctl_db_remove_usage
exit 0 exit 0
;; ;;
--partial)
partial=1
dbscripts_options+=(--partial)
shift
;;
-a|--arch) -a|--arch)
(( $# <= 1 )) && die "missing argument for %s" "$1" (( $# <= 1 )) && die "missing argument for %s" "$1"
dbscripts_options+=(--arch "$2") ARCH=$2
shift 2 shift 2
;; ;;
--noconfirm)
confirm=0
shift
;;
-*) -*)
die "invalid argument: %s" "$1" die "invalid argument: %s" "$1"
;; ;;
@@ -92,62 +63,7 @@ pkgctl_db_remove() {
REPO=$1 REPO=$1
shift shift
PKGBASES+=("$@") PKGBASES+=("$@")
pkgnames=("${PKGBASES[@]}")
# check if the target repo is valid
if ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then
die "Invalid repository target: %s" "${REPO}"
fi
# update pacman cache to query all pkgnames
if (( ! partial )); then
case ${REPO} in
*-unstable)
update_pacman_repo_cache unstable
;;
*-staging)
update_pacman_repo_cache multilib-staging
;;
*-testing)
update_pacman_repo_cache multilib-testing
;;
*)
update_pacman_repo_cache multilib
;;
esac
# fetch the pkgnames of all pkgbase as present in the repo
mapfile -t pkgnames < <(get_pkgnames_from_repo_pkgbase "${REPO}" "${PKGBASES[@]}")
echo
if (( ! ${#pkgnames[@]} )); then
error "Packages not found in %s" "${REPO}"
exit 1
fi
fi
# print list of packages
printf "%sRemoving packages from %s:%s\n" "${RED}" "${REPO}" "${ALL_OFF}"
for pkgname in "${pkgnames[@]}"; do
printf "• %s\n" "${pkgname}"
done
# print explenation about partial removal
if (( partial )); then
echo
msg_warn "${YELLOW}Removing only partial pkgnames from a split package.${ALL_OFF}"
msg_warn "${YELLOW}This leaves debug packages and pkgbase entries in the state repo!${ALL_OFF}"
fi
# ask for confirmation
if (( confirm )); then
echo
if ! prompt "${GREEN}${BOLD}?${ALL_OFF} Are you sure this is correct?"; then
exit 1
fi
fi
echo
# shellcheck disable=SC2029 # shellcheck disable=SC2029
ssh "${PACKAGING_REPO_RELEASE_HOST}" db-remove "${dbscripts_options[@]}" "${REPO}" "${PKGBASES[@]}" ssh "${PACKAGING_REPO_RELEASE_HOST}" db-remove "${REPO}" "${ARCH}" "${PKGBASES[@]}"
} }

View File

@@ -35,7 +35,7 @@ pkgctl_release_usage() {
OPTIONS OPTIONS
-m, --message MSG Use the given <msg> as the commit message -m, --message MSG Use the given <msg> as the commit message
-r, --repo REPO Specify target repository for new packages not in any official repo -r, --repo REPO Specify a target repository (disables auto-detection)
-s, --staging Release to the staging counterpart of the auto-detected repo -s, --staging Release to the staging counterpart of the auto-detected repo
-t, --testing Release to the testing counterpart of the auto-detected repo -t, --testing Release to the testing counterpart of the auto-detected repo
-u, --db-update Automatically update the pacman database after uploading -u, --db-update Automatically update the pacman database after uploading
@@ -43,8 +43,8 @@ pkgctl_release_usage() {
EXAMPLES EXAMPLES
$ ${COMMAND} $ ${COMMAND}
$ ${COMMAND} --staging --message 'libyay 0.42 rebuild' libfoo libbar $ ${COMMAND} --repo core-testing --message 'libyay 0.42 rebuild' libfoo libbar
$ ${COMMAND} --repo extra --db-update new-package $ ${COMMAND} --staging --db-update libfoo
_EOF_ _EOF_
} }
@@ -124,9 +124,9 @@ pkgctl_release() {
# Update pacman cache for auto-detection # Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then if [[ -z ${REPO} ]]; then
update_pacman_repo_cache multilib update_pacman_repo_cache
# Check valid repos if not resolved dynamically # Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then elif ! in_array "${REPO}" "${_repos[@]}"; then
die "Invalid repository target: %s" "${REPO}" die "Invalid repository target: %s" "${REPO}"
fi fi
@@ -134,27 +134,20 @@ pkgctl_release() {
pushd "${path}" >/dev/null pushd "${path}" >/dev/null
pkgbase=$(basename "${path}") pkgbase=$(basename "${path}")
# auto-detect target repository if [[ -n ${REPO} ]]; then
if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'Failed to query pacman repo'
fi
# fail if an existing package specifies --repo
if [[ -n "${repo}" ]] && [[ -n ${REPO} ]]; then
# allow unstable to use --repo
if [[ ${REPO} == *unstable ]]; then
repo=${REPO} repo=${REPO}
else else
die 'Using --repo for packages that exist in official repositories is disallowed' if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then
die 'Failed to get pacman repo'
fi
if [[ -z "${repo}" ]]; then
die 'Unknown repo, please specify --repo for new packages'
fi fi
fi fi
# fail if a new package does not specify --repo # TODO: REMOVE AFTER POC
if [[ -z "${repo}" ]]; then if [[ ${repo} == community ]]; then
if [[ -z ${REPO} ]]; then repo=extra
die 'Specify --repo for packages that do not yet exist in official repositories'
fi
repo=${REPO}
fi fi
if (( TESTING )); then if (( TESTING )); then

View File

@@ -27,23 +27,19 @@ pkgctl_repo_usage() {
without SSH access using read-only HTTPS. without SSH access using read-only HTTPS.
COMMANDS COMMANDS
clean Remove untracked files from the working tree
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
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} clean --interactive *
$ ${COMMAND} clone libfoo linux libbar $ ${COMMAND} clone libfoo linux libbar
$ ${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_
} }
@@ -61,14 +57,6 @@ pkgctl_repo() {
pkgctl_repo_usage pkgctl_repo_usage
exit 0 exit 0
;; ;;
clean)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/clean.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/clean.sh
pkgctl_repo_clean "$@"
exit 0
;;
clone) clone)
_DEVTOOLS_COMMAND+=" $1" _DEVTOOLS_COMMAND+=" $1"
shift shift
@@ -93,14 +81,6 @@ 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

@@ -1,114 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_CLEAN_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_CLEAN_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 -eo pipefail
pkgctl_repo_clean_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTION] [PATH]...
Cleans the working tree by recursively removing files that are not under
version control, starting from the current directory.
Files unknown to Git as well as ignored files are removed. This can, for
example, be useful to remove all build products.
OPTIONS
-i, --interactive Show what would be done and clean files interactively
-n, --dry-run Don't remove anything, just show what would be done
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} libfoo linux libbar
$ ${COMMAND} --interactive libfoo linux libbar
$ ${COMMAND} --dry-run *
_EOF_
}
pkgctl_repo_clean() {
# options
local git_clean_options=()
local paths
local path pkgbase
while (( $# )); do
case $1 in
-i|--interactive)
git_clean_options+=("$1")
shift
;;
-n|--dry-run)
git_clean_options+=("$1")
shift
;;
-h|--help)
pkgctl_repo_clean_usage
exit 0
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
paths=(".")
fi
# print message about the work chunk
printf "🗑️ Removing untracked files from %s working trees\n" "${BOLD}${#paths[@]}${ALL_OFF}"
for path in "${paths[@]}"; do
# skip paths that are not directories
if [[ ! -d "${path}" ]]; then
continue
fi
if [[ ! -f "${path}/PKGBUILD" ]]; then
msg_error "Not a package repository: ${path}"
continue
fi
if [[ ! -d "${path}/.git" ]]; then
msg_error "Not a Git repository: ${path}"
continue
fi
pkgbase=$(basename "$(realpath "${path}")")
pkgbase=${pkgbase%.git}
# run dry mode to see if git would clean any files
if [[ ! $(git -C "${path}" clean -x -d --dry-run 2>&1) ]]; then
continue
fi
# git clean untracked files
msg_success "Cleaning ${BOLD}${pkgbase}${ALL_OFF}"
if ! git -C "${path}" clean -x -d --force "${git_clean_options[@]}"; then
msg_error "Failed to remove untracked files"
fi
echo
done
}

View File

@@ -8,19 +8,14 @@ DEVTOOLS_INCLUDE_REPO_CLONE_SH=1
_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/api/archweb.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/archweb.sh
# shellcheck source=src/lib/api/gitlab.sh # shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/lib/repo/configure.sh # shellcheck source=src/lib/repo/configure.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
source /usr/share/makepkg/util/message.sh source /usr/share/makepkg/util/message.sh
set -e set -e
set -o pipefail
pkgctl_repo_clone_usage() { pkgctl_repo_clone_usage() {
@@ -31,22 +26,18 @@ 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 protocol option can be used specs and makepkg.conf settings. The unprivileged 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_
} }
@@ -57,17 +48,13 @@ pkgctl_repo_clone() {
fi fi
# options # options
local protocol=ssh
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 jobs= local pkgbases
jobs=$(nproc)
# variables # variables
local command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local project_path local project_path
while (( $# )); do while (( $# )); do
@@ -76,23 +63,11 @@ pkgctl_repo_clone() {
pkgctl_repo_clone_usage pkgctl_repo_clone_usage
exit 0 exit 0
;; ;;
--protocol=https) -u|--unprivileged)
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS} GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
protocol=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
protocol="$2"
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"
@@ -102,28 +77,10 @@ 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
@@ -140,41 +97,33 @@ pkgctl_repo_clone() {
# Query packages of a maintainer # Query packages of a maintainer
if [[ -n ${MAINTAINER} ]]; then if [[ -n ${MAINTAINER} ]]; then
mapfile -t pkgbases < <(archweb_query_maintainer_packages "${MAINTAINER}") stat_busy "Query packages"
if ! wait $!; then max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}" | jq -r '.num_pages')
die "Failed to query maintainer packages" if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
stat_done
warning "found no packages for maintainer ${MAINTAINER}"
exit 0
fi fi
mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do
curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}&page=${page}" | jq -r '.results[].pkgbase'
stat_progress
done | sort --unique)
stat_done
fi fi
# Query all released packages # Query all released packages
if (( CLONE_ALL )); then if (( CLONE_ALL )); then
mapfile -t pkgbases < <(archweb_query_all_packages) stat_busy "Query all released packages"
if ! wait $!; then max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name" | jq -r '.num_pages')
die "Failed to query all packages" if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
stat_done
die "failed to query packages"
fi fi
fi mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do
curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&page=${page}" | jq -r '.results[].pkgbase'
# parallelization stat_progress
if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then done | sort --unique)
# force colors in parallel if parent process is colorized stat_done
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
# assign command options
if [[ -n "${VERSION}" ]]; then
command+=" --switch '${VERSION}'"
fi
# warm up ssh connection as it may require user input (key unlock, hostkey verification etc)
if [[ ${protocol} == ssh ]]; then
git_warmup_ssh_connection
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 fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
@@ -182,17 +131,11 @@ pkgctl_repo_clone() {
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"
if ! git clone --origin origin "${remote_url}" "${pkgbase}"; then git clone --origin origin "${remote_url}" "${pkgbase}"
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

@@ -10,14 +10,11 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/api/gitlab.sh # shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
source /usr/share/makepkg/util/config.sh 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
shopt -s nullglob
pkgctl_repo_configure_usage() { pkgctl_repo_configure_usage() {
@@ -35,15 +32,11 @@ pkgctl_repo_configure_usage() {
address by choosing SSH for all official packager identities and address by choosing SSH for all official packager identities and
read-only HTTPS otherwise. read-only HTTPS otherwise.
Git default excludes and hooks are applied to the configured repo.
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
$ ${COMMAND} * $ ${COMMAND} configure *
_EOF_ _EOF_
} }
@@ -100,14 +93,10 @@ 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 hook
local PACKAGER GPGKEY packager_name packager_email local PACKAGER GPGKEY packager_name packager_email
while (( $# )); do while (( $# )); do
@@ -116,24 +105,6 @@ 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
@@ -172,12 +143,10 @@ 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}}"
@@ -188,31 +157,9 @@ 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
# warm up ssh connection as it may require user input (key unlock, hostkey verification etc)
if [[ ${proto} == ssh ]]; then
git_warmup_ssh_connection
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
# resolve symlink for basename if ! realpath=$(realpath -e "${path}"); then
if ! realpath=$(realpath --canonicalize-existing -- "${path}"); then error "No such directory: ${path}"
die "No such directory: ${path}"
fi
# skip paths that aren't directories
if [[ ! -d "${realpath}" ]]; then
continue continue
fi fi
@@ -221,7 +168,8 @@ pkgctl_repo_configure() {
msg "Configuring ${pkgbase}" msg "Configuring ${pkgbase}"
if [[ ! -d "${path}/.git" ]]; then if [[ ! -d "${path}/.git" ]]; then
die "Not a Git repository: ${path}" error "Not a Git repository: ${path}"
continue
fi fi
pushd "${path}" >/dev/null pushd "${path}" >/dev/null
@@ -233,20 +181,12 @@ pkgctl_repo_configure() {
fi fi
# move the master branch to main # move the master branch to main
if [[ $(git symbolic-ref --quiet --short HEAD) == master ]]; then if [[ $(git symbolic-ref --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
# configure spec version and variant to avoid using development hooks in production
git config devtools.version "${GIT_REPO_SPEC_VERSION}" git config devtools.version "${GIT_REPO_SPEC_VERSION}"
if [[ ${_DEVTOOLS_LIBRARY_DIR} == /usr/share/devtools ]]; then
git config devtools.variant canonical
else
warning "Configuring with development version of pkgctl, do not use this repo in production"
git config devtools.variant development
fi
git config pull.rebase true git config pull.rebase true
git config branch.autoSetupRebase always git config branch.autoSetupRebase always
git config branch.main.remote origin git config branch.main.remote origin
@@ -271,21 +211,8 @@ pkgctl_repo_configure() {
if [[ -n $GPGKEY ]]; then if [[ -n $GPGKEY ]]; then
git config commit.gpgsign true git config commit.gpgsign true
git config user.signingKey "${GPGKEY}" git config user.signingKey "${GPGKEY}"
git config gpg.format openpgp
fi fi
# set default git exclude
mkdir -p .git/info
ln -sf "${_DEVTOOLS_LIBRARY_DIR}/git.conf.d/template/info/exclude" \
.git/info/exclude
# set default git hooks
mkdir -p .git/hooks
rm -f .git/hooks/*.sample
for hook in "${_DEVTOOLS_LIBRARY_DIR}"/git.conf.d/template/hooks/*; do
ln -sf "${hook}" ".git/hooks/$(basename "${hook}")"
done
if ! git ls-remote origin &>/dev/null; then if ! git ls-remote origin &>/dev/null; then
warning "configured remote origin may not exist, run:" warning "configured remote origin may not exist, run:"
msg2 "pkgctl repo create ${pkgbase}" msg2 "pkgctl repo create ${pkgbase}"

View File

@@ -1,124 +0,0 @@
#!/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
# resolve symlink for basename
if ! realpath=$(realpath --canonicalize-existing -- "${path}"); then
die "No such directory: ${path}"
fi
# skip paths that are not directories
if [[ ! -d "${realpath}" ]]; then
continue
fi
# skip paths that are not git repositories
if [[ ! -d "${realpath}/.git" ]]; then
error "Not a Git repository: ${path}"
continue
fi
pkgbase=$(basename "${realpath}")
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

@@ -23,18 +23,16 @@ pkgctl_repo_web_usage() {
no arguments, open the package cloned in the current working directory. no arguments, open the package cloned in the current working directory.
OPTIONS OPTIONS
--print Print the url instead of opening it with xdg-open
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} linux $ ${COMMAND} web linux
_EOF_ _EOF_
} }
pkgctl_repo_web() { pkgctl_repo_web() {
local pkgbases=() local pkgbases=()
local path giturl pkgbase url local path giturl pkgbase
local mode=open
# option checking # option checking
while (( $# )); do while (( $# )); do
@@ -43,10 +41,6 @@ pkgctl_repo_web() {
pkgctl_repo_web_usage pkgctl_repo_web_usage
exit 0 exit 0
;; ;;
--print)
mode=print
shift
;;
--) --)
shift shift
break break
@@ -62,7 +56,7 @@ pkgctl_repo_web() {
done done
# Check if web mode has xdg-open # Check if web mode has xdg-open
if [[ ${mode} == open ]] && ! command -v xdg-open &>/dev/null; then if ! command -v xdg-open &>/dev/null; then
die "The web command requires 'xdg-open'" die "The web command requires 'xdg-open'"
fi fi
@@ -84,18 +78,6 @@ pkgctl_repo_web() {
fi fi
for pkgbase in "${pkgbases[@]}"; do for pkgbase in "${pkgbases[@]}"; do
pkgbase=$(basename "${pkgbase}") xdg-open "${GIT_PACKAGING_URL_HTTPS}/${pkgbase}"
path=$(gitlab_project_name_to_path "${pkgbase}")
url="${GIT_PACKAGING_URL_HTTPS}/${path}"
case ${mode} in
open)
xdg-open "${url}"
;;
print)
printf "%s\n" "${url}"
;;
*)
die "Unknown mode: ${mode}"
esac
done done
} }

View File

@@ -1,308 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_SEARCH_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_SEARCH_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/cache.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/cache.sh
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/lib/valid-search.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh
# shellcheck source=src/lib/util/term.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh
source /usr/share/makepkg/util/util.sh
source /usr/share/makepkg/util/message.sh
set -eo pipefail
pkgctl_search_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] QUERY
Search for an expression across the GitLab packaging group.
To use a filter, include it in your query. You may use wildcards (*) to
use glob matching.
Available filters for the blobs scope: path, extension
Every usage of the search command must be authenticated. Consult the
'pkgctl auth' command to authenticate with GitLab or view the
authentication status.
SEARCH TIPS
Syntax Description Example
───────────────────────────────────────
" Exact search "gem sidekiq"
~ Fuzzy search J~ Doe
| Or display | banner
+ And display +banner
- Exclude display -banner
* Partial bug error 50*
\\ Escape \\*md
# Issue ID #23456
! Merge request !23456
OPTIONS
-h, --help Show this help text
FILTER OPTIONS
--no-default-filter Do not apply default filter (like -path:keys/pgp/*.asc)
OUTPUT OPTIONS
--json Enable printing in JSON; Shorthand for '--format json'
-F, --format FORMAT Controls the formatting of the results; FORMAT is 'pretty',
'plain', or 'json' (default: pretty)
-N, --no-line-number Don't show line numbers when formatting results
EXAMPLES
$ ${COMMAND} linux
$ ${COMMAND} --json '"pytest -v" +PYTHONPATH'
_EOF_
}
pkgctl_search_check_option_group_format() {
local option=$1
local output_format=$2
if [[ -n ${output_format} ]]; then
die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}"
exit 1
fi
return 0
}
pkgctl_search() {
if (( $# < 1 )); then
pkgctl_search_usage
exit 0
fi
# options
local search
local output_format=
local use_default_filter=1
local line_numbers=1
# variables
local bat_style="header,grid"
local default_filter="-path:keys/pgp/*.asc"
local graphql_lookup_batch=200
local output result query entries from until length
local project_name_cache_file project_name_lookup project_ids project_id project_name project_slice
local mapping_output path startline currentline data line
while (( $# )); do
case $1 in
-h|--help)
pkgctl_search_usage
exit 0
;;
--no-default-filter)
use_default_filter=0
shift
;;
--json)
pkgctl_search_check_option_group_format "$1" "${output_format}"
output_format=json
shift
;;
-F|--format)
(( $# <= 1 )) && die "missing argument for %s" "$1"
pkgctl_search_check_option_group_format "$1" "${output_format}"
output_format="${2}"
if ! in_array "${output_format}" "${valid_search_output_format[@]}"; then
die "Unknown output format: %s" "${output_format}"
fi
shift 2
;;
-N|--no-line-number)
line_numbers=0
shift
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
break
;;
esac
done
if (( $# == 0 )); then
pkgctl_search_usage
exit 1
fi
# assign search parameter
search="${*}"
if (( use_default_filter )); then
search+=" ${default_filter}"
fi
# assign default output format
if [[ -z ${output_format} ]]; then
output_format=pretty
fi
# check for optional dependencies
if [[ ${output_format} == pretty ]] && ! command -v bat &>/dev/null; then
warning "Failed to find optional dependency 'bat': falling back to plain output"
output_format=plain
fi
# populate line numbers option
if (( line_numbers )); then
bat_style="numbers,${bat_style}"
fi
# call the gitlab search API
status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX)
printf "📡 Querying GitLab search API..." > "${status_dir}/status"
term_spinner_start "${status_dir}"
output=$(gitlab_api_search "${search}" "${status_dir}/status")
term_spinner_stop "${status_dir}"
msg_success "Querying GitLab search API"
# collect project ids whose name needs to be looked up
project_name_cache_file=$(get_cache_file gitlab/project_id_to_name)
lock 11 "${project_name_cache_file}" "Locking project name cache"
mapfile -t project_ids < <(
jq --raw-output '[.[].project_id] | unique[]' <<< "${output}" | \
grep --invert-match --file <(awk '{ print $1 }' < "${project_name_cache_file}" ))
# look up project names
tmp_file=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api-spinner.tmp.XXXXXXXXXX)
printf "📡 Querying GitLab project names..." > "${status_dir}/status"
term_spinner_start "${status_dir}"
local entries="${#project_ids[@]}"
local until=0
while (( until < entries )); do
from=${until}
until=$(( until + graphql_lookup_batch ))
if (( until > entries )); then
until=${entries}
fi
length=$(( until - from ))
percentage=$(( 100 * until / entries ))
printf "📡 Querying GitLab project names: %s/%s [%s] %%spinner%%" \
"${BOLD}${until}" "${entries}" "${percentage}%${ALL_OFF}" \
> "${tmp_file}"
mv "${tmp_file}" "${status_dir}/status"
project_slice=("${project_ids[@]:${from}:${length}}")
printf -v projects '"gid://gitlab/Project/%s",' "${project_slice[@]}"
query='{
projects(after: "" ids: ['"${projects}"']) {
pageInfo {
startCursor
endCursor
hasNextPage
}
nodes {
id
name
}
}
}'
mapping_output=$(gitlab_api_get_project_name_mapping "${query}")
# update cache
while read -r project_id project_name; do
printf "%s %s\n" "${project_id}" "${project_name}" >> "${project_name_cache_file}"
done < <(jq --raw-output \
'.[] | "\(.id | rindex("/") as $lastSlash | .[$lastSlash+1:]) \(.name)"' \
<<< "${mapping_output}")
done
term_spinner_stop "${status_dir}"
msg_success "Querying GitLab project names"
# read project_id to name mapping from cache
declare -A project_name_lookup=()
while read -r project_id project_name; do
project_name_lookup[${project_id}]=${project_name}
done < "${project_name_cache_file}"
# close project name cache lock
lock_close 11
# output mode JSON
if [[ ${output_format} == json ]]; then
jq --from-file <(
for project_id in $(jq '.[].project_id' <<< "${output}"); do
project_name=${project_name_lookup[${project_id}]}
printf 'map(if .project_id == %s then . + {"project_name": "%s"} else . end) | ' \
"${project_id}" "${project_name}"
done
printf .
) <<< "${output}"
exit 0
fi
# pretty print each result
while read -r result; do
# read properties from search result
mapfile -t data < <(jq --raw-output ".data" <<< "${result}")
{ read -r project_id; read -r path; read -r startline; } < <(
jq --raw-output ".project_id, .path, .startline" <<< "${result}"
)
project_name=${project_name_lookup[${project_id}]}
# remove trailing newline for multiline results
if (( ${#data[@]} > 1 )) && [[ ${data[-1]} == "" ]]; then
unset "data[${#data[@]}-1]"
fi
# output mode plain
if [[ ${output_format} == plain ]]; then
printf "%s%s%s\n" "${PURPLE}" "${project_name}/${path}" "${ALL_OFF}"
currentline=${startline}
for line in "${data[@]}"; do
if (( line_numbers )); then
line="${DARK_GREEN}${currentline}${ALL_OFF}: ${line}"
currentline=$(( currentline + 1 ))
fi
printf "%s\n" "${line}"
done
printf "\n"
continue
fi
# prepend empty lines to match startline
if (( startline > 1 )); then
mapfile -t data < <(
printf '%.0s\n' $(seq 1 "$(( startline - 1 ))")
printf "%s\n" "${data[@]}"
)
fi
bat \
--file-name="${project_name}/${path}" \
--line-range "${startline}:" \
--paging=never \
--force-colorization \
--style "${bat_style}" \
--map-syntax "PKGBUILD:Bourne Again Shell (bash)" \
--map-syntax ".SRCINFO:INI" \
--map-syntax "*install:Bourne Again Shell (bash)" \
--map-syntax "*sysusers*:Bourne Again Shell (bash)" \
--map-syntax "*tmpfiles*:Bourne Again Shell (bash)" \
--map-syntax "*.hook:INI" \
<(printf "%s\n" "${data[@]}")
done < <(jq --compact-output '.[]' <<< "${output}")
}

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