Ponysearch/utils/manage_static.sh
Alexandre Flament 0606cde105 [mod] add make targets to manage the build files in the /searx/static directory
The idea is to avoid conflict when there are differents branches with changes are made on the static files.
A solution is to ask the administrators to build the files from the sources, but it requires to install the npm dependencies.
So the solution in this commit keep the sources and the build files in the same git repository.

In one branch, the modification of the source (*.less, *.js) are commited without the built files.
The built files are commited in a uniq commit, with a commit message "Static build"
In case of merge or rebase, this commit can be dropped.

New make targets:
* static.build.commit.drop:
    drop the last "Static build".
    The command checks that there are only build files in the commit.
* static.build.commit :
    call "make static.build.commit.drop"
    call "make themes.all"
    commit the files
* static.git.restore.staged:
    git restore --staged <build files>
* static.git.restore:
    git restore <build files>

Related to https://github.com/searxng/searxng/issues/137
2021-06-26 13:13:31 +02:00

151 lines
4.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# -*- coding: utf-8; mode: sh indent-tabs-mode: nil -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
BUILD_COMMIT_MESSAGE="Static build"
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
)
CURRENT_BRANCH="$(git branch --show-current)"
STAGED_FILES=$(git diff --name-only --cached)
git_log_current_branch() {
git log "heads/${CURRENT_BRANCH}" --not --exclude="${CURRENT_BRANCH}" --branches --remotes --pretty=format:"%h"
}
is.build.commit() {
COMMIT_SHA=$1
# check commit message
COMMIT_MESSAGE=$(git show -s --format=%s ${COMMIT_SHA})
if [ "${COMMIT_MESSAGE}" != "${BUILD_COMMIT_MESSAGE}" ]; then
echo "Commit message of ${COMMIT_SHA} is '${COMMIT_MESSAGE}'"
return 1
fi
# check all files of the commit belongs to $BUILT_PATHS
COMMIT_FILES=$(git diff-tree --no-commit-id --name-only -r "${COMMIT_SHA}")
for i in ${BUILT_PATHS[*]}; do
# remove files of ${BUILT_PATHS}
COMMIT_FILES=$(echo "${COMMIT_FILES}" | grep -v "^${i}")
done
if [ -n "${COMMIT_FILES}" ]; then
echo "Commit $1 contains files that were not build: ${COMMIT_FILES}"
return 2
fi
return 0
}
static.build.commit.drop() {
LAST_COMMIT_ID=$(git_log_current_branch | head -1)
if [ -z "${LAST_COMMIT_ID}" ]; then
echo "Empty branch"
return 1
fi
is.build.commit "${LAST_COMMIT_ID}"
if [ $? -ne 0 ]; then
return $?
fi
echo "Drop last commit ${LAST_COMMIT_ID}"
git reset --hard HEAD~1
}
static.build.commit() {
# check for not commited files
NOT_COMMITED_FILES="$(git diff --name-only)"
if [ -n "${NOT_COMMITED_FILES}" ]; then
echo "Some files are not commited:"
echo "${NOT_COMMITED_FILES}"
return 1
fi
# check for staged files
if [ -n "${STAGED_FILES}" ]; then
echo "Some files are staged:"
echo "${STAGED_FILES}"
return 1
fi
# drop existing commit
static.commit.drop
if [ $? -ne 0 ]; then
return $?
fi
(
set -e
# build the themes
make themes.all
# add build files
for built_path in ${BUILT_PATHS[@]}; do
git add -v "${built_path}"
done
# check for modified files that are not staged
if [ -n "$(git diff --name-only)" ]; then
echo "make themes.all has created files that are not in BUILT_PATHS"
return 2
fi
#
git commit -m "Static build"
)
}
static.git.restore.staged() {
for i in ${BUILT_PATHS[*]}; do
STAGED_FILES_FOR_I=$(echo "${STAGED_FILES}" | grep "^${i}")
if [ -n "${STAGED_FILES_FOR_I}" ]; then
git restore --staged ${STAGED_FILES_FOR_I}
fi
done
}
static.git.restore() {
static.git.restore.staged
NOT_COMMITED_FILES="$(git diff --name-only)"
for i in ${BUILT_PATHS[*]}; do
NOT_COMMITED_FILES_FOR_I=$(echo "${NOT_COMMITED_FILES}" | grep "^${i}")
if [ -n "${NOT_COMMITED_FILES_FOR_I}" ]; then
git restore ${NOT_COMMITED_FILES_FOR_I}
fi
done
}
main() {
case $1 in
static.build.commit.drop)
# drop last commit if it was made by the "commit" command
static.build.commit.drop
;;
static.build.commit)
# call the "static.build.commit.drop" command,
# then "make themes.all"
# then commit the built files ($BUILT_PATHS).
static.build.commit
;;
static.git.restore.staged)
# after "git add ."
# remove the built files
# so only the source are commited
static.git.restore.staged
;;
static.git.restore)
# "git restore" of the built files.
static.git.restore
;;
esac
}
main "$@"