pre-commit-src/pre-commit
author eyeokg <k.galczynski@eyeo.com>
Mon, 11 Nov 2024 14:48:38 +0100
changeset 25710 b3dddcc5f208
parent 25709 ca5e4f738e57
child 25711 2bb339143f01
permissions -rwxr-xr-x
Improved performance, messaging, fix bugs and tests
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     1
#!/bin/bash
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     2
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     3
# Improve error handling, option e is not picked because it's expected for functions
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     4
# to return non-0 statuses.
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     5
set -Eeuo pipefail
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     6
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     7
# Allow user input during commit
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     8
exec < /dev/tty
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
     9
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    10
templates_content='{}'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    11
templates_names=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    12
unique_json_files=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    13
unique_filterlists_to_include=()
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    14
all_domains_variables_in_json_files='[]'
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    15
all_domains_variables_names='{}'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    16
all_json_files_contents='{}'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    17
variables_in_json_files='{}'
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    18
variables_in_included_filterlists='{}'
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    19
all_domain_variables_matches_in_filterlists='[]'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    20
last_error=''
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    21
testing=false
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    22
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    23
error_handler() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    24
    local exit_code=$?
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    25
    local line_number=$1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    26
    echo "Error: Script failed with exit code $exit_code at line $line_number"
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    27
    if [ "${BASH_COMMAND:-}" = "return 1" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    28
        echo -e "Last error message:\n$last_error"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    29
    else
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    30
        echo -e "\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    31
        echo "THIS ERROR SHOULDN'T HAPPEN, PLEASE REPORT IT TO AFB TEAM OR KRIS"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    32
        echo -e "\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n"
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    33
        echo "Last executed command: ${BASH_COMMAND:-}"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    34
    fi
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    35
    if [ "$testing" = true ] && [ "${BASH_COMMAND:-}" = "return 1" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    36
        exit 0
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    37
    else
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    38
        exit $exit_code
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    39
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    40
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    41
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    42
# Set up trap to catch errors and invoke the error handler
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    43
trap 'error_handler $LINENO' ERR
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    44
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    45
check_git_status() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    46
    local status=$(git status)
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    47
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    48
    local git_status=$(grep -s "Changes not staged for commit" <<< $status || grep -s "Untracked files" <<< $status || echo '')
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
    49
    if ! [ -z "$git_status" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    50
        read -p "There are changes not staged for commit. The script will check only the staged version. Do you want to continue? (y/n): " choice
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    51
        case "$choice" in 
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    52
            y|Y ) echo "";;
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    53
            n|N ) echo "Aborting."; exit 1;;
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    54
            * ) echo "Invalid choice. Aborting."; exit 1;;
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    55
        esac
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    56
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    57
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    58
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    59
check_if_jq_is_installed() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    60
    if ! command -v jq &>/dev/null; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    61
        last_error="ERROR: jq is not installed. Please install jq to continue."
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    62
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    63
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    64
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    65
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    66
check_if_file_exists() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    67
    local file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    68
    if ! [ -f "$file_path" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    69
        last_error="ERROR: File $file_path does not exist"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    70
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    71
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    72
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    73
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    74
get_staged_version_of_a_file() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    75
    local file_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    76
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    77
    # Using name reference in order to not create subshells for each assignment and allow to use global variables
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    78
    # and global error handling
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    79
    local -n staged_file_content_nameref=$2
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    80
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    81
    check_if_file_exists "$file_name"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    82
    if git show :"$file_name" >/dev/null 2>&1; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    83
        staged_file_content_nameref="$(git show :"$file_name")"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    84
    else
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    85
        last_error="ERROR: File $file_name was requested by a template but it's not tracked neither staged."
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    86
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    87
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    88
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    89
parse_template_data() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    90
    local template="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    91
    local -n file_data_nameref=$2
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    92
    local staged_template
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    93
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    94
    get_staged_version_of_a_file "$template" staged_template
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    95
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    96
    # Extract lines starting with %domainsVariables exceptionrules: and process them with jq
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
    97
    local json_files_in_template=$(grep "^%domainsVariables exceptionrules:" <<< $staged_template | sed 's/^%domainsVariables exceptionrules://; s/%$//' | jq -R -s 'split("\n") | map(select(length > 0))' || echo '[]')
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
    98
    # Extract lines starting with %include exceptionrules: and process them with jq
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
    99
    local included_filterlists_files_in_template=$(grep "^%include exceptionrules:" <<< $staged_template | sed 's/^%include exceptionrules://; s/%$//' | jq -R -s 'split("\n") | map(select(length > 0))' || echo '[]')
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   100
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   101
    if [ "$included_filterlists_files_in_template" = "[]" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   102
        last_error="ERROR: There is no list included in template $template_name"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   103
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   104
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   105
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   106
    # Create a JSON object with the template name as the key and the extracted domainsVariables and include data as values
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   107
    file_data_nameref=$(jq -n --arg template "$template" --argjson json_files_in_template "$json_files_in_template" --argjson included_filterlists_files_in_template "$included_filterlists_files_in_template" '
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   108
        {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   109
            $template: {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   110
                "domainsVariables": $json_files_in_template,
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   111
                "include": $included_filterlists_files_in_template
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   112
            }
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   113
        }')
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   114
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   115
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   116
update_templates_content() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   117
    local file_template="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   118
    # Merge the new template data into the existing templates_content JSON
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   119
    templates_content=$(jq -n --argjson templates_content "$templates_content" --argjson file_template "$file_template" '$templates_content + $file_template')
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   120
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   121
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   122
update_unique_json_files() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   123
    local template_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   124
    local file_data="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   125
    # Extract the list of domainsVariables files from the template data
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   126
    local json_files_list=$(jq -r --arg template_name "$template_name" '.[$template_name].domainsVariables[]' <<< $file_data)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   127
    for json_file in $json_files_list; do
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   128
        local matches_in_unique_json_files=$(grep -swF "$json_file" <<< ${unique_json_files[@]} || echo '')
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   129
        if [ -z "$matches_in_unique_json_files" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   130
            unique_json_files+=("$json_file")
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   131
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   132
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   133
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   134
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   135
update_unique_includes() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   136
    local template_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   137
    local file_data="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   138
    # Extract the list of included files from the template data
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   139
    local included_files_list=$(jq -r --arg file "$template_name" '.[$file].include[]' <<< $file_data)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   140
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   141
    for included_filterlist in $included_files_list; do
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   142
        local matches_in_unique_filterlists=$(grep -swF "$included_filterlist" <<< ${unique_filterlists_to_include[@]} || echo '')
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   143
        if [ -z "$matches_in_unique_filterlists" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   144
            unique_filterlists_to_include+=("$included_filterlist")
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   145
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   146
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   147
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   148
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   149
check_if_valid_json() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   150
    local json_file_path="$1"
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   151
    if ! jq -e . >/dev/null 2>&1 <<< $(cat "$json_file_path"); then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   152
        last_error="ERROR: Invalid JSON content in $json_file_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   153
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   154
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   155
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   156
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   157
get_domains_variables_names_incl_duplicates() {
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   158
    local json_file_content="$1"
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   159
    local -n domains_variables_names_incl_duplicated_nameref=$2
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   160
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   161
    # If jq would be used the duplicates would be automatically removed, therefore I used perl
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   162
    domains_variables_names_incl_duplicated_nameref=$(perl -0777 -ne 'print "$1\n" while /"([^"]+?)"(?=[\s\r\n]*:)/g' <<< $json_file_content)
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   163
}
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   164
check_if_correct_domains_variables_json_structure() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   165
    local json_file_content="$1"
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   166
    local json_file_path="$2"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   167
    # Check if the JSON structure is valid and matches the expected format:
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   168
    # { "variable1": ["domain1", "domain2" (...)], "variable2": ["domain1", "domain3" (...)], (...)}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   169
    if ! echo $json_file_content | jq -e '
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   170
        type == "object" and
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   171
        ([keys[] as $k | .[$k] | type == "array" and all(.[]; type == "string")] | all)
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   172
        '   >/dev/null 2>&1;
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   173
    then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   174
        last_error="ERROR: JSON structure is invalid in $json_file_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   175
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   176
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   177
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   178
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   179
check_if_duplicated_domains_variable_name_in_single_file() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   180
    local json_file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   181
    local domains_variables_names="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   182
    if [ "$(echo "$domains_variables_names" | sort | uniq -d)" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   183
        last_error="ERROR: Duplicate domains_variables_names found in $json_file_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   184
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   185
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   186
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   187
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   188
check_if_valid_domains_variable_name() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   189
    local domains_variable_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   190
    if ! [[ "$domains_variable_name" =~ ^[[:alnum:]_]+$ ]]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   191
        last_error="ERROR: Invalid domains variable name: $domains_variable_name, only alphanumeric characters and underscores are allowed"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   192
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   193
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   194
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   195
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   196
check_if_duplicated_domains() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   197
    local json_file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   198
    local key="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   199
    local value="$3"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   200
    # Value of domainsVariable is an array of strings representing domains,
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   201
    # therefore the error message mentions domains.
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   202
    if [ -n "$(echo "$value" | sort | uniq -di)" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   203
        last_error="ERROR: There are duplicated domains in $key in file $json_file_path:\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   204
        last_error+="$(echo "$value" | sort | uniq -di)"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   205
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   206
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   207
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   208
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   209
check_if_correct_domain() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   210
    local json_file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   211
    local domains_variable_name="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   212
    local domains="$3"
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   213
    # Preselect candidates for invalid domains, then check them 
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   214
    local candidates=$(grep -vP "^[a-zA-Z0-9]{1,63}\.[a-zA-Z]{2,24}$" <<< $domains || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   215
    local strong_candidates=$(grep -vP "^((([A-Za-z0-9][A-Za-z0-9-]{0,61})?[A-Za-z0-9]\.)+([A-Za-z]{2,63}|\*|xn--[a-zA-Z0-9-]{1,59}) )+$" <<< $candidates || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   216
    if [ -n "$strong_candidates" ]; then
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   217
        for domain in $strong_candidates; do
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   218
            # Check if the domain matches the expected pattern
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   219
            if ! [[ $domain =~ ^(([A-Za-z0-9][A-Za-z0-9-]{0,61})?[A-Za-z0-9]\.)+([A-Za-z]{2,63}|\*|xn--[a-zA-Z0-9-]{1,59})$ ]]; then
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   220
                last_error="ERROR: Invalid domain in $domains_variable_name: $domain in file $json_file_path"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   221
                return 1
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   222
            fi
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   223
        done
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   224
    fi
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   225
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   226
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   227
check_if_correct_domains_variables() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   228
    local json_file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   229
    local domains_variables_names="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   230
    local json_file_content="$3"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   231
    check_if_duplicated_domains_variable_name_in_single_file "$json_file_path" "$domains_variables_names"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   232
    for domains_variable_name in $domains_variables_names; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   233
        check_if_valid_domains_variable_name "$domains_variable_name"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   234
        # Extract the value associated with the domains variable name from the JSON file
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   235
        local domains=$(jq -r --arg key "$domains_variable_name" '.[$key][]' <<< $json_file_content)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   236
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   237
        check_if_duplicated_domains "$json_file_path" "$domains_variable_name" "$domains"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   238
        check_if_correct_domain "$json_file_path" "$domains_variable_name" "$domains"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   239
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   240
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   241
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   242
update_domains_variables_data() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   243
    local domains_variables_names="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   244
    local json_file_path="$2"
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   245
    local json_file_content="$3"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   246
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   247
    # Merge the new domains variables into the existing all_domains_variables_in_json_files array
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   248
    all_domains_variables_in_json_files=$(jq -n --argjson all_domains_variables_in_json_files "$all_domains_variables_in_json_files" --argjson domains_variables_names "$(echo "$domains_variables_names" | jq -R -s 'split("\n") | map(select(length > 0))')" '$all_domains_variables_in_json_files + $domains_variables_names | unique')
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   249
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   250
    # Adding all the json files content to the variable was causing "Too big variable" error
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   251
    # Therefore, the content is saved to a temporary file and then loaded back to the variable
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   252
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   253
    all_json_files_temp_file=$(mktemp)
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   254
    echo "$all_json_files_contents" > "$all_json_files_temp_file"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   255
    json_file_content_temp=$(mktemp)
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   256
    echo "$json_file_content" > "$json_file_content_temp"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   257
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   258
    all_json_files_contents=$(jq --arg json_file_path "$json_file_path" --slurpfile json_file_content "$json_file_content_temp" '.[$json_file_path] = $json_file_content[0]' "$all_json_files_temp_file")
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   259
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   260
    rm "$json_file_content_temp"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   261
    rm "$all_json_files_temp_file"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   262
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   263
    # Update the variables_in_json_files object with the keys from the JSON file
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   264
    variables_in_json_files=$(echo "$variables_in_json_files" | jq --arg key "$json_file_path" --argjson value "$(echo "$all_json_files_contents" | jq 'to_entries | map({key: .key, value: (.value | keys)}) | from_entries' | jq --arg key "$json_file_path" '.[$key]')" '. * {($key): $value}')
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   265
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   266
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   267
check_if_duplicated_domains_variable_name_between_files() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   268
    local json_file_path="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   269
    local domains_variables_names="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   270
    for domains_variable_name in $domains_variables_names; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   271
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   272
        # Check if the domains variable name exists in the all_domains_variables_in_json_files array
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   273
        if jq -e --arg name "$domains_variable_name" 'index($name) != null' <<< $all_domains_variables_in_json_files >/dev/null 2>&1; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   274
            # If a duplicate is found, identify the file containing the duplicate and report an error
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   275
            local file_with_duplicate=$(jq -r --arg name "$domains_variable_name" '
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   276
            to_entries | map(select(.value | has($name))) | .[0].key
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   277
            ' <<< $all_json_files_contents)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   278
            last_error="ERROR: Duplicate domains variable found in $json_file_path and $file_with_duplicate file: $domains_variable_name"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   279
            return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   280
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   281
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   282
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   283
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   284
find_domain_variables_syntax_in_filterlist() {
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   285
    local filterlist_content="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   286
    local filterlist_path="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   287
    local -n all_lines_with_domain_variables_in_filterlist_nameref=$3
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   288
    # Find lines containing domain variables in the filterlist
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   289
    # The regex to find them is simpler than in filterlist delivery to also catch domains variables in the wrong place
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   290
    # without starting with a complex regex. The full regex is in one of the next steps
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   291
    all_lines_with_domain_variables_in_filterlist_nameref=$(grep -P '%<\{.*\}>%' <<< $filterlist_content || echo '')
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   292
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   293
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   294
check_for_similar_to_domain_variable() {
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   295
    local filterlist_content="$1"
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   296
    local filterlist_path="$2"
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   297
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   298
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   299
    # Precheck to quickly gather only the potentiall candidates for the full check
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   300
    local weak_candidates=$(grep -P "[%{}<>].\w+.[%{}<>]" <<< $filterlist_content || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   301
    local candidates=$(grep -P "[%{}<>].?[%{}<>].*[%{}<>].?[%{}<>]" <<< $weak_candidates || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   302
    local strong_candidates=$(grep -oP "([^%{}<>]|^)[%{}<>]+.?[%{}<>]+.*[%{}<>]+.?[%{}<>]+([^%{}<>]|$)" <<< $candidates || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   303
    if [ -n "$strong_candidates" ]; then
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   304
        local lines_with_similar_to_domain_variable=$(grep -vP "([|,=]|^)%<\{\w+\}>%([,|#]|$)" <<< $candidates || echo '')
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   305
        if [ -n "$lines_with_similar_to_domain_variable" ]; then
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   306
            last_error="ERROR: Found a line in $filterlist_path that is similar to a domain variable, but it's not a domain variable:\n\n"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   307
            last_error+="$lines_with_similar_to_domain_variable"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   308
            return 1
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   309
        fi
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   310
    fi
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   311
    }
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   312
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   313
process_filters() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   314
    local all_lines_with_domain_variables_in_filterlist="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   315
    local -n domains_variables_collected_from_filterlist_nameref="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   316
    domains_variables_collected_from_filterlist_nameref='[]'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   317
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   318
    for filter in $all_lines_with_domain_variables_in_filterlist; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   319
        # Extract the domain variable from the filter
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   320
        local domains_variable_match=$(grep -oP '(?<=%<\{).*?(?=\}>%)' <<< $filter)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   321
        if [ "$(echo "$domains_variable_match" | wc -l)" -gt 1 ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   322
            last_error="ERROR: More than 2 domain variables found in filter: $filter"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   323
            return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   324
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   325
        # Ensure the domain variable is correctly formatted in the filter
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   326
        local true_matches
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   327
        true_matches=$(grep -P '(%<{(\w+)}>%(?:,~?[a-zA-Z0-9*.~-]+)*#[?@$]?#)|([,$]domain=(?:[a-zA-Z0-9*.~-]+\|)*%<{(\w+)}>%)' <<< $filter)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   328
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   329
        if [ -z "$true_matches" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   330
            last_error="ERROR: Domain variable added in a wrong way in filter: $filter"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   331
            return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   332
        fi
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   333
        domains_variables_collected_from_filterlist_nameref=$(jq --arg domains_variable_match "$domains_variable_match" '. + [$domains_variable_match]' <<< $domains_variables_collected_from_filterlist_nameref)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   334
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   335
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   336
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   337
update_matches_and_variables() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   338
    local domains_variables_collected_from_filterlist="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   339
    local file_path="$2"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   340
    
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   341
    # Update the list of all domain variable matches in filterlists
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   342
    all_domain_variables_matches_in_filterlists=$(jq -n --argjson all_domain_variables_matches_in_filterlists "$all_domain_variables_matches_in_filterlists" --argjson matches "$domains_variables_collected_from_filterlist" '$all_domain_variables_matches_in_filterlists + $matches | unique')
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   343
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   344
    # Update the variables_in_included_filterlists object with the matches from the current filterlist
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   345
    variables_in_included_filterlists=$(jq --arg key "$file_path" --argjson value "$domains_variables_collected_from_filterlist" '.[$key] = $value' <<< $variables_in_included_filterlists)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   346
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   347
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   348
extract_domains_variables_in_included_filterlists() {
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   349
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   350
    local template_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   351
    local -n domains_variables_in_included_filterlists_nameref=$2
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   352
    # Extract the list of included filterlists from the template
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   353
    local included_filterlists=$(jq -r --arg template_name "$template_name" '.[$template_name].include[]' <<< $templates_content)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   354
    domains_variables_in_included_filterlists_nameref=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   355
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   356
    for included_filterlist in $included_filterlists; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   357
        # Extract the domain variables from each included filterlist
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   358
        local domains_variables=$(jq -r --arg key "$included_filterlist" '.[$key][]' <<< $variables_in_included_filterlists)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   359
        for domain_variable in $domains_variables; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   360
            domains_variables_in_included_filterlists_nameref+=("$domain_variable")
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   361
        done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   362
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   363
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   364
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   365
extract_domains_variables_in_included_json_files() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   366
    local template_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   367
    local -n domains_variables_in_included_json_files_nameref=$2
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   368
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   369
    # Extract the list of included JSON files from the template
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   370
    local included_json_files=$(jq -r --arg template_name "$template_name" '.[$template_name].domainsVariables[]' <<< $templates_content)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   371
    domains_variables_in_included_json_files_nameref=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   372
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   373
    for included_json_file in $included_json_files; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   374
        # Extract the domain variables from each included JSON file
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   375
        local domains_variables=$(jq -r --arg key "$included_json_file" '.[$key][]' <<< $variables_in_json_files)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   376
        for domain_variable in $domains_variables; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   377
            domains_variables_in_included_json_files_nameref+=("$domain_variable")
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   378
        done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   379
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   380
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   381
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   382
check_domain_variables_in_filterlists() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   383
    local template_name="$1"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   384
    local domains_variables_in_included_filterlists=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   385
    local domains_variables_in_included_json_files=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   386
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   387
    # When for example $2 was empty, then the array had one element with empty string
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   388
    if [ -n "$2" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   389
        domains_variables_in_included_filterlists=($2)
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   390
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   391
    if [ -n "$3" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   392
        domains_variables_in_included_json_files=($3)
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   393
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   394
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   395
    # Extract the list of included filterlists and JSON files from the template
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   396
    local included_filterlists=$(jq -r --arg template_name "$template_name" '.[$template_name].include[]' <<< $templates_content)
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   397
    local included_json_files=$(jq -r --arg template_name "$template_name" '.[$template_name].domainsVariables[]' <<< $templates_content)
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   398
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   399
    for domain_variable_in_filterlist in ${domains_variables_in_included_filterlists[@]}; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   400
        local found=false
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   401
        for domain_variable_in_json_file in ${domains_variables_in_included_json_files[@]}; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   402
            if [ "$domain_variable_in_filterlist" = "$domain_variable_in_json_file" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   403
                found=true
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   404
                break
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   405
            fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   406
        done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   407
        if ! $found; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   408
            last_error="Error: One of the filterlists:\n\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   409
            last_error+="$included_filterlists\n\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   410
            last_error+="included in the template $template_name contain a domain variable $domain_variable_in_filterlist "
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   411
            last_error+="which wasn't found in any of the domains variables files included in that template:\n\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   412
            last_error+="$included_json_files"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   413
            return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   414
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   415
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   416
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   417
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   418
check_if_domains_variables_are_identical_in_lists_and_jsons() {
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   419
    if [ "$all_domains_variables_in_json_files" != "$all_domain_variables_matches_in_filterlists" ]; then
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   420
        last_error="Error: the domain variables in domain-variables file and the filter list are not the same\n"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   421
        last_error+="Extra variables in domain-variables files:\n"
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   422
        last_error+="$(jq -n --argjson all_domains_variables_in_json_files "$all_domains_variables_in_json_files" --argjson all_domain_variables_matches_in_filterlists "$all_domain_variables_matches_in_filterlists" '$all_domains_variables_in_json_files - $all_domain_variables_matches_in_filterlists')\n"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   423
        last_error+="Extra variables in filter lists:\n"
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   424
        last_error+=$(jq -n --argjson all_domains_variables_in_json_files "$all_domains_variables_in_json_files" --argjson all_domain_variables_matches_in_filterlists "$all_domain_variables_matches_in_filterlists" '$all_domain_variables_matches_in_filterlists - $all_domains_variables_in_json_files')
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   425
        return 1
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   426
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   427
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   428
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   429
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   430
main() {
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   431
    check_git_status
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   432
    check_if_jq_is_installed
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   433
    for template_name in *.txt; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   434
        templates_names+=("$template_name")
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   435
        # To avoid creating a subshell, the variable is passed as a reference to parse_template_data function
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   436
        # That helps with the error handling and allows to use global variables
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   437
        local file_data
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   438
        # Parse data from the template
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   439
        parse_template_data "$template_name" file_data
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   440
        # Update the templates_content JSON with the data from the file
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   441
        update_templates_content "$file_data"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   442
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   443
        update_unique_json_files "$template_name" "$file_data"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   444
        update_unique_includes "$template_name" "$file_data"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   445
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   446
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   447
    for domains_variables_path in ${unique_json_files[@]}; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   448
        check_if_file_exists "$domains_variables_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   449
        local staged_domains_variables_file
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   450
        get_staged_version_of_a_file "$domains_variables_path" staged_domains_variables_file
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   451
        check_if_correct_domains_variables_json_structure "$staged_domains_variables_file" "$domains_variables_path"
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   452
        local domains_variables_names_incl_duplicates
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   453
        get_domains_variables_names_incl_duplicates "$staged_domains_variables_file" domains_variables_names_incl_duplicates
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   454
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   455
        check_if_correct_domains_variables "$domains_variables_path" "$domains_variables_names_incl_duplicates" "$staged_domains_variables_file"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   456
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   457
        check_if_duplicated_domains_variable_name_between_files "$domains_variables_path" "$domains_variables_names_incl_duplicates"
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   458
        update_domains_variables_data "$domains_variables_names_incl_duplicates" "$domains_variables_path" "$staged_domains_variables_file"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   459
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   460
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   461
    for filterlist_path in ${unique_filterlists_to_include[@]}; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   462
        check_if_file_exists "$filterlist_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   463
        local filterlist_content
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   464
        get_staged_version_of_a_file "$filterlist_path" filterlist_content
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   465
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   466
        check_for_similar_to_domain_variable  "$filterlist_content" "$filterlist_path"
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   467
        local all_lines_with_domain_variables_in_filterlist
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   468
        find_domain_variables_syntax_in_filterlist "$filterlist_content" "$filterlist_path" all_lines_with_domain_variables_in_filterlist
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   469
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   470
        if [ -z "$all_lines_with_domain_variables_in_filterlist" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   471
            # In case of lack of matches, the value of all_lines_with_domain_variables_in_filterlist should have just
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   472
            # a message to show.
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   473
            local domains_variables_collected_from_filterlist='[]'
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   474
        else
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   475
            local domains_variables_collected_from_filterlist
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   476
            process_filters "$all_lines_with_domain_variables_in_filterlist" domains_variables_collected_from_filterlist
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   477
        fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   478
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   479
        update_matches_and_variables "$domains_variables_collected_from_filterlist" "$filterlist_path"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   480
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   481
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   482
    local domains_variables_in_included_filterlists=()
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   483
    for template_name in ${templates_names[@]}; do
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   484
        extract_domains_variables_in_included_filterlists "$template_name" domains_variables_in_included_filterlists
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   485
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   486
        local domains_variables_in_included_json_files
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   487
        extract_domains_variables_in_included_json_files "$template_name" domains_variables_in_included_json_files
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   488
        check_domain_variables_in_filterlists "$template_name" "$(echo ${domains_variables_in_included_filterlists[@]})" "$(echo ${domains_variables_in_included_json_files[@]})"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   489
    done
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   490
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   491
    check_if_domains_variables_are_identical_in_lists_and_jsons
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   492
}
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   493
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   494
check_unit_tests() {
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   495
    local exit_status=0
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   496
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   497
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   498
    ./pre-commit-src/tests/pre-commit-tests.sh '--no-verbose' || exit_status=1
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   499
    function_exit_code=$?
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   500
    if [ $exit_status -ne 1 ]; then
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   501
        exit_status=$function_exit_code
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   502
    fi
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   503
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   504
    if [ $exit_status -ne 0 ]; then
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   505
        last_error="Unit tests failed with exit code $exit_status"
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   506
        last_error+="\nPlease fix the issues before continuing"
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   507
        last_error+="To check the details run 'pre-commit-src/tests/pre-commit-tests.sh'"
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   508
        return $exit_status
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   509
    else
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   510
        last_error="Unit tests passed successfully"
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   511
    fi
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   512
}
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   513
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   514
check_pre_commit_files() {
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   515
    pre_commit_git_status=$(git status :pre-commit-src/pre-commit)
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   516
    logs_for_unstaged_changes_in_pre_commit=$(grep -s "Changes not staged for commit" <<< $pre_commit_git_status || grep -s "Untracked files" <<< $pre_commit_git_status || echo '')
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   517
    if ! [ -z "$logs_for_unstaged_changes_in_pre_commit" ]; then
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   518
        last_error="Unstaged changes detected in pre-commit file. Stage pre-commit changes before continuing."
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   519
        return 1
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   520
    fi
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   521
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   522
    pre_commit_tests_git_status=$(git status :pre-commit-src/tests/pre-commit-tests.sh)
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   523
    logs_for_unstaged_changes_in_pre_commit_tests=$(grep -s "Changes not staged for commit" <<< $pre_commit_tests_git_status || grep -s "Untracked files" <<< $pre_commit_tests_git_status || echo '')
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   524
    if ! [ -z "$logs_for_unstaged_changes_in_pre_commit_tests" ]; then
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   525
        last_error="Unstaged changes detected in pre-commit-tests file. Stage pre-commit tests changes before continuing."
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   526
        return 1
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   527
    fi
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   528
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   529
    # Only if something changed in pre commit or pre commit tests the unit tests should be run
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   530
    logs_for_commited_changes_in_pre_commit_or_test=$(grep -s "Changes to be committed" <<< $pre_commit_tests_git_status || grep -s "Changes to be committed" <<< $pre_commit_git_status || echo '')
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   531
    if ! [ -z "$logs_for_commited_changes_in_pre_commit_or_test" ]; then
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   532
        check_unit_tests
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   533
    fi
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   534
}
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   535
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   536
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   537
# For testing purposes only if the script has no arguments or the argument is main the process should run
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   538
# thanks to that the script can be tested without running the main function
25710
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   539
if [ -z "${1:-}" ]; then
b3dddcc5f208 Improved performance, messaging, fix bugs and tests
eyeokg <k.galczynski@eyeo.com>
parents: 25709
diff changeset
   540
    echo 'Running pre-commit checks...'
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   541
    main
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   542
    check_pre_commit_files
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   543
25709
ca5e4f738e57 Improved pre_commit and tests, removed old pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25708
diff changeset
   544
    echo "Pre-commit checks passed successfully. Double check if there were no error messages above this message before pushing"
25708
d3198dc01a79 Reorganized pre-commit
eyeokg <k.galczynski@eyeo.com>
parents: 25707
diff changeset
   545
    exit 0
25707
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   546
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   547
elif [ "$1" = "--load-only" ]; then
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   548
    testing=true
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   549
    echo "Script loaded successfully"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   550
else
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   551
    "$@"
2a19e3a985b6 Moved pre-commit files and added first test
eyeokg <k.galczynski@eyeo.com>
parents:
diff changeset
   552
fi