commit: 051f684fe3e6150bf26a445b9c18092742b6a240 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> AuthorDate: Tue Dec 29 01:43:53 2015 +0000 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> CommitDate: Tue Dec 29 01:43:53 2015 +0000 URL: https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=051f684f
Create a file extension search order system for source paths Adds a new source_matching setting to the config, defaults to "strict". Allows for the possibility of multiple compression types to be present in teh same directory and allow for a prefered matching system. catalyst/base/stagebase.py | 35 +++++++++++++++++++++++------------ catalyst/defaults.py | 1 + catalyst/support.py | 13 +++++++++++-- etc/catalyst.conf | 12 ++++++++++++ 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/catalyst/base/stagebase.py b/catalyst/base/stagebase.py index c800c34..8891b3f 100644 --- a/catalyst/base/stagebase.py +++ b/catalyst/base/stagebase.py @@ -143,6 +143,19 @@ class StageBase(TargetBase, ClearBase, GenBase): # This must be set first as other set_ options depend on this self.set_spec_prefix() + # Initialize our (de)compressor's) + self.decompressor = CompressMap(self.settings["decompress_definitions"], + env=self.env, + search_order=self.settings["decompressor_search_order"]) + self.accepted_extensions = self.decompressor.search_order_extensions( + self.settings["decompressor_search_order"]) + log.notice("Source file specification matching setting is: %s", + self.settings["source_matching"]) + log.notice("Accepted source file extensions search order: %s", + self.accepted_extensions) + # save resources, it is not always needed + self.compressor = None + # Define all of our core variables self.set_target_profile() self.set_target_subpath() @@ -254,14 +267,6 @@ class StageBase(TargetBase, ClearBase, GenBase): self.env["PORT_LOGDIR"] = self.settings["port_logdir"] self.env["PORT_LOGDIR_CLEAN"] = PORT_LOGDIR_CLEAN - # Initialize our (de)compressor's) - self.decompressor = CompressMap(self.settings["decompress_definitions"], - env=self.env, - search_order=self.settings["decompressor_search_order"]) - - # save resources, it is not always needed - self.compressor = None - def override_cbuild(self): if "CBUILD" in self.makeconf: self.settings["CBUILD"]=self.makeconf["CBUILD"] @@ -416,7 +421,9 @@ class StageBase(TargetBase, ClearBase, GenBase): self.settings["source_subpath"]) self.settings["source_path"] = file_check( normpath(self.settings["storedir"] + "/builds/" + - self.settings["source_subpath"]) + self.settings["source_subpath"]), + self.accepted_extensions, + self.settings["source_matching"] in ["strict"] ) log.debug('Source path returned from file_check is: %s', self.settings["source_path"]) @@ -441,9 +448,13 @@ class StageBase(TargetBase, ClearBase, GenBase): "/root/*", self.settings["portdir"]] def set_snapshot_path(self): - self.settings["snapshot_path"]= file_check(normpath(self.settings["storedir"]+\ - "/snapshots/" + self.settings["snapshot_name"] + - self.settings["snapshot"])) + self.settings["snapshot_path"]= file_check( + normpath(self.settings["storedir"]+\ + "/snapshots/" + self.settings["snapshot_name"] + + self.settings["snapshot"]), + self.accepted_extensions, + self.settings["source_matching"] is "strict" + ) log.info('SNAPSHOT_PATH set to: %s', self.settings['snapshot_path']) self.settings["snapshot_path_hash"] = \ self.settings["hash_map"].generate_hash( diff --git a/catalyst/defaults.py b/catalyst/defaults.py index c5162d6..a0e3ea8 100644 --- a/catalyst/defaults.py +++ b/catalyst/defaults.py @@ -43,6 +43,7 @@ confdefaults={ "shdir": "/usr/share/catalyst/targets/", "snapshot_cache": "/var/tmp/catalyst/snapshot_cache", "snapshot_name": "portage-", + "source_matching": "strict", "storedir": "/var/tmp/catalyst", } diff --git a/catalyst/support.py b/catalyst/support.py index e132568..97fe562 100644 --- a/catalyst/support.py +++ b/catalyst/support.py @@ -55,7 +55,7 @@ def cmd(mycmd, myexc="", env=None, debug=False, fail_func=None): print_traceback=False) -def file_check(filepath): +def file_check(filepath, extensions=None, strict=True): '''Check for the files existence and that only one exists if others are found with various extensions ''' @@ -68,9 +68,18 @@ def file_check(filepath): files = [x for x in files if not x.endswith(".CONTENTS") and not x.endswith(".DIGESTS")] if len(files) is 1: return files[0] - elif len(files) > 1: + elif len(files) > 1 and strict: msg = "Ambiguos Filename: %s\nPlease specify the correct extension as well" % filepath raise CatalystError(msg, print_traceback=False) + else: + target_file = None + for ext in extensions: + target = filepath + "." + ext + if target in files: + target_file = target + break + if target_file: + return target_file raise CatalystError("File Not Found: %s" % filepath) diff --git a/etc/catalyst.conf b/etc/catalyst.conf index 939e941..734e428 100644 --- a/etc/catalyst.conf +++ b/etc/catalyst.conf @@ -102,6 +102,18 @@ snapshot_cache="/var/tmp/catalyst/snapshot_cache" # also where it will put its temporary files and caches. storedir="/var/tmp/catalyst" +# source_matching specifies how catalyst will match non-specific file names +# if the filename is not found as an exact match. +# ie: a filename without the extension specified. "/path/to/foo" +# +# possible values are: +# "strict" meaning if more than one file of that name is present with any +# file extension, then it will raise an exception. +# "loose" meaning it will search for an existing filename with an added +# extension from an ordered list of extensions determined from the +# decompressor_search_order specification in the spec file or (default) +source_matching="strict" + # port_logdir is where all build logs will be kept. This dir will be automatically cleaned # of all logs over 30 days old. If left undefined the logs will remain in the build directory # as usual and get cleaned every time a stage build is restarted.