Merge pull request #229 from dalf/version-from-git
version based on git
This commit is contained in:
		
						commit
						38ee88b390
					
				| @ -60,9 +60,6 @@ ARG VERSION_GITCOMMIT=unknown | |||||||
| RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \ | RUN su searx -c "/usr/bin/python3 -m compileall -q searx"; \ | ||||||
|     touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \ |     touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml; \ | ||||||
|     touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \ |     touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini; \ | ||||||
|     if [ ! -z $VERSION_GITCOMMIT ]; then\ |  | ||||||
|       echo "VERSION_STRING = VERSION_STRING + \"-$VERSION_GITCOMMIT\"" >> /usr/local/searx/searx/version.py; \ |  | ||||||
|     fi; \ |  | ||||||
|     find /usr/local/searx/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \ |     find /usr/local/searx/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \ | ||||||
|     -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \ |     -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \ | ||||||
|     -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+ |     -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+ | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ import  sys, os | |||||||
| from pallets_sphinx_themes import ProjectLink | from pallets_sphinx_themes import ProjectLink | ||||||
| 
 | 
 | ||||||
| from searx import get_setting | from searx import get_setting | ||||||
| from searx.version import VERSION_STRING | from searx.version import VERSION_STRING, GIT_URL, GIT_BRANCH | ||||||
| 
 | 
 | ||||||
| # Project -------------------------------------------------------------- | # Project -------------------------------------------------------------- | ||||||
| 
 | 
 | ||||||
| @ -15,8 +15,6 @@ author = u'Adam Tauber' | |||||||
| release, version = VERSION_STRING, VERSION_STRING | release, version = VERSION_STRING, VERSION_STRING | ||||||
| 
 | 
 | ||||||
| SEARX_URL = get_setting('server.base_url') or 'https://example.org/searx' | SEARX_URL = get_setting('server.base_url') or 'https://example.org/searx' | ||||||
| GIT_URL = get_setting('brand.git_url') |  | ||||||
| GIT_BRANCH = get_setting('brand.git_branch') |  | ||||||
| ISSUE_URL = get_setting('brand.issue_url') | ISSUE_URL = get_setting('brand.issue_url') | ||||||
| DOCS_URL = get_setting('brand.docs_url') | DOCS_URL = get_setting('brand.docs_url') | ||||||
| PUBLIC_INSTANCES = get_setting('brand.public_instances') | PUBLIC_INSTANCES = get_setting('brand.public_instances') | ||||||
|  | |||||||
| @ -107,8 +107,8 @@ The ``make buildenv`` target will update the *build environment* in: | |||||||
| Tasks running outside of an *installed instance*, need the following settings | Tasks running outside of an *installed instance*, need the following settings | ||||||
| from the YAML configuration: | from the YAML configuration: | ||||||
| 
 | 
 | ||||||
| - ``GIT_URL`` from :ref:`brand.git_url <settings global brand>` | - ``GIT_URL`` from git configuration | ||||||
| - ``GIT_BRANCH`` from :ref:`brand.git_branch <settings global brand>` | - ``GIT_BRANCH`` from git configuration | ||||||
| 
 | 
 | ||||||
