mirror of
https://github.com/creyD/prettier_action.git
synced 2026-04-12 19:30:30 +02:00
This is a non-breaking new feature that addresses issue #129. New input parameter: - only_show_changed (default: false) When true, shows only files that were changed by Prettier instead of all processed files. Useful for large projects where output is overwhelming. Backward compatibility: - When flag is NOT set or is false: behavior stays exactly as before (shows "Files:" header and all prettier output) - When flag is set to true: shows only "Changed files:" with git status output for modified files In projects with ~2,000 files, it's hard to see which were changed. This optional flag makes it easy to identify modified files without affecting existing users who rely on the current output format. Closes #129 Refs prettier/prettier#2611
181 lines
6.0 KiB
Bash
Executable File
181 lines
6.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# e is for exiting the script automatically if a command fails, u is for exiting if a variable is not set
|
|
# x would be for showing the commands before they are executed
|
|
set -eu
|
|
shopt -s globstar
|
|
|
|
# FUNCTIONS
|
|
# Function for setting up git env in the docker container (copied from https://github.com/stefanzweifel/git-auto-commit-action/blob/master/entrypoint.sh)
|
|
_git_setup ( ) {
|
|
cat <<- EOF > $HOME/.netrc
|
|
machine github.com
|
|
login $GITHUB_ACTOR
|
|
password $INPUT_GITHUB_TOKEN
|
|
machine api.github.com
|
|
login $GITHUB_ACTOR
|
|
password $INPUT_GITHUB_TOKEN
|
|
EOF
|
|
chmod 600 $HOME/.netrc
|
|
|
|
# If GIT_IDENTITY="actor"
|
|
if [ "$INPUT_GIT_IDENTITY" = "author" ]; then
|
|
git config --global user.name "$GITHUB_ACTOR"
|
|
git config --global user.email "$GITHUB_ACTOR_ID+$GITHUB_ACTOR@users.noreply.github.com"
|
|
elif [ "$INPUT_GIT_IDENTITY" = "actions" ]; then
|
|
git config --global user.email "actions@github.com"
|
|
git config --global user.name "GitHub Action"
|
|
else
|
|
echo "GIT_IDENTITY must be either 'author' or 'actions'";
|
|
exit 1;
|
|
fi;
|
|
}
|
|
|
|
# Checks if any files are changed
|
|
_git_changed() {
|
|
[[ -n "$(git status -s)" ]]
|
|
}
|
|
|
|
(
|
|
# PROGRAM
|
|
# Changing to the directory
|
|
if [ -z "$INPUT_WORKING_DIRECTORY" ] ; then
|
|
INPUT_WORKING_DIRECTORY=$GITHUB_ACTION_PATH
|
|
fi
|
|
cd "$INPUT_WORKING_DIRECTORY"
|
|
|
|
echo "Installing prettier..."
|
|
|
|
npm install --silent prettier@$INPUT_PRETTIER_VERSION
|
|
|
|
# Install plugins
|
|
if [ -n "$INPUT_PRETTIER_PLUGINS" ]; then
|
|
if [ "$INPUT_ALLOW_OTHER_PLUGINS" != "true" ]; then
|
|
for plugin in $INPUT_PRETTIER_PLUGINS; do
|
|
echo "Checking plugin: $plugin"
|
|
# check regex against @prettier/xyz
|
|
if ! echo "$plugin" | grep -Eq '(@prettier\/plugin-|(@[a-z\-]+\/)?prettier-plugin-){1}([a-z\-]+)'; then
|
|
echo "$plugin does not seem to be a valid @prettier/plugin-x plugin. Exiting."
|
|
exit 1
|
|
fi
|
|
done
|
|
fi
|
|
npm install --silent $INPUT_PRETTIER_PLUGINS
|
|
fi
|
|
)
|
|
|
|
PRETTIER_RESULT=0
|
|
echo "Prettifying files..."
|
|
if [ "$INPUT_ONLY_SHOW_CHANGED" = "true" ]; then
|
|
# New behavior: don't show all files, only show changed files later
|
|
npx prettier $INPUT_PRETTIER_OPTIONS \
|
|
|| { PRETTIER_RESULT=$?; echo "Problem running prettier with $INPUT_PRETTIER_OPTIONS"; exit 1; }
|
|
else
|
|
# Original behavior: show all files processed by prettier
|
|
echo "Files:"
|
|
npx prettier $INPUT_PRETTIER_OPTIONS \
|
|
|| { PRETTIER_RESULT=$?; echo "Problem running prettier with $INPUT_PRETTIER_OPTIONS"; exit 1; } >> $GITHUB_STEP_SUMMARY
|
|
fi
|
|
|
|
echo "Prettier result: $PRETTIER_RESULT"
|
|
|
|
# Show only the files that were changed by prettier (when flag is enabled)
|
|
if [ "$INPUT_ONLY_SHOW_CHANGED" = "true" ] && _git_changed; then
|
|
echo ""
|
|
echo "Changed files:"
|
|
git status --short | tee -a $GITHUB_STEP_SUMMARY
|
|
echo ""
|
|
fi
|
|
|
|
# Removing the node_modules folder, so it doesn't get committed if it is not added in gitignore
|
|
if $INPUT_CLEAN_NODE_FOLDER; then
|
|
echo "Deleting node_modules/ folder..."
|
|
if [ -d 'node_modules' ]; then
|
|
rm -r node_modules/
|
|
else
|
|
echo "No node_modules/ folder."
|
|
fi
|
|
fi
|
|
|
|
if [ -f 'package-lock.json' ]; then
|
|
git checkout -- package-lock.json || echo "No package-lock.json file tracked by git."
|
|
else
|
|
echo "No package-lock.json file."
|
|
fi
|
|
|
|
# If running under only_changed, reset every modified file that wasn't also modified in the last commit
|
|
# This allows only_changed and dry to work together, and simplified the non-dry logic below
|
|
if [ $INPUT_ONLY_CHANGED = true ] || [ $INPUT_ONLY_CHANGED_PR = true ] ; then
|
|
BASE_BRANCH=origin/$GITHUB_BASE_REF
|
|
if $INPUT_ONLY_CHANGED; then
|
|
BASE_BRANCH=HEAD~1
|
|
fi
|
|
|
|
echo "Resetting changes, removing changes to files not changed since $BASE_BRANCH"
|
|
# list of all files changed in the previous commit
|
|
git diff --name-only HEAD $BASE_BRANCH > /tmp/prev.txt
|
|
# list of all files with outstanding changes
|
|
git diff --name-only HEAD > /tmp/cur.txt
|
|
|
|
OLDIFS="$IFS"
|
|
IFS=$'\n'
|
|
# get all files that are in prev.txt that aren't also in cur.txt
|
|
for file in $(comm -1 -3 /tmp/prev.txt /tmp/cur.txt)
|
|
do
|
|
echo "resetting: $file"
|
|
git restore -- "$file"
|
|
done
|
|
IFS="$OLDIFS"
|
|
fi
|
|
|
|
# To keep runtime good, just continue if something was changed
|
|
if _git_changed; then
|
|
# case when --write is used with dry-run so if something is unpretty there will always have _git_changed
|
|
if $INPUT_DRY; then
|
|
echo "Unpretty Files Changes:"
|
|
git diff
|
|
if $INPUT_NO_COMMIT; then
|
|
echo "There are changes that won't be commited, you can use an external job to do so."
|
|
else
|
|
echo "Finishing dry-run. Exiting before committing."
|
|
exit 1
|
|
fi
|
|
else
|
|
# Calling method to configure the git environemnt
|
|
_git_setup
|
|
|
|
# Add changes to git
|
|
git add "${INPUT_FILE_PATTERN}" || echo "Problem adding your files with pattern ${INPUT_FILE_PATTERN}"
|
|
|
|
if $INPUT_NO_COMMIT; then
|
|
echo "There are changes that won't be commited, you can use an external job to do so."
|
|
exit 0
|
|
fi
|
|
|
|
# Commit and push changes back
|
|
if $INPUT_SAME_COMMIT; then
|
|
echo "Amending the current commit..."
|
|
git pull
|
|
git commit --amend --no-edit --allow-empty
|
|
git push origin -f
|
|
else
|
|
if [ "$INPUT_COMMIT_DESCRIPTION" != "" ]; then
|
|
git commit -m "$INPUT_COMMIT_MESSAGE" -m "$INPUT_COMMIT_DESCRIPTION" --author="$GITHUB_ACTOR <$GITHUB_ACTOR@users.noreply.github.com>" ${INPUT_COMMIT_OPTIONS:+"$INPUT_COMMIT_OPTIONS"} || echo "No files added to commit"
|
|
else
|
|
git commit -m "$INPUT_COMMIT_MESSAGE" --author="$GITHUB_ACTOR <$GITHUB_ACTOR@users.noreply.github.com>" ${INPUT_COMMIT_OPTIONS:+"$INPUT_COMMIT_OPTIONS"} || echo "No files added to commit"
|
|
fi
|
|
git push origin ${INPUT_PUSH_OPTIONS:-}
|
|
fi
|
|
echo "Changes pushed successfully."
|
|
fi
|
|
else
|
|
# case when --check is used so there will never have something to commit but there are unpretty files
|
|
if [ "$PRETTIER_RESULT" -eq 1 ]; then
|
|
echo "Prettier found unpretty files!"
|
|
exit 1
|
|
else
|
|
echo "Finishing dry-run."
|
|
fi
|
|
echo "No unpretty files!"
|
|
echo "Nothing to commit. Exiting."
|
|
fi
|