#! /bin/bash #importer driglibash echo "" #Variables definitions REPO_NAME="performance_testing" REMOTE="https://git.jean-cloud.net/eleonore/performance_testing.git" WITH_SUBMODULE="true" FILENAMES=("sample0" "sample1 sample3") #we do not check for all files FILENAMES_TAG=("sample0 sample1 sample4") FILENAMES_BRANCH=("sample0 sample1 sample2") #we do not check for all files, especially not those specific to the branch. FILE_ON_BRANCH_ONLY="sample2" FILE_ON_TAG_ONLY="sample4" FILE_ON_MAIN_ONLY="sample3" FILE_TO_BE_DELETED="sample0" FILE_TO_BE_CREATED="new_file" FILE_TO_BE_MODIFIED=$FILE_TO_BE_CREATED TAG_NAME="tagging_point" TAG_FLAG="tag_flag" BRANCH_NAME="secondary" TMP_CLONE_DIR="tmp_local_clone" TMP_EXISTING_DIR="tmp_existing_dir" TMP_EXISTING_FILE="tmp_existing_file" Help() { echo " NAME test_git_update.sh SYNOPSIS test_git_update.sh [-a] [-h] [-n number] OPTIONS -a excutes all the tests. -n number executes test number -h prints the help. DESCRIPTION Tests on the initial cloning TEST0: git cloned in an empty directory TEST1: git cloned in an empty directory with tag TEST2: git cloned in an empty directory with branch TEST3: git cloned in an existing directory TEST4: git updated fast-forward on main TEST5: git updated with underlying conflict on main TEST6: git updated, switching to another branch, deleting and adding files in the process TEST7: git updated, switching to a tag, deleting and adding files in the process TEST8: git updated, before and after changing a tag, deleting and adding files in the process " } #output function section(){ echo "------------------------------ $1 ------------------------------" } #check functions cloning_check(){ local input=("$@") local repo_name=${input[0]} local FILENAMES=${input[@]:1} if [[ -d "./$repo_name" ]]; then echo "into $repo_name" cloning_result=0 for FILE in ${FILENAMES[@]} do if [ -f "./$repo_name/$FILE" ]; then echo "the file $FILE has correctly been imported" else echo "the file $FILE could not be imported" cloning_result=1 fi done else cloning_result=1 echo "the directory $repo_name could not be created" fi } history_check(){ local repo_name=$1 cd $repo_name history_result=0 if [ $(git log | grep "Date" | wc -l) -gt 1 ]; then echo "Several commits have been saved" history_result=1 elif [ $(git log | grep "Date" | wc -l) = 1 ]; then echo "Only the last commit has been saved" else history_result=1 echo "Cloning error, incoherent git log" fi cd .. } tag_check(){ local repo_name=$1 cd $repo_name git branch > res if [ $(grep "no branch" res | wc -l) = 1 ]; then echo "The tag instruction has been respected" tag_result=0 else echo "The tag instruction has not been respected" tag_result=1 fi cd .. } branch_check(){ local repo_name=$1 cd $repo_name git branch > res if [ $(grep $BRANCH_NAME res | wc -l) = 1 ];then echo "The branch instruction has been respected" branch_result=0 else branch_result=1 echo "The branch instruction has not been respected" fi cd .. } existing_check(){ cd $TMP_EXISTING_DIR if [ -f $TMP_EXISTING_FILE ]; then echo "The preexisting non-conflicting file is still here." existing_result=0 cd .. conflict_check $TMP_EXISTING_DIR existing_result=conflict_result else echo "The preexisting non-conflicting file has been deleted." cd .. existing_result=1 fi } modification_check(){ local repo_name=$1 cd $repo_name if [ -f $FILE_TO_BE_CREATED ]; then echo "The new file has been imported." modification_result=0 else echo "The new file has not been imported." modification_result="1" fi if [ -f "$FILE_TO_BE_DELETED" ]; then echo "$FILE_TO_BE_DELETED has not been deleted." modification_result="1" else echo "$FILE_TO_BE_DELETED has been deleted." fi cd .. } switching_branch_check(){ local repo_name=$1 cd $repo_name if [ -f $FILE_ON_BRANCH_ONLY ]; then echo "The files of the branch $BRANCH_NAME are present." branch_switching_result=0 if [ -f $FILE_ON_MAIN_ONLY ]; then echo "The files of the branch main are present." branch_switching_result=1 else echo "The files of the branch main are absent." branch_switching_result=0 fi else echo "The files of the branch $BRANCH_NAME are absent." branch_switching_result=1 fi cd .. } switching_tag_check(){ local repo_name=$1 cd $repo_name if [ -f $FILE_ON_TAG_ONLY ]; then echo "The files of the tag $TAG_NAME are present." tag_switching_result=0 if [ -f $FILE_ON_MAIN_ONLY ]; then echo "The files of the last commit on main are present." tag_switching_result=1 else echo "The files of the last commit in main are absent." tag_switching_result=0 fi else echo "The files of the tag $TAG_NAME are absent." tag_switching_result=1 fi cd .. } conflict_check(){ local repo_name=$1 cd $repo_name if [[ $(grep "new" $FILE_TO_BE_MODIFIED | wc -l) > 0 && $(grep "different" $FILE_TO_BE_MODIFIED | wc -l) = 0 ]]; then echo "The remote version has overwritten the local version." conflict_result=0 else echo "The remote version has not overwritten the local version." fi cd .. } #intermediate functions make_temporary_existing_dir(){ mkdir $TMP_EXISTING_DIR cd $TMP_EXISTING_DIR touch $TMP_EXISTING_FILE touch $FILE_TO_BE_MODIFIED echo "this should be overwritten" > $FILE_TO_BE_MODIFIED cd .. } make_temporary_clone(){ mkdir $TMP_CLONE_DIR cd $TMP_CLONE_DIR git clone --recurse-submodules --shallow-submodules --depth 1 --no-single-branch --config core.sshCommand="ssh" $REMOTE . &> /dev/null cd .. } modification_remote(){ cd $TMP_CLONE_DIR touch $FILE_TO_BE_CREATED echo "new text" > $FILE_TO_BE_CREATED rm $FILE_TO_BE_DELETED git add $FILE_TO_BE_CREATED $FILE_TO_BE_DELETED &> /dev/null git commit -m "$FILE_TO_BE_CREATED created and $FILE_TO_BE_DELETED deleted" &> /dev/null git push &> /dev/null cd .. } undo_modification_remote(){ cd $TMP_CLONE_DIR git revert --no-edit HEAD &> /dev/null git push &> /dev/null cd .. } modification_local(){ cd $REPO_NAME touch $FILE_TO_BE_CREATED echo "different text" > $FILE_TO_BE_CREATED git add $FILE_TO_BE_CREATED &> /dev/null git commit -m "$FILE_TO_BE_CREATED added" &> /dev/null cd .. } changing_tag(){ cd $TMP_CLONE_DIR git checkout $TAG_NAME &> /dev/null git tag -f $TAG_FLAG &> /dev/null #temporary tag flag to be able to put the tag back here after the test git push -f origin $TAG_FLAG &> /dev/null git checkout $BRANCH_NAME &> /dev/null git tag -f $TAG_NAME &> /dev/null #moving the tag on the branch secondary git push -f origin $TAG_NAME &> /dev/null #push the move to the remote cd .. } undo_changing_tag(){ cd $TMP_CLONE_DIR git checkout $TAG_FLAG &> /dev/null git tag -f $TAG_NAME &> /dev/null #move locally git push -f origin $TAG_NAME &> /dev/null #push the move to the remote git push --delete origin $TAG_FLAG &> /dev/null #delete remotely git tag --delete $TAG_FLAG &> /dev/null #delete locally cd .. rm -rf $TMP_CLONE_DIR } test0 (){ #CASE 0: git cloned in an empty directory section TEST0 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi ./git_update.sh -d $REPO_NAME $REMOTE &> /dev/null #checks cloning_check $REPO_NAME ${FILENAMES[@]} history_check $REPO_NAME case0=$((history_result+cloning_result)) if [ "$case0" = "0" ]; then echo "case 0, in a empty directory: OK" else echo "case 0, in a empty directory: FAIL" fi } test1(){ #CASE 1: git cloned in an empty directory with tag section TEST1 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi ./git_update.sh -d $REPO_NAME -r $TAG_NAME $REMOTE &> /dev/null #checks cloning_check $REPO_NAME ${FILENAMES_TAG[@]} history_check $REPO_NAME tag_check $REPO_NAME case1=$((cloning_result+history_result+tag_result)) if [ $case1 = 0 ]; then echo "case 1, in a empty directory, with tag: OK" else echo "case 1, in a empty directory, with tag: FAIL" fi } test2(){ #CASE 2: git cloned in an empty directory with branch section TEST2 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi ./git_update.sh -d $REPO_NAME -r $BRANCH_NAME $REMOTE &> /dev/null #checks cloning_check $REPO_NAME ${FILENAMES_BRANCH[@]} #we do not check for all files, especially not those specific to the branch. history_check $REPO_NAME branch_check $REPO_NAME case2=$((cloning_result+history_result+branch_result)) if [ $case2 = 0 ]; then echo "case 2, in a empty directory, with branch: OK" else echo "case 2, in a empty directory, with branch: FAIL" fi } test3(){ #CASE 3: git cloned in an existing directory section TEST3 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #mimic an existing directory, with two existing file, one with the same name as a to-be-cloned file, and go inside the new dir make_temporary_existing_dir #make git_update.sh clone in the existing dir cd $TMP_EXISTING_DIR ../git_update.sh -N $REMOTE &> /dev/null cd .. #checks cloning_check $TMP_EXISTING_DIR ${FILENAMES[@]} history_check $TMP_EXISTING_DIR existing_check rm -rf tmp_existing_dir case3=$((cloning_result+history_result+existing_result)) if [ $case3 = 0 ]; then echo "case 3, in a non-empty directory : OK" else echo "case 3, in a non-empty directory : FAIL" fi } test4(){ #CASE 4: git updated fast-forward on main section TEST4 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #clone the repo in its last state git clone --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="ssh" $REMOTE &> /dev/null #modify the remote from elsewhere modification_remote #make git_update.sh update the repository cd $REPO_NAME ../git_update.sh $REMOTE &> /dev/null cd .. #checks modification_check $REPO_NAME history_check $REPO_NAME #cleaning undo_modification_remote case4=$((modification_result+history_result)) if [ "$case4" = "0" ]; then echo "case 4, fast-forward update on main: OK" else echo "case 4, fast-forward update on main: FAIL" fi } test5(){ #CASE 5: git updated with underlying conflict on main section TEST5 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #clone the repo in its last state git clone --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="ssh" $REMOTE &> /dev/null #modify the local repo modification_local #modify the remote from elsewhere modification_remote #make git_update.sh update the local repository cd $REPO_NAME ../git_update.sh $REMOTE &> /dev/null cd .. #checks conflict_check $REPO_NAME #cleaning undo_modification_remote case5=$((conflict_result+history_result)) if [ "$case5" = "0" ]; then echo "case 5, update with underlying conflict: OK" else echo "case 5, update with underlying conflict: FAIL" fi } test6(){ #CASE 6: git updated, switching to another branch, deleting and adding files in the process section TEST6 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #clone the repo in its last state git clone --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="ssh" $REMOTE &> /dev/null #call git update with another branch cd $REPO_NAME ../git_update.sh -r $BRANCH_NAME $REMOTE &> /dev/null cd .. #checks switching_branch_check $REPO_NAME history_check $REPO_NAME case6=$((branch_switching_result+history_result)) if [ "$case6" = "0" ]; then echo "case 6, branch-switching update: OK" else echo "case 6, branch-switching update: FAIL" fi } test7(){ #CASE 7: git updated, switching to a tag, deleting and adding files in the process section TEST7 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #clone the repo in its last state git clone --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="ssh" $REMOTE &> /dev/null #call git_update.sh with a tag cd $REPO_NAME ../git_update.sh -r $TAG_NAME $REMOTE &> /dev/null cd .. #checks switching_tag_check $REPO_NAME history_check $REPO_NAME case7=$((tag_switching_result+history_result)) if [ "$case7" = "0" ]; then echo "case 7, tag-switching update: OK" else echo "case 7, tag-switching update: FAIL" fi } test8(){ #CASE 8: git updated, before and after changing a tag, deleting and adding files in the process section TEST8 #if it exists, delete the directory if [ -d $REPO_NAME ]; then rm -rf $REPO_NAME fi #clone the repo in its last state git clone --recurse-submodules --shallow-submodules --depth 1 --config core.sshCommand="ssh" $REMOTE &> /dev/null #call git_update.sh with a tag cd $REPO_NAME ../git_update.sh -r $TAG_NAME $REMOTE &> /dev/null cd .. #intermediate check to make sure that we are starting on the initial position of the tag echo "first position of the tag" switching_tag_check $REPO_NAME #change the position of the tag from elsewhere changing_tag #call git_update.sh again to go to the new position of the tag cd $REPO_NAME ../git_update.sh -r $TAG_NAME $REMOTE &> /dev/null cd .. #put back the remote in its initial state undo_changing_tag #checks echo "second position of the tag" switching_branch_check $REPO_NAME #new position of the tag=last commit of the branch hence we can reuse this check history_check $REPO_NAME case8=$((tag_switching_result+branch_switching_result+history_result)) if [ "$case8" = "0" ]; then echo "case 8, tag-changing update: OK" else echo "case 8, tag-changing update: FAIL" fi } while getopts ":hn:a" option; do case $option in h) # display Help Help exit;; n) TEST_NUM=$OPTARG;; a) ALL_TESTS="true";; \?) # Invalid option echo "Error: Invalid option here" exit;; esac done if [ "$ALL_TESTS" = "true" ]; then make_temporary_clone test0 test1 test2 test3 test4 test5 test6 test7 test8 rm -rf $TMP_CLONE_DIR elif [ -n "$TEST_NUM" ]; then #in order to only create the temporary clone once if we execute all tests if [[ "$TEST_NUM" = 4 || "$TEST_NUM" = 5 || "$TEST_NUM" = 8 ]]; then make_temporary_clone fi case $TEST_NUM in 0) test0;; 1) test1;; 2) test2;; 3) test3;; 4) test4;; 5) test5;; 6) test6;; 7) test7;; 8) test8;; *) echo "Error: Invalid test number" exit;; esac if [[ "$TEST_NUM" = 4 || "$TEST_NUM" = 5 || "$TEST_NUM" = 8 ]]; then rm -rf $TMP_CLONE_DIR fi else Help fi