Крюк предварительного приема, Bash + Git - PullRequest
2 голосов
/ 05 мая 2020

Попытка написать ловушку предварительного приема для репо сервера битбакета.

Репо состоит только из json файлов:

по умолчанию. json
/subdirectory/overwrite.json

Файл по умолчанию. json содержит серию пар ключ / значение, которые перезаписываются. json файл должен иметь точную копию ключа, но не значения .

ie: по умолчанию. json = {myKey: "someValue"}, перезапись. json = {myKey: "someOtherValue"}

когда разработчик совершает перезапись . json ", мне нужно предварительное получение, чтобы сравнить файл с тем, что находится на сервере, чтобы убедиться, что ключи совпадают (не может иметь ключ / значение, которое не определено по умолчанию. json)

Вот код перехвата предварительного приема:

#>******************************************************
while read line
do
    echo "[INFO] Reading in stdin"
    # if line is not empty
    if [[ -n "${line// }" ]]; then
        # Split the line into an array.
        IFS=' ' read -r -a array <<< "$line"
        # This is the standard Git behaviour for pre-receive:
        parentsha=${array[0]}
        currentsha=${array[1]}
        ref=${array[2]}
        echo "[INFO] "
        echo "[INFO] Current line: "
        echo "[INFO] > Parent sha: $parentsha"
        echo "[INFO] > Current sha: $currentsha"
        echo "[INFO] Ref: $ref"
    fi
done
git show
echo "[INFO] END of pre-receive script 21"
exit 0

Приведенный выше код выдает значения sha для изменения, и я могу видеть фактическое изменение файла (ов), но я ' m отныне потеряно для чтения в фактически зафиксированных файлах и как сравнить файлы с тем, что находится на сервере

1 Ответ

2 голосов
/ 05 мая 2020

Хотя это можно решить с помощью сценария Bash, вам понадобится внешний инструмент, например jq , чтобы проанализировать ваши файлы JSON и извлечь ключи. Вероятно, было бы проще использовать другой язык (Python, Perl, Ruby и т. Д.) С собственным парсером JSON.

В любом случае, вот один из способов решения этой проблемы. В приведенном ниже коде:

  • Мы используем mapfile для извлечения списка ключей в default.json в переменную массива default
  • Мы используем mapfile для извлечения список ключей в subdirectory/overwrite.json в переменную массива overrides
  • Мы перебираем список ключей в $overrides, сравнивая каждый со списком ключей в $default.
#!/bin/bash

while read -r -a ref; do
    mapfile -t default <<< $(git show ${ref[1]}:default.json | jq -r 'keys[]')
    mapfile -t overrides <<< $(git show ${ref[1]}:subdirectory/overwrite.json | jq -r 'keys[]')

    for key in "${overrides[@]}"; do
        found=0
        for defkey in "${default[@]}"; do
            if [[ $defkey = $key ]]; then
                found=1
                break
            fi
        done

        if [[ $found -ne 1 ]]; then
            echo "ERROR: key $key not in default.json" >&2
            exit 1
        fi
    done
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...