summaryrefslogtreecommitdiff
path: root/.gitlab-ci/fossils/fossils.sh
blob: e50312d64889e727e93aae34e69243fa6c8a854c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env bash
# shellcheck disable=SC2086 # we want word splitting
# shellcheck disable=SC2155

FOSSILS_SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
FOSSILS_YAML="$(readlink -f "$1")"
FOSSILS_RESULTS="$2"

clone_fossils_db()
{
    local repo="$1"
    local commit="$2"
    rm -rf fossils-db
    git clone --no-checkout "$repo" fossils-db
    (cd fossils-db || return; git reset "$commit" || git reset "origin/$commit")
}

query_fossils_yaml()
{
    python3 "$FOSSILS_SCRIPT_DIR/query_fossils_yaml.py" \
        --file "$FOSSILS_YAML" "$@"
}

create_clean_git()
{
    rm -rf .clean_git
    cp -R .git .clean_git
}

restore_clean_git()
{
    rm -rf .git
    cp -R .clean_git .git
}

fetch_fossil()
{
    local fossil="${1//,/?}"
    echo -n "[fetch_fossil] Fetching $1... "
    local output=$(git lfs pull -I "$fossil" 2>&1)
    local ret=0
    if [[ $? -ne 0 || ! -f "$1" ]]; then
        echo "ERROR"
        echo "$output"
        ret=1
    else
        echo "OK"
    fi
    restore_clean_git
    return $ret
}

if [[ -n "$(query_fossils_yaml fossils_db_repo)" ]]; then
    clone_fossils_db "$(query_fossils_yaml fossils_db_repo)" \
                     "$(query_fossils_yaml fossils_db_commit)"
    cd fossils-db || return
else
    echo "Warning: No fossils-db entry in $FOSSILS_YAML, assuming fossils-db is current directory"
fi

# During git operations various git objects get created which
# may take up significant space. Store a clean .git instance,
# which we restore after various git operations to keep our
# storage consumption low.
create_clean_git

for fossil in $(query_fossils_yaml fossils)
do
    fetch_fossil "$fossil" || exit $?
    if ! fossilize-replay --num-threads 4 $fossil 1>&2 2> $FOSSILS_RESULTS/fossil_replay.txt;
    then
        echo "Replay of $fossil failed"
        grep "pipeline crashed or hung" $FOSSILS_RESULTS/fossil_replay.txt
        exit 1
    fi
    rm $fossil
done

exit $ret