diff --git a/README.md b/README.md index b64d1ca..c2e2006 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@ REMOTE="origin" BASE_BRANCH="main" # optional: fixed date or a filename prefixed with @ to get a stable date for testing DATE="@token" -# optional: an OBS project with a list of packages -OBSPKGLIST="https://api.opensuse.org/public/source/openSUSE:Factory:Rings:0-Bootstrap" +# optional: OBS projects with a list of packages +OBS_PROJECTS="openSUSE:Factory:Rings:0-Bootstrap" ``` Scripts: @@ -36,13 +36,16 @@ Scripts: All scripts use getopt, --help may not always be up to date though :-) +- obspkglist: given obs projects, prints all packages in those projects that + are also in gitea - updatemodules: checks all submodules for updates. For packages that need to be updated creates `refs/pq/$packagename`. The updated refence there updates the submodule commit reference for updates. It also adds or removes entries from/to `.gitmodules` if needed. There's also a `--single` option which produces a single reference for all updates. The `--status` option show the current - state. + state. Use --packages-from to read a package list produced by `obspkglist`. + With the list the script can also add or drop packages. - pusher: compares the references created by the `updatemodules` script with the specified remote. Pushed pending refs to an `update_$packagename` ref. Gitea doesn't seem to support refs in diff --git a/obspkglist b/obspkglist new file mode 100755 index 0000000..efad9f4 --- /dev/null +++ b/obspkglist @@ -0,0 +1,73 @@ +#!/bin/bash +set -e + +# https://api.opensuse.org/public/source/openSUSE:Factory:Rings:0-Bootstrap +APIURL="https://api.opensuse.org" +GITEA_PACKAGES="https://gitea.opensuse.org/api/v1/repos/rpm" +OBS_PROJECTS=() + +# command line only +packages_from= +single= +verbose=0 +cfg_file= + +################### + +declare -A packages + +helpandquit() +{ + cat <<-EOF + Usage: $0 [OPTIONS] [ ...] + OPTIONS: + --apiurl=URL OBS api url + --single create single commit for all changes + -h help screen + EOF + exit 0 +} + +log_info() +{ + [ "$verbose" -gt 0 ] || return 0 + echo "$@" +} + +getopttmp=$(getopt -o hc:v --long help,config:,verbose,apiurl: -n "${0##*/}" -- "$@") +eval set -- "$getopttmp" + +while true ; do + case "$1" in + -h|--help) helpandquit; shift ;; + -v|--verbose) verbose=$((++verbose)); shift ;; + -c|--config) cfg_file="$2"; shift 2 ;; + --apiurl) APIURL="$2"; shift 2 ;; + --) shift ; break ;; + *) echo "Internal error!" ; exit 1 ;; + esac +done + +[ $# ] && OBS_PROJECTS=("$@") + +# shellcheck disable=SC1090 +. "${cfg_file:-.settings}" 2>/dev/null || : + +for prj in "${OBS_PROJECTS[@]}"; do + while read -r p l; do + if [ -n "$l" ]; then + echo "Warning: link $p -> $l ignored" >&2 + continue + fi + packages["$p"]=1 + done < <(curl -s -f "$APIURL/public/source/$prj"|sed -ne 's/.*entry name="\([^"]*\)"\( \+originpackage="\([^"]*\)"\)\?.*\/>/\1 \3/p'|sort -u) +done + +for p in "${!packages[@]}"; do + # XXX: unfortuantely plain git would ask for auth + if ! curl -s -f "$GITEA_PACKAGES/$p" >/dev/null; then + log_info "Warning: $p not found in $GITEA_PACKAGES" >&2 + continue + fi + echo "$p" +done diff --git a/updatemodules b/updatemodules index 70eca6d..6b05c96 100755 --- a/updatemodules +++ b/updatemodules @@ -7,12 +7,11 @@ REMOTE="origin" BASE_BRANCH="main" PACKAGE_BASE_URL= PACKAGE_RELATIVE_URL="../../rpm" -# https://api.opensuse.org/public/source/openSUSE:Factory:Rings:0-Bootstrap -OBSPKGLIST= DATE="$(date "+%s %z")" -keep["dummy-release"]=1 +PACKAGES_KEEP= # command line only +packages_from= single= verbose=0 cfg_file= @@ -22,7 +21,7 @@ cfg_file= # constant needed to aid quoting nl=$'\n' -declare -A obs +declare -A packages declare -A new declare -A drop declare -A revs @@ -33,6 +32,7 @@ helpandquit() cat <<-EOF Usage: $0 [OPTIONS] [ ...] OPTIONS: + --packages-from=FILE read list of packges to sync from FILE --single create single commit for all changes -h help screen EOF @@ -81,7 +81,7 @@ makedict() done } -getopttmp=$(getopt -o hc:v --long help,single,branch:,config:,date:,remote:,status,verbose,clear -n "${0##*/}" -- "$@") +getopttmp=$(getopt -o hc:v --long help,single,branch:,config:,date:,remote:,status,verbose,clear,packages-from: -n "${0##*/}" -- "$@") eval set -- "$getopttmp" while true ; do @@ -90,6 +90,7 @@ while true ; do -v|--verbose) verbose=$((++verbose)); shift ;; -c|--config) cfg_file="$2"; shift 2 ;; --single) single=1; shift ;; + --packages-from) packages_from="$2"; shift 2 ;; --remote) REMOTE="$2"; shift 2 ;; --branch) BASE_BRANCH="$2"; shift 2 ;; --status) show_status; exit 0 ;; @@ -107,6 +108,10 @@ PACKAGE_BASE_URL="$(git config --get remote."$REMOTE".url)" # shellcheck disable=SC1090 . "${cfg_file:-.settings}" +for p in $PACKAGES_KEEP; do + keep["$p"]=1 +done + if [ "${DATE:0:1}" = '@' ]; then DATE="$(stat -c %Y "${DATE:1}") +0100" fi @@ -135,14 +140,13 @@ while read -r m t cid p; do revs["$p"]="$cid" done < <(git cat-file -p "$REMOTE/$BASE_BRANCH^{tree}") -if [ -n "$OBSPKGLIST" ]; then +if [ -n "$packages_from" ]; then while read -r p; do - obs["$p"]=1 + packages["$p"]=1 [ -n "${revs[$p]}" ] || new["$p"]=1 - done < <(curl -s -f "$OBSPKGLIST"|sed -ne 's/.*entry name="\([^":]*\).*\/>/\1/p'|sort -u | grep -v AGGR) - + done < "$packages_from" for m in "${!revs[@]}"; do - [ -n "${obs[$m]}" -o -n "${keep[$m]}" ] || drop["$m"]=1 + [ -n "${packages[$m]}" -o -n "${keep[$m]}" ] || drop["$m"]=1 done fi @@ -184,9 +188,9 @@ for m in "${modules[@]}"; do cid= if ! todrop "$m"; then - read -r cid _d < <(git ls-remote "$url" "${smbranch:-HEAD}") + read -r cid _d < <(GIT_ASKPASS=/bin/true git ls-remote "$url" "${smbranch:-HEAD}" 2>/dev/null) || true if [ -z "$cid" ]; then - echo "$path not in pool" >&2 + echo "Warning: $path not in pool, ignored" >&2 continue fi fi