blob: 35665cf58fa51addd78f0d42aeedbcb50d9d6c5c [file]
#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
set -euo pipefail
# Script to copy latest files from master branch to current working directory
# Usage: copy-latest-from-master.sh <save|apply> <path1> [path2] [path3] ...
#
# Commands:
# save - Clone master and save specified files/directories to /tmp
# apply - Apply previously saved files to current working directory
#
# Examples:
# copy-latest-from-master.sh save .github scripts web/Dockerfile
# copy-latest-from-master.sh apply
COMMAND="${1:-}"
shift || true
TMP_REPO="/tmp/repo-master"
TMP_SAVED="/tmp/latest-files"
if [ -z "$COMMAND" ]; then
echo "Usage: $0 <save|apply> [paths...]"
echo ""
echo "Commands:"
echo " save Clone master and save specified files/directories"
echo " apply Apply previously saved files to current directory"
exit 1
fi
case "$COMMAND" in
save)
if [ $# -eq 0 ]; then
echo "Error: No paths specified for save command"
echo "Usage: $0 save <path1> [path2] ..."
exit 1
fi
echo "📦 Cloning master branch..."
rm -rf "$TMP_REPO" "$TMP_SAVED"
# Use GITHUB_REPOSITORY if available, otherwise try to detect from git remote
if [ -z "${GITHUB_REPOSITORY:-}" ]; then
# Try to extract from git remote
REPO_URL=$(git remote get-url origin 2>/dev/null || echo "")
if [[ "$REPO_URL" =~ github\.com[:/]([^/]+/[^/.]+)(\.git)?$ ]]; then
GITHUB_REPOSITORY="${BASH_REMATCH[1]}"
else
echo "Error: Could not determine repository. Set GITHUB_REPOSITORY environment variable."
exit 1
fi
fi
git clone --depth 1 --branch master "https://github.com/${GITHUB_REPOSITORY}.git" "$TMP_REPO"
mkdir -p "$TMP_SAVED"
echo "💾 Saving specified files from master..."
for path in "$@"; do
if [ -e "$TMP_REPO/$path" ]; then
# Create parent directory structure
parent_dir=$(dirname "$path")
if [ "$parent_dir" != "." ]; then
mkdir -p "$TMP_SAVED/$parent_dir"
fi
# Copy the file or directory
cp -r "$TMP_REPO/$path" "$TMP_SAVED/$path"
echo " ✅ Saved: $path"
else
echo " ⚠️ Not found in master: $path"
fi
done
echo ""
echo "📋 Summary of saved files:"
find "$TMP_SAVED" -type f | sed "s|$TMP_SAVED/| - |"
# Clean up the cloned repo
rm -rf "$TMP_REPO"
;;
apply)
if [ ! -d "$TMP_SAVED" ]; then
echo "Error: No saved files found. Run 'save' command first."
exit 1
fi
echo "📝 Applying saved files to current directory..."
# Iterate through all saved files
find "$TMP_SAVED" -type f | while read -r saved_file; do
# Get relative path by removing the tmp prefix
rel_path="${saved_file#"$TMP_SAVED"/}"
dest_dir=$(dirname "$rel_path")
# Create destination directory if it doesn't exist
if [ "$dest_dir" != "." ] && [ ! -d "$dest_dir" ]; then
echo " 📁 Creating directory: $dest_dir"
mkdir -p "$dest_dir"
fi
# Copy the file
cp "$saved_file" "$rel_path"
echo " ✅ Applied: $rel_path"
# Make scripts executable if they're in scripts/ directory
if [[ "$rel_path" == scripts/*.sh ]]; then
chmod +x "$rel_path"
echo " Made executable: $rel_path"
fi
done
echo ""
echo "✅ All applicable files have been applied"
;;
*)
echo "Error: Unknown command '$COMMAND'"
echo "Valid commands: save, apply"
exit 1
;;
esac