From ac4fbb83edb19e745c38637fd0bccdc8b89ecb23 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Wed, 25 Jun 2025 09:04:01 -0400 Subject: [PATCH] refactor: harden the joj3-forge-convert script --- bin/joj3-forge-convert | 103 +++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/bin/joj3-forge-convert b/bin/joj3-forge-convert index 8452b3c..744c9a0 100755 --- a/bin/joj3-forge-convert +++ b/bin/joj3-forge-convert @@ -1,46 +1,67 @@ -#!/usr/bin/bash -set -ex +#!/usr/bin/env bash -ORG_NAME=$(basename "$(dirname "$(pwd)")") -REPO_NAME=$(basename "$(pwd)") +set -euo pipefail -COURSE=${REPO_NAME%-*} -CONFIG_REPO_PATH="/home/tt/.cache/$COURSE-config" -GRADING_REPO_PATH="/home/tt/.cache/$COURSE-joj" -GIT_USER="bot-$COURSE" -GIT_EMAIL="bot-$COURSE@focs.ji.sjtu.edu.cn" +export PATH="/usr/bin:/bin:/usr/local/bin" +unset IFS -if ! [ -d "$CONFIG_REPO_PATH" ]; then - git clone "ssh://git@focs.ji.sjtu.edu.cn:2222/$COURSE/$COURSE-joj.git" "$CONFIG_REPO_PATH" -fi -# TODO: move this into if statement -git -C "$CONFIG_REPO_PATH" config user.name "$GIT_USER" -git -C "$CONFIG_REPO_PATH" config user.email "$GIT_EMAIL" +main() { + local org_name + local repo_name + local course + org_name=$(basename "$(dirname "$(pwd)")") + repo_name=$(basename "$(pwd)") + course=${repo_name%-*} + if ! [[ "$course" =~ ^[a-zA-Z0-9_-]+$ ]]; then + exit 1 + fi -if ! [ -d "$GRADING_REPO_PATH" ]; then - git clone "ssh://git@focs.ji.sjtu.edu.cn:2222/$COURSE/$COURSE-joj.git" "$GRADING_REPO_PATH" - git -C "$GRADING_REPO_PATH" switch --orphan grading - echo "# $COURSE JOJ grading" >"$GRADING_REPO_PATH/Readme.md" - echo "This branch is automatically updated by JOJ, **never edit any file in this branch!**" >>"$GRADING_REPO_PATH/Readme.md" - git -C "$GRADING_REPO_PATH" add Readme.md - git -C "$GRADING_REPO_PATH" commit -m"docs: readme" - git -C "$GRADING_REPO_PATH" push -u origin grading -fi -# TODO: move this into if statement -git -C "$GRADING_REPO_PATH" config user.name "$GIT_USER" -git -C "$GRADING_REPO_PATH" config user.email "$GIT_EMAIL" + local config_repo_path="/home/tt/.cache/$course-config" + local grading_repo_path="/home/tt/.cache/$course-joj" + local git_user="bot-$course" + local git_email="bot-$course@focs.ji.sjtu.edu.cn" + local git_server="ssh://git@focs.ji.sjtu.edu.cn:2222" -git -C "$CONFIG_REPO_PATH" pull --rebase -rsync -r --delete "$CONFIG_REPO_PATH/home/tt/.config/" /home/tt/.config -joj3-forge convert /home/tt/.config/joj -rsync -r --delete /home/tt/.config/joj/ "$CONFIG_REPO_PATH/home/tt/.config/joj" -git -C "$CONFIG_REPO_PATH" add home/tt/.config/joj -if ! git -C "$CONFIG_REPO_PATH" diff --staged --quiet; then - git -C "$CONFIG_REPO_PATH" commit -m "chore: joj3-forge convert [skip ci]" - git -C "$CONFIG_REPO_PATH" push -fi -if [ -n "$TEAPOT_GITEA_TOKEN" ]; then - mkdir -p /home/tt/.config/teapot - echo "GITEA_ORG_NAME=$ORG_NAME" >"/home/tt/.config/teapot/teapot.env" - echo "GITEA_ACCESS_TOKEN=$TEAPOT_GITEA_TOKEN" >>"/home/tt/.config/teapot/teapot.env" -fi + if ! [ -d "$config_repo_path" ]; then + git clone "$git_server/$course/$course-config.git" "$config_repo_path" + fi + # TODO: move this into if statement + git -C "$config_repo_path" config user.name "$git_user" + git -C "$config_repo_path" config user.email "$git_email" + + if ! [ -d "$grading_repo_path" ]; then + git clone "$git_server/$course/$course-joj.git" "$grading_repo_path" + git -C "$grading_repo_path" switch --orphan grading + cat >"$grading_repo_path/Readme.md" <"$teapot_config_dir/teapot.env" <