#!/bin/bash # Requires: coreutils, curl, jq, git set -uex API_KEY="$(cat "$(dirname "$(readlink -f "$0")")"/gitea-api-token.txt)" gitea_cmd () { ADD_PARAMS=${2:-} # shellcheck disable=SC2048,SC2086 curl -s -H 'Accept: application/json' -H 'Content-Type: application/json' \ -H "Authorization: token $API_KEY" ${ADD_PARAMS[*]} \ "https://src.opensuse.org/api/v1/$1" 2>/dev/null } [ "$#" -lt 2 ] && exit 1 if [ "$1" = "openSUSE:Factory" ] ; then OUT=$(osc develproject "$1" "$2") DEVPRJ="$(dirname "$OUT")" PKG="$(basename "$OUT")" else DEVPRJ="$1" PKG="$2" fi osc co "$DEVPRJ" "$PKG" cd "$DEVPRJ/$PKG" # Init git? if ! git rev-parse --git-dir >/dev/null 2>&1 ; then git init -q -b obs_state git add -A . && git rm --cached -r .osc/ && git commit -m 'OBS last state' git remote add origin "https://src.opensuse.org/pool/$PKG.git" fi # # Fork # Whoami? LOGIN="$(gitea_cmd "user" | jq -r '.login')" # Do we have our own configuration for MYORG? if ! MYORG="$(git config obs.org)" ; then MYORG="${LOGIN}" fi # Check whether the fork already exists FRK_OUT="$(gitea_cmd "repos/pool/$PKG/forks")" FORKS="$(echo "$FRK_OUT" | jq -r '.[].full_name | select(startswith("rpm/") | not)')" if [ -n "$FORKS" ] ; then # shellcheck disable=SC2086 MY_FORK="$(echo "$FRK_OUT" | jq -r ".[].full_name | select(startswith(\""$MYORG/"\"))")" else MY_FORK="" fi # If not, make a fork if [ -z "$MY_FORK" ] ; then if [ "$MYORG" = "$LOGIN" ] ; then FRK_OUT="$(gitea_cmd "repos/pool/$PKG/forks" "-X POST")" else # shellcheck disable=SC2086 FRK_OUT="$(echo '{ "organization": "'$MYORG'" }' \ | gitea_cmd "repos/pool/$PKG/forks" "-d @-")" fi MY_FORK="$(echo "$FRK_OUT" | jq -r '.full_name')" fi # Set URLs for the forked repository git remote add myproj "https://src.opensuse.org/$MY_FORK.git" git remote set-url --push myproj "gitea@src.opensuse.org:$MY_FORK.git" git remote update # # Final cleanup # Add ignore echo '.osc/' >> .git/info/exclude echo '_scmsync.obsinfo' >> .git/info/exclude # Set config git config "lfs.$(git remote get-url myproj)/info/lfs.locksverify" true # Switch to factory branch, obs_state is just a record of the old state git checkout --force -B factory myproj/factory # # SCM Sync settings OSC_META=$(mktemp /tmp/osc_meta_data.XXXXXX.xml) trap 'rm -f $OSC_META' EXIT osc meta pkg "$DEVPRJ" "$PKG" >"$OSC_META" 2>/dev/null # If this is considered a bad idea # (https://stackoverflow.com/a/1732454/164233) we can use # xmlstarlet instead. if ! grep '' "$OSC_META" >/dev/null 2>&1 ; then sed -e "/<\/package>/i\ \ https://src.opensuse.org/pool/$PKG#factory<\/scmsync>" \ "$OSC_META" | osc meta pkg "$DEVPRJ" "$PKG" -F - fi