sway/test/update-contract-ids.sh
Hannes Karppila eb57cbf284
Make update-contract-ids.sh macOS-compatible (#7120)
## Description

Currently update-contract-ids.sh cannot be run on any recent macOS
installation, as the system-provided grep and sed are incompatible with
the linux-specific options used. The GNU versions of these are available
through homebrew, so it would be nice to use those. Unfortunately, those
are installed with `g` prefix, so the binaries are named `gsed` and
`ggrep`. This PR changes the script to prefer these `g`-prefixed
commands, making the script work on macOS as well.

I tested this on a recent clean Ubuntu install, as well as latest macOS,
and it works on both.

## Checklist

- [x] I have linked to any relevant issues.
- [x] I have commented my code, particularly in hard-to-understand
areas.
- [ ] I have updated the documentation where relevant (API docs, the
reference, and the Sway book). N/A
- [ ] If my change requires substantial documentation changes, I have
[requested support from the DevRel
team](https://github.com/FuelLabs/devrel-requests/issues/new/choose)
- [ ] I have added tests that prove my fix is effective or that my
feature works. N/A
- [x] I have added (or requested a maintainer to add) the necessary
`Breaking*` or `New Feature` labels where relevant.
- [x] I have done my best to ensure that my PR adheres to [the Fuel Labs
Code Review
Standards](https://github.com/FuelLabs/rfcs/blob/master/text/code-standards/external-contributors.md).
- [x] I have requested a review from the relevant team or maintainers.
2025-04-25 15:01:50 +03:00

112 lines
3.2 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
print_help() {
echo "
-i run interactively
";
}
INTERACTIVELY="0"
while [[ "$#" -gt 0 ]]; do
case $1 in
-i) INTERACTIVELY="1"; shift ;;
*) print_help; exit 1 ;;
esac
shift
done
CHANGES=$(git status --porcelain | wc -l)
BOLD_RED='\033[1;31m'
BOLD_GREEN="\033[1;32m"
BOLD_YELLOW='\033[1;33m'
BOLD_WHITE='\033[1;97m'
NC='\033[0m'
# macOS compatibility: ggrep and gsed from `brew install gnu-sed grep`
if [ -x "$(command -v ggrep)" ]; then
grep="ggrep"
else
grep="grep"
fi
if [ -x "$(command -v gsed)" ]; then
sed="gsed"
else
sed="sed"
fi
function join_by {
local d=${1-} f=${2-}
if shift 2; then
printf %s "$f" "${@/#/$d}"
fi
}
ask_confirmation() {
echo -e "${BOLD_WHITE}Command below needs confirmation before running.${NC} $2"
echo "> $1"
read -p "Run the command above? (y/n) " -n 1 -r </dev/tty
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
bash -c "$1"
else
exit 1
fi
}
$grep --include \*.sw -Hno "// AUTO-CONTRACT-ID" . -R | while read line ; do
PARTS=($(echo $line | $sed 's/:/ /g'))
FOLDER=$(dirname ${PARTS[0]})
FILE=${PARTS[0]}
LINE=${PARTS[1]}
SED_COMMAND="${LINE}"'!d'
CONTRACT_ARGS=($($sed "$SED_COMMAND" $FILE))
CONTRACT_ARGS=$(join_by " " ${CONTRACT_ARGS[@]:6})
if [[ $CONTRACT_ARGS ]]; then
PROJ=$(realpath "$FOLDER/..")
echo -e "${BOLD_WHITE}$PROJ${NC}"
pushd "$FOLDER/.." >> /dev/null
CONTRACT_ID=$(cargo r -p forc --release -- contract-id --path $CONTRACT_ARGS 2> /dev/null | $grep -oP '0x[a-zA-Z0-9]{64}')
if [[ $CONTRACT_ID ]]; then
popd >> /dev/null
SED_EXPR="${LINE}s/0x[a-zA-Z0-9]*/$CONTRACT_ID/g"
# check if there is a diff
diff -s --color <(cat $FILE) <(cat $FILE | $sed --expression="$SED_EXPR") > /dev/null
if [ $? -eq 0 ]; then
# no diff, continue
echo -e " ${BOLD_GREEN}no changes needed${NC} ($CONTRACT_ID)"
else
# diff detected, check we are clean to update files, if not abort
if [[ "$INTERACTIVELY" == "0" ]]; then
# Don´t change anything if git is dirty
if [ "$CHANGES" != "0" ]; then
echo -e " ${BOLD_RED}Aborting${NC} This contract id needs update, but git state is not clean. commit, restore first or run with \"-i\"."
echo $FILE
diff -s --color <(cat $FILE) <(cat $FILE | $sed --expression="$SED_EXPR")
exit
fi
# we are clean and can update files
$sed -i "$SED_EXPR" $FILE
else
# ask confirmation before applying the change
diff -s --color <(cat $FILE) <(cat $FILE | $sed --expression="$SED_EXPR")
ask_confirmation "$sed -i \"$SED_EXPR\" $FILE" "Update contract id"
fi
echo -e " ${BOLD_GREEN}updated${NC} ($CONTRACT_ID)"
fi
else
echo -e " ${BOLD_RED}error${NC}"
cargo r -p forc --release -- contract-id --release
popd >> /dev/null
fi
fi
done