From b6e5636a32aab930da9544be6cd32912564c95ab Mon Sep 17 00:00:00 2001 From: Rajat Agrawal Date: Tue, 30 Jul 2024 11:46:56 +0530 Subject: [PATCH] Add pre push hook to not allow ee changes in ce --- .github/workflows/client-build.yml | 1 + app/client/.husky/pre-push | 95 ++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100755 app/client/.husky/pre-push diff --git a/.github/workflows/client-build.yml b/.github/workflows/client-build.yml index 4dae3f6ecde4..6b7a659d253e 100644 --- a/.github/workflows/client-build.yml +++ b/.github/workflows/client-build.yml @@ -234,6 +234,7 @@ jobs: git config --global user.email "$gituseremail" git config --global user.name "$gituser" git clone https://$cachetoken@github.com/appsmithorg/cibuildcache.git + git lfs update --force git lfs install cd cibuildcache/ if [ "$reponame" = "appsmith" ]; then export repodir="CE"; fi diff --git a/app/client/.husky/pre-push b/app/client/.husky/pre-push new file mode 100755 index 000000000000..7eb289f2e40e --- /dev/null +++ b/app/client/.husky/pre-push @@ -0,0 +1,95 @@ +#!/bin/bash + +echo "Pre push hook called" + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# + +appsmith_ee_url="appsmith-ee.git" +appsmith_ce_url="appsmithorg/appsmith.git" + +# Define the null SHA. +null_sha="0000000000000000000000000000000000000000" + +# Function to get list of files between two commits +do_commits_contain_ee_files() { + # Store the commit hashes + from_commit=$1 + to_commit=$2 + string_to_match="app/client/src/ee" + + # to_commit sha can be null if a branch is being pushed for the first to remote + # In that case, we would need to compare the diff against a default branch, like release. + if [ "$to_commit" == "$null_sha" ]; then + echo "comparing changes against release" + + remote_name=$(git remote -v | grep -i $appsmith_ce_url | grep -i fetch | awk '{print $1}') + echo "remote name is $remote_name" + + git fetch $remote_name release + to_commit=$remote_name/release + fi + + echo "to_commit in function is $to_commit" + echo "from_commit is $from_commit" + + # Get the list of files between the two commits + files=$(git diff --name-only $from_commit $to_commit) + + # Iterate over each file + for file in $files; do + # Check if the file path contains the string + if [[ "$file" == *"$string_to_match"* ]]; then + echo "File '$file' matches the string '$string_to_match'" + return 0 + fi + done + return 1 +} + + +remote="$1" +url="$2" + +echo "URL is $url" +echo "remote is $remote" +echo "remote sha is $remote_sha" + +if [[ "$url" == *"$appsmith_ee_url"* ]]; then + echo "Hook invoked on EE repo. Ignoring pre-push hook checks" + exit 0 +fi + +while read local_ref local_sha remote_ref remote_sha +do + echo "pushing from $local_sha to $remote_sha" + echo "local ref is " $local_ref + echo "remote ref is " $remote_ref + + if [ "$local_sha" == "$null_sha" ]; then + echo "Branch is being deleted. Allow push" + exit 0 + fi + + if do_commits_contain_ee_files $local_sha $remote_sha + then + echo -e "Found EE changes in the commits\n" + exit 1 + else + echo -e "Didn't find ee changes in the commits\n" + exit 0 + fi +done \ No newline at end of file