feat: add dependency manager with multipath

This commit is contained in:
Zitao Xiong
2022-02-27 14:56:58 +08:00
parent 460c281b6a
commit 9944d1143a
3 changed files with 104 additions and 0 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@ history.txt
scraps.txt
cvm/vmstate.db
.DS_Store
contracts_modules

15
Clarinet.json Normal file
View File

@@ -0,0 +1,15 @@
{
"name": "alex-dao-proposals",
"dependencies": {
"alex_dao_proposals": {
"commit": "62e118d7",
"git": "git@github.com:alexgo-io/alex-dao-proposals.git",
"contracts_paths": [""]
},
"alex_v1": {
"commit": "c1a772fe",
"git": "git@github.com:alexgo-io/alex-v1.git",
"contracts_paths": ["clarity/contracts"]
}
}
}

88
scripts/clarinet_manager.sh Executable file
View File

@@ -0,0 +1,88 @@
#!/usr/bin/env bash
set -euo pipefail
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
TMP_GIT_DIR="$ROOT/.git_tmp_repos"
CONTRACTS_MODULE_PATH="contracts_modules"
pre_check() {
echo "Installing from Clarinet.json..."
# check if file not exists
if [ ! -f "$DIR/../Clarinet.json" ]; then
echo "Clarity.json not found. abort..."
exit 1
fi
# check if command jq is installed, if not, install jq
if ! [ -x "$(command -v jq)" ]; then
echo "jq not installed. Install it before continue. (brew install jq)..."
exit 1
fi
}
install_project() {
project_name=${1//\"/}
echo "Installing project...$project_name"
commit=$(cat Clarinet.json | jq -cr ".dependencies.$project_name.commit")
git_repo=$(cat Clarinet.json | jq -cr ".dependencies.$project_name.git")
contracts_path_string=$(cat Clarinet.json | jq -c ".dependencies.$project_name.contracts_paths" | sed -e 's/\[//g' -e 's/\]//g' -e 's/\,/ /g')
contracts_paths=($contracts_path_string)
echo "Installing from $git_repo, commit $commit, to $project_name"
mkdir -p "$TMP_GIT_DIR"/"$project_name"
# clone project
echo git clone "$git_repo" "$TMP_GIT_DIR"/"$project_name"
git clone "$git_repo" "$TMP_GIT_DIR"/"$project_name"
pushd "$TMP_GIT_DIR"/"$project_name" > /dev/null
echo git checkout "$commit"
git checkout "$commit"
popd > /dev/null
# copy contracts
mkdir -p "$ROOT/$CONTRACTS_MODULE_PATH"
rm -rf "$ROOT/$CONTRACTS_MODULE_PATH/${project_name:?}"
for c in "${contracts_paths[@]}"; do
mkdir -p "$ROOT/$CONTRACTS_MODULE_PATH/${project_name}/${c//\"/}"
cp -r "$TMP_GIT_DIR"/"$project_name"/${c//\"/} "$ROOT"/"$CONTRACTS_MODULE_PATH"/$project_name/${c//\"/}
done
echo "cleaning..."
rm -rf "$TMP_GIT_DIR"
echo "installed $project_name"
}
install() {
pre_check
pushd "$DIR"/.. > /dev/null
projects_str=$(cat Clarinet.json | jq -c ".dependencies | keys" | sed -e 's/\[//g' -e 's/\]//g' -e 's/\,/ /g')
projects=($projects_str)
for i in "${projects[@]}"; do
install_project $i
done
echo installed all projects: $projects
}
clean() {
rm -rf "$TMP_GIT_DIR"
rm -rf "$ROOT/${CONTRACTS_MODULE_PATH:?}"
echo "cleaned"
}
main() {
# check if command is valid
if [ "$1" == "install" ]; then
install
elif [ "$1" == "clean" ]; then
clean
else
echo "Invalid command. Use 'install' or 'clean'"
fi
}
main $@