forked from cfengine/cfengine-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalyze.py
More file actions
93 lines (76 loc) · 3.38 KB
/
analyze.py
File metadata and controls
93 lines (76 loc) · 3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from collections import OrderedDict
import os
from cfbs.utils import dict_sorted_by_key, file_sha256, version_as_comparable_list
Version = str
def initialize_vcf():
versions_dict = {"versions": {}}
checksums_dict = {"checksums": {}}
files_dict = {"files": {}}
return versions_dict, checksums_dict, files_dict
def versions_checksums_files(
files_dir_path, version, versions_dict, checksums_dict, files_dict
):
for root, _, files in os.walk(files_dir_path):
for name in files:
full_relpath = os.path.join(root, name)
tarball_relpath = os.path.relpath(full_relpath, files_dir_path)
file_checksum = file_sha256(full_relpath)
if version not in versions_dict["versions"]:
versions_dict["versions"][version] = {}
versions_dict["versions"][version][tarball_relpath] = file_checksum
if file_checksum not in checksums_dict["checksums"]:
checksums_dict["checksums"][file_checksum] = {}
if tarball_relpath not in checksums_dict["checksums"][file_checksum]:
checksums_dict["checksums"][file_checksum][tarball_relpath] = []
checksums_dict["checksums"][file_checksum][tarball_relpath].append(version)
if tarball_relpath not in files_dict["files"]:
files_dict["files"][tarball_relpath] = {}
if file_checksum not in files_dict["files"][tarball_relpath]:
files_dict["files"][tarball_relpath][file_checksum] = []
files_dict["files"][tarball_relpath][file_checksum].append(version)
return versions_dict, checksums_dict, files_dict
def finalize_vcf(versions_dict, checksums_dict, files_dict):
# explicitly sort VCF data to ensure determinism
# checksums.json:
working_dict = checksums_dict["checksums"]
for c in working_dict.keys():
for f in working_dict[c].keys():
# sort each version list, descending
working_dict[c][f] = sorted(
working_dict[c][f],
key=lambda v: version_as_comparable_list(v),
reverse=True,
)
# sort filepaths, alphabetically
working_dict[c] = dict_sorted_by_key(working_dict[c])
# sort checksums
checksums_dict["checksums"] = dict_sorted_by_key(working_dict)
# files.json:
working_dict = files_dict["files"]
# sort each list, first by version descending, then by checksum
for f in working_dict.keys():
for c in working_dict[f].keys():
# sort each version list, descending
working_dict[f][c] = sorted(
working_dict[f][c],
key=lambda v: version_as_comparable_list(v),
reverse=True,
)
# sort checksums
working_dict[f] = dict_sorted_by_key(working_dict[f])
# sort files, alphabetically
files_dict["files"] = dict_sorted_by_key(working_dict)
# versions.json:
working_dict = versions_dict["versions"]
# sort files of each version
for v in working_dict.keys():
working_dict[v] = dict_sorted_by_key(working_dict[v])
# sort version numbers, in decreasing order
versions_dict["versions"] = OrderedDict(
sorted(
working_dict.items(),
key=lambda p: version_as_comparable_list(p[0]),
reverse=True,
)
)
return versions_dict, checksums_dict, files_dict