summaryrefslogtreecommitdiff
path: root/utils/lib_static.sh
blob: 2a5efeda0fc75d512639554956f5faa1fae8c37c (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env bash
# SPDX-License-Identifier: AGPL-3.0-or-later


STATIC_BUILD_COMMIT="[build] /static"
STATIC_BUILT_PATHS=(
    'searx/static/themes/oscar/css'
    'searx/static/themes/oscar/js'
    'searx/static/themes/oscar/src/generated/pygments-logicodev.less'
    'searx/static/themes/oscar/src/generated/pygments-pointhi.less'
    'searx/static/themes/simple/css'
    'searx/static/themes/simple/js'
    'searx/static/themes/simple/src/generated/pygments.less'
    'searx/static/themes/simple/img'
    'searx/templates/__common__/searxng-wordmark.min.svg'
    'searx/templates/simple/icons.html'
)

static_help(){
    cat <<EOF
static.build.:  ${STATIC_BUILD_COMMIT}
  commit    : build & commit /static folder
  drop      : drop last commit if it was previously done by static.build.commit
  restore   : git restore of the /static folder (after themes.all)
EOF
}

is.static.build.commit() {

    local commit_sha="$1"
    local commit_message
    local commit_files

    # check commit message
    commit_message=$(git show -s --format=%s "${commit_sha}")
    if [ "${commit_message}" != "${STATIC_BUILD_COMMIT}" ]; then
        err_msg "expecting commit message: '${STATIC_BUILD_COMMIT}'"
        err_msg "commit message of ${commit_sha} is: '${commit_message}'"
        return 1
    fi

    # check all files of the commit belongs to $STATIC_BUILT_PATHS
    commit_files=$(git diff-tree --no-commit-id --name-only -r "${commit_sha}")
    for i in ${STATIC_BUILT_PATHS[*]}; do
        # remove files of ${STATIC_BUILT_PATHS}
        commit_files=$(echo "${commit_files}" | grep -v "^${i}")
    done

    if [ -n "${commit_files}" ]; then
        err_msg "commit ${commit_sha} contains files not a part of ${STATIC_BUILD_COMMIT}"
        echo "${commit_files}" | prefix_stdout "  "
        return 2
    fi
    return 0
}

static.build.drop() {
    # drop last commit if it was made by the static.build.commit command

    local last_commit_id
    local branch

    build_msg STATIC "drop last commit if it was previously done by static.build.commit"

    # get only last (option -n1) local commit not in remotes
    branch="$(git branch --show-current)"
    last_commit_id="$(git log -n1 "${branch}" --pretty=format:'%h'\
     --not --exclude="${branch}" --branches --remotes)"

    if [ -z "${last_commit_id}" ]; then
        err_msg "there are no local commits"
        return 1
    fi

    if ! is.static.build.commit "${last_commit_id}"; then
        return $?
    fi

    build_msg STATIC "drop last commit ${last_commit_id}"
    git reset --hard HEAD~1
}

static.build.commit() {
    # call the "static.build.drop" command, then "themes.all" then commit the
    # built files ($BUILT_PATHS).

    build_msg STATIC "build & commit /static files"

    # check for not commited files
    if [ -n "$(git diff --name-only)" ]; then
        err_msg "some files are not commited:"
        git diff --name-only | prefix_stdout "  "
        return 1
    fi

    # check for staged files
    if [ -n "$(git diff --name-only --cached)" ]; then
        err_msg "some files are staged:"
        git diff --name-only --cached | prefix_stdout "  "
        return 1
    fi

    # drop existing commit from previos build
    static.build.drop &>/dev/null

    (   set -e
        # build the themes
        themes.all

        # add build files
        for built_path in "${STATIC_BUILT_PATHS[@]}"; do
            git add -v "${built_path}"
        done

        # check if any file has been added (in case of no changes)
        if [ -z "$(git diff --name-only --cached)" ]; then
            build_msg STATIC "no changes applied / nothing to commit"
            return 0
        fi

        # check for modified files that are not staged
        if [ -n "$(git diff --name-only)" ]; then
            die 42 "themes.all has created files that are not in STATIC_BUILT_PATHS"
        fi
        git commit -m "${STATIC_BUILD_COMMIT}"
    )
}

static.build.restore() {
    build_msg STATIC "git-restore of the built files (/static)"
    git restore --staged "${STATIC_BUILT_PATHS[@]}"
    git restore --worktree "${STATIC_BUILT_PATHS[@]}"
}