mirror of
				https://gitlab.archlinux.org/archlinux/devtools.git
				synced 2025-10-30 23:34:43 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			6471027b68
			...
			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. | ||||
|  | ||||
| 		COMMANDS | ||||
| 		    aur     Interact with the Arch User Repository | ||||
| 		    auth    Authenticate with services like GitLab | ||||
| 		    build   Build packages inside a clean chroot | ||||
| 		    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 | ||||
| 		    search  Search for an expression across the GitLab packaging group | ||||
| 		    version Check and manage package versions against upstream | ||||
| 		    aur          Interact with the Arch User Repository | ||||
| 		    auth         Authenticate with services like GitLab | ||||
| 		    build        Build packages inside a clean chroot | ||||
| 		    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 | ||||
| 		    search       Search for an expression across the GitLab packaging group | ||||
| 		    rebuild-todo Rebuilds packages from a todo list. | ||||
| 		    version      Check and manage package versions against upstream | ||||
|  | ||||
| 		OPTIONS | ||||
| 		    -h, --help     Show this help text | ||||
| @@ -112,6 +113,14 @@ while (( $# )); do | ||||
| 			pkgctl_release "$@" | ||||
| 			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) | ||||
| 			_DEVTOOLS_COMMAND+=" $1" | ||||
| 			shift | ||||
|   | ||||
		Reference in New Issue
	
	Block a user