diff --git a/analysis/softenv_analysis.py b/analysis/softenv_analysis.py index 759820e..643f49f 100755 --- a/analysis/softenv_analysis.py +++ b/analysis/softenv_analysis.py @@ -42,7 +42,47 @@ def sources_stats(input_table): pkgmgr[row[2]] += 1 return pkgmgr -# def pkg_changed(pkgname, ) +def pkg_changed(table, artifact_name, pkgname, pkgsource): + """ + Analyzes the given package lists table to determine if the given package + changed for the given artifact. + + Parameters + ---------- + table: str + Table to analyse. + + artifact_name: str + Name of the artifact for which we want to analyze package changes. + + pkgname: str + The package we want to track changes. + + pkgsource: str + Source of the package, in case there is multiple packages with the + same name but different sources. + + Returns + ------- + changed: bool + True if the version number of the package changed over time, False + otherwise. + """ + changed = False + i = 0 + pkgver = "" + while i < len(table) and not changed: + row = table[i] + # Artifact name is in the 4th column, package name in the first, + # and package source in the 3rd: + if row[3] == artifact_name and row[0] == pkgname and row[2] == pkgsource: + # If the first version number has not been saved yet: + if pkgver == "": + pkgver = row[1] # Package version is in the 2nd column + elif row[1] != pkgver: + changed = True + i += 1 + return changed def pkgs_changes(input_table): """ @@ -59,15 +99,27 @@ def pkgs_changes(input_table): dict Output table of the analysis in the form of a dict with headers as keys. """ - pkgmgr = {} + pkgchanges_dict = {} + # Key is the artifact name, and value is a list of tuples constituted + # of the package that has been checked and its source for this artifact: + # FIXME: Memory usage? + checked_artifacts = {} i = 0 for row in input_table: - # Third column is the package source: - if row[2] not in pkgmgr: - pkgmgr[row[2]] = 1 - else: - pkgmgr[row[2]] += 1 - return pkgmgr + artifact_name = row[3] # Artifact name is in the 4th column + if artifact_name not in checked_artifacts.keys(): + checked_artifacts[artifact_name] = [] + pkgname = row[0] # Package name is in the first column + pkgsource = row[2] # Package source is in the 3rd column + if (pkgname, pkgsource) not in checked_artifacts[artifact_name]: + if pkg_changed(input_table, artifact_name, pkgname, pkgsource): + # Third column is the package source: + if row[2] not in pkgchanges_dict: + pkgchanges_dict[row[2]] = 1 + else: + pkgchanges_dict[row[2]] += 1 + checked_artifacts[artifact_name].append((pkgname, pkgsource)) + return pkgchanges_dict def pkgs_per_container(input_table): """ diff --git a/ecg.py b/ecg.py index 8b284a1..289bd1a 100755 --- a/ecg.py +++ b/ecg.py @@ -201,7 +201,6 @@ def buildresult_saver(result, buildstatus_path, config_path): ------- None """ - file_exists = os.path.exists(buildstatus_path) buildstatus_file = open(buildstatus_path, "a") artifact_name = os.path.basename(config_path).split(".")[0] # # Writing header in case file didn't exist: @@ -244,7 +243,6 @@ def build_image(config, src_dir, image_name, docker_cache = False): build_command = f"docker build{cache_arg} -t {image_name} ." build_process = subprocess.run(build_command.split(" "), cwd=path, capture_output=True) build_output = f"stdout:\n{build_process.stdout.decode('utf-8')}\nstderr:\n{build_process.stderr.decode('utf-8')}" - # build_output = build_process.stderr.decode("utf-8") logging.info(f"Output of '{build_command}':") logging.info(build_output) return_code = build_process.returncode @@ -284,7 +282,7 @@ def check_env(config, src_dir, artifact_name, pkglist_path): # of the package manager, depending on the package managers. # Each package manager is associated with a tuple, the first item being # the package manager's command, the second being the arguments for the - # query (they must be separate for the "--entrypoint" argument of Docker + # query (they must be separated for the "--entrypoint" argument of Docker # 'run', see below), and the third one being the command that will format # the output of the query command (this one can be an empty string in case # the formatting part is already done using the options of the first command). @@ -453,8 +451,6 @@ def main(): try: config_file = open(config_path, "r") config = json.loads(config_file.read()) - # config = yaml.safe_load(config_file) - # print(config) config_file.close() dl_dir = None