tridactyl/scripts/pretty.sh

76 lines
1.9 KiB
Bash
Raw Normal View History

2018-08-24 13:38:05 -06:00
#!/usr/bin/env bash
# Run prettier on each staged file that needs it without touching the working tree copy if they differ.
2019-05-29 17:48:32 +01:00
source ./scripts/common.sh
set -Eeuo pipefail
echoe() {
echo "$@" >&2
}
lock() {
local lockfile="$1"
if [ -e "$lockfile" ]; then
echoe "Lockfile '$lockfile' already exists. Check no other operation is occuring or delete lockfile"
return 1
else
touch "$lockfile"
fi
}
unlock() {
rm "$1"
}
2019-05-29 21:09:58 +01:00
trap 'unlock $(git rev-parse --show-toplevel)/.git/index.lock || true' ERR
main() {
2019-05-29 21:09:58 +01:00
local stagedFiles
stagedFiles="$(cachedTSLintFiles)"$'\n'"$(cachedPrettierFiles)"
if [ -n "$stagedFiles" ]; then
# Could use git-update-index --cacheinfo to add a file without creating directories and stuff.
IFS=$'\n'
for file in $stagedFiles; do
if cmp -s <(staged "$file") "$file"; then
echo "WARN: Staged copy of '$file' matches working copy. Modifying both"
lock .git/index.lock
case "$file" in
*.md | *.css) prettier --write "$file";;
*) tslint --project . --fix "$file";;
esac
unlock .git/index.lock
git add "$file"
else
echo "WARN: Staged copy of '$file' does not match working copy: only prettifying staged copy."
(
2019-06-01 18:47:14 +01:00
local tmpdir
tmpdir=$(mktemp -d "pretty.XXXXXXXXX")
cd "$tmpdir"
2019-05-29 21:09:58 +01:00
mkdir -p "$(dirname "$file")"
lock ../.git/index.lock
2019-06-01 18:47:14 +01:00
tmpfile=$(mktemp "pretty.XXXXXXXXX")
case "$file" in
2019-06-01 18:47:14 +01:00
*.md | *.css)
staged "$file" | prettier --stdin-filepath "$file" > "$tmpfile" &&
mv "$tmpfile" "$file";;
*)
staged "$file" > "$tmpfile"
tslint -c ../tslint.json --fix "$tmpfile" 2>/dev/null &&
mv "$tmpfile" "$file";;
esac
chmod --reference="../$file" "$file" # match permissions
# Can't hold lock while git add occurs. Hopefully release and reacquire happen fast enough to prevent race.
unlock ../.git/index.lock
GIT_WORK_TREE=. git add "$file"
2019-06-01 18:47:14 +01:00
rm -rf "$tmpdir"
)
fi
done
fi
}
main