mirror of
https://gitlab.archlinux.org/archlinux/devtools.git
synced 2025-09-13 09:56:18 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
02bc8bfbc0 | ||
![]() |
f632659563 | ||
![]() |
7e41adf00b | ||
![]() |
a316b50f88 | ||
![]() |
547961681a | ||
![]() |
8190a22480 | ||
![]() |
f31ea3a48e | ||
![]() |
9f7808c26e |
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
SHELL=/bin/bash
|
||||
|
||||
V=1.0.3
|
||||
V=1.0.4
|
||||
BUILDTOOLVER ?= $(V)
|
||||
|
||||
PREFIX = /usr/local
|
||||
|
28
README.md
28
README.md
@@ -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
|
||||
|
44
cliff.toml
Normal file
44
cliff.toml
Normal 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]*"
|
@@ -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'
|
||||
|
@@ -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'
|
||||
|
@@ -7,8 +7,6 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
|
||||
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
|
||||
# shellcheck source=src/lib/valid-tags.sh
|
||||
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
|
||||
# shellcheck source=src/lib/util/git.sh
|
||||
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
|
||||
|
||||
set -e
|
||||
|
||||
@@ -57,8 +55,8 @@ gittag=$(get_tag_from_pkgver "$pkgver")
|
||||
if ! branchname=$(git symbolic-ref --short HEAD); then
|
||||
die 'not on any branch'
|
||||
fi
|
||||
if ! is_valid_release_branch "${branchname}"; then
|
||||
die 'must be run from a valid release branch (%s)' "${VALID_RELEASE_BRANCHES[@]}"
|
||||
if [[ "${branchname}" != main ]]; then
|
||||
die 'must be run from the main branch'
|
||||
fi
|
||||
|
||||
# Check if remote origin is setup properly
|
||||
@@ -87,10 +85,10 @@ if git tag --verify "$gittag" &> /dev/null; then
|
||||
if [[ "$cwd_checksum" != "$tag_checksum" ]]; then
|
||||
die "tagged PKGBUILD is not the same as the working dir PKGBUILD"
|
||||
fi
|
||||
git push --tags --set-upstream origin "${branchname}" || abort
|
||||
git push --tags --set-upstream origin main || abort
|
||||
exit 0
|
||||
fi
|
||||
|
||||
msg "Releasing package"
|
||||
git tag --sign --message="Package release ${pkgver}" "$gittag" || abort
|
||||
git push --tags --set-upstream origin "${branchname}" || abort
|
||||
git push --tags --set-upstream origin main || abort
|
||||
|
@@ -5,10 +5,9 @@
|
||||
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
|
||||
# shellcheck source=src/lib/common.sh
|
||||
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
|
||||
# shellcheck source=src/lib/util/git.sh
|
||||
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
|
||||
|
||||
source /usr/share/makepkg/util/util.sh
|
||||
source /usr/share/makepkg/srcinfo.sh
|
||||
|
||||
|
||||
check_pkgbuild_validity() {
|
||||
@@ -72,12 +71,8 @@ if ! repo_spec=$(git config --local devtools.version) || [[ ${repo_spec} != "${G
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! branchname=$(git symbolic-ref --short HEAD); then
|
||||
die 'not on any branch'
|
||||
fi
|
||||
|
||||
if ! is_valid_release_branch "${branchname}"; then
|
||||
die 'must be run from a valid release branch (%s)' "${VALID_RELEASE_BRANCHES[@]}"
|
||||
if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then
|
||||
die 'must be run from the main branch'
|
||||
fi
|
||||
|
||||
source=()
|
||||
@@ -101,9 +96,6 @@ case "$cmd" in
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ "${branchname}" == "unstable" ]] && [[ "$repo" != *"unstable" ]]; then
|
||||
die 'Cannot release from unstable branch into non-unstable repo: %s' "${repo}"
|
||||
fi
|
||||
|
||||
if (( ${#validpgpkeys[@]} != 0 )); then
|
||||
if [[ -d keys ]]; then
|
||||
@@ -186,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'
|
||||
|
@@ -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
|
||||
;;
|
||||
|
@@ -29,8 +29,6 @@ export GIT_PACKAGING_URL_SSH="git@${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 VALID_RELEASE_BRANCHES=(main unstable)
|
||||
|
||||
# check if messages are to be printed using color
|
||||
if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then
|
||||
colorize
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
@@ -23,7 +26,9 @@ git_diff_tree() {
|
||||
-- "${path}"
|
||||
}
|
||||
|
||||
is_valid_release_branch() {
|
||||
local branch=$1
|
||||
in_array "${branch}" "${VALID_RELEASE_BRANCHES[@]}"
|
||||
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
|
||||
}
|
||||
|
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user