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 "$@"