Allow custom config files.

- Needed to switch from a timestamp to a checksum.
- Added a --config command line option.
This commit is contained in:
Andrew Hamilton 2021-12-15 00:07:59 +10:00
parent f8177ef58d
commit 2c3043c633
3 changed files with 45 additions and 14 deletions

View file

@ -18,6 +18,7 @@ import asyncio
import contextlib
import functools
import gzip
import hashlib
import importlib
import importlib.resources
import itertools
@ -39,7 +40,6 @@ import pyinotify
import termstr
import eris
import eris.tools as tools
import eris.worker as worker
import eris.paged_list as paged_list
import sorted_collection
@ -65,6 +65,7 @@ Options:
highlighting. Defaults to "native".
-c TYPE, --compression=TYPE The type of compression used in the cache:
gzip, lzma, bz2, or none. Defaults to gzip.
--config=FILE_NAME Use a custom config file instead of tools.toml.
"""
@ -1068,21 +1069,36 @@ def chdir(path):
os.chdir(old_cwd)
def source_checksum():
resources = ["__main__.py", "tools.py"]
if "config" not in os.environ:
resources.append("tools.toml")
checksum_paths = []
for resource in resources:
with importlib.resources.path(eris, resource) as resource_path:
checksum_paths.append(resource_path)
if "config" in os.environ:
checksum_paths.append(os.environ["config"])
sha256 = hashlib.sha256()
for path in checksum_paths:
with open(path, "rb") as source_file:
sha256.update(source_file.read())
return sha256.hexdigest()
def manage_cache(root_path):
cache_path = os.path.join(root_path, tools.CACHE_PATH)
timestamp_path = os.path.join(cache_path, "creation_time")
checksum_path = os.path.join(cache_path, "source_checksum")
if os.path.exists(cache_path):
timestamp = os.stat(timestamp_path).st_mtime
for resource_path in ["__main__.py", "tools.py", "tools.toml"]:
with importlib.resources.path(eris, resource_path) as resource:
if resource.stat().st_mtime > timestamp:
print("Eris has been updated, so clearing the cache and"
" recalculating all results…")
shutil.rmtree(cache_path)
break
with open(checksum_path, "r") as checksum_file:
cache_checksum = checksum_file.read()
if source_checksum() != cache_checksum:
print("Eris has been changed, so clearing the cache and recalculating all results…")
shutil.rmtree(cache_path)
if not os.path.exists(cache_path):
os.mkdir(cache_path)
open(timestamp_path, "w").close()
with open(checksum_path, "w") as checksum_file:
checksum_file.write(source_checksum())
def print_tool_info():
@ -1105,11 +1121,19 @@ def print_tool_info():
def check_arguments():
global tools
cmdline_help = __doc__ + USAGE.replace("*", "")
arguments = docopt.docopt(cmdline_help, help=False)
if arguments["--help"]:
print(cmdline_help)
sys.exit(0)
if arguments["--config"] is not None:
config_path = arguments["--config"]
if not os.path.exists(config_path):
print("File does not exist:", config_path)
sys.exit(1)
os.environ["ERIS_CONFIG"] = config_path
import eris.tools as tools
if arguments["--info"]:
print_tool_info()
sys.exit(0)

View file

@ -460,8 +460,13 @@ def make_tool_function(dependencies, command, url=None, error_status=None,
elinks, git_diff, git_blame = None, None, None # For linters.
with importlib.resources.open_text(eris, "tools.toml") as tools_toml_file:
tools_toml = toml.load(tools_toml_file)
if "ERIS_CONFIG" in os.environ:
tools_toml = toml.load(os.environ["ERIS_CONFIG"])
else:
with importlib.resources.open_text(eris, "tools.toml") as tools_toml_file:
tools_toml = toml.load(tools_toml_file)
tools_for_extensions = tools_toml["tools_for_extensions"]
del tools_toml["tools_for_extensions"]
for tool_name, tool_toml in tools_toml.items():

View file

@ -13,6 +13,8 @@ import fill3
import golden
import eris.__main__ as __main__
import eris.tools as tools
__main__.tools = tools
os.environ["TERM"] = "xterm-256color"
@ -204,7 +206,7 @@ class MainTestCase(unittest.TestCase):
with contextlib.redirect_stdout(io.StringIO()):
loop.run_until_complete(__main__.main("test",
root_path, worker_count=2, is_being_tested=True))
for file_name in ["summary.pickle", "creation_time",
for file_name in ["summary.pickle", "source_checksum",
"foo-metadata", "foo-contents"]:
self.assertTrue(os.path.exists(".eris/" + file_name))
self.assertEqual(_mount_total(), mount_total)