| - ``SEARX_URL`` from :ref:`server.base_url <settings global server>` (aka | - ``SEARX_URL`` from :ref:`server.base_url <settings global server>` (aka | ||||||
|   ``PUBLIC_URL``) |   ``PUBLIC_URL``) | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								manage
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								manage
									
									
									
									
									
								
							| @ -115,8 +115,11 @@ buildenv() { | |||||||
|         fi |         fi | ||||||
|     fi |     fi | ||||||
|     export SEARX_SETTINGS_PATH |     export SEARX_SETTINGS_PATH | ||||||
|  |     ( | ||||||
|  |         set -e | ||||||
|         SEARX_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \ |         SEARX_DEBUG=1 pyenv.cmd python utils/build_env.py 2>&1 \ | ||||||
|             | prefix_stdout "${_Blue}BUILDENV${_creset}  " |             | prefix_stdout "${_Blue}BUILDENV${_creset}  " | ||||||
|  |     ) | ||||||
|     return "${PIPESTATUS[0]}" |     return "${PIPESTATUS[0]}" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -200,7 +203,6 @@ docker.build() { | |||||||
| 
 | 
 | ||||||
|     local SEARX_GIT_VERSION |     local SEARX_GIT_VERSION | ||||||
|     local VERSION_GITCOMMIT |     local VERSION_GITCOMMIT | ||||||
|     local SEARX_PYTHON_VERSION |  | ||||||
|     local GITHUB_USER |     local GITHUB_USER | ||||||
|     local SEARX_IMAGE_NAME |     local SEARX_IMAGE_NAME | ||||||
|     local BUILD |     local BUILD | ||||||
| @ -227,34 +229,14 @@ docker.build() { | |||||||
|         fi |         fi | ||||||
| 
 | 
 | ||||||
|         # This is a git repository |         # This is a git repository | ||||||
| 
 |  | ||||||
|         # "git describe" to get the Docker version (for example : v0.15.0-89-g0585788e) |  | ||||||
|         # awk to remove the "v" and the "g" |  | ||||||
|         SEARX_GIT_VERSION=$(git describe --match "v[0-9]*\.[0-9]*\.[0-9]*" HEAD 2>/dev/null | awk -F'-' '{OFS="-"; $1=substr($1, 2); if ($3) { $3=substr($3, 2); }  print}') |  | ||||||
| 
 |  | ||||||
|         # add the suffix "-dirty" if the repository has uncommited change |  | ||||||
|         # /!\ HACK for searx/searx: ignore utils/brand.env |  | ||||||
|         git update-index -q --refresh |         git update-index -q --refresh | ||||||
|         if [ ! -z "$(git diff-index --name-only HEAD -- | grep -v 'utils/brand.env')" ]; then |         pyenv.cmd python -m searx.version freeze | ||||||
| 	    SEARX_GIT_VERSION="${SEARX_GIT_VERSION}-dirty" |         eval "$(pyenv.cmd python -m searx.version)" | ||||||
|         fi |  | ||||||
| 
 | 
 | ||||||
|         # Get the last git commit id, will be added to the Searx version (see Dockerfile) |         # Get the last git commit id | ||||||
|         VERSION_GITCOMMIT=$(echo "$SEARX_GIT_VERSION" | cut -d- -f2-4) |         VERSION_GITCOMMIT=$(echo "$VERSION_STRING" | cut -d- -f3) | ||||||
|         build_msg DOCKER "Last commit : $VERSION_GITCOMMIT" |         build_msg DOCKER "Last commit : $VERSION_GITCOMMIT" | ||||||
| 
 | 
 | ||||||
|         # Check consistency between the git tag and the searx/version.py file |  | ||||||
|         # /! HACK : parse Python file with bash /! |  | ||||||
|         # otherwise it is not possible build the docker image without all Python |  | ||||||
|         # dependencies ( version.py loads __init__.py ) |  | ||||||
|         # SEARX_PYTHON_VERSION=$(python3 -c "import six; import searx.version; six.print_(searx.version.VERSION_STRING)") |  | ||||||
|         SEARX_PYTHON_VERSION=$(cat searx/version.py | grep "\(VERSION_MAJOR\|VERSION_MINOR\|VERSION_BUILD\) =" | cut -d\= -f2 | sed -e 's/^[[:space:]]*//' | paste -sd "." -) |  | ||||||
|         if [ "$(echo "$SEARX_GIT_VERSION" | cut -d- -f1)" != "$SEARX_PYTHON_VERSION" ]; then |  | ||||||
| 	    err_msg "git tag:          $SEARX_GIT_VERSION" |  | ||||||
| 	    err_msg "searx/version.py: $SEARX_PYTHON_VERSION" |  | ||||||
| 	    die 1 "Inconsistency between the last git tag and the searx/version.py file" |  | ||||||
|         fi |  | ||||||
| 
 |  | ||||||
|         # define the docker image name |         # define the docker image name | ||||||
|         GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/') |         GITHUB_USER=$(echo "${GIT_URL}" | sed 's/.*github\.com\/\([^\/]*\).*/\1/') | ||||||
|         SEARX_IMAGE_NAME="${SEARX_IMAGE_NAME:-${GITHUB_USER:-searxng}/searxng}" |         SEARX_IMAGE_NAME="${SEARX_IMAGE_NAME:-${GITHUB_USER:-searxng}/searxng}" | ||||||
| @ -274,14 +256,14 @@ docker.build() { | |||||||
|         docker $BUILD \ |         docker $BUILD \ | ||||||
|          --build-arg BASE_IMAGE="${DEPENDENCIES_IMAGE_NAME}" \ |          --build-arg BASE_IMAGE="${DEPENDENCIES_IMAGE_NAME}" \ | ||||||
|          --build-arg GIT_URL="${GIT_URL}" \ |          --build-arg GIT_URL="${GIT_URL}" \ | ||||||
|          --build-arg SEARX_GIT_VERSION="${SEARX_GIT_VERSION}" \ |          --build-arg SEARX_GIT_VERSION="${VERSION_STRING}" \ | ||||||
|          --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \ |          --build-arg VERSION_GITCOMMIT="${VERSION_GITCOMMIT}" \ | ||||||
|          --build-arg LABEL_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ |          --build-arg LABEL_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \ | ||||||
|          --build-arg LABEL_VCS_REF="$(git rev-parse HEAD)" \ |          --build-arg LABEL_VCS_REF="$(git rev-parse HEAD)" \ | ||||||
|          --build-arg LABEL_VCS_URL="${GIT_URL}" \ |          --build-arg LABEL_VCS_URL="${GIT_URL}" \ | ||||||
|          --build-arg TIMESTAMP_SETTINGS="$(git log -1 --format="%cd" --date=unix -- searx/settings.yml)" \ |          --build-arg TIMESTAMP_SETTINGS="$(git log -1 --format="%cd" --date=unix -- searx/settings.yml)" \ | ||||||
|          --build-arg TIMESTAMP_UWSGI="$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini)" \ |          --build-arg TIMESTAMP_UWSGI="$(git log -1 --format="%cd" --date=unix -- dockerfiles/uwsgi.ini)" \ | ||||||
|          -t "${SEARX_IMAGE_NAME}:latest" -t "${SEARX_IMAGE_NAME}:${SEARX_GIT_VERSION}" . |          -t "${SEARX_IMAGE_NAME}:latest" -t "${SEARX_IMAGE_NAME}:${VERSION_STRING}" . | ||||||
| 
 | 
 | ||||||
|         if [ "$1" = "push" ]; then |         if [ "$1" = "push" ]; then | ||||||
| 	        docker push "${SEARX_IMAGE_NAME}:latest" | 	        docker push "${SEARX_IMAGE_NAME}:latest" | ||||||
|  | |||||||
| @ -10,11 +10,6 @@ brand: | |||||||
|   wiki_url: https://github.com/searxng/searxng/wiki |   wiki_url: https://github.com/searxng/searxng/wiki | ||||||
|   issue_url: https://github.com/searxng/searxng/issues |   issue_url: https://github.com/searxng/searxng/issues | ||||||
| 
 | 
 | ||||||
|   # If you change a value below don't forget to rebuild instance's enviroment |  | ||||||
|   # (make buildenv) |  | ||||||
|   git_url: https://github.com/searxng/searxng |  | ||||||
|   git_branch: master |  | ||||||
| 
 |  | ||||||
| search: | search: | ||||||
|   # Filter results. 0: None, 1: Moderate, 2: Strict |   # Filter results. 0: None, 1: Moderate, 2: Strict | ||||||
|   safe_search: 0 |   safe_search: 0 | ||||||
|  | |||||||
| @ -130,8 +130,6 @@ SCHEMA = { | |||||||
|         'contact_url': SettingsValue((None, False, str), None), |         'contact_url': SettingsValue((None, False, str), None), | ||||||
|     }, |     }, | ||||||
|     'brand': { |     'brand': { | ||||||
|         'git_url': SettingsValue(str), |  | ||||||
|         'git_branch': SettingsValue(str), |  | ||||||
|         'issue_url': SettingsValue(str, None), |         'issue_url': SettingsValue(str, None), | ||||||
|         'new_issue_url': SettingsValue(str, None), |         'new_issue_url': SettingsValue(str, None), | ||||||
|         'docs_url': SettingsValue(str, None), |         'docs_url': SettingsValue(str, None), | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ | |||||||
|   <p>More about SearXNG ...</p> |   <p>More about SearXNG ...</p> | ||||||
| 
 | 
 | ||||||
|   <ul> |   <ul> | ||||||
|     <li><a href="{{ get_setting('brand.git_url') }}">SearXNG sources</a></li> |     <li><a href="{{ searx_git_url }}">SearXNG sources</a></li> | ||||||
|     <li><a href="https://www.transifex.com/projects/p/searx/">transifex</a></li> |     <li><a href="https://www.transifex.com/projects/p/searx/">transifex</a></li> | ||||||
|   </ul> |   </ul> | ||||||
| 
 | 
 | ||||||
| @ -30,7 +30,7 @@ | |||||||
|     </li> |     </li> | ||||||
|     <li> |     <li> | ||||||
|       SearXNG is free software, the code is 100% open and you can help to make |       SearXNG is free software, the code is 100% open and you can help to make | ||||||
|       it better.  See more on <a href="{{ get_setting('brand.git_url') |       it better.  See more on <a href="{{ searx_git_url | ||||||
|       }}">SearXNG sources</a>. |       }}">SearXNG sources</a>. | ||||||
|     </li> |     </li> | ||||||
|   </ul> |   </ul> | ||||||
| @ -81,7 +81,7 @@ | |||||||
| 
 | 
 | ||||||
|   <p> |   <p> | ||||||
|     SearXNG appreciates your concern regarding logs, so take the code from |     SearXNG appreciates your concern regarding logs, so take the code from | ||||||
|     the <a href="{{ get_setting('brand.git_url') }}">SearXNG project</a> and |     the <a href="{{ searx_git_url }}">SearXNG project</a> and | ||||||
|     run it yourself! |     run it yourself! | ||||||
|   </p> |   </p> | ||||||
|   <p> |   <p> | ||||||
| @ -95,7 +95,7 @@ | |||||||
| 
 | 
 | ||||||
|   <p> |   <p> | ||||||
|     See the <a href="{{ get_setting('brand.docs_url') }}">SearXNG docs</a> |     See the <a href="{{ get_setting('brand.docs_url') }}">SearXNG docs</a> | ||||||
|     and <a href="{{ get_setting('brand.git_url') }}">SearXNG sources</a> |     and <a href="{{ searx_git_url }}">SearXNG sources</a> | ||||||
|   </p> |   </p> | ||||||
| 
 | 
 | ||||||
| </div> | </div> | ||||||
|  | |||||||
| @ -83,7 +83,7 @@ | |||||||
|             <p class="text-muted"> |             <p class="text-muted"> | ||||||
|                 <small> |                 <small> | ||||||
|                     {{ _('Powered by') }} <a href="{{ get_setting('brand.docs_url') }}">SearXNG</a> - {{ searx_version }} - {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> |                     {{ _('Powered by') }} <a href="{{ get_setting('brand.docs_url') }}">SearXNG</a> - {{ searx_version }} - {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> | ||||||
|                     <a href="{{ get_setting('brand.git_url') }}">{{ _('Source code') }}</a> | |                     <a href="{{ searx_git_url }}">{{ _('Source code') }}</a> | | ||||||
|                     <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | |                     <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | | ||||||
|                     <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>{% if get_setting('general.contact_url') %} | |                     <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>{% if get_setting('general.contact_url') %} | | ||||||
|                     <a href="{{ get_setting('general.contact_url') }}">{{ _('Contact instance maintainer') }}</a>{% endif %} |                     <a href="{{ get_setting('general.contact_url') }}">{{ _('Contact instance maintainer') }}</a>{% endif %} | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ | |||||||
|   <footer> |   <footer> | ||||||
|     <p> |     <p> | ||||||
|     {{ _('Powered by') }} <a href="{{ url_for('about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> |     {{ _('Powered by') }} <a href="{{ url_for('about') }}">searxng</a> - {{ searx_version }} — {{ _('a privacy-respecting, hackable metasearch engine') }}<br/> | ||||||
|         <a href="{{ get_setting('brand.git_url') }}">{{ _('Source code') }}</a> | |         <a href="{{ searx_git_url }}">{{ _('Source code') }}</a> | | ||||||
|         <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | |         <a href="{{ get_setting('brand.issue_url') }}">{{ _('Issue tracker') }}</a> | | ||||||
|         <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>{% if get_setting('general.contact_url') %} | |         <a href="{{ get_setting('brand.public_instances') }}">{{ _('Public instances') }}</a>{% if get_setting('general.contact_url') %} | | ||||||
|         <a href="{{ get_setting('general.contact_url') }}">{{ _('Contact instance maintainer') }}</a>{% endif %} |         <a href="{{ get_setting('general.contact_url') }}">{{ _('Contact instance maintainer') }}</a>{% endif %} | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ from babel.core import get_global | |||||||
| 
 | 
 | ||||||
| from searx import settings | from searx import settings | ||||||
| from searx.data import USER_AGENTS | from searx.data import USER_AGENTS | ||||||
| from searx.version import VERSION_STRING | from searx.version import VERSION_TAG | ||||||
| from searx.languages import language_codes | from searx.languages import language_codes | ||||||
| from searx.exceptions import SearxXPathSyntaxException, SearxEngineXPathException | from searx.exceptions import SearxXPathSyntaxException, SearxEngineXPathException | ||||||
| from searx import logger | from searx import logger | ||||||
| @ -44,7 +44,7 @@ NOTSET = NotSetClass() | |||||||
| def searx_useragent(): | def searx_useragent(): | ||||||
|     """Return the searx User Agent""" |     """Return the searx User Agent""" | ||||||
|     return 'searx/{searx_version} {suffix}'.format( |     return 'searx/{searx_version} {suffix}'.format( | ||||||
|            searx_version=VERSION_STRING, |            searx_version=VERSION_TAG, | ||||||
|            suffix=settings['outgoing']['useragent_suffix']).strip() |            suffix=settings['outgoing']['useragent_suffix']).strip() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										158
									
								
								searx/version.py
									
									
									
									
									
								
							
							
						
						
									
										158
									
								
								searx/version.py
									
									
									
									
									
								
							| @ -1,26 +1,142 @@ | |||||||
| # -*- coding: utf-8 -*- | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
| ''' | # lint: pylint | ||||||
| searx is free software: you can redistribute it and/or modify | # pylint: disable=missing-function-docstring,missing-module-docstring,missing-class-docstring | ||||||
| it under the terms of the GNU Affero General Public License as published by |  | ||||||
| the Free Software Foundation, either version 3 of the License, or |  | ||||||
| (at your option) any later version. |  | ||||||
| 
 | 
 | ||||||
| searx is distributed in the hope that it will be useful, | import re | ||||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | import os | ||||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | import shlex | ||||||
| GNU Affero General Public License for more details. | import subprocess | ||||||
|  | import logging | ||||||
| 
 | 
 | ||||||
| You should have received a copy of the GNU Affero General Public License | # fallback values | ||||||
| along with searx. If not, see < http://www.gnu.org/licenses/ >. | # if there is searx.version_frozen module, and it is not possible to get the git tag | ||||||
|  | VERSION_STRING = "1.0.0" | ||||||
|  | VERSION_TAG = "1.0.0" | ||||||
|  | GIT_URL = "unknow" | ||||||
|  | GIT_BRANCH = "unknow" | ||||||
| 
 | 
 | ||||||
| (C) 2013- by Adam Tauber, <asciimoo@gmail.com> | logger = logging.getLogger("searx") | ||||||
| ''' |  | ||||||
| 
 | 
 | ||||||
| # version of searx | SUBPROCESS_RUN_ENV = { | ||||||
| VERSION_MAJOR = 1 |     "PATH": os.environ["PATH"], | ||||||
| VERSION_MINOR = 0 |     "LC_ALL": "C", | ||||||
| VERSION_BUILD = 0 |     "LANGUAGE": "", | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| VERSION_STRING = "{0}.{1}.{2}".format(VERSION_MAJOR, | 
 | ||||||
|                                       VERSION_MINOR, | def subprocess_run(args, **kwargs): | ||||||
|                                       VERSION_BUILD) |     """Call :py:func:`subprocess.run` and return (striped) stdout.  If returncode is | ||||||
|  |     non-zero, raise a :py:func:`subprocess.CalledProcessError`. | ||||||
|  |     """ | ||||||
|  |     if not isinstance(args, (list, tuple)): | ||||||
|  |         args = shlex.split(args) | ||||||
|  | 
 | ||||||
|  |     kwargs["env"] = kwargs.get("env", SUBPROCESS_RUN_ENV) | ||||||
|  |     kwargs["encoding"] = kwargs.get("encoding", "utf-8") | ||||||
|  |     kwargs["stdout"] = subprocess.PIPE | ||||||
|  |     kwargs["stderr"] = subprocess.PIPE | ||||||
|  |     # raise CalledProcessError if returncode is non-zero | ||||||
|  |     kwargs["check"] = True | ||||||
|  |     proc = subprocess.run(args, **kwargs)  # pylint: disable=subprocess-run-check | ||||||
|  |     return proc.stdout.strip() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_git_url_and_branch(): | ||||||
|  |     try: | ||||||
|  |         ref = subprocess_run("git rev-parse --abbrev-ref @{upstream}") | ||||||
|  |     except subprocess.CalledProcessError: | ||||||
|  |         ref = subprocess_run("git rev-parse --abbrev-ref master@{upstream}") | ||||||
|  |     origin, git_branch = ref.split("/", 1) | ||||||
|  |     git_url = subprocess_run(["git", "remote", "get-url", origin]) | ||||||
|  | 
 | ||||||
|  |     # get https:// url from git@ url | ||||||
|  |     if git_url.startswith("git@"): | ||||||
|  |         git_url = git_url.replace(":", "/", 2).replace("git@", "https://", 1) | ||||||
|  |     if git_url.endswith(".git"): | ||||||
|  |         git_url = git_url.replace(".git", "", 1) | ||||||
|  | 
 | ||||||
|  |     return git_url, git_branch | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_git_version(): | ||||||
|  |     try: | ||||||
|  |         tag = subprocess_run("git describe HEAD") | ||||||
|  |         # a. HEAD is on tag name, example: tag = "v1.0.1" | ||||||
|  |         # b. HEAD is not a tag name, example "<tag>-<distance>-g<commit>" | ||||||
|  |         tag_version, tag_distance, tag_commit = (tag.split("-") + ["", ""])[:3] | ||||||
|  |         if re.match(r"v[0-9]+\.[0-9]+\.[0-9]+", tag_version): | ||||||
|  |             # tag_version "v1.0.0" becomes "1.0.0" (without the v) | ||||||
|  |             # other patterns are kept untouched | ||||||
|  |             tag_version = tag_version[1:] | ||||||
|  |         # remove "g" prefix from tag_commit | ||||||
|  |         if tag_commit and tag_commit[0] == "g": | ||||||
|  |             tag_commit = tag_commit[1:] | ||||||
|  |         # set git_version to "1.0.0-590-0686e274" or '1.0.0' | ||||||
|  |         git_version = "-".join(filter(bool, [tag_version, tag_distance, tag_commit])) | ||||||
|  |     except subprocess.CalledProcessError: | ||||||
|  |         # fall back to "YYYY.MM.DD.Hash" if there is no tag at all | ||||||
|  |         git_version = subprocess_run(r"git show -s --format='%as-%h'") | ||||||
|  |         # PEP 440: replace - with . | ||||||
|  |         tag_version = git_version = git_version.replace("-", ".") | ||||||
|  | 
 | ||||||
|  |     # add "-dirty" suffix if there are uncommited changes except searx/settings.yml | ||||||
|  |     try: | ||||||
|  |         subprocess_run( | ||||||
|  |             "git diff --quiet -- . ':!searx/settings.yml' ':!utils/brand.env'" | ||||||
|  |         ) | ||||||
|  |     except subprocess.CalledProcessError as e: | ||||||
|  |         if e.returncode == 1: | ||||||
|  |             git_version += "-dirty" | ||||||
|  |         else: | ||||||
|  |             logger.warning( | ||||||
|  |                 '"%s" returns an unexpected return code %i', e.returncode, e.cmd | ||||||
|  |             ) | ||||||
|  |     return git_version, tag_version | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     from searx.version_frozen import VERSION_STRING, VERSION_TAG, GIT_URL, GIT_BRANCH | ||||||
|  | except ImportError: | ||||||
|  |     try: | ||||||
|  |         try: | ||||||
|  |             VERSION_STRING, VERSION_TAG = get_git_version() | ||||||
|  |         except subprocess.CalledProcessError as ex: | ||||||
|  |             logger.error("Error while getting the version: %s", ex.stderr) | ||||||
|  |         try: | ||||||
|  |             GIT_URL, GIT_BRANCH = get_git_url_and_branch() | ||||||
|  |         except subprocess.CalledProcessError as ex: | ||||||
|  |             logger.error("Error while getting the git URL & branch: %s", ex.stderr) | ||||||
|  |     except FileNotFoundError as ex: | ||||||
|  |         logger.error("%s is not found, fallback to the default version", ex.filename) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | logger.info("version: %s", VERSION_STRING) | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     import sys | ||||||
|  | 
 | ||||||
|  |     if len(sys.argv) >= 2 and sys.argv[1] == "freeze": | ||||||
|  |         # freeze the version (to create an archive outside a git repository) | ||||||
|  |         python_code = f"""# SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # this file is generated automatically by searx/version.py | ||||||
|  | 
 | ||||||
|  | VERSION_STRING = "{VERSION_STRING}" | ||||||
|  | VERSION_TAG = "{VERSION_TAG}" | ||||||
|  | GIT_URL = "{GIT_URL}" | ||||||
|  | GIT_BRANCH = "{GIT_BRANCH}" | ||||||
|  | """ | ||||||
|  |         with open( | ||||||
|  |             os.path.join(os.path.dirname(__file__), "version_frozen.py"), "w" | ||||||
|  |         ) as f: | ||||||
|  |             f.write(python_code) | ||||||
|  |             print(f"{f.name} created") | ||||||
|  |     else: | ||||||
|  |         # output shell code to set the variables | ||||||
|  |         # usage: eval "$(python -m searx.version)" | ||||||
|  |         shell_code = f""" | ||||||
|  | VERSION_STRING="{VERSION_STRING}" | ||||||
|  | VERSION_TAG="{VERSION_TAG}" | ||||||
|  | GIT_URL="{GIT_URL}" | ||||||
|  | GIT_BRANCH="{GIT_BRANCH}" | ||||||
|  | """ | ||||||
|  |         print(shell_code) | ||||||
|  | |||||||
| @ -82,7 +82,7 @@ from searx.utils import ( | |||||||
|     dict_subset, |     dict_subset, | ||||||
|     match_language, |     match_language, | ||||||
| ) | ) | ||||||
| from searx.version import VERSION_STRING | from searx.version import VERSION_STRING, GIT_URL | ||||||
| from searx.query import RawTextQuery | from searx.query import RawTextQuery | ||||||
| from searx.plugins import plugins | from searx.plugins import plugins | ||||||
| from searx.plugins.oa_doi_rewrite import get_doi_resolver | from searx.plugins.oa_doi_rewrite import get_doi_resolver | ||||||
| @ -475,6 +475,7 @@ def render(template_name, override_theme=None, **kwargs): | |||||||
|     ] |     ] | ||||||
|     kwargs['instance_name'] = get_setting('general.instance_name') |     kwargs['instance_name'] = get_setting('general.instance_name') | ||||||
|     kwargs['searx_version'] = VERSION_STRING |     kwargs['searx_version'] = VERSION_STRING | ||||||
|  |     kwargs['searx_git_url'] = GIT_URL | ||||||
|     kwargs['get_setting'] = get_setting |     kwargs['get_setting'] = get_setting | ||||||
| 
 | 
 | ||||||
|     # helpers to create links to other pages |     # helpers to create links to other pages | ||||||
| @ -1322,7 +1323,7 @@ def config(): | |||||||
|         'version': VERSION_STRING, |         'version': VERSION_STRING, | ||||||
|         'brand': { |         'brand': { | ||||||
|             'CONTACT_URL': get_setting('general.contact_url'), |             'CONTACT_URL': get_setting('general.contact_url'), | ||||||
|             'GIT_URL': get_setting('brand.git_url'), |             'GIT_URL': GIT_URL, | ||||||
|             'DOCS_URL': get_setting('brand.docs_url'), |             'DOCS_URL': get_setting('brand.docs_url'), | ||||||
|         }, |         }, | ||||||
|         'doi_resolvers': list(settings['doi_resolvers'].keys()), |         'doi_resolvers': list(settings['doi_resolvers'].keys()), | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								setup.py
									
									
									
									
									
								
							| @ -4,10 +4,7 @@ | |||||||
| from setuptools import setup | from setuptools import setup | ||||||
| from setuptools import find_packages | from setuptools import find_packages | ||||||
| 
 | 
 | ||||||
| import os | from searx.version import VERSION_TAG, GIT_URL | ||||||
| import sys |  | ||||||
| 
 |  | ||||||
| from searx.version import VERSION_STRING |  | ||||||
| from searx import get_setting | from searx import get_setting | ||||||
| 
 | 
 | ||||||
| with open('README.rst', encoding='utf-8') as f: | with open('README.rst', encoding='utf-8') as f: | ||||||
| @ -21,12 +18,12 @@ with open('requirements-dev.txt') as f: | |||||||
| 
 | 
 | ||||||
| setup( | setup( | ||||||
|     name='searx', |     name='searx', | ||||||
|     version=VERSION_STRING, |     version=VERSION_TAG, | ||||||
|     description="A privacy-respecting, hackable metasearch engine", |     description="A privacy-respecting, hackable metasearch engine", | ||||||
|     long_description=long_description, |     long_description=long_description, | ||||||
|     url=get_setting('brand.docs_url'), |     url=get_setting('brand.docs_url'), | ||||||
|     project_urls={ |     project_urls={ | ||||||
|         "Code": get_setting('brand.git_url'), |         "Code": GIT_URL, | ||||||
|         "Issue tracker": get_setting('brand.issue_url') |         "Issue tracker": get_setting('brand.issue_url') | ||||||
|     }, |     }, | ||||||
|     classifiers=[ |     classifiers=[ | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| export GIT_URL='https://github.com/searxng/searxng' |  | ||||||
| export GIT_BRANCH='master' |  | ||||||
| export SEARX_URL='' | export SEARX_URL='' | ||||||
| export SEARX_PORT='8888' | export SEARX_PORT='8888' | ||||||
| export SEARX_BIND_ADDRESS='127.0.0.1' | export SEARX_BIND_ADDRESS='127.0.0.1' | ||||||
|  | export GIT_URL='https://github.com/searxng/searxng' | ||||||
|  | export GIT_BRANCH='master' | ||||||
|  | |||||||
| @ -10,10 +10,9 @@ from os.path import realpath, dirname, join, sep, abspath | |||||||
| repo_root = realpath(dirname(realpath(__file__)) + sep + '..') | repo_root = realpath(dirname(realpath(__file__)) + sep + '..') | ||||||
| sys.path.insert(0, repo_root) | sys.path.insert(0, repo_root) | ||||||
| 
 | 
 | ||||||
| # Under the assumption that a brand is always a fork assure that the settings | # Assure that the settings file from reposetorie's working tree is used to | ||||||
| # file from reposetorie's working tree is used to generate the build_env, not | # generate the build_env, not from /etc/searx/settings.yml. | ||||||
| # from /etc/searx/settings.yml. | os.environ['SEARX_SETTINGS_PATH'] = join(repo_root, 'etc', 'settings.yml') | ||||||
| os.environ['SEARX_SETTINGS_PATH'] = abspath(dirname(__file__) + sep + 'settings.yml') |  | ||||||
| 
 | 
 | ||||||
| def _env(*arg, **kwargs): | def _env(*arg, **kwargs): | ||||||
|     val = get_setting(*arg, **kwargs) |     val = get_setting(*arg, **kwargs) | ||||||
| @ -30,9 +29,6 @@ def _env(*arg, **kwargs): | |||||||
| 
 | 
 | ||||||
| name_val = [ | name_val = [ | ||||||
| 
 | 
 | ||||||
|     ('GIT_URL'                , 'brand.git_url'), |  | ||||||
|     ('GIT_BRANCH'             , 'brand.git_branch'), |  | ||||||
| 
 |  | ||||||
|     ('SEARX_URL'              , 'server.base_url'), |     ('SEARX_URL'              , 'server.base_url'), | ||||||
|     ('SEARX_PORT'             , 'server.port'), |     ('SEARX_PORT'             , 'server.port'), | ||||||
|     ('SEARX_BIND_ADDRESS'     , 'server.bind_address'), |     ('SEARX_BIND_ADDRESS'     , 'server.bind_address'), | ||||||
| @ -50,15 +46,17 @@ for name, option in name_val: | |||||||
|     if not os.environ.get(name, _unset) is _unset: |     if not os.environ.get(name, _unset) is _unset: | ||||||
|         del os.environ[name] |         del os.environ[name] | ||||||
| 
 | 
 | ||||||
| # After the variables are unset in the environ, we can import settings | # After the variables are unset in the environ, we can import from the searx | ||||||
| # (get_setting) from searx module. | # package (what will read the values from the settings.yml). | ||||||
| 
 | 
 | ||||||
|  | from searx.version import GIT_URL, GIT_BRANCH | ||||||
| from searx import get_setting | from searx import get_setting | ||||||
| 
 | 
 | ||||||
| print('build %s (settings from: %s)' % (brand_env, os.environ['SEARX_SETTINGS_PATH'])) | print('build %s (settings from: %s)' % (brand_env, os.environ['SEARX_SETTINGS_PATH'])) | ||||||
| sys.path.insert(0, repo_root) | sys.path.insert(0, repo_root) | ||||||
| from searx import settings |  | ||||||
| 
 | 
 | ||||||
| with open(repo_root + sep + brand_env, 'w', encoding='utf-8') as f: | with open(repo_root + sep + brand_env, 'w', encoding='utf-8') as f: | ||||||
|     for name, option in name_val: |     for name, option in name_val: | ||||||
|         print("export %s='%s'" % (name, _env(option)), file=f) |         print("export %s='%s'" % (name, _env(option)), file=f) | ||||||
|  |     print(f"export GIT_URL='{GIT_URL}'", file=f) | ||||||
|  |     print(f"export GIT_BRANCH='{GIT_BRANCH}'", file=f) | ||||||
|  | |||||||
| @ -213,20 +213,26 @@ main() { | |||||||
|                 *) usage "$_usage"; exit 42;; |                 *) usage "$_usage"; exit 42;; | ||||||
|             esac ;; |             esac ;; | ||||||
|         install) |         install) | ||||||
|             rst_title "SearXNG (install)" part |  | ||||||
|             sudo_or_exit |             sudo_or_exit | ||||||
|             case $2 in |             case $2 in | ||||||
|                 all) install_all ;; |                 all) | ||||||
|  |                     rst_title "SearXNG (install)" part | ||||||
|  |                     install_all | ||||||
|  |                     ;; | ||||||
|                 user) |                 user) | ||||||
|  |                     rst_title "SearXNG (install user)" | ||||||
|                     verify_continue_install |                     verify_continue_install | ||||||
|                     assert_user |                     assert_user | ||||||
|                     ;; |                     ;; | ||||||
|                 pyenv) |                 pyenv) | ||||||
|  |                     rst_title "SearXNG (install pyenv)" | ||||||
|                     verify_continue_install |                     verify_continue_install | ||||||
|                     create_pyenv |                     create_pyenv | ||||||
|                     ;; |                     ;; | ||||||
|                 searx-src) |                 searx-src) | ||||||
|  |                     rst_title "SearXNG (install searx-src)" | ||||||
|                     verify_continue_install |                     verify_continue_install | ||||||
|  |                     assert_user | ||||||
|                     clone_searx |                     clone_searx | ||||||
|                     install_DOT_CONFIG |                     install_DOT_CONFIG | ||||||
|                     init_SEARX_SRC |                     init_SEARX_SRC | ||||||
| @ -241,6 +247,7 @@ main() { | |||||||
|                     install_settings |                     install_settings | ||||||
|                     ;; |                     ;; | ||||||
|                 uwsgi) |                 uwsgi) | ||||||
|  |                     rst_title "SearXNG (install uwsgi)" | ||||||
|                     verify_continue_install |                     verify_continue_install | ||||||
|                     install_searx_uwsgi |                     install_searx_uwsgi | ||||||
|                     if ! service_is_available "http://${SEARX_INTERNAL_HTTP}"; then |                     if ! service_is_available "http://${SEARX_INTERNAL_HTTP}"; then | ||||||
| @ -248,9 +255,11 @@ main() { | |||||||
|                     fi |                     fi | ||||||
|                     ;; |                     ;; | ||||||
|                 packages) |                 packages) | ||||||
|  |                     rst_title "SearXNG (install packages)" | ||||||
|                     pkg_install "$SEARX_PACKAGES" |                     pkg_install "$SEARX_PACKAGES" | ||||||
|                     ;; |                     ;; | ||||||
|                 buildhost) |                 buildhost) | ||||||
|  |                     rst_title "SearXNG (install buildhost)" | ||||||
|                     pkg_install "$SEARX_PACKAGES" |                     pkg_install "$SEARX_PACKAGES" | ||||||
|                     pkg_install "$BUILD_PACKAGES" |                     pkg_install "$BUILD_PACKAGES" | ||||||
|                     ;; |                     ;; | ||||||
| @ -377,6 +386,11 @@ installations that were installed with this script." | |||||||
| assert_user() { | assert_user() { | ||||||
|     rst_title "user $SERVICE_USER" section |     rst_title "user $SERVICE_USER" section | ||||||
|     echo |     echo | ||||||
|  |     if getent passwd "$SERVICE_USER"  > /dev/null; then | ||||||
|  |        echo "user exists" | ||||||
|  |        return 0 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|     tee_stderr 1 <<EOF | bash | prefix_stdout |     tee_stderr 1 <<EOF | bash | prefix_stdout | ||||||
| useradd --shell /bin/bash --system \ | useradd --shell /bin/bash --system \ | ||||||
|  --home-dir "$SERVICE_HOME" \ |  --home-dir "$SERVICE_HOME" \ | ||||||
| @ -431,31 +445,36 @@ EOF | |||||||
| 
 | 
 | ||||||
| prompt_installation_status(){ | prompt_installation_status(){ | ||||||
| 
 | 
 | ||||||
|     local state branch remote remote_url instance_setting |     # shellcheck disable=SC2034 | ||||||
|  |     local GIT_URL GIT_BRANCH VERSION_STRING VERSION_TAG | ||||||
|  |     local ret_val state branch remote remote_url | ||||||
|     state="$(install_searx_get_state)" |     state="$(install_searx_get_state)" | ||||||
|     branch="$(git name-rev --name-only HEAD)" |  | ||||||
|     remote="$(git config branch."${branch}".remote)" |  | ||||||
|     remote_url="$(git config remote."${remote}".url)" |  | ||||||
| 
 | 
 | ||||||
|     case $state in |     case $state in | ||||||
|         missing-searx-clone) |         missing-searx-clone|missing-searx-pyenv) | ||||||
|             info_msg "${_BBlue}(status: $(install_searx_get_state))${_creset}" |             info_msg "${_BBlue}(status: $(install_searx_get_state))${_creset}" | ||||||
|             return 0 |             return 0 | ||||||
|             ;; |             ;; | ||||||
|         *) |         *) | ||||||
|             warn_msg "SearXNG instance already installed at: $SEARX_SRC" |             info_msg "SearXNG instance already installed at: $SEARX_SRC" | ||||||
|             warn_msg "status:  ${_BBlue}$(install_searx_get_state)${_creset} " |             info_msg "status:  ${_BBlue}$(install_searx_get_state)${_creset} " | ||||||
|             instance_setting="$(prompt_installation_setting brand.git_url)" |             branch="$(git name-rev --name-only HEAD)" | ||||||
|             if ! [ "$instance_setting" = "$remote_url" ]; then |             remote="$(git config branch."${branch}".remote)" | ||||||
|                 warn_msg "instance's brand.git_url: '${instance_setting}'" \ |             remote_url="$(git config remote."${remote}".url)" | ||||||
|  |             eval "$(get_installed_version_variables)" | ||||||
|  | 
 | ||||||
