This commit is contained in:
Executable
+2
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env sh
|
||||
exec bash "$(dirname "$0")/commit-msg.bash" "$@"
|
||||
Executable
+97
@@ -0,0 +1,97 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Get the commit message file path from the first argument
|
||||
commit_msg_file="$1"
|
||||
|
||||
# Read the commit message
|
||||
commit_msg=$(cat "$commit_msg_file")
|
||||
|
||||
# Colors for output
|
||||
red='\033[0;31m'
|
||||
yellow='\033[1;33m'
|
||||
no_color='\033[0m'
|
||||
|
||||
# Get the first line (subject)
|
||||
subject=$(echo "$commit_msg" | head -n1)
|
||||
|
||||
# Get the second line
|
||||
second_line=$(echo "$commit_msg" | sed -n '2p')
|
||||
|
||||
# Get the third line
|
||||
third_line=$(echo "$commit_msg" | sed -n '3p')
|
||||
|
||||
# Get the rest of the message (body)
|
||||
body=$(echo "$commit_msg" | tail -n +4)
|
||||
|
||||
# Check subject length (max 80 characters)
|
||||
if [ ${#subject} -gt 80 ]; then
|
||||
echo -e "${yellow}Warning: Commit message subject is too long (max 80 characters)${no_color}"
|
||||
echo -e "Current length: ${#subject} characters"
|
||||
fi
|
||||
|
||||
# Check if second line is blank
|
||||
if [ ! -z "$second_line" ]; then
|
||||
echo -e "${yellow}Warning: Second line should be blank${no_color}"
|
||||
fi
|
||||
|
||||
# Check third line format
|
||||
if [ ! -z "$third_line" ]; then
|
||||
if [[ "$third_line" =~ ^(refs|ref:) ]]; then
|
||||
echo -e "${red}Error: Third line should not start with 'refs' or 'ref:'${no_color}" >&2
|
||||
echo -e "Use 'ref <issue link>', 'fixes <issue link>', or 'closes <issue link>' instead" >&2
|
||||
echo -e "${yellow}Press Enter to edit the message...${no_color}" >&2
|
||||
read < /dev/tty # Wait for Enter key press from the terminal
|
||||
|
||||
# Get the configured Git editor
|
||||
editor=$(git var GIT_EDITOR)
|
||||
if [ -z "$editor" ]; then
|
||||
editor=${VISUAL:-${EDITOR:-vi}} # Fallback logic similar to Git
|
||||
fi
|
||||
|
||||
# Re-open the editor on the commit message file, connected to the terminal
|
||||
$editor "$commit_msg_file" < /dev/tty
|
||||
|
||||
# Re-read the potentially modified commit message after editing
|
||||
commit_msg=$(cat "$commit_msg_file")
|
||||
# Need to update related variables as well
|
||||
subject=$(echo "$commit_msg" | head -n1)
|
||||
second_line=$(echo "$commit_msg" | sed -n '2p')
|
||||
third_line=$(echo "$commit_msg" | sed -n '3p')
|
||||
body=$(echo "$commit_msg" | tail -n +4)
|
||||
|
||||
# Re-check the third line *again* after editing
|
||||
if [[ "$third_line" =~ ^(refs|ref:) ]]; then
|
||||
echo -e "${red}Error: Third line still starts with 'refs' or 'ref:'. Commit aborted.${no_color}" >&2
|
||||
exit 1 # Abort commit if still invalid
|
||||
fi
|
||||
# If fixed, the script will continue to the next checks
|
||||
fi
|
||||
|
||||
if ! [[ "$third_line" =~ ^(ref|fixes|closes)\ .*$ ]]; then
|
||||
echo -e "${yellow}Warning: Third line should start with 'ref', 'fixes', or 'closes' followed by an issue link${no_color}" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check for body content (why explanation)
|
||||
if [ -z "$body" ]; then
|
||||
echo -e "${yellow}Warning: Missing explanation of why this change was made${no_color}"
|
||||
echo -e "The body should explain: why this, why now, why not something else?"
|
||||
fi
|
||||
|
||||
# Check for emoji in user-facing changes
|
||||
if [[ "$subject" =~ ^[^[:space:]]*[[:space:]] ]]; then
|
||||
first_word="${subject%% *}"
|
||||
if [[ ! "$first_word" =~ ^[[:punct:]] ]]; then
|
||||
echo -e "${yellow}Warning: User-facing changes should start with an emoji${no_color}"
|
||||
echo -e "Common emojis: ✨ (Feature), 🎨 (Improvement), 🐛 (Bug Fix), 🌐 (i18n), 💡 (User-facing)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check for past tense verbs in subject
|
||||
past_tense_words="Fixed|Changed|Updated|Improved|Added|Removed|Reverted|Moved|Released|Bumped|Cleaned"
|
||||
if ! echo "$subject" | grep -iE "$past_tense_words" > /dev/null; then
|
||||
echo -e "${yellow}Warning: Subject line should use past tense${no_color}"
|
||||
echo -e "Use one of: Fixed, Changed, Updated, Improved, Added, Removed, Reverted, Moved, Released, Bumped, Cleaned"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
Executable
+2
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env sh
|
||||
exec bash "$(dirname "$0")/pre-commit.bash" "$@"
|
||||
Executable
+116
@@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bash
|
||||
# Modified from https://github.com/chaitanyagupta/gitutils
|
||||
|
||||
[ -n "$CI" ] && exit 0
|
||||
|
||||
pnpm lint-staged --relative
|
||||
lintStatus=$?
|
||||
|
||||
if [ $lintStatus -ne 0 ]; then
|
||||
echo "❌ Linting failed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
green='\033[0;32m'
|
||||
no_color='\033[0m'
|
||||
grey='\033[0;90m'
|
||||
red='\033[0;31m'
|
||||
|
||||
##
|
||||
## 1) Check and remove submodules before committing
|
||||
##
|
||||
|
||||
ROOT_DIR=$(git rev-parse --show-cdup)
|
||||
SUBMODULES=$(grep path ${ROOT_DIR}.gitmodules | sed 's/^.*path = //')
|
||||
MOD_SUBMODULES=$(git diff --cached --name-only --ignore-submodules=none | grep -F "$SUBMODULES" || true)
|
||||
|
||||
echo -e "Checking submodules ${grey}(pre-commit hook)${no_color} "
|
||||
|
||||
# If no modified submodules, exit with status code 0, else remove them and continue
|
||||
if [[ -n "$MOD_SUBMODULES" ]]; then
|
||||
echo -e "${grey}Removing submodules from commit...${no_color}"
|
||||
for SUB in $MOD_SUBMODULES
|
||||
do
|
||||
git reset --quiet HEAD "$SUB"
|
||||
echo -e "\t${grey}removed:\t$SUB${no_color}"
|
||||
done
|
||||
echo
|
||||
echo -e "${grey}Submodules removed from commit, continuing...${no_color}"
|
||||
|
||||
# If there are no changes to commit after removing submodules, abort to avoid an empty commit
|
||||
if output=$(git status --porcelain) && [ -z "$output" ]; then
|
||||
echo -e "nothing to commit, working tree clean"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo "No submodules in commit, continuing..."
|
||||
fi
|
||||
|
||||
##
|
||||
## 2) Suggest shipping a new version of @tryghost/activitypub when changes are detected
|
||||
## The intent is to ship smaller changes more frequently to production
|
||||
##
|
||||
|
||||
increment_version() {
|
||||
local package_json_path=$1
|
||||
local version_type=$2
|
||||
|
||||
local current_version
|
||||
current_version=$(grep '"version":' "$package_json_path" | awk -F '"' '{print $4}')
|
||||
|
||||
IFS='.' read -r major minor patch <<< "$current_version"
|
||||
|
||||
case "$version_type" in
|
||||
major) ((major++)); minor=0; patch=0 ;;
|
||||
minor) ((minor++)); patch=0 ;;
|
||||
patch) ((patch++)) ;;
|
||||
*) echo "Invalid version type"; exit 1 ;;
|
||||
esac
|
||||
|
||||
new_version="$major.$minor.$patch"
|
||||
|
||||
# Update package.json with new version
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS
|
||||
sed -i '' -E "s/\"version\": \"[0-9]+\.[0-9]+\.[0-9]+\"/\"version\": \"$new_version\"/" "$package_json_path"
|
||||
else
|
||||
# Linux and others
|
||||
sed -i -E "s/\"version\": \"[0-9]+\.[0-9]+\.[0-9]+\"/\"version\": \"$new_version\"/" "$package_json_path"
|
||||
fi
|
||||
|
||||
echo "Updated version to $new_version in $package_json_path"
|
||||
}
|
||||
|
||||
AP_BUMP_NEEDED=false
|
||||
MODIFIED_FILES=$(git diff --cached --name-only)
|
||||
|
||||
for FILE in $MODIFIED_FILES; do
|
||||
if [[ "$FILE" == apps/activitypub/* ]]; then
|
||||
AP_BUMP_NEEDED=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "$AP_BUMP_NEEDED" == true ]]; then
|
||||
echo -e "\nYou have made changes to @tryghost/activitypub."
|
||||
echo -e "Would you like to ship a new version? (yes)"
|
||||
read -r new_version </dev/tty
|
||||
|
||||
if [[ -z "$new_version" || "$new_version" == "yes" || "$new_version" == "y" ]]; then
|
||||
echo -e "Is that a patch, minor or major? (patch)"
|
||||
read -r version_type </dev/tty
|
||||
|
||||
# Default to patch
|
||||
if [[ -z "$version_type" ]]; then
|
||||
version_type="patch"
|
||||
fi
|
||||
|
||||
if [[ "$version_type" != "patch" && "$version_type" != "minor" && "$version_type" != "major" ]]; then
|
||||
echo -e "${red}Invalid input. Skipping version bump.${no_color}"
|
||||
else
|
||||
echo "Bumping version ($version_type)..."
|
||||
increment_version "apps/activitypub/package.json" "$version_type"
|
||||
git add apps/activitypub/package.json
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
Reference in New Issue
Block a user