machineconfig 4.1__py3-none-any.whl → 4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,162 +1,47 @@
1
1
 
2
2
  from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
3
- from machineconfig.utils.accessories import split_list
4
- from typing import Literal
3
+ # from machineconfig.utils.accessories import split_list
4
+ from typing import Literal, Protocol
5
+ from machineconfig.cluster.sessions_managers.utils.load_balancer_helper import restrict_num_tabs_helper1, restrict_num_tabs_helper2, restrict_num_tabs_helper3, restrict_num_tabs_helper4
5
6
 
7
+ class COMMAND_SPLITTER(Protocol):
8
+ def __call__(self, command: str, to: int) -> list[str]: ...
6
9
 
7
10
 
8
- def split_tabs_by_weight(tabs: list[TabConfig], max_weight: int) -> list[list[TabConfig]]:
9
- """Split tabs into chunks where each chunk's total weight <= max_weight."""
10
- chunks: list[list[TabConfig]] = []
11
- current_chunk: list[TabConfig] = []
12
- current_weight = 0
13
- for tab in tabs:
14
- tab_weight = tab.get("tabWeight", 1)
15
- if current_weight + tab_weight > max_weight and current_chunk:
16
- chunks.append(current_chunk)
17
- current_chunk = [tab]
18
- current_weight = tab_weight
19
- else:
20
- current_chunk.append(tab)
21
- current_weight += tab_weight
22
-
23
- if current_chunk:
24
- chunks.append(current_chunk)
25
-
26
- return chunks
27
-
28
-
29
- def combine_tabs_into_super_tabs(tabs: list[TabConfig], num_super_tabs: int) -> list[TabConfig]:
30
- """Combine tabs into num_super_tabs super tabs with combined commands."""
31
- if len(tabs) <= num_super_tabs:
32
- return tabs # No need to combine
33
-
34
- tab_groups = split_list(tabs, to=num_super_tabs)
35
- super_tabs: list[TabConfig] = []
36
- for idx, group in enumerate(tab_groups):
37
- if len(group) == 1:
38
- super_tabs.append(group[0])
39
- else:
40
- combined_command = "; ".join(tab["command"] for tab in group)
41
- combined_name = f"super_tab_{idx+1}"
42
- # Use startDir of the first tab
43
- start_dir = group[0]["startDir"]
44
- # Sum weights
45
- total_weight = sum(tab.get("tabWeight", 1) for tab in group)
46
- super_tabs.append({
47
- "tabName": combined_name,
48
- "startDir": start_dir,
49
- "command": combined_command,
50
- "tabWeight": total_weight
51
- })
52
- return super_tabs
53
-
54
-
55
- def combine_tabs_by_weight_into_super_tabs(tabs: list[TabConfig], max_weight: int) -> list[TabConfig]:
56
- """Combine tabs into super tabs where each super tab has weight <= max_weight."""
57
- tab_groups = split_tabs_by_weight(tabs, max_weight=max_weight)
58
- super_tabs: list[TabConfig] = []
59
- for idx, group in enumerate(tab_groups):
60
- if len(group) == 1:
61
- super_tabs.append(group[0])
62
- else:
63
- combined_command = "; ".join(tab["command"] for tab in group)
64
- combined_name = f"super_tab_{idx+1}"
65
- start_dir = group[0]["startDir"]
66
- total_weight = sum(tab.get("tabWeight", 1) for tab in group)
67
- super_tabs.append({
68
- "tabName": combined_name,
69
- "startDir": start_dir,
70
- "command": combined_command,
71
- "tabWeight": total_weight
72
- })
73
- return super_tabs
74
-
75
-
76
- def restrict_num_tabs(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number", "weight"], breaking_method: Literal["moreLayouts", "combineTabs"]) -> list[LayoutConfig]:
11
+ def limit_tab_num(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number", "weight"], breaking_method: Literal["moreLayouts", "combineTabs"]) -> list[LayoutConfig]:
77
12
  match threshold_type, breaking_method:
78
13
  case "number", "moreLayouts":
79
- return _restrict_num_tabs_helper1(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
14
+ return restrict_num_tabs_helper1(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
80
15
  case "number", "combineTabs":
81
- return _restrict_num_tabs_helper2(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
16
+ return restrict_num_tabs_helper2(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
82
17
  case "weight", "moreLayouts":
83
- return _restrict_num_tabs_helper3(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
18
+ return restrict_num_tabs_helper3(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
84
19
  case "weight", "combineTabs":
85
- return _restrict_num_tabs_helper4(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
20
+ return restrict_num_tabs_helper4(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=threshold_type, breaking_method=breaking_method)
86
21
  case _:
87
22
  raise NotImplementedError(f"The combination {threshold_type}, {breaking_method} is not implemented")
88
-
89
-
90
- def _restrict_num_tabs_helper1(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number"], breaking_method: Literal["moreLayouts"]) -> list[LayoutConfig]:
91
- """When threshold is exceeded, create more layouts with max_thresh tabs each."""
92
- new_layout_configs: list[LayoutConfig] = []
93
- for a_layout_config in layout_configs:
94
- if len(a_layout_config["layoutTabs"]) > max_thresh:
95
- print(f"Layout '{a_layout_config['layoutName']}' has too many tabs ({len(a_layout_config['layoutTabs'])} > {max_thresh}). Splitting into multiple layouts.")
96
- tab_chunks = split_list(a_layout_config["layoutTabs"], every=max_thresh)
97
- for idx, tab_chunk in enumerate(tab_chunks):
98
- new_layout_configs.append({
99
- "layoutName": f"{a_layout_config['layoutName']}_part{idx+1}",
100
- "layoutTabs": tab_chunk
101
- })
102
- else:
103
- print(f"Layout '{a_layout_config['layoutName']}' has acceptable number of tabs ({len(a_layout_config['layoutTabs'])} <= {max_thresh}). Keeping as is.")
104
- new_layout_configs.append(a_layout_config)
105
- return new_layout_configs
106
-
107
-
108
- def _restrict_num_tabs_helper2(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number"], breaking_method: Literal["combineTabs"]) -> list[LayoutConfig]:
109
- """When threshold is exceeded, combine tabs into super tabs to reduce count to max_thresh."""
110
- new_layout_configs: list[LayoutConfig] = []
111
- for a_layout_config in layout_configs:
112
- num_tabs = len(a_layout_config["layoutTabs"])
113
- if num_tabs > max_thresh:
114
- print(f"Layout '{a_layout_config['layoutName']}' has too many tabs ({num_tabs} > {max_thresh}). Combining into {max_thresh} super tabs.")
115
- super_tabs = combine_tabs_into_super_tabs(a_layout_config["layoutTabs"], num_super_tabs=max_thresh)
116
- new_layout_configs.append({
117
- "layoutName": a_layout_config["layoutName"],
118
- "layoutTabs": super_tabs
119
- })
120
- else:
121
- print(f"Layout '{a_layout_config['layoutName']}' has acceptable number of tabs ({num_tabs} <= {max_thresh}). Keeping as is.")
122
- new_layout_configs.append(a_layout_config)
123
- return new_layout_configs
124
-
125
-
126
- def _restrict_num_tabs_helper3(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["weight"], breaking_method: Literal["moreLayouts"]) -> list[LayoutConfig]:
127
- """When threshold is exceeded, create more layouts with max_thresh total weight each."""
128
- new_layout_configs: list[LayoutConfig] = []
129
- for a_layout_config in layout_configs:
130
- layout_weight = sum(tab.get("tabWeight", 1) for tab in a_layout_config["layoutTabs"])
131
- if layout_weight > max_thresh:
132
- print(f"Layout '{a_layout_config['layoutName']}' has too much weight ({layout_weight} > {max_thresh}). Splitting into multiple layouts.")
133
- tab_chunks = split_tabs_by_weight(a_layout_config["layoutTabs"], max_weight=max_thresh)
134
- for idx, tab_chunk in enumerate(tab_chunks):
135
- new_layout_configs.append({
136
- "layoutName": f"{a_layout_config['layoutName']}_part{idx+1}",
137
- "layoutTabs": tab_chunk
138
- })
139
- else:
140
- print(f"Layout '{a_layout_config['layoutName']}' has acceptable total weight ({layout_weight} <= {max_thresh}). Keeping as is.")
141
- new_layout_configs.append(a_layout_config)
142
- return new_layout_configs
143
-
144
-
145
- def _restrict_num_tabs_helper4(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["weight"], breaking_method: Literal["combineTabs"]) -> list[LayoutConfig]:
146
- """When threshold is exceeded, combine tabs into super tabs with weight <= max_thresh."""
23
+ def limit_tab_weight(layout_configs: list[LayoutConfig], max_weight: int, command_splitter: COMMAND_SPLITTER) -> list[LayoutConfig]:
147
24
  new_layout_configs: list[LayoutConfig] = []
148
25
  for a_layout_config in layout_configs:
149
- layout_weight = sum(tab.get("tabWeight", 1) for tab in a_layout_config["layoutTabs"])
150
- if layout_weight > max_thresh:
151
- print(f"Layout '{a_layout_config['layoutName']}' has too much weight ({layout_weight} > {max_thresh}). Combining into super tabs with weight <= {max_thresh}.")
152
- super_tabs = combine_tabs_by_weight_into_super_tabs(a_layout_config["layoutTabs"], max_weight=max_thresh)
153
- new_layout_configs.append({
154
- "layoutName": a_layout_config["layoutName"],
155
- "layoutTabs": super_tabs
156
- })
157
- else:
158
- print(f"Layout '{a_layout_config['layoutName']}' has acceptable total weight ({layout_weight} <= {max_thresh}). Keeping as is.")
159
- new_layout_configs.append(a_layout_config)
26
+ new_tabs: list[TabConfig] = []
27
+ for tab in a_layout_config["layoutTabs"]:
28
+ tab_weight = tab.get("tabWeight", 1)
29
+ if tab_weight > max_weight:
30
+ print(f"Tab '{tab['tabName']}' in layout '{a_layout_config['layoutName']}' has too much weight ({tab_weight} > {max_weight}). Splitting command.")
31
+ split_commands = command_splitter(tab["command"], to=max_weight)
32
+ for idx, cmd in enumerate(split_commands):
33
+ new_tabs.append({
34
+ "tabName": f"{tab['tabName']}_part{idx+1}",
35
+ "startDir": tab["startDir"],
36
+ "command": cmd,
37
+ "tabWeight": max_weight
38
+ })
39
+ else:
40
+ new_tabs.append(tab)
41
+ new_layout_configs.append({
42
+ "layoutName": a_layout_config["layoutName"],
43
+ "layoutTabs": new_tabs
44
+ })
160
45
  return new_layout_configs
161
46
 
162
47
 
@@ -0,0 +1,145 @@
1
+ from machineconfig.utils.accessories import split_list
2
+ from machineconfig.utils.schemas.layouts.layout_types import TabConfig, LayoutConfig
3
+
4
+ from typing import Literal
5
+
6
+
7
+ def split_tabs_by_weight(tabs: list[TabConfig], max_weight: int) -> list[list[TabConfig]]:
8
+ """Split tabs into chunks where each chunk's total weight <= max_weight."""
9
+ chunks: list[list[TabConfig]] = []
10
+ current_chunk: list[TabConfig] = []
11
+ current_weight = 0
12
+ for tab in tabs:
13
+ tab_weight = tab.get("tabWeight", 1)
14
+ if current_weight + tab_weight > max_weight and current_chunk:
15
+ chunks.append(current_chunk)
16
+ current_chunk = [tab]
17
+ current_weight = tab_weight
18
+ else:
19
+ current_chunk.append(tab)
20
+ current_weight += tab_weight
21
+
22
+ if current_chunk:
23
+ chunks.append(current_chunk)
24
+
25
+ return chunks
26
+
27
+
28
+ def combine_tabs_into_super_tabs(tabs: list[TabConfig], num_super_tabs: int) -> list[TabConfig]:
29
+ """Combine tabs into num_super_tabs super tabs with combined commands."""
30
+ if len(tabs) <= num_super_tabs:
31
+ return tabs # No need to combine
32
+
33
+ tab_groups = split_list(tabs, to=num_super_tabs)
34
+ super_tabs: list[TabConfig] = []
35
+ for idx, group in enumerate(tab_groups):
36
+ if len(group) == 1:
37
+ super_tabs.append(group[0])
38
+ else:
39
+ combined_command = "; ".join(tab["command"] for tab in group)
40
+ combined_name = f"super_tab_{idx+1}"
41
+ # Use startDir of the first tab
42
+ start_dir = group[0]["startDir"]
43
+ # Sum weights
44
+ total_weight = sum(tab.get("tabWeight", 1) for tab in group)
45
+ super_tabs.append({
46
+ "tabName": combined_name,
47
+ "startDir": start_dir,
48
+ "command": combined_command,
49
+ "tabWeight": total_weight
50
+ })
51
+ return super_tabs
52
+
53
+
54
+ def combine_tabs_by_weight_into_super_tabs(tabs: list[TabConfig], max_weight: int) -> list[TabConfig]:
55
+ """Combine tabs into super tabs where each super tab has weight <= max_weight."""
56
+ tab_groups = split_tabs_by_weight(tabs, max_weight=max_weight)
57
+ super_tabs: list[TabConfig] = []
58
+ for idx, group in enumerate(tab_groups):
59
+ if len(group) == 1:
60
+ super_tabs.append(group[0])
61
+ else:
62
+ combined_command = "; ".join(tab["command"] for tab in group)
63
+ combined_name = f"super_tab_{idx+1}"
64
+ start_dir = group[0]["startDir"]
65
+ total_weight = sum(tab.get("tabWeight", 1) for tab in group)
66
+ super_tabs.append({
67
+ "tabName": combined_name,
68
+ "startDir": start_dir,
69
+ "command": combined_command,
70
+ "tabWeight": total_weight
71
+ })
72
+ return super_tabs
73
+
74
+
75
+ def restrict_num_tabs_helper1(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number"], breaking_method: Literal["moreLayouts"]) -> list[LayoutConfig]:
76
+ """When threshold is exceeded, create more layouts with max_thresh tabs each."""
77
+ new_layout_configs: list[LayoutConfig] = []
78
+ for a_layout_config in layout_configs:
79
+ if len(a_layout_config["layoutTabs"]) > max_thresh:
80
+ print(f"Layout '{a_layout_config['layoutName']}' has too many tabs ({len(a_layout_config['layoutTabs'])} > {max_thresh}). Splitting into multiple layouts.")
81
+ tab_chunks = split_list(a_layout_config["layoutTabs"], every=max_thresh)
82
+ for idx, tab_chunk in enumerate(tab_chunks):
83
+ new_layout_configs.append({
84
+ "layoutName": f"{a_layout_config['layoutName']}_part{idx+1}",
85
+ "layoutTabs": tab_chunk
86
+ })
87
+ else:
88
+ print(f"Layout '{a_layout_config['layoutName']}' has acceptable number of tabs ({len(a_layout_config['layoutTabs'])} <= {max_thresh}). Keeping as is.")
89
+ new_layout_configs.append(a_layout_config)
90
+ return new_layout_configs
91
+
92
+
93
+ def restrict_num_tabs_helper2(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["number"], breaking_method: Literal["combineTabs"]) -> list[LayoutConfig]:
94
+ """When threshold is exceeded, combine tabs into super tabs to reduce count to max_thresh."""
95
+ new_layout_configs: list[LayoutConfig] = []
96
+ for a_layout_config in layout_configs:
97
+ num_tabs = len(a_layout_config["layoutTabs"])
98
+ if num_tabs > max_thresh:
99
+ print(f"Layout '{a_layout_config['layoutName']}' has too many tabs ({num_tabs} > {max_thresh}). Combining into {max_thresh} super tabs.")
100
+ super_tabs = combine_tabs_into_super_tabs(a_layout_config["layoutTabs"], num_super_tabs=max_thresh)
101
+ new_layout_configs.append({
102
+ "layoutName": a_layout_config["layoutName"],
103
+ "layoutTabs": super_tabs
104
+ })
105
+ else:
106
+ print(f"Layout '{a_layout_config['layoutName']}' has acceptable number of tabs ({num_tabs} <= {max_thresh}). Keeping as is.")
107
+ new_layout_configs.append(a_layout_config)
108
+ return new_layout_configs
109
+
110
+
111
+ def restrict_num_tabs_helper3(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["weight"], breaking_method: Literal["moreLayouts"]) -> list[LayoutConfig]:
112
+ """When threshold is exceeded, create more layouts with max_thresh total weight each."""
113
+ new_layout_configs: list[LayoutConfig] = []
114
+ for a_layout_config in layout_configs:
115
+ layout_weight = sum(tab.get("tabWeight", 1) for tab in a_layout_config["layoutTabs"])
116
+ if layout_weight > max_thresh:
117
+ print(f"Layout '{a_layout_config['layoutName']}' has too much weight ({layout_weight} > {max_thresh}). Splitting into multiple layouts.")
118
+ tab_chunks = split_tabs_by_weight(a_layout_config["layoutTabs"], max_weight=max_thresh)
119
+ for idx, tab_chunk in enumerate(tab_chunks):
120
+ new_layout_configs.append({
121
+ "layoutName": f"{a_layout_config['layoutName']}_part{idx+1}",
122
+ "layoutTabs": tab_chunk
123
+ })
124
+ else:
125
+ print(f"Layout '{a_layout_config['layoutName']}' has acceptable total weight ({layout_weight} <= {max_thresh}). Keeping as is.")
126
+ new_layout_configs.append(a_layout_config)
127
+ return new_layout_configs
128
+
129
+
130
+ def restrict_num_tabs_helper4(layout_configs: list[LayoutConfig], max_thresh: int, threshold_type: Literal["weight"], breaking_method: Literal["combineTabs"]) -> list[LayoutConfig]:
131
+ """When threshold is exceeded, combine tabs into super tabs with weight <= max_thresh."""
132
+ new_layout_configs: list[LayoutConfig] = []
133
+ for a_layout_config in layout_configs:
134
+ layout_weight = sum(tab.get("tabWeight", 1) for tab in a_layout_config["layoutTabs"])
135
+ if layout_weight > max_thresh:
136
+ print(f"Layout '{a_layout_config['layoutName']}' has too much weight ({layout_weight} > {max_thresh}). Combining into super tabs with weight <= {max_thresh}.")
137
+ super_tabs = combine_tabs_by_weight_into_super_tabs(a_layout_config["layoutTabs"], max_weight=max_thresh)
138
+ new_layout_configs.append({
139
+ "layoutName": a_layout_config["layoutName"],
140
+ "layoutTabs": super_tabs
141
+ })
142
+ else:
143
+ print(f"Layout '{a_layout_config['layoutName']}' has acceptable total weight ({layout_weight} <= {max_thresh}). Keeping as is.")
144
+ new_layout_configs.append(a_layout_config)
145
+ return new_layout_configs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: machineconfig
3
- Version: 4.1
3
+ Version: 4.2
4
4
  Summary: Dotfiles management package
5
5
  Author-email: Alex Al-Saffar <programmer@usa.com>
6
6
  License: Apache 2.0
@@ -20,7 +20,8 @@ machineconfig/cluster/sessions_managers/zellij_local_manager.py,sha256=4ap0Gtd8w
20
20
  machineconfig/cluster/sessions_managers/zellij_remote.py,sha256=3gz-wgqVW7B-4CgvJq0fiDh8691h4yeK3Xh3CfSPc2s,8749
21
21
  machineconfig/cluster/sessions_managers/zellij_remote_manager.py,sha256=T-j1KMV7mDTeGSHC5To0_JmqNtjSR_LVZT9VanP4lyI,8313
22
22
  machineconfig/cluster/sessions_managers/utils/enhanced_command_runner.py,sha256=3vcQVg-HHa_WTxBGPtKMAdoSqJVa2EO5KAtrY8a6I3c,5264
23
- machineconfig/cluster/sessions_managers/utils/load_balancer.py,sha256=ODnYCkMwpnD9ooMemJsaADAnmFSGELTW5QKJwepajL4,9051
23
+ machineconfig/cluster/sessions_managers/utils/load_balancer.py,sha256=q9k3ofvgcZzx_oKtaymWf75JpDAs5pagwRRYzfVgu30,3176
24
+ machineconfig/cluster/sessions_managers/utils/load_balancer_helper.py,sha256=i5TRittC1IWTgMZNyG8AR5qq-3WrGp3xgIx2m5ktT7g,7526
24
25
  machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py,sha256=CFGcZPFTZQJtFf0OvMUHhadZ0qbImCP3wxvbWYVcVYo,7445
25
26
  machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py,sha256=Mitm7mKiKl5lT0OiEUHAqVg2Q21RjsKO1-hpJTHJ5lM,15196
26
27
  machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py,sha256=lApUy67_WhfaBXqt0meZSx_QvwiXjN0YLdyE3c7kP_s,6744
@@ -405,8 +406,8 @@ machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=CCs5ebomW1ac
405
406
  machineconfig/utils/schemas/installer/installer_types.py,sha256=DLagmIe0G5-xg7HZ9VrlFCDk1gIbwvX7O4gZjwq0wh0,1326
406
407
  machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
407
408
  machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
408
- machineconfig-4.1.dist-info/METADATA,sha256=b3JCS_zyxDLbFlIDEu5k4EdmkuOHwIIclgCSorz6Jdg,7031
409
- machineconfig-4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
410
- machineconfig-4.1.dist-info/entry_points.txt,sha256=c6ea0waVseT1rbfz1bw3k-eph2yVaB67x9hx64Mpvfs,1066
411
- machineconfig-4.1.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
412
- machineconfig-4.1.dist-info/RECORD,,
409
+ machineconfig-4.2.dist-info/METADATA,sha256=rffGO9RS2gCZbESOyc4G44R-Txmfx8SAOlpSQcZGXhY,7031
410
+ machineconfig-4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
411
+ machineconfig-4.2.dist-info/entry_points.txt,sha256=c6ea0waVseT1rbfz1bw3k-eph2yVaB67x9hx64Mpvfs,1066
412
+ machineconfig-4.2.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
413
+ machineconfig-4.2.dist-info/RECORD,,