|  |             ret_val=0 | ||||||
|  |             if ! [ "$GIT_URL" = "$remote_url" ]; then | ||||||
|  |                 warn_msg "instance's git URL: '${GIT_URL}'" \ | ||||||
|                          "differs from local clone's remote URL: ${remote_url}" |                          "differs from local clone's remote URL: ${remote_url}" | ||||||
|  |                 ret_val=42 | ||||||
|             fi |             fi | ||||||
|             instance_setting="$(prompt_installation_setting brand.git_branch)" |             if ! [ "$GIT_BRANCH" = "$branch" ]; then | ||||||
|             if ! [ "$instance_setting" = "$branch" ]; then |                 warn_msg "instance git branch: ${GIT_BRANCH}" \ | ||||||
|                 warn_msg "instance brand.git_branch: ${instance_setting}" \ |  | ||||||
|                          "differs from local clone's branch: ${branch}" |                          "differs from local clone's branch: ${branch}" | ||||||
|  |                 ret_val=42 | ||||||
|             fi |             fi | ||||||
|             return 42 |             return $ret_val | ||||||
|             ;; |             ;; | ||||||
|     esac |     esac | ||||||
| } | } | ||||||
| @ -469,7 +488,7 @@ verify_continue_install(){ | |||||||
| 
 | 
 | ||||||
| prompt_installation_setting(){ | prompt_installation_setting(){ | ||||||
| 
 | 
 | ||||||
|     # usage:  prompt_installation_setting brand.git_url |     # usage:  prompt_installation_setting brand.docs_url | ||||||
|     # |     # | ||||||
|     # Prompts the value of the (YAML) setting in the SearXNG instance. |     # Prompts the value of the (YAML) setting in the SearXNG instance. | ||||||
| 
 | 
 | ||||||
| @ -496,6 +515,23 @@ EOF | |||||||
|     esac |     esac | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | get_installed_version_variables() { | ||||||
|  | 
 | ||||||
|  |     # usage:  eval "$(get_installed_version_variables)" | ||||||
|  |     # | ||||||
|  |     # Set variables VERSION_STRING, VERSION_TAG, GIT_URL, GIT_BRANCH | ||||||
|  | 
 | ||||||
|  |     local _state | ||||||
|  |     _state="$(install_searx_get_state)" | ||||||
|  |     case $_state in | ||||||
|  |         python-installed|installer-modified) | ||||||
|  |             sudo -H -u "${SERVICE_USER}" "${SEARX_PYENV}/bin/python" -m searx.version;; | ||||||
|  |         *) | ||||||
|  |             return 42 | ||||||
|  |             ;; | ||||||
|  |     esac | ||||||
|  | } | ||||||
|  | 
 | ||||||
| init_SEARX_SRC(){ | init_SEARX_SRC(){ | ||||||
|     rst_title "Update instance: ${SEARX_SRC}/" section |     rst_title "Update instance: ${SEARX_SRC}/" section | ||||||
| 
 | 
 | ||||||
| @ -512,20 +548,21 @@ init_SEARX_SRC(){ | |||||||
|     fi |     fi | ||||||
| 
 | 
 | ||||||
|     echo |     echo | ||||||
|     echo "Manipulating files like settings.yml can break existing installation!" |  | ||||||
|     echo "Update instance with file(s) from: ${REPO_ROOT}" |     echo "Update instance with file(s) from: ${REPO_ROOT}" | ||||||
|     echo |     echo | ||||||
|     for i in "${SEARX_SRC_INIT_FILES[@]}"; do |     for i in "${SEARX_SRC_INIT_FILES[@]}"; do | ||||||
|         echo "- $i" |         echo "- $i" | ||||||
|     done |     done | ||||||
|  |     echo | ||||||
|  |     echo "Be careful when modifying an existing installation." | ||||||
|     if ! ask_yn "Do you really want to update these files in the instance?" Yn; then |     if ! ask_yn "Do you really want to update these files in the instance?" Yn; then | ||||||
|         return 42 |         return 42 | ||||||
|     fi |     fi | ||||||
|     for fname in "${SEARX_SRC_INIT_FILES[@]}"; do |     for fname in "${SEARX_SRC_INIT_FILES[@]}"; do | ||||||
|         while true; do |         while true; do | ||||||
|             choose_one _reply "choose next step with file ${fname}" \ |             choose_one _reply "choose next step with file ${fname}" \ | ||||||
|                    "leave file unchanged" \ |  | ||||||
|                    "replace file" \ |                    "replace file" \ | ||||||
|  |                    "leave file unchanged" \ | ||||||
|                    "diff files" \ |                    "diff files" \ | ||||||
|                    "interactive shell" |                    "interactive shell" | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Alexandre Flament
						Alexandre Flament