summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevente Polyak <anthraxx@archlinux.org>2022-10-10 00:37:51 +0200
committerLevente Polyak <anthraxx@archlinux.org>2023-05-19 22:27:12 +0200
commitb5d5402e439f5edfd642fb4f680d596f5992e874 (patch)
tree856facc3e379ed590e260e7c39cafaebea9e60be
parenta8be7423efb287edd5ef80002a75a853fc0c9c1d (diff)
downloaddevtools-b5d5402e439f5edfd642fb4f680d596f5992e874.tar.xz
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.
-rw-r--r--Makefile59
-rw-r--r--contrib/completion/zsh/_devtools.in23
-rw-r--r--src/arch-nspawn.in8
-rw-r--r--src/archbuild.in8
-rw-r--r--src/archrelease.in8
-rw-r--r--src/checkpkg.in5
-rw-r--r--src/commitpkg.in7
-rw-r--r--src/diffpkg.in5
-rw-r--r--src/export-pkgbuild-keys.in7
-rw-r--r--src/find-libdeps.in5
-rw-r--r--src/finddeps.in5
-rw-r--r--src/lddd.in5
-rw-r--r--src/lib/archroot.sh (renamed from lib/archroot.sh)0
-rw-r--r--src/lib/common.sh (renamed from lib/common.sh)6
-rw-r--r--src/lib/repo.sh90
-rw-r--r--src/lib/repo/clone.sh139
-rw-r--r--src/lib/repo/configure.sh169
-rw-r--r--src/lib/repo/web.sh84
-rw-r--r--src/lib/valid-repos.sh (renamed from lib/valid-repos.sh)0
-rw-r--r--src/lib/valid-tags.sh (renamed from lib/valid-tags.sh)0
-rw-r--r--src/makechrootpkg.in9
-rw-r--r--src/makerepropkg.in8
-rw-r--r--src/mkarchroot.in8
-rw-r--r--src/pkgctl.in8
-rw-r--r--src/pkgrepo.in345
-rw-r--r--src/rebuildpkgs.in5
-rw-r--r--src/sogrep.in8
27 files changed, 618 insertions, 406 deletions
diff --git a/Makefile b/Makefile
index 70e977c..f59ca26 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,19 @@
+SHELL=/bin/bash
+
V=20230307
BUILDTOOLVER ?= $(V)
PREFIX = /usr/local
MANDIR = $(PREFIX)/share/man
+DATADIR = $(PREFIX)/share/devtools
BUILDDIR = build
-BINPROGS = $(addprefix $(BUILDDIR)/,$(patsubst src/%,bin/%,$(patsubst %.in,%,$(wildcard src/*.in))))
-LIBUTILS = $(wildcard lib/*)
+rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
+
+BINPROGS_SRC = $(wildcard src/*.in)
+BINPROGS = $(addprefix $(BUILDDIR)/,$(patsubst src/%,bin/%,$(patsubst %.in,%,$(BINPROGS_SRC))))
+LIBRARY_SRC = $(call rwildcard,src/lib,*.sh)
+LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC))))
MAKEPKG_CONFIGS=$(wildcard config/makepkg/*)
PACMAN_CONFIGS=$(wildcard config/pacman/*)
SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*)
@@ -41,8 +48,9 @@ ARCHBUILD_LINKS = \
COMPLETIONS = $(addprefix $(BUILDDIR)/,$(patsubst %.in,%,$(wildcard contrib/completion/*/*)))
-all: binprogs completion man
+all: binprogs library completion man
binprogs: $(BINPROGS)
+library: $(LIBRARY)
completion: $(COMPLETIONS)
man: $(MANS)
@@ -61,41 +69,45 @@ ifneq ($(wildcard setarch-aliases.d/*),)
endif
-edit = sed -e "s|@pkgdatadir[@]|$(PREFIX)/share/devtools|g"
+edit = sed -e "s|@pkgdatadir[@]|$(DATADIR)|g"
GEN_MSG = @echo "GEN $(patsubst $(BUILDDIR)/%,%,$@)"
define buildInScript
-$(1)/%: $(2)%.in $(LIBUTILS)
+$(1)/%: $(2)%$(3)
$$(GEN_MSG)
@mkdir -p $$(dir $$@)
@$(RM) "$$@"
@{ echo -n 'm4_changequote([[[,]]])'; cat $$<; } | m4 -P --define=m4_devtools_version=$$(BUILDTOOLVER) | $(edit) >$$@
- @chmod $(3) "$$@"
+ @chmod $(4) "$$@"
@bash -O extglob -n "$$@"
endef
-$(eval $(call buildInScript,build/bin,src/,555))
-$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,444)))
+$(eval $(call buildInScript,build/bin,src/,.in,755))
+$(eval $(call buildInScript,build/lib,src/lib/,,644))
+$(foreach completion,$(wildcard contrib/completion/*),$(eval $(call buildInScript,build/$(completion),$(completion)/,.in,444)))
$(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/asciidoc.conf doc/man/include/footer.asciidoc
$(GEN_MSG)
@mkdir -p $(BUILDDIR)/doc/man
- @a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(PREFIX)/share/devtools $<
+ @a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $<
clean:
rm -rf $(BUILDDIR)
install: all
install -dm0755 $(DESTDIR)$(PREFIX)/bin
- install -dm0755 $(DESTDIR)$(PREFIX)/share/devtools/setarch-aliases.d
+ install -dm0755 $(DESTDIR)$(DATADIR)/setarch-aliases.d
install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin
- for conf in ${MAKEPKG_CONFIGS}; do install -Dm0644 $$conf $(DESTDIR)$(PREFIX)/share/devtools/makepkg-$${conf##*/}; done
- for conf in ${PACMAN_CONFIGS}; do install -Dm0644 $$conf $(DESTDIR)$(PREFIX)/share/devtools/pacman-$${conf##*/}; done
- for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(PREFIX)/share/devtools/setarch-aliases.d; done
+ install -dm0755 $(DESTDIR)$(DATADIR)/lib
+ cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib
+ for conf in ${MAKEPKG_CONFIGS}; do install -Dm0644 $$conf $(DESTDIR)$(DATADIR)/makepkg-$${conf##*/}; done
+ for conf in ${PACMAN_CONFIGS}; do install -Dm0644 $$conf $(DESTDIR)$(DATADIR)/pacman-$${conf##*/}; done
+ for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
for l in ${COMMITPKG_LINKS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do ln -sf archbuild $(DESTDIR)$(PREFIX)/bin/$$l; done
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
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
for manfile in $(MANS); do \
install -Dm644 $$manfile -t $(DESTDIR)$(MANDIR)/man$${manfile##*.}; \
@@ -103,16 +115,21 @@ install: all
uninstall:
for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
- for conf in ${MAKEPKG_CONFIGS}; do rm -f $(DESTDIR)$(PREFIX)/share/devtools/makepkg-$${conf##*/}; done
- for conf in ${PACMAN_CONFIGS}; do rm -f $(DESTDIR)$(PREFIX)/share/devtools/pacman-$${conf##*/}; done
- for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(PREFIX)/share/devtools/setarch-aliases.d/$$f; done
+ for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done
+ rm -rf $(DESTDIR)$(DATADIR)/lib
+ for conf in ${MAKEPKG_CONFIGS}; do rm -f $(DESTDIR)$(DATADIR)/makepkg-$${conf##*/}; done
+ for conf in ${PACMAN_CONFIGS}; do rm -f $(DESTDIR)$(DATADIR)/pacman-$${conf##*/}; done
+ for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done
for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
- rm $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools
- rm $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_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)/bin/find-libprovides
for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done;
- rmdir --ignore-fail-on-non-empty $(DESTDIR)$(PREFIX)/share/devtools/setarch-aliases.d $(DESTDIR)$(PREFIX)/share/devtools
+ rmdir --ignore-fail-on-non-empty \
+ $(DESTDIR)$(DATADIR)/setarch-aliases.d \
+ $(DESTDIR)$(DATADIR)
TODAY=$(shell date +"%Y%m%d")
tag:
@@ -127,8 +144,8 @@ dist:
upload:
scp devtools-$(V).tar.gz devtools-$(V).tar.gz.sig repos.archlinux.org:/srv/ftp/other/devtools/
-check: $(BINPROGS) $(BUILDDIR)/contrib/completion/bash/devtools 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 $^
-.PHONY: all completion man clean install uninstall dist upload check tag
+.PHONY: all binprogs library completion man clean install uninstall tag dist upload check
.DELETE_ON_ERROR:
diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in
index 959497e..b210378 100644
--- a/contrib/completion/zsh/_devtools.in
+++ b/contrib/completion/zsh/_devtools.in
@@ -1,9 +1,12 @@
-#compdef archbuild pkgrepo arch-nspawn archrelease commitpkg pkgctl diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
+#compdef archbuild arch-nspawn archrelease commitpkg pkgctl diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/valid-tags.sh)
-m4_include(lib/valid-repos.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/valid-tags.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
+# shellcheck source=src/lib/valid-repos.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)
@@ -15,14 +18,14 @@ _archbuild_args=(
'--[Introduce makechrootpkg options]:*::makechrootpkg options:= _dispatch makechrootpkg makechrootpkg'
)
-_pkgrepo_cmds=(
- "pkgrepo command"
+_pkgctl_repo_cmds=(
+ "pkgctl repo command"
"clone[Clone a package repository]"
"configure[Configure a clone according to distro specs]"
"web[Open the packaging repository's website]"
)
-_pkgrepo_clone_args=(
+_pkgctl_repo_clone_args=(
'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
'(-u --unprivileged)'{-u,--unprivileged}'[Read-only access without packager info as Git author]'
'--universe[Clone all existing packages, useful for cache warming]'
@@ -30,13 +33,13 @@ _pkgrepo_clone_args=(
'*:packages:_devtools_completions_all_packages'
)
-_pkgrepo_configure_args=(
+_pkgctl_repo_configure_args=(
'(-u --unprivileged)'{-u,--unprivileged}'[Configure read-only repo without packager info as Git author]'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
-_pkgrepo_web_args=(
+_pkgctl_repo_web_args=(
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
@@ -157,10 +160,6 @@ _pkgctl_cmds=(
_pkgctl_diff_args=("${_diffpkg_args[@]}")
-_pkgctl_repo_cmds=("${_pkgrepo_cmds[@]}")
-_pkgctl_repo_clone_args=("${_pkgrepo_clone_args[@]}")
-_pkgctl_repo_configure_args=("${_pkgrepo_configure_args[@]}")
-
_handle_subcommands() {
local service_name=${1}
if typeset -p ${service_name}_cmds &> /dev/null; then
diff --git a/src/arch-nspawn.in b/src/arch-nspawn.in
index 275cff7..77a27ad 100644
--- a/src/arch-nspawn.in
+++ b/src/arch-nspawn.in
@@ -2,8 +2,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/archroot.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/archroot.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
+
# umask might have been changed in /etc/profile
# ensure that sane default is set again
diff --git a/src/archbuild.in b/src/archbuild.in
index ba3ba94..3367011 100644
--- a/src/archbuild.in
+++ b/src/archbuild.in
@@ -2,8 +2,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/archroot.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/archroot.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
+
base_packages=(base-devel)
makechrootpkg_args=(-c -n -C)
diff --git a/src/archrelease.in b/src/archrelease.in
index 3dd969b..b89dad2 100644
--- a/src/archrelease.in
+++ b/src/archrelease.in
@@ -2,8 +2,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/valid-tags.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/valid-tags.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
+
# parse command line options
FORCE=
diff --git a/src/checkpkg.in b/src/checkpkg.in
index fe5b71a..ccb7259 100644
--- a/src/checkpkg.in
+++ b/src/checkpkg.in
@@ -2,7 +2,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
usage() {
cat <<- _EOF_
diff --git a/src/commitpkg.in b/src/commitpkg.in
index 7b6e904..9158763 100644
--- a/src/commitpkg.in
+++ b/src/commitpkg.in
@@ -2,7 +2,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_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/util.sh
+
check_pkgbuild_validity() {
# shellcheck source=contrib/makepkg/PKGBUILD.proto
diff --git a/src/diffpkg.in b/src/diffpkg.in
index 4856e44..ab1a5af 100644
--- a/src/diffpkg.in
+++ b/src/diffpkg.in
@@ -2,7 +2,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
diff --git a/src/export-pkgbuild-keys.in b/src/export-pkgbuild-keys.in
index 8697b3d..c19fc8b 100644
--- a/src/export-pkgbuild-keys.in
+++ b/src/export-pkgbuild-keys.in
@@ -2,7 +2,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
usage() {
cat <<- _EOF_
@@ -35,7 +38,7 @@ if [[ ! -f PKGBUILD ]]; then
fi
mapfile -t validpgpkeys < <(
- # shellcheck source=PKGBUILD.proto
+ # shellcheck source=contrib/makepkg/PKGBUILD.proto
. ./PKGBUILD
if (( ${#validpgpkeys[@]} )); then
printf "%s\n" "${validpgpkeys[@]}"
diff --git a/src/find-libdeps.in b/src/find-libdeps.in
index 2517879..afdf0f5 100644
--- a/src/find-libdeps.in
+++ b/src/find-libdeps.in
@@ -2,7 +2,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
set -e
diff --git a/src/finddeps.in b/src/finddeps.in
index da7cb85..20d7095 100644
--- a/src/finddeps.in
+++ b/src/finddeps.in
@@ -4,7 +4,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
match=$1
diff --git a/src/lddd.in b/src/lddd.in
index 12f8d67..80c22c4 100644
--- a/src/lddd.in
+++ b/src/lddd.in
@@ -4,7 +4,10 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
ifs=$IFS
IFS="${IFS}:"
diff --git a/lib/archroot.sh b/src/lib/archroot.sh
index d7917da..d7917da 100644
--- a/lib/archroot.sh
+++ b/src/lib/archroot.sh
diff --git a/lib/common.sh b/src/lib/common.sh
index d2351af..f977726 100644
--- a/lib/common.sh
+++ b/src/lib/common.sh
@@ -4,13 +4,13 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-[[ -z ${_INCLUDE_COMMON_SH:-} ]] || return 0
-_INCLUDE_COMMON_SH="$(set +o|grep nounset)"
+[[ -z ${DEVTOOLS_INCLUDE_COMMON_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_COMMON_SH="$(set +o|grep nounset)"
set +u +o posix
# shellcheck disable=1091
. /usr/share/makepkg/util.sh
-$_INCLUDE_COMMON_SH
+$DEVTOOLS_INCLUDE_COMMON_SH
# Avoid any encoding problems
export LANG=C
diff --git a/src/lib/repo.sh b/src/lib/repo.sh
new file mode 100644
index 0000000..8b8df11
--- /dev/null
+++ b/src/lib/repo.sh
@@ -0,0 +1,90 @@
+#!/hint/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_REPO_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_REPO_SH=1
+
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+
+set -e
+
+
+pkgctl_repo_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [COMMAND] [OPTIONS]
+
+ Manage Git packaging repositories and helps with their configuration
+ according to distro specs.
+
+ Git author information and the used signing key is set up from
+ makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
+ The configure command can be used to synchronize the distro specs and
+ makepkg.conf settings for previously cloned repositories.
+
+ The unprivileged option can be used for cloning packaging repositories
+ without SSH access using read-only HTTPS.
+
+ COMMANDS
+ clone Clone a package repository
+ configure Configure a clone according to distro specs
+ web Open the packaging repository's website
+
+ OPTIONS
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} clone libfoo linux libbar
+ $ ${COMMAND} clone --maintainer mynickname
+ $ ${COMMAND} configure *
+ $ ${COMMAND} web linux
+_EOF_
+}
+
+pkgctl_repo() {
+ if (( $# < 1 )); then
+ pkgctl_repo_usage
+ exit 0
+ fi
+
+ # option checking
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_repo_usage
+ exit 0
+ ;;
+ clone)
+ _DEVTOOLS_COMMAND+=" $1"
+ shift
+ # shellcheck source=src/lib/repo/clone.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/clone.sh
+ pkgctl_repo_clone "$@"
+ exit 0
+ ;;
+ configure)
+ _DEVTOOLS_COMMAND+=" $1"
+ shift
+ # shellcheck source=src/lib/repo/configure.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
+ pkgctl_repo_configure "$@"
+ exit 0
+ ;;
+ web)
+ _DEVTOOLS_COMMAND+=" $1"
+ shift
+ # shellcheck source=src/lib/repo/web.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/web.sh
+ pkgctl_repo_web "$@"
+ exit 0
+ ;;
+ -*)
+ die "invalid argument: %s" "$1"
+ ;;
+ *)
+ die "invalid command: %s" "$1"
+ ;;
+ esac
+ done
+}
diff --git a/src/lib/repo/clone.sh b/src/lib/repo/clone.sh
new file mode 100644
index 0000000..42dc383
--- /dev/null
+++ b/src/lib/repo/clone.sh
@@ -0,0 +1,139 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_REPO_CLONE_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_REPO_CLONE_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/api/gitlab.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
+# shellcheck source=src/lib/repo/configure.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
+
+source /usr/share/makepkg/util/message.sh
+
+set -e
+
+
+pkgctl_repo_clone_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
+
+ Clone Git packaging repositories from the canonical namespace.
+
+ The configure command is subsequently invoked to synchronize the distro
+ specs and makepkg.conf settings. The unprivileged option can be used
+ for cloning packaging repositories without SSH access using read-only
+ HTTPS.
+
+ OPTIONS
+ -m, --maintainer=NAME Clone all packages of the named maintainer
+ -u, --unprivileged Clone package with read-only access and without
+ packager info as Git author
+ --universe Clone all existing packages, useful for cache warming
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} libfoo linux libbar
+ $ ${COMMAND} --maintainer mynickname
+_EOF_
+}
+
+pkgctl_repo_clone() {
+ if (( $# < 1 )); then
+ pkgctl_repo_clone_usage
+ exit 0
+ fi
+
+ # options
+ local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
+ local CLONE_ALL=0
+ local MAINTAINER=
+ local CONFIGURE_OPTIONS=()
+ local pkgbases
+
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_repo_clone_usage
+ exit 0
+ ;;
+ -u|--unprivileged)
+ GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
+ CONFIGURE_OPTIONS+=("$1")
+ shift
+ ;;
+ -m|--maintainer)
+ (( $# <= 1 )) && die "missing argument for %s" "$1"
+ MAINTAINER="$2"
+ shift 2
+ ;;
+ --maintainer=*)
+ MAINTAINER="${1#*=}"
+ shift
+ ;;
+ --universe)
+ CLONE_ALL=1
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ die "invalid argument: %s" "$1"
+ ;;
+ *)
+ pkgbases=("$@")
+ break
+ ;;
+ esac
+ done
+
+ # Query packages of a maintainer
+ if [[ -n ${MAINTAINER} ]]; then
+ stat_busy "Query packages"
+ 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')
+ if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
+ stat_done
+ warning "found no packages for maintainer ${MAINTAINER}"
+ exit 0
+ 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
+
+ # Query all released packages
+ if (( CLONE_ALL )); then
+ stat_busy "Query all released packages"
+ max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name" | jq -r '.num_pages')
+ if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then
+ stat_done
+ die "failed to query packages"
+ 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'
+ stat_progress
+ done | sort --unique)
+ stat_done
+ fi
+
+ for pkgbase in "${pkgbases[@]}"; do
+ if [[ ! -d ${pkgbase} ]]; then
+ msg "Cloning ${pkgbase} ..."
+ remote_url="${GIT_REPO_BASE_URL}/${pkgbase}.git"
+ git clone --origin origin "${remote_url}" "${pkgbase}"
+ else
+ warning "Skip cloning ${pkgbase}: Directory exists"
+ fi
+
+ pkgctl_repo_configure "${CONFIGURE_OPTIONS[@]}" "${pkgbase}"
+ done
+}
diff --git a/src/lib/repo/configure.sh b/src/lib/repo/configure.sh
new file mode 100644
index 0000000..5c99562
--- /dev/null
+++ b/src/lib/repo/configure.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_REPO_CONFIGURE_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_REPO_CONFIGURE_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/api/gitlab.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
+
+source /usr/share/makepkg/util/config.sh
+source /usr/share/makepkg/util/message.sh
+
+set -e
+
+
+pkgctl_repo_configure_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [OPTIONS] [PATH]...
+
+ Configure Git packaging repositories according to distro specs and
+ makepkg.conf settings.
+
+ Git author information and the used signing key is set up from
+ makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
+ The unprivileged option can be used for cloning packaging repositories
+ without SSH access using read-only HTTPS.
+
+ OPTIONS
+ -u, --unprivileged Configure read-only repo without packager info as Git author
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} configure *
+_EOF_
+}
+
+pkgctl_repo_configure() {
+ # options
+ local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
+ local UNPRIVILEGED=0
+ local PACKAGER_NAME=
+ local PACKAGER_EMAIL=
+ local paths=()
+
+ # variables
+ local path realpath pkgbase remote_url
+
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_repo_configure_usage
+ exit 0
+ ;;
+ -u|--unprivileged)
+ GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
+ UNPRIVILEGED=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_repo_configure_usage
+ exit 1
+ fi
+ fi
+
+ # Load makepkg.conf variables to be available
+ # shellcheck disable=2119
+ load_makepkg_config
+
+ # Check official packaging identity before setting Git author
+ if (( ! UNPRIVILEGED )); then
+ if [[ $PACKAGER == *"Unknown Packager"* ]]; then
+ die "Packager must be set in makepkg.conf"
+ fi
+ packager_pattern="(.+) <(.+@.+)>"
+ if [[ ! $PACKAGER =~ $packager_pattern ]]; then
+ die "Invalid Packager format '${PACKAGER}' in makepkg.conf"
+ fi
+
+ PACKAGER_NAME=$(echo "${PACKAGER}"|sed -E "s/${packager_pattern}/\1/")
+ PACKAGER_EMAIL=$(echo "${PACKAGER}"|sed -E "s/${packager_pattern}/\2/")
+
+ if [[ ! $PACKAGER_EMAIL =~ .+@archlinux.org ]]; then
+ die "Packager email '${PACKAGER_EMAIL}' is not an @archlinux.org address"
+ fi
+ fi
+
+ msg "Collected packager settings"
+ msg2 "name : ${PACKAGER_NAME}"
+ msg2 "email : ${PACKAGER_EMAIL}"
+ msg2 "gpg-key : ${GPGKEY:-undefined}"
+
+ # TODO: print which protocol got auto detected, ssh https
+
+ for path in "${paths[@]}"; do
+ if ! realpath=$(realpath -e "${path}"); then
+ error "No such directory: ${path}"
+ continue
+ fi
+
+ pkgbase=$(basename "${realpath}")
+ pkgbase=${pkgbase%.git}
+ msg "Configuring ${pkgbase}"
+
+ if [[ ! -d "${path}/.git" ]]; then
+ error "Not a Git repository: ${path}"
+ continue
+ fi
+
+ remote_url="${GIT_REPO_BASE_URL}/${pkgbase}.git"
+ if ! git -C "${path}" remote add origin "${remote_url}" &>/dev/null; then
+ git -C "${path}" remote set-url origin "${remote_url}"
+ fi
+
+ # move the master branch to main
+ if [[ $(git -C "${path}" symbolic-ref --short HEAD) == master ]]; then
+ git -C "${path}" branch --move main
+ git -C "${path}" config branch.main.merge refs/heads/main
+ fi
+
+ git -C "${path}" config devtools.version "${GIT_REPO_SPEC_VERSION}"
+ git -C "${path}" config pull.rebase true
+ git -C "${path}" config branch.autoSetupRebase always
+ git -C "${path}" config branch.main.remote origin
+ git -C "${path}" config branch.main.rebase true
+
+ git -C "${path}" config transfer.fsckobjects true
+ git -C "${path}" config fetch.fsckobjects true
+ git -C "${path}" config receive.fsckobjects true
+
+ if (( ! UNPRIVILEGED )); then
+ git -C "${path}" config user.name "${PACKAGER_NAME}"
+ git -C "${path}" config user.email "${PACKAGER_EMAIL}"
+ git -C "${path}" config commit.gpgsign true
+ if [[ -n $GPGKEY ]]; then
+ git -C "${path}" config user.signingKey "${GPGKEY}"
+ else
+ warning "Missing makepkg.conf configuration: GPGKEY"
+ fi
+ fi
+
+ if ! git ls-remote origin &>/dev/null; then
+ warning "configured remote origin may not exist, run:"
+ msg2 "pkgctl repo create ${pkgbase}"
+ fi
+ done
+}
diff --git a/src/lib/repo/web.sh b/src/lib/repo/web.sh
new file mode 100644
index 0000000..3fa214d
--- /dev/null
+++ b/src/lib/repo/web.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[[ -z ${DEVTOOLS_INCLUDE_REPO_WEB_SH:-} ]] || return 0
+DEVTOOLS_INCLUDE_REPO_WEB_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/api/gitlab.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
+
+set -e
+
+
+pkgctl_repo_web_usage() {
+ local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
+ cat <<- _EOF_
+ Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
+
+ Open the packaging repository's website via xdg-open. If called with
+ no arguments, open the package cloned in the current working directory.
+
+ OPTIONS
+ -h, --help Show this help text
+
+ EXAMPLES
+ $ ${COMMAND} web linux
+_EOF_
+}
+
+pkgctl_repo_web() {
+ local pkgbases=()
+ local path giturl pkgbase
+
+ # option checking
+ while (( $# )); do
+ case $1 in
+ -h|--help)
+ pkgctl_repo_web_usage
+ exit 0
+ ;;
+ --)
+ shift
+ break
+ ;;
+ -*)
+ die "invalid argument: %s" "$1"
+ ;;
+ *)
+ pkgbases=("$@")
+ break
+ ;;
+ esac
+ done
+
+ # Check if web mode has xdg-open
+ if ! command -v xdg-open &>/dev/null; then
+ die "The web command requires 'xdg-open'"
+ fi
+
+ # Check if used without pkgnames in a packaging directory
+ if (( ! $# )); then
+ path=${PWD}
+ if [[ ! -d "${path}/.git" ]]; then
+ die "Not a Git repository: ${path}"
+ fi
+
+ giturl=$(git -C "${path}" remote get-url origin)
+ if [[ ${giturl} != *${GIT_PACKAGING_NAMESPACE}* ]]; then
+ die "Not a packaging repository: ${path}"
+ fi
+
+ pkgbase=$(basename "${giturl}")
+ pkgbase=${pkgbase%.git}
+ pkgbases=("${pkgbase}")
+ fi
+
+ for pkgbase in "${pkgbases[@]}"; do
+ path=$(gitlab_project_name_to_path "${pkgbase}")
+ xdg-open "${GIT_PACKAGING_URL_HTTPS}/${path}"
+ done
+}
diff --git a/lib/valid-repos.sh b/src/lib/valid-repos.sh
index 9ac9639..9ac9639 100644
--- a/lib/valid-repos.sh
+++ b/src/lib/valid-repos.sh
diff --git a/lib/valid-tags.sh b/src/lib/valid-tags.sh
index d628fd1..d628fd1 100644
--- a/lib/valid-tags.sh
+++ b/src/lib/valid-tags.sh
diff --git a/src/makechrootpkg.in b/src/makechrootpkg.in
index 5d3eaae..8d3d093 100644
--- a/src/makechrootpkg.in
+++ b/src/makechrootpkg.in
@@ -2,8 +2,13 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/archroot.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/archroot.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
+
source /usr/share/makepkg/util/config.sh
diff --git a/src/makerepropkg.in b/src/makerepropkg.in
index c58a923..e0a5b85 100644
--- a/src/makerepropkg.in
+++ b/src/makerepropkg.in
@@ -6,8 +6,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/archroot.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/archroot.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
+
source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh
diff --git a/src/mkarchroot.in b/src/mkarchroot.in
index ff3426e..6c8d8a2 100644
--- a/src/mkarchroot.in
+++ b/src/mkarchroot.in
@@ -2,8 +2,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
-m4_include(lib/archroot.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/archroot.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh
+
# umask might have been changed in /etc/profile
# ensure that sane default is set again
diff --git a/src/pkgctl.in b/src/pkgctl.in
index 9b7d89c..64d9bcd 100644
--- a/src/pkgctl.in
+++ b/src/pkgctl.in
@@ -2,7 +2,9 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -e
@@ -40,7 +42,9 @@ while (( $# )); do
repo)
_DEVTOOLS_COMMAND+=" $1"
shift
- pkgrepo "$@"
+ # shellcheck source=src/lib/repo.sh
+ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo.sh
+ pkgctl_repo "$@"
exit 0
;;
diff)
diff --git a/src/pkgrepo.in b/src/pkgrepo.in
deleted file mode 100644
index 00f46e1..0000000
--- a/src/pkgrepo.in
+++ /dev/null
@@ -1,345 +0,0 @@
-#!/bin/bash
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-m4_include(lib/common.sh)
-
-source /usr/share/makepkg/util/config.sh
-source /usr/share/makepkg/util/message.sh
-
-set -e
-
-COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
-
-usage() {
- cat <<- _EOF_
- Usage: ${COMMAND} [COMMAND] [OPTIONS]
-
- Manage Git packaging repositories and helps with their configuration
- according to distro specs.
-
- Git author information and the used signing key is set up from
- makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
- The configure command can be used to synchronize the distro specs and
- makepkg.conf settings for previously cloned repositories.
-
- The unprivileged option can be used for cloning packaging repositories
- without SSH access using read-only HTTPS.
-
- COMMANDS
- clone Clone a package repository
- configure Configure a clone according to distro specs
- web Opens the packaging repository's website
-
- OPTIONS
- -h, --help Show this help text
-_EOF_
-}
-
-usage_clone() {
- cat <<- _EOF_
- Usage: ${COMMAND} clone [OPTIONS] [PKGNAME...]
-
- Clone Git packaging repositories from the canonical namespace.
-
- The configure command is subsequently invoked to synchronize the distro
- specs and makepkg.conf settings. The unprivileged option can be used
- for cloning packaging repositories without SSH access using read-only
- HTTPS.
-
- OPTIONS
- -m, --maintainer=NAME Clone all packages of the named maintainer
- -u, --unprivileged Clone package with read-only access and without
- packager info as Git author.
- --universe Clone all existing packages, useful for cache warming
- -h, --help Show this help text
-_EOF_
-}
-
-usage_configure() {
- cat <<- _EOF_
- Usage: ${COMMAND} configure [OPTIONS] [PATH...]
-
- Configure Git packaging repositories according to distro specs and
- makepkg.conf settings.
-
- Git author information and the used signing key is set up from
- makepkg.conf read from any valid location like /etc or XDG_CONFIG_HOME.
- The unprivileged option can be used for cloning packaging repositories
- without SSH access using read-only HTTPS.
-
- OPTIONS
- -u, --unprivileged Configure read-only repo without packager info as Git author.
- -h, --help Show this help text
-_EOF_
-}
-
-usage_web() {
- cat <<- _EOF_
- Usage: ${COMMAND} web [PKGNAME...]
-
- Opens the packaging repository's website via xdg-open. If called with
- no arguments, open the package cloned in the current working directory.
-
- OPTIONS
- -h, --help Show this help text
-_EOF_
-}
-
-if (( $# < 1 )); then
- usage
- exit 1
-fi
-
-# commands
-CLONE=0
-CONFIGURE=0
-
-# options
-GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
-UNPRIVILEGED=0
-CLONE_ALL=0
-MAINTAINER=
-PACKAGER_NAME=
-PACKAGER_EMAIL=
-
-# command checking
-while (( $# )); do
- case $1 in
- -h|--help)
- usage
- exit 0
- ;;
- clone)
- CLONE=1
- CONFIGURE=1
- shift
- break
- ;;
- configure)
- CONFIGURE=1
- shift
- break
- ;;
- web)
- WEB=1
- shift
- break
- ;;
- *)
- die "invalid argument: %s" "$1"
- ;;
- esac
-done
-
-if (( CLONE )); then
- # option checking
- if (( $# < 1 )); then
- usage_clone
- exit 1
- fi
- while (( $# )); do
- case $1 in
- -h|--help)
- usage_clone
- exit 0
- ;;
- -u|--unprivileged)
- GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
- UNPRIVILEGED=1
- shift
- ;;
- -m|--maintainer)
- (( $# <= 1 )) && die "missing argument for %s" "$1"
- MAINTAINER="$2"
- shift 2
- ;;
- --maintainer=*)
- MAINTAINER="${1#*=}"
- shift
- ;;
- --all)
- CLONE_ALL=1
- shift
- ;;
- --)
- shift
- break
- ;;
- -*)
- die "invalid argument: %s" "$1"
- ;;
- *)
- break
- ;;
- esac
- done
-elif (( CONFIGURE )); then
- # option checking
- if (( $# < 1 )); then
- usage_configure
- exit 1
- fi
- while (( $# )); do
- case $1 in
- -h|--help)
- usage_configure
- exit 0
- ;;
- -u|--unprivileged)
- GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
- UNPRIVILEGED=1
- shift
- ;;
- --)
- shift
- break
- ;;
- -*)
- die "invalid argument: %s" "$1"
- ;;
- *)
- break
- ;;
- esac
- done
-elif (( WEB )); then
- # option checking
- while (( $# )); do
- case $1 in
- -h|--help)
- usage_web
- exit 0
- ;;
- --)
- shift
- break
- ;;
- -*)
- die "invalid argument: %s" "$1"
- ;;
- *)
- break
- ;;
- esac
- done
-fi
-
-pkgbases=("$@")
-
-# Load makepkg.conf variables to be available
-load_makepkg_config
-
-# Check official packaging identity before setting Git author
-if (( ! UNPRIVILEGED )); then
- if [[ $PACKAGER == *"Unknown Packager"* ]]; then
- die "Packager must be set in makepkg.conf"
- fi
- packager_pattern="(.+) <(.+@.+)>"
- if [[ ! $PACKAGER =~ $packager_pattern ]]; then
- die "Invalid Packager format '${PACKAGER}' in makepkg.conf"
- fi
-
- PACKAGER_NAME=$(echo "${PACKAGER}"|sed -E "s/${packager_pattern}/\1/")
- PACKAGER_EMAIL=$(echo "${PACKAGER}"|sed -E "s/${packager_pattern}/\2/")
-
- if [[ ! $PACKAGER_EMAIL =~ .+@archlinux.org ]]; then
- die "Packager email '${PACKAGER_EMAIL}' is not an @archlinux.org address"
- fi
-fi
-
-# Query packages of a maintainer
-if [[ -n ${MAINTAINER} ]]; then
- stat_busy "Query packages for ${MAINTAINER}"
- 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')
- 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
-
-# Query all released packages
-if (( CLONE_ALL )); then
- stat_busy "Query all released packages"
- max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name" | jq -r '.num_pages')
- 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'
- stat_progress
- done | sort --unique)
- stat_done
-fi
-
-# Check web mode requirements and current directory shorthand
-if (( WEB )); then
- # Check if web mode has xdg-open
- if ! command -v xdg-open &>/dev/null; then
- die "The web command requires 'xdg-open'"
- fi
-
- # Check if used without pkgnames in a packaging directory
- if (( ! $# )); then
- path=${PWD}
- if [[ ! -d "${path}/.git" ]]; then
- die "Not a Git repository: ${path}"
- fi
-
- giturl=$(git -C "${path}" remote get-url origin)
- if [[ ${giturl} != *${GIT_PACKAGING_NAMESPACE}* ]]; then
- die "Not a packaging repository: ${path}"
- fi
-
- pkgbase=$(basename "${giturl}")
- pkgbase=${pkgbase%.git}
- pkgbases=("${pkgbase}")
- fi
-fi
-
-for pkgbase in "${pkgbases[@]}"; do
- if (( CLONE )); then
- if [[ ! -d ${pkgbase} ]]; then
- msg "Cloning ${pkgbase} ..."
- remote_url="${GIT_REPO_BASE_URL}/${pkgbase}.git"
- git clone --origin origin "${remote_url}"
- else
- warning "Skip cloning ${pkgbase}: Directory exists"
- fi
- fi
-
- if (( CONFIGURE )); then
- msg "Configuring $(basename "${pkgbase}") ..."
- path=${pkgbase}
- if [[ ! -d "${path}/.git" ]]; then
- error "Not a Git repository: ${path}"
- continue
- fi
-
- giturl=$(git -C "${path}" remote get-url origin)
- if [[ ${giturl} != *${GIT_PACKAGING_NAMESPACE}* ]]; then
- error "Not a packaging repository: ${path}"
- continue
- fi
-
- pkgbase=$(basename "${giturl}")
- pkgbase=${pkgbase%.git}
- remote_url="${GIT_REPO_BASE_URL}/${pkgbase}.git"
-
- git -C "${path}" remote set-url origin "${remote_url}"
- git -C "${path}" config devtools.version "${GIT_REPO_SPEC_VERSION}"
- git -C "${path}" config commit.gpgsign true
- git -C "${path}" config pull.rebase true
- git -C "${path}" config branch.main.rebase true
-
- if (( ! UNPRIVILEGED )); then
- git -C "${path}" config user.name "${PACKAGER_NAME}"
- git -C "${path}" config user.email "${PACKAGER_EMAIL}"
- if [[ -n $GPGKEY ]]; then
- git -C "${path}" config user.signingKey "${GPGKEY}"
- fi
- fi
- fi
-
- if (( WEB )); then
- xdg-open "${GIT_PACKAGING_URL_HTTPS}/${pkgbase}"
- fi
-done
diff --git a/src/rebuildpkgs.in b/src/rebuildpkgs.in
index f58cfab..7bf8b12 100644
--- a/src/rebuildpkgs.in
+++ b/src/rebuildpkgs.in
@@ -12,7 +12,10 @@
# Currently uses $(pwd)/rebuilds as the directory for rebuilding...
# TODO make this work for community too
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+
if (( $# < 1 )); then
printf 'Usage: %s <chrootdir> <packages to rebuild>\n' "$(basename "${BASH_SOURCE[0]}")"
diff --git a/src/sogrep.in b/src/sogrep.in
index 031d28e..0ee05cc 100644
--- a/src/sogrep.in
+++ b/src/sogrep.in
@@ -6,13 +6,17 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-m4_include(lib/common.sh)
+_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
+# shellcheck source=src/lib/common.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
+# shellcheck source=src/lib/valid-repos.sh
+source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
+
# globals
fallback_mirror='https://geo.mirror.pkgbuild.com'
: ${SOCACHE_DIR:="${XDG_CACHE_HOME:-${HOME}/.cache}/sogrep"}
-m4_include(lib/valid-repos.sh)
arches=('x86_64')
# options