Update 2026-04-17_01:44:15
This commit is contained in:
111
gitea_push.sh
111
gitea_push.sh
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/zsh
|
#!/bin/zsh
|
||||||
# Script Version: 1.5
|
# Script Version: 1.6
|
||||||
# Description: Pushes the current folder (e.g. /etc) to a nested Gitea repo using provided nesting arguments. Auto-creates the remote repo via Gitea API if missing.
|
# Description: Pushes the current folder (e.g. /etc) or a single file to a nested Gitea repo using provided nesting arguments. Auto-creates the remote repo via Gitea API if missing.
|
||||||
|
|
||||||
# Set variables
|
# Set variables
|
||||||
# ========
|
# ========
|
||||||
@@ -27,6 +27,8 @@ GITEA_API_URL="$GITEA_URL/api/v1"
|
|||||||
PRIVATE=false
|
PRIVATE=false
|
||||||
DEBUG=false
|
DEBUG=false
|
||||||
COMMIT_MESSAGE="Update $(date +"%F_%T")"
|
COMMIT_MESSAGE="Update $(date +"%F_%T")"
|
||||||
|
SINGLE_FILE=""
|
||||||
|
TARGET_REPO=""
|
||||||
|
|
||||||
# Logging function
|
# Logging function
|
||||||
# ========
|
# ========
|
||||||
@@ -65,7 +67,11 @@ create_repo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
prepare_commit() {
|
prepare_commit() {
|
||||||
git add .
|
if [ -n "$SINGLE_FILE" ]; then
|
||||||
|
git add "$SINGLE_FILE"
|
||||||
|
else
|
||||||
|
git add .
|
||||||
|
fi
|
||||||
if git diff --quiet HEAD && ! git rev-parse --verify HEAD >/dev/null 2>&1; then
|
if git diff --quiet HEAD && ! git rev-parse --verify HEAD >/dev/null 2>&1; then
|
||||||
log INFO "Creating initial commit"
|
log INFO "Creating initial commit"
|
||||||
git commit -m "$COMMIT_MESSAGE"
|
git commit -m "$COMMIT_MESSAGE"
|
||||||
@@ -96,16 +102,24 @@ push_changes() {
|
|||||||
# ========
|
# ========
|
||||||
if [ $# -eq 0 ]; then
|
if [ $# -eq 0 ]; then
|
||||||
echo "GITEA_API_TOKEN=<your token>"
|
echo "GITEA_API_TOKEN=<your token>"
|
||||||
echo "Usage: $0 [--private] [--debug] [--message \"your commit message\"] <host_group>"
|
echo "Usage: $0 [--private] [--debug] [--message \"your commit message\"] [--file <path>] [--repo <repo_name>] <host_group>"
|
||||||
echo "Example: $0 server"
|
echo "Example: $0 server"
|
||||||
echo " $0 --private workstation"
|
echo " $0 --private workstation"
|
||||||
echo " $0 --debug server"
|
echo " $0 --debug server"
|
||||||
echo " $0 --message \"minor update\" server"
|
echo " $0 --message \"minor update\" server"
|
||||||
|
echo " $0 --file /path/to/script.sh server"
|
||||||
|
echo " $0 --file /path/to/script.sh --repo at1-workstation-scripts server"
|
||||||
echo
|
echo
|
||||||
echo "Note: You must cd into the target folder before running this script."
|
echo "Note: Without --file, you must cd into the target folder before running this script."
|
||||||
echo "For example:"
|
echo "For example:"
|
||||||
echo " cd /etc && $0 server"
|
echo " cd /etc && $0 server"
|
||||||
echo
|
echo
|
||||||
|
echo "With --file, you can push a single file from any location:"
|
||||||
|
echo " $0 --file /home/user/scripts/myscript.sh server"
|
||||||
|
echo
|
||||||
|
echo "With --repo, you can specify an existing repository name instead of auto-generating:"
|
||||||
|
echo " $0 --file /path/to/script.sh --repo at1-workstation-scripts server"
|
||||||
|
echo
|
||||||
echo "Authentication:"
|
echo "Authentication:"
|
||||||
echo " Git operations (clone, push, pull) use ~/.netrc with your Git password:"
|
echo " Git operations (clone, push, pull) use ~/.netrc with your Git password:"
|
||||||
echo " machine \$(echo \"$GITEA_URL\" | sed 's|https\?://||') login $GITEA_USER password \"<your Git password>\""
|
echo " machine \$(echo \"$GITEA_URL\" | sed 's|https\?://||') login $GITEA_USER password \"<your Git password>\""
|
||||||
@@ -133,6 +147,14 @@ while [[ $# -gt 0 ]]; do
|
|||||||
COMMIT_MESSAGE="$2"
|
COMMIT_MESSAGE="$2"
|
||||||
shift 2
|
shift 2
|
||||||
;;
|
;;
|
||||||
|
--file)
|
||||||
|
SINGLE_FILE="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--repo)
|
||||||
|
TARGET_REPO="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
POSITIONAL_ARGS+=("$1")
|
POSITIONAL_ARGS+=("$1")
|
||||||
shift
|
shift
|
||||||
@@ -143,22 +165,67 @@ done
|
|||||||
set -- "${POSITIONAL_ARGS[@]}"
|
set -- "${POSITIONAL_ARGS[@]}"
|
||||||
|
|
||||||
if [[ $# -ne 1 ]]; then
|
if [[ $# -ne 1 ]]; then
|
||||||
echo "Usage: $0 [--private] [--debug] [--message \"your commit message\"] <host_group>"
|
echo "Usage: $0 [--private] [--debug] [--message \"your commit message\"] [--file <path>] [--repo <repo_name>] <host_group>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
HOST_GROUP=$(echo "$1" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')
|
HOST_GROUP=$(echo "$1" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')
|
||||||
HOST_NAME=$(hostname -s | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')
|
HOST_NAME=$(hostname -s | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')
|
||||||
FOLDER_NAME="${HOST_NAME}-${HOST_GROUP}-$(basename "$PWD")"
|
|
||||||
REPO_PATH="$PWD"
|
if [ -n "$TARGET_REPO" ]; then
|
||||||
REMOTE_PATH="$FOLDER_NAME"
|
# Use specified repository name
|
||||||
GIT_REMOTE="$GITEA_URL/$GITEA_USER/$FOLDER_NAME.git"
|
FOLDER_NAME="$TARGET_REPO"
|
||||||
|
if [ -n "$SINGLE_FILE" ]; then
|
||||||
|
# Validate file exists
|
||||||
|
if [ ! -f "$SINGLE_FILE" ]; then
|
||||||
|
log ERROR "File not found: $SINGLE_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
FILE_DIR=$(dirname "$SINGLE_FILE")
|
||||||
|
REPO_PATH="$FILE_DIR"
|
||||||
|
log INFO "Using existing repo: $TARGET_REPO"
|
||||||
|
log INFO "Single file mode: $SINGLE_FILE"
|
||||||
|
else
|
||||||
|
REPO_PATH="$PWD"
|
||||||
|
log INFO "Using existing repo: $TARGET_REPO"
|
||||||
|
fi
|
||||||
|
REMOTE_PATH="$FOLDER_NAME"
|
||||||
|
GIT_REMOTE="$GITEA_URL/$GITEA_USER/$FOLDER_NAME.git"
|
||||||
|
elif [ -n "$SINGLE_FILE" ]; then
|
||||||
|
# Validate file exists
|
||||||
|
if [ ! -f "$SINGLE_FILE" ]; then
|
||||||
|
log ERROR "File not found: $SINGLE_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# Get directory and filename
|
||||||
|
FILE_DIR=$(dirname "$SINGLE_FILE")
|
||||||
|
FILE_NAME=$(basename "$SINGLE_FILE")
|
||||||
|
# Sanitize filename for repo name
|
||||||
|
FILE_NAME_SANITIZED=$(echo "$FILE_NAME" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9-')
|
||||||
|
FOLDER_NAME="${HOST_NAME}-${HOST_GROUP}-${FILE_NAME_SANITIZED}"
|
||||||
|
REPO_PATH="$FILE_DIR"
|
||||||
|
REMOTE_PATH="$FOLDER_NAME"
|
||||||
|
GIT_REMOTE="$GITEA_URL/$GITEA_USER/$FOLDER_NAME.git"
|
||||||
|
log INFO "Single file mode: $SINGLE_FILE"
|
||||||
|
else
|
||||||
|
FOLDER_NAME="${HOST_NAME}-${HOST_GROUP}-$(basename "$PWD")"
|
||||||
|
REPO_PATH="$PWD"
|
||||||
|
REMOTE_PATH="$FOLDER_NAME"
|
||||||
|
GIT_REMOTE="$GITEA_URL/$GITEA_USER/$FOLDER_NAME.git"
|
||||||
|
fi
|
||||||
|
|
||||||
# Git authentication hint
|
# Git authentication hint
|
||||||
log DEBUG "Ensure ~/.netrc has: machine <host> login $GITEA_USER password <your Git password>"
|
log DEBUG "Ensure ~/.netrc has: machine <host> login $GITEA_USER password <your Git password>"
|
||||||
|
|
||||||
# Check or create remote repo
|
# Check or create remote repo
|
||||||
check_or_create_repo() {
|
check_or_create_repo() {
|
||||||
|
if [ -n "$TARGET_REPO" ]; then
|
||||||
|
# Assume repo exists when --repo is specified
|
||||||
|
log INFO "Skipping repo creation (using --repo)"
|
||||||
|
HTTP_STATUS=200
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -z "$GITEA_API_TOKEN" ]; then
|
if [ -z "$GITEA_API_TOKEN" ]; then
|
||||||
log WARNING "GITEA_API_TOKEN is not set. Skipping API repo creation."
|
log WARNING "GITEA_API_TOKEN is not set. Skipping API repo creation."
|
||||||
return
|
return
|
||||||
@@ -182,8 +249,8 @@ check_or_create_repo
|
|||||||
# ========
|
# ========
|
||||||
|
|
||||||
# Safety check against pushing from / or $HOME
|
# Safety check against pushing from / or $HOME
|
||||||
if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then
|
if [[ "$REPO_PATH" == "$HOME" || "$REPO_PATH" == "/" ]]; then
|
||||||
log ERROR "Refusing to run inside \$PWD=$PWD"
|
log ERROR "Refusing to run inside \$REPO_PATH=$REPO_PATH"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
log INFO "Pushing $REPO_PATH to $GIT_REMOTE"
|
log INFO "Pushing $REPO_PATH to $GIT_REMOTE"
|
||||||
@@ -192,10 +259,22 @@ cd "$REPO_PATH" || { log ERROR "Directory $REPO_PATH not found"; exit 1; }
|
|||||||
# Initialize git if needed
|
# Initialize git if needed
|
||||||
# Branch is fixed to 'main' for simplicity and consistency
|
# Branch is fixed to 'main' for simplicity and consistency
|
||||||
if [ ! -d .git ]; then
|
if [ ! -d .git ]; then
|
||||||
log INFO "Initializing Git repo"
|
if [ -n "$TARGET_REPO" ]; then
|
||||||
git init
|
# Clone existing repository when --repo is specified
|
||||||
git config init.defaultBranch main
|
log INFO "Cloning existing repository from $GIT_REMOTE"
|
||||||
git checkout -b main
|
TEMP_DIR=".gitea_push_clone_$$"
|
||||||
|
git clone "$GIT_REMOTE" "$TEMP_DIR"
|
||||||
|
# Move .git from temp dir to current dir
|
||||||
|
mv "$TEMP_DIR/.git" .git
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
git config init.defaultBranch main
|
||||||
|
log INFO "Repository cloned successfully"
|
||||||
|
else
|
||||||
|
log INFO "Initializing Git repo"
|
||||||
|
git init
|
||||||
|
git config init.defaultBranch main
|
||||||
|
git checkout -b main
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
log DEBUG ".git directory already present"
|
log DEBUG ".git directory already present"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user