Compare commits

...

3 Commits

Author SHA1 Message Date
Josephine Pfeiffer
fedc192811 Merge branch 'gl-257-pkgctl-repo-sanity-check' into 'master'
[GL#257] add pkgctl repo sanity check

Closes #257

See merge request archlinux/devtools!303
2025-08-06 04:06:29 +00:00
Jakub Klinkovský
fc56ebedf3 fix(completion): fix bash completion for the license subcommand
Signed-off-by: Jakub Klinkovský <lahwaacz@archlinux.org>
2025-08-05 17:48:12 +02:00
Josephine Pfeiffer
d9ac6029d9 fix(repo): improve validation for repository configuration
The pkgctl repo configure command previously had no validation,
which could lead to accidental misconfiguration of unrelated
repositories. This change adds basic validation to ensure we're in a
git repository, while still preserving the ability to configure AUR
repositories and local git repositories for legitimate workflows.

This approach prevents accidental misconfiguration in non-git
directories while maintaining compatibility with important use cases:
- Configuring AUR repositories when promoting packages
- Configuring local git repositories during initial setup

Tests have been updated to use temporary directories with mktemp instead
of reusing existing fixtures, providing better isolation and preventing
side effects.

Fixes #257

Component: pkgctl repo configure
Signed-off-by: Josephine Pfeiffer <hi@josie.lol>
2025-03-13 18:08:05 +01:00
4 changed files with 101 additions and 10 deletions

View File

@@ -24,7 +24,7 @@ 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
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats bats-assert bats-support
- make test BATS_EXTRA_ARGS='--formatter junit'
artifacts:
reports:
@@ -34,7 +34,7 @@ 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
- pacman -Syu --noconfirm m4 make openssh subversion rsync arch-install-scripts git bzr mercurial diffutils coreutils asciidoctor shellcheck nvchecker bats bats-assert bats-support kcov jq
- make coverage
coverage: '/Percent covered\s+\d+\.\d+/'
artifacts:

View File

@@ -150,6 +150,7 @@ _pkgctl_cmds=(
db
diff
issue
license
release
repo
search

View File

@@ -110,6 +110,11 @@ pkgctl_repo_configure() {
local path realpath pkgbase remote_url project_path hook
local PACKAGER GPGKEY packager_name packager_email
# Check if we're in a git repo
if ! git rev-parse --git-dir &>/dev/null; then
die "Not in a git repository"
fi
while (( $# )); do
case $1 in
-h|--help)
@@ -150,7 +155,8 @@ pkgctl_repo_configure() {
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
if [[ -f PKGBUILD ]]; then
if [[ -d .git ]] || git rev-parse --git-dir &>/dev/null; then
# We're in a git repository, so use current directory
paths=(".")
else
pkgctl_repo_configure_usage
@@ -226,10 +232,19 @@ pkgctl_repo_configure() {
pushd "${path}" >/dev/null
project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
if ! git remote add origin "${remote_url}" &>/dev/null; then
git remote set-url origin "${remote_url}"
# Check if this is a packaging repository
local is_packaging_repo=0
if [[ -f PKGBUILD ]]; then
is_packaging_repo=1
fi
# Configure remote only for packaging repositories
if (( is_packaging_repo )); then
project_path=$(gitlab_project_name_to_path "${pkgbase}")
remote_url="${GIT_REPO_BASE_URL}/${project_path}.git"
if ! git remote add origin "${remote_url}" &>/dev/null; then
git remote set-url origin "${remote_url}"
fi
fi
# move the master branch to main
@@ -239,7 +254,7 @@ pkgctl_repo_configure() {
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:-1.0.0}"
if [[ ${_DEVTOOLS_LIBRARY_DIR} == /usr/share/devtools ]]; then
git config devtools.variant canonical
else
@@ -249,8 +264,12 @@ pkgctl_repo_configure() {
git config pull.rebase true
git config branch.autoSetupRebase always
git config branch.main.remote origin
git config branch.main.rebase true
# Configure branch remote settings only for packaging repositories with remotes
if (( is_packaging_repo )) && git remote | grep -q "^origin$"; then
git config branch.main.remote origin
git config branch.main.rebase true
fi
git config transfer.fsckobjects true
git config fetch.fsckobjects true

View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bats
bats_require_minimum_version 1.5.0
# Load bats libraries
load "/usr/lib/bats/bats-support/load.bash"
load "/usr/lib/bats/bats-assert/load.bash"
export _DEVTOOLS_LIBRARY_DIR="${PWD}/src"
_pkgctl_repo_configure() {
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh
pkgctl_repo_configure "$@"
}
@test "repo-configure-valid-packaging" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://gitlab.archlinux.org/archlinux/packaging/packages/devtools.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-non-packaging" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://gitlab.com/kicad/libraries/kicad-packages3D.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-non-arch" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
git remote add origin "https://github.com/torvalds/linux.git"
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-no-git" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
run ! _pkgctl_repo_configure
assert_failure
assert_output --partial "Not in a git repository"
popd
rm -rf "${tmpdir}"
}
@test "repo-configure-local-git" {
local tmpdir
tmpdir=$(mktemp -dt devtools.test.repo-configure.XXXXXX)
pushd "${tmpdir}"
git init
run _pkgctl_repo_configure
assert_success
popd
rm -rf "${tmpdir}"
}