Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: Add pre push hook to not allow ee changes in ce #35276

Merged
merged 2 commits into from
Jul 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/client-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -227,13 +227,15 @@ jobs:
reponame: ${{ github.event.repository.name }}
gituser: ${{ secrets.CACHE_GIT_USER }}
gituseremail: ${{ secrets.CACHE_GIT_EMAIL }}
# git lfs update --force in the script below overrides appsmith git hooks with git lfs hooks since appsmith hooks are not required during workflow runs
run: |
pwd
mkdir cacherepo
cd ./cacherepo
git config --global user.email "$gituseremail"
git config --global user.name "$gituser"
git clone https://[email protected]/appsmithorg/cibuildcache.git
git lfs update --force
git lfs install
cd cibuildcache/
if [ "$reponame" = "appsmith" ]; then export repodir="CE"; fi
Expand Down
95 changes: 95 additions & 0 deletions app/client/.husky/pre-push
Original file line number Diff line number Diff line change
@@ -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:
#
# <local ref> <local oid> <remote ref> <remote oid>

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
}
Comment on lines +27 to +61
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider using local for variables within the function.

Using local for from_commit, to_commit, and string_to_match will limit their scope to the function and prevent potential conflicts.

-    from_commit=$1
-    to_commit=$2
-    string_to_match="app/client/src/ee"
+    local from_commit=$1
+    local to_commit=$2
+    local string_to_match="app/client/src/ee"
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# 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
}
do_commits_contain_ee_files() {
# Store the commit hashes
local from_commit=$1
local to_commit=$2
local 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
Loading