2024-10-08 06:45:11 +00:00
__package__ = ' archivebox.config '
import os
import importlib . metadata
from pathlib import Path
from functools import cache
from datetime import datetime
from typing import Optional
#############################################################################################
IN_DOCKER = os . environ . get ( ' IN_DOCKER ' , False ) in ( ' 1 ' , ' true ' , ' True ' , ' TRUE ' , ' yes ' )
PACKAGE_DIR : Path = Path ( __file__ ) . resolve ( ) . parent . parent # archivebox source code dir
DATA_DIR : Path = Path ( os . getcwd ( ) ) . resolve ( ) # archivebox user data dir
ARCHIVE_DIR : Path = DATA_DIR / ' archive ' # archivebox snapshot data dir
#############################################################################################
@cache
def detect_installed_version ( PACKAGE_DIR : Path = PACKAGE_DIR ) :
""" Autodetect the installed archivebox version by using pip package metadata, pyproject.toml file, or package.json file """
try :
# if in production install, use pip-installed package metadata
return importlib . metadata . version ( ' archivebox ' ) . strip ( )
except importlib . metadata . PackageNotFoundError :
pass
try :
# if in dev Git repo dir, use pyproject.toml file
pyproject_config = ( PACKAGE_DIR . parent / ' pyproject.toml ' ) . read_text ( ) . split ( ' \n ' )
for line in pyproject_config :
if line . startswith ( ' version = ' ) :
return line . split ( ' = ' , 1 ) [ - 1 ] . strip ( ' " ' ) . strip ( )
except FileNotFoundError :
# building docs, pyproject.toml is not available
pass
# raise Exception('Failed to detect installed archivebox version!')
return ' dev '
@cache
def get_COMMIT_HASH ( ) - > Optional [ str ] :
try :
2024-10-29 01:47:45 +00:00
git_dir = PACKAGE_DIR . parent / ' .git '
2024-10-08 06:45:11 +00:00
ref = ( git_dir / ' HEAD ' ) . read_text ( ) . strip ( ) . split ( ' ' ) [ - 1 ]
commit_hash = git_dir . joinpath ( ref ) . read_text ( ) . strip ( )
return commit_hash
except Exception :
pass
try :
2024-10-29 01:47:45 +00:00
return list ( ( PACKAGE_DIR . parent / ' .git/refs/heads/ ' ) . glob ( ' * ' ) ) [ 0 ] . read_text ( ) . strip ( )
2024-10-08 06:45:11 +00:00
except Exception :
pass
return None
@cache
def get_BUILD_TIME ( ) - > str :
if IN_DOCKER :
2024-10-29 01:47:45 +00:00
try :
# if we're in the archivebox official docker image, /VERSION.txt will contain the build time
docker_build_end_time = Path ( ' /VERSION.txt ' ) . read_text ( ) . rsplit ( ' BUILD_END_TIME= ' ) [ - 1 ] . split ( ' \n ' , 1 ) [ 0 ]
return docker_build_end_time
except Exception :
pass
2024-10-08 06:45:11 +00:00
src_last_modified_unix_timestamp = ( PACKAGE_DIR / ' README.md ' ) . stat ( ) . st_mtime
return datetime . fromtimestamp ( src_last_modified_unix_timestamp ) . strftime ( ' % Y- % m- %d % H: % M: % S %s ' )
# def get_versions_available_on_github(config):
# """
# returns a dictionary containing the ArchiveBox GitHub release info for
# the recommended upgrade version and the currently installed version
# """
# # we only want to perform the (relatively expensive) check for new versions
# # when its most relevant, e.g. when the user runs a long-running command
# subcommand_run_by_user = sys.argv[3] if len(sys.argv) > 3 else 'help'
# long_running_commands = ('add', 'schedule', 'update', 'status', 'server')
# if subcommand_run_by_user not in long_running_commands:
# return None
# github_releases_api = "https://api.github.com/repos/ArchiveBox/ArchiveBox/releases"
# response = requests.get(github_releases_api)
# if response.status_code != 200:
# stderr(f'[!] Warning: GitHub API call to check for new ArchiveBox version failed! (status={response.status_code})', color='lightyellow', config=config)
# return None
# all_releases = response.json()
# installed_version = parse_version_string(config['VERSION'])
# # find current version or nearest older version (to link to)
# current_version = None
# for idx, release in enumerate(all_releases):
# release_version = parse_version_string(release['tag_name'])
# if release_version <= installed_version:
# current_version = release
# break
# current_version = current_version or all_releases[-1]
# # recommended version is whatever comes after current_version in the release list
# # (perhaps too conservative to only recommend upgrading one version at a time, but it's safest)
# try:
# recommended_version = all_releases[idx+1]
# except IndexError:
# recommended_version = None
# return {'recommended_version': recommended_version, 'current_version': current_version}
# def can_upgrade(config):
# if config['VERSIONS_AVAILABLE'] and config['VERSIONS_AVAILABLE']['recommended_version']:
# recommended_version = parse_version_string(config['VERSIONS_AVAILABLE']['recommended_version']['tag_name'])
# current_version = parse_version_string(config['VERSIONS_AVAILABLE']['current_version']['tag_name'])
# return recommended_version > current_version
# return False
VERSION : str = detect_installed_version ( )