1
1
#!/usr/bin/env python3
2
2
3
+ import argparse
3
4
import json
4
5
import os
5
6
import subprocess
@@ -47,6 +48,7 @@ class GitHubActionPackage(TypedDict):
47
48
system : str
48
49
already_cached : bool
49
50
runs_on : RunsOnConfig
51
+ postgresql_version : NotRequired [str ]
50
52
51
53
52
54
BUILD_RUNNER_MAP : Dict [str , RunsOnConfig ] = {
@@ -76,22 +78,23 @@ def get_worker_count() -> int:
76
78
return 1
77
79
78
80
79
- def build_nix_eval_command (max_workers : int ) -> List [str ]:
81
+ def build_nix_eval_command (max_workers : int , target : str ) -> List [str ]:
80
82
"""Build the nix-eval-jobs command with appropriate flags."""
81
- return [
83
+ nix_eval_cmd = [
82
84
"nix-eval-jobs" ,
83
85
"--flake" ,
84
- ".#checks " ,
86
+ f ".#{ target } " ,
85
87
"--check-cache-status" ,
86
88
"--force-recurse" ,
87
89
"--quiet" ,
88
90
"--workers" ,
89
91
str (max_workers ),
90
92
]
93
+ return nix_eval_cmd
91
94
92
95
93
96
def parse_nix_eval_line (
94
- line : str , drv_paths : Set [str ]
97
+ line : str , drv_paths : Set [str ], target : str
95
98
) -> Optional [GitHubActionPackage ]:
96
99
"""Parse a single line of nix-eval-jobs output"""
97
100
if not line .strip ():
@@ -102,12 +105,11 @@ def parse_nix_eval_line(
102
105
if data ["drvPath" ] in drv_paths :
103
106
return None
104
107
drv_paths .add (data ["drvPath" ])
105
- print (f"Processing package: { data } " , file = sys .stderr )
106
108
107
109
runs_on_config = BUILD_RUNNER_MAP [data ["system" ]]
108
110
109
111
return {
110
- "attr" : "checks." + data [" attr" ] ,
112
+ "attr" : f" { target } . { data [' attr' ] } " ,
111
113
"name" : data ["name" ],
112
114
"system" : data ["system" ],
113
115
"already_cached" : data .get ("cacheStatus" ) != "notBuilt" ,
@@ -118,7 +120,9 @@ def parse_nix_eval_line(
118
120
return None
119
121
120
122
121
- def run_nix_eval_jobs (cmd : List [str ]) -> Generator [GitHubActionPackage , None , None ]:
123
+ def run_nix_eval_jobs (
124
+ cmd : List [str ], target : str
125
+ ) -> Generator [GitHubActionPackage , None , None ]:
122
126
"""Run nix-eval-jobs and yield parsed package data."""
123
127
print (f"Running command: { ' ' .join (cmd )} " , file = sys .stderr )
124
128
@@ -128,8 +132,8 @@ def run_nix_eval_jobs(cmd: List[str]) -> Generator[GitHubActionPackage, None, No
128
132
drv_paths = set ()
129
133
130
134
for line in process .stdout :
131
- package = parse_nix_eval_line (line , drv_paths )
132
- if package :
135
+ package = parse_nix_eval_line (line , drv_paths , target )
136
+ if package and not package [ "already_cached" ] :
133
137
yield package
134
138
135
139
if process .returncode and process .returncode != 0 :
@@ -138,11 +142,41 @@ def run_nix_eval_jobs(cmd: List[str]) -> Generator[GitHubActionPackage, None, No
138
142
sys .exit (process .returncode )
139
143
140
144
145
+ def is_extension_pkg (pkg : GitHubActionPackage ) -> bool :
146
+ """Check if the package is a postgresql extension package."""
147
+ attrs = pkg ["attr" ].split ("." )
148
+ return attrs [- 2 ] == "exts"
149
+
150
+
141
151
def main () -> None :
152
+ parser = argparse .ArgumentParser (
153
+ description = "Generate GitHub Actions matrix for Nix builds"
154
+ )
155
+ parser .add_argument (
156
+ "target" , choices = ["checks" , "extensions" ], help = "Type of matrix to generate"
157
+ )
158
+
159
+ args = parser .parse_args ()
160
+
142
161
max_workers = get_worker_count ()
143
- cmd = build_nix_eval_command (max_workers )
144
162
145
- gh_action_packages = list (run_nix_eval_jobs (cmd ))
163
+ if args .target == "checks" :
164
+ flake_output = "checks"
165
+ else :
166
+ flake_output = "legacyPackages"
167
+
168
+ cmd = build_nix_eval_command (max_workers , flake_output )
169
+
170
+ gh_action_packages = list (run_nix_eval_jobs (cmd , flake_output ))
171
+
172
+ if args .target == "extensions" :
173
+ # filter to only include extension packages and add postgresql_version field
174
+ gh_action_packages = [
175
+ {** pkg , "postgresql_version" : pkg ["attr" ].split ("." )[- 3 ]}
176
+ for pkg in gh_action_packages
177
+ if is_extension_pkg (pkg )
178
+ ]
179
+
146
180
gh_output = {"include" : gh_action_packages }
147
181
print (json .dumps (gh_output ))
148
182
0 commit comments