mirror of
https://gitlab.archlinux.org/archlinux/devtools.git
synced 2025-09-13 01:46:19 +02:00
Compare commits
1 Commits
3cf1cf6eeb
...
190-rebuil
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b095aeee61 |
234
src/lib/rebuild-todo.sh
Normal file
234
src/lib/rebuild-todo.sh
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
#!/hint/bash
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
[[ -z ${DEVTOOLS_INCLUDE_REBUILD_TODO_SH:-} ]] || return 0
|
||||||
|
DEVTOOLS_INCLUDE_REBUILD_TODO_SH=1
|
||||||
|
|
||||||
|
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
|
||||||
|
|
||||||
|
source /usr/share/makepkg/util/util.sh
|
||||||
|
|
||||||
|
# shellcheck source=src/lib/repo/clone.sh
|
||||||
|
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/clone.sh
|
||||||
|
# shellcheck source=src/lib/build/build.sh
|
||||||
|
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/build/build.sh
|
||||||
|
# shellcheck source=src/lib/release.sh
|
||||||
|
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
|
||||||
|
pkgctl_rebuild_todo_usage() {
|
||||||
|
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
|
||||||
|
cat <<- _EOF_
|
||||||
|
Usage: ${COMMAND} [OPTIONS] URL
|
||||||
|
|
||||||
|
Rebuilds packages from a todo list.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-h, --help Show this help text
|
||||||
|
-m, --message MSG Use the given <msg> as the commit message
|
||||||
|
-i, --ignore Give one or more pkgbases to ignore
|
||||||
|
-f, --maintainer Filter for one or more maintainers (orphan for orphan packages)
|
||||||
|
-o, --offload Build on a remote server and transfer artifacts afterwards
|
||||||
|
-e, --edit Edit PKGBUILD before building. Default when todo type is "Task"
|
||||||
|
-r, --repo REPO Specify a target repository (disables auto-detection)
|
||||||
|
-s, --staging Release to the staging 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
|
||||||
|
--no-build Don't build PKGBUILD
|
||||||
|
--no-release Don't run commitpkg after building
|
||||||
|
|
||||||
|
EXAMPLES
|
||||||
|
TODO
|
||||||
|
_EOF_
|
||||||
|
}
|
||||||
|
|
||||||
|
pkgctl_rebuild_todo() {
|
||||||
|
if (( $# < 1 )); then
|
||||||
|
pkgctl_rebuild_todo_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local URL=""
|
||||||
|
local REPO=""
|
||||||
|
|
||||||
|
local MAINTAINERS=()
|
||||||
|
local IGNORE_PKGBASES=()
|
||||||
|
local FILTER_REPOSITORY=("extra")
|
||||||
|
|
||||||
|
local DRY_RUN=0
|
||||||
|
local MESSAGE_SET=0
|
||||||
|
local NO_RELEASE=0
|
||||||
|
local NO_BUILD=0
|
||||||
|
|
||||||
|
local RELEASE_OPTIONS=("--staging")
|
||||||
|
local BUILD_OPTIONS=("--staging" "--rebuild")
|
||||||
|
|
||||||
|
local packages
|
||||||
|
|
||||||
|
# option checking
|
||||||
|
while (( $# )); do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
pkgctl_rebuild_todo_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--dry-run)
|
||||||
|
DRY_RUN=1
|
||||||
|
shift 1
|
||||||
|
;;
|
||||||
|
-f|--maintainer)
|
||||||
|
(( $# <= 1 )) && die "missing argument for %s" "$1"
|
||||||
|
MAINTAINERS+=("$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-i|--ignore)
|
||||||
|
(( $# <= 1 )) && die "missing argument for %s" "$1"
|
||||||
|
IGNORE_PKGBASES+=("$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-o|--offload)
|
||||||
|
BUILD_OPTIONS+=("--offload")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-e|--edit)
|
||||||
|
BUILD_OPTIONS+=("--edit")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-m|--message)
|
||||||
|
(( $# <= 1 )) && die "missing argument for %s" "$1"
|
||||||
|
MESSAGE_SET=1
|
||||||
|
RELEASE_OPTIONS+=("--message" "$2")
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-s|--staging)
|
||||||
|
RELEASE_OPTIONS+=("--staging")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-t|--testing)
|
||||||
|
RELEASE_OPTIONS+=("--testing")
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-release)
|
||||||
|
NO_RELEASE=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-build)
|
||||||
|
NO_BUILD=1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
die "invalid option: %s" "$1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ ! "$1" == https* ]]; then
|
||||||
|
die "Missing url!"
|
||||||
|
fi
|
||||||
|
URL="$1"
|
||||||
|
if [[ ! "$URL" == */ ]]; then
|
||||||
|
URL+="/"
|
||||||
|
fi
|
||||||
|
if [[ ! "$URL" == *json ]]; then
|
||||||
|
URL+="json"
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# TODO: setup default values for options
|
||||||
|
|
||||||
|
while read -r json; do
|
||||||
|
readarray -t packages < <(jq --slurpfile repo <(printf '"%s" ' "${FILTER_REPOSITORY[@]}") \
|
||||||
|
--slurpfile maint <(printf '"%s" ' "${MAINTAINERS[@]}") \
|
||||||
|
-r '.created as $created
|
||||||
|
| .packages[]
|
||||||
|
| select(.status_str == "Incomplete" )
|
||||||
|
| select([.repo] | inside($repo))
|
||||||
|
| select(($maint[0] == "") or (($maint[0] == "orphan") and .maintainers == []) or (select(.maintainers | any([.] | inside($maint)))))
|
||||||
|
| "\(.pkgbase)"' \
|
||||||
|
- <<< "$json" | sort -u)
|
||||||
|
|
||||||
|
# This removes any elements we have ignored.... it's not pretty
|
||||||
|
readarray -t packages < <(comm -1 -3 <(printf "%s\n" "${IGNORE_PKGBASES[@]}" | sort) <(printf "%s\n" "${packages[@]}"| sort))
|
||||||
|
|
||||||
|
# Default to include the list name in the commit message
|
||||||
|
if (( ! MESSAGE_SET )); then
|
||||||
|
RELEASE_OPTIONS+=("--message" "$(jq -r '.name' - <<< "$json")")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If we are doing a Task we probably want to edit the PKGBUILD
|
||||||
|
if [[ "$(jq -r '.kind' - <<< "$json")" == "Task" ]]; then
|
||||||
|
BUILD_OPTIONS+=("--edit")
|
||||||
|
fi
|
||||||
|
done <<< "$(curl -s "$URL")"
|
||||||
|
|
||||||
|
if (( DRY_RUN )); then
|
||||||
|
msg "Would rebuild the following packages:"
|
||||||
|
msg2 '%s' "${packages[@]}"
|
||||||
|
msg "by running the following for each:"
|
||||||
|
if ! ((NO_BUILD)); then
|
||||||
|
msg2 "pkgctl build ${BUILD_OPTIONS[*]}"
|
||||||
|
fi
|
||||||
|
if ! ((NO_RELEASE)); then
|
||||||
|
msg2 "pkgctl release ${RELEASE_OPTIONS[*]}"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( 0 == ${#packages[@]} )); then
|
||||||
|
die "No packages to rebuild!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
msg "Rebuilding the following packages:"
|
||||||
|
msg2 '%s' "${packages[@]}"
|
||||||
|
msg "Press [Enter] to continue..."
|
||||||
|
read <&1
|
||||||
|
|
||||||
|
[[ -z ${WORKDIR:-} ]] && setup_workdir
|
||||||
|
pushd "$WORKDIR" &>/dev/null
|
||||||
|
|
||||||
|
# TODO set -j 1 to circumvent bug in repo clone
|
||||||
|
msg "Clone the pacakges"
|
||||||
|
if ! pkgctl_repo_clone -j 1 "${packages[@]}"; then
|
||||||
|
die "error while cloning packages"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for pkg in "${packages[@]}"; do
|
||||||
|
pushd "$pkg" &>/dev/null
|
||||||
|
|
||||||
|
# This should help us figure out if the package is already built
|
||||||
|
readarray -t pkgs < <(makepkg --packagelist)
|
||||||
|
if [[ -f ${pkgs[0]} ]]; then
|
||||||
|
msg "${pkg[0]} has already been rebuilt!"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! ((NO_BUILD)); then
|
||||||
|
SKIP_BUILD=0
|
||||||
|
while true; do
|
||||||
|
# TODO: it seems like pkgctl build does not set the exit code correctly if (offload?) build fails
|
||||||
|
if pkgctl_build "${BUILD_OPTIONS[@]}"; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
error "We failed to build! You are in a subshell to fix the build. Exit the shell to build again."
|
||||||
|
$SHELL || true
|
||||||
|
read -p "Skip build? [N/y] " -n 1 -r
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
SKIP_BUILD=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if ((SKIP_BUILD)); then
|
||||||
|
popd &>/dev/null
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if ! ((NO_RELEASE)); then
|
||||||
|
pkgctl_release "${RELEASE_OPTIONS[@]}"
|
||||||
|
fi
|
||||||
|
popd &>/dev/null
|
||||||
|
done
|
||||||
|
}
|
@@ -19,15 +19,16 @@ usage() {
|
|||||||
Unified command-line frontend for devtools.
|
Unified command-line frontend for devtools.
|
||||||
|
|
||||||
COMMANDS
|
COMMANDS
|
||||||
aur Interact with the Arch User Repository
|
aur Interact with the Arch User Repository
|
||||||
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 package 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
|
search Search for an expression across the GitLab packaging group
|
||||||
version Check and manage package versions against upstream
|
rebuild-todo Rebuilds packages from a todo list.
|
||||||
|
version Check and manage package versions against upstream
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-h, --help Show this help text
|
-h, --help Show this help text
|
||||||
@@ -112,6 +113,14 @@ while (( $# )); do
|
|||||||
pkgctl_release "$@"
|
pkgctl_release "$@"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
|
rebuild-todo)
|
||||||
|
_DEVTOOLS_COMMAND+=" $1"
|
||||||
|
shift
|
||||||
|
# shellcheck source=src/lib/rebuild-todo.sh
|
||||||
|
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/rebuild-todo.sh
|
||||||
|
pkgctl_rebuild_todo "$@"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
search)
|
search)
|
||||||
_DEVTOOLS_COMMAND+=" $1"
|
_DEVTOOLS_COMMAND+=" $1"
|
||||||
shift
|
shift
|
||||||
|
Reference in New Issue
Block a user