From 0606cde105859d9bdb751825bf89952297b335ed Mon Sep 17 00:00:00 2001 From: Alexandre Flament Date: Wed, 23 Jun 2021 12:48:31 +0200 Subject: [PATCH] [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 * static.git.restore: git restore Related to https://github.com/searxng/searxng/issues/137 --- Makefile | 7 ++ utils/manage_static.sh | 151 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100755 utils/manage_static.sh diff --git a/Makefile b/Makefile index cd541a9a7..ab2f6cc20 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ .DEFAULT_GOAL=help export MTOOLS=./manage +export MSTATIC=./utils/manage_static.sh include utils/makefile.include @@ -89,6 +90,12 @@ PHONY += $(MANAGE) $(MANAGE): $(Q)$(MTOOLS) $@ + +MANAGE_STATIC += static.build.commit.drop static.build.commit static.git.restore.staged static.git.restore + +$(MANAGE_STATIC): + $(Q)$(MSTATIC) $@ + # deprecated PHONY += docs docs-clean docs-live docker themes diff --git a/utils/manage_static.sh b/utils/manage_static.sh new file mode 100755 index 000000000..3321f310e --- /dev/null +++ b/utils/manage_static.sh @@ -0,0 +1,151 @@ +#!/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 "$@"