Compare commits

...

17 Commits

Author SHA1 Message Date
Levente Polyak
02bc8bfbc0 chore(release): version v1.0.4 2023-09-27 00:38:17 +02:00
Levente Polyak
f632659563 fix(clone): ssh connection may require user input (key unlocking etc)
Anything that requires user input (such as a key unlock or hostkey
verify) will block the terminal and wait for input which will never
come.

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

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

Fixes #148

Component: pkgctl repo clone/configure

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

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

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

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

Fixes #189

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

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

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

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

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

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

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

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

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

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

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-07-06 15:30:49 +02:00
Levente Polyak
662d6c5274 fix(make): use correct version variable for release target 2023-07-05 18:45:54 +02:00
Levente Polyak
3de03e8b1f chore(release): version v1.0.3 2023-07-05 18:36:07 +02:00
Christian Heusel
720b7c9b05 chore(build): skip invalid architectures on autodetection
This is done so that pkgctl can be better used to build aur packages
which can have arch=(...) settings for which we do not have a clean
chroot builder.

Signed-off-by: Christian Heusel <christian@heusel.eu>
2023-07-05 18:17:32 +02:00
Christian Heusel
0ea7e9e0e5 chore(doc): fix spelling typo in pkgrel detection
Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-06-18 01:01:11 +02:00
Christian Heusel
be5f54c95c fix(commitpkg): ensure the PKGBUILD is version controlled
Early exit in case the PKGBUILD is not yet properly under version
control, which can happen for freshly initialized repositories.
Furthermore print an appropriate error message including a hint how to
resolve this.

Fixes #154
Fixes #167

Signed-off-by: Christian Heusel <christian@heusel.eu>
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2023-06-17 23:02:36 +02:00
Levente Polyak
5c6e13a672 chore(doc): add missing dependency on fakeroot
We need fakeroot to trick pacman into updating a fresh pacman database
for an unprivileged user.
2023-06-08 00:31:35 +02:00
16 changed files with 145 additions and 31 deletions

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash
V=1.0.2
V=1.0.4
BUILDTOOLVER ?= $(V)
PREFIX = /usr/local
@@ -153,7 +153,7 @@ tag:
git tag --sign --message "Version v$$VERSION" v$$VERSION
release: dist
glab release create v$(RELEASE) devtools-$(RELEASE).tar.gz*
glab release create v$(V) devtools-$(V).tar.gz*
dist:
git archive --format=tar --prefix=devtools-$(V)/ v$(V) | gzip > devtools-$(V).tar.gz

View File

@@ -23,6 +23,34 @@ will automatically build the project and proxy all calls to the local build dire
./test/bin/pkgctl --help
```
### Commit messages
All commits must follow [conventional commits](https://www.conventionalcommits.org).
The following groups are allowed:
- chore
- feat
- fix
- doc
- perf
- test
To override the scope for the changelog entry use the `Component:` trailer.
Example:
```
feat(db): yay mega cool feature
Very long and useful description.
Fixes #1
Fixes #2
Component: pkgctl db remove
```
## Releasing
1. bump the version in the Makefile
@@ -42,6 +70,7 @@ will automatically build the project and proxy all calls to the local build dire
- binutils
- coreutils
- diffutils
- fakeroot
- findutils
- grep
- jq

44
cliff.toml Normal file
View File

@@ -0,0 +1,44 @@
[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 %}
{%- if component %}{{ component }}: {% elif commit.scope %}{{ commit.scope }}: {% endif %}
{{- commit.message | upper_first }}
{%- set fixes = commit.footers | filter(attribute="token", value="Fixes") %}
{%- for fix in fixes %}{{ fix.separator }}{{ fix.value }}{% 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
# glob pattern for matching git tags
tag_pattern = "*v[0-9]*"

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
VCSCLIENTS=('bzr::breezy'
'fossil::fossil'
'git::git'
'hg::mercurial'

View File

@@ -25,7 +25,7 @@ DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u'
#-- The package required by makepkg to download VCS sources
# Format: 'protocol::package'
VCSCLIENTS=('bzr::bzr'
VCSCLIENTS=('bzr::breezy'
'fossil::fossil'
'git::git'
'hg::mercurial'

View File

@@ -241,7 +241,7 @@ _pkgctl_cmds=(
"pkgctl command"
"auth[Authenticate with services like GitLab]"
"build[Build packages inside a clean chroot]"
"db[Pacman database modification for packge update, move etc]"
"db[Pacman database modification for package update, move etc]"
"diff[Compare package files using different modes]"
"release[Release step to commit, tag and upload build artifacts]"
"repo[Manage Git packaging repositories and their configuration]"

View File

@@ -33,7 +33,7 @@ pkgctl build::
Build packages inside a clean chroot
pkgctl db::
Pacman database modification for packge update, move etc
Pacman database modification for package update, move etc
pkgctl diff::
Compare package files using different modes

View File

@@ -16,7 +16,6 @@ umask 0022
working_dir=''
files=()
mount_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
@@ -56,6 +55,16 @@ shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
nspawn_args=(
--quiet
--directory="$working_dir"
--setenv="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin"
--register=no
--slice="devtools-$(systemd-escape "${SUDO_USER:-$USER}")"
--machine="arch-nspawn-$$"
--as-pid2
)
if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi
@@ -83,10 +92,10 @@ while read -r line; do
done
done < <(pacman-conf --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
mount_args+=("--bind=${cache_dirs[0]//:/\\:}")
nspawn_args+=(--bind="${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("--bind-ro=${cache_dir//:/\\:}")
nspawn_args+=(--bind-ro="${cache_dir//:/\\:}")
done
# {{{ functions
@@ -129,9 +138,4 @@ else
set_arch="${CARCH}"
fi
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn -q \
-D "$working_dir" \
-E "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin" \
--register=no --keep-unit --as-pid2 \
"${mount_args[@]}" \
"$@"
exec ${CARCH:+setarch "$set_arch"} systemd-nspawn "${nspawn_args[@]}" "$@"

View File

@@ -7,6 +7,7 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
source /usr/share/makepkg/util/util.sh
source /usr/share/makepkg/srcinfo.sh
check_pkgbuild_validity() {
@@ -111,7 +112,7 @@ if (( ${#validpgpkeys[@]} != 0 )); then
fi
# find files which should be under source control
needsversioning=()
needsversioning=(PKGBUILD)
for s in "${source[@]}"; do
[[ $s != *://* ]] && needsversioning+=("$s")
done
@@ -177,13 +178,11 @@ done
# check for PKGBUILD standards
check_pkgbuild_validity
# auto generate .SRCINFO if present
if [[ -f .SRCINFO ]]; then
stat_busy 'Generating .SRCINFO'
makepkg --printsrcinfo > .SRCINFO
git add .SRCINFO
stat_done
fi
# auto generate .SRCINFO
stat_busy 'Generating .SRCINFO'
write_srcinfo_content > .SRCINFO
git add --force .SRCINFO
stat_done
if [[ -n $(git status --porcelain --untracked-files=no) ]]; then
stat_busy 'Staging files'

View File

@@ -129,7 +129,7 @@ pkgctl_build() {
local WORKER_SLOT=
# variables
local path pkgbase pkgrepo source
local loop_arch path pkgbase pkgrepo source
while (( $# )); do
case $1 in
@@ -200,7 +200,7 @@ pkgctl_build() {
;;
-I|--install)
(( $# <= 1 )) && die "missing argument for %s" "$1"
MAKECHROOT_OPTIONS+=("-I" "$2")
MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")")
warning 'installing packages into the chroot may break reproducible builds, use with caution!'
shift 2
;;
@@ -318,7 +318,13 @@ pkgctl_build() {
if in_array any "${arch[@]}"; then
BUILD_ARCH=("${_arch[0]}")
else
BUILD_ARCH+=("${arch[@]}")
for loop_arch in "${arch[@]}"; do
if in_array "${loop_arch}" "${_arch[@]}"; then
BUILD_ARCH+=("$loop_arch")
else
warning 'invalid architecture, not building for: %s' "${loop_arch}"
fi
done
fi
fi
@@ -329,7 +335,7 @@ pkgctl_build() {
# increment pkgrel on rebuild
if (( REBUILD )); then
# try to figure out of pkgrel has been changed
# try to figure out if pkgrel has been changed
if ! old_pkgrel=$(git_diff_tree HEAD PKGBUILD | grep --perl-regexp --only-matching --max-count=1 '^-pkgrel=\K\w+'); then
old_pkgrel=${pkgrel}
fi

View File

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

View File

@@ -12,6 +12,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
# shellcheck source=src/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
@@ -52,6 +54,7 @@ pkgctl_repo_clone() {
fi
# options
local protocol=ssh
local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH}
local CLONE_ALL=0
local MAINTAINER=
@@ -72,6 +75,7 @@ pkgctl_repo_clone() {
;;
--protocol=https)
GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS}
protocol=https
CONFIGURE_OPTIONS+=("$1")
shift
;;
@@ -82,6 +86,7 @@ pkgctl_repo_clone() {
else
die "unsupported protocol: %s" "$2"
fi
protocol="$2"
CONFIGURE_OPTIONS+=("$1" "$2")
shift 2
;;
@@ -171,6 +176,12 @@ pkgctl_repo_clone() {
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

View File

@@ -10,6 +10,8 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
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/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
source /usr/share/makepkg/util/config.sh
source /usr/share/makepkg/util/message.sh
@@ -188,6 +190,12 @@ pkgctl_repo_configure() {
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

View File

@@ -7,6 +7,9 @@ DEVTOOLS_INCLUDE_UTIL_GIT_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
git_diff_tree() {
local commit=$1
@@ -22,3 +25,10 @@ git_diff_tree() {
"${commit}" \
-- "${path}"
}
git_warmup_ssh_connection() {
msg 'Establishing ssh connection to git@%s' "${GITLAB_HOST}"
if ! ssh -T "git@${GITLAB_HOST}" >/dev/null; then
die 'Failed to establish ssh connection to git@%s' "${GITLAB_HOST}"
fi
}

View File

@@ -39,12 +39,15 @@ get_pacman_repo_from_pkgbuild() {
fi
slock 10 "${_DEVTOOLS_PACMAN_CACHE_DIR}.lock" "Locking pacman database cache"
# query repo of passed pkgname, specify --nodeps twice to skip all dependency checks
mapfile -t repos < <(pacman --config "${_DEVTOOLS_PACMAN_CONF_DIR}/multilib.conf" \
--dbpath "${_DEVTOOLS_PACMAN_CACHE_DIR}" \
-S \
--sync \
--nodeps \
--nodeps \
--print \
--print-format '%n %r' \
"${pkgnames[0]}" | grep -E "^${pkgnames[0]} " | awk '{print $2}'
"${pkgnames[0]}" | awk '$1=="'"${pkgnames[0]}"'"{print $2}'
)
lock_close 10

View File

@@ -21,7 +21,7 @@ usage() {
COMMANDS
auth Authenticate with services like GitLab
build Build packages inside a clean chroot
db Pacman database modification for packge update, move etc
db Pacman database modification for package update, move etc
diff Compare package files using different modes
release Release step to commit, tag and upload build artifacts
repo Manage Git packaging repositories and their configuration