8
8
import urllib .request
9
9
import logging as log
10
10
from itertools import batched
11
+ import subprocess
11
12
12
13
DEPS_PACKAGING = "deps-packaging"
13
14
14
15
16
+ def run_command (cmd : list ):
17
+ try :
18
+ log .debug (f"Running command '{ " " .join (cmd )} '" )
19
+ subprocess .run (cmd , check = True )
20
+ except subprocess .CalledProcessError :
21
+ log .error (f"Command '{ " " .join (cmd )} ' failed" )
22
+ return False
23
+ return True
24
+
25
+
26
+ def git_commit (root , msg ):
27
+ return run_command (["git" , "-C" , root , "add" , "-u" ]) and run_command (
28
+ [
29
+ "git" ,
30
+ "-C" ,
31
+ root ,
32
+ "commit" ,
33
+ f"--message={ msg } " ,
34
+ ],
35
+ )
36
+
37
+
15
38
def parse_args ():
16
39
parser = argparse .ArgumentParser (description = "CFEngine dependency updater" )
17
40
parser .add_argument (
@@ -20,25 +43,28 @@ def parse_args():
20
43
help = "enable debug log messages" ,
21
44
)
22
45
parser .add_argument (
23
- "--update " ,
46
+ "--bump " ,
24
47
default = "minor" ,
25
48
choices = ["major" , "minor" , "patch" ],
26
- help = "whether to do major, minor or patch updates " ,
49
+ help = "whether to bump version major, minor or patch" ,
27
50
)
28
51
parser .add_argument (
29
52
"--skip" ,
30
53
nargs = 2 ,
31
54
action = "extend" ,
32
55
default = [],
33
56
metavar = ("PACKAGE" , "VERSION" ),
34
- help = "skip updates for specific version of a package (e.g., --skip librsync 2.3.4)"
57
+ help = "skip updates for specific version of a package (e.g., --skip librsync 2.3.4)" ,
58
+ )
59
+ parser .add_argument (
60
+ "--root" , default = "." , help = "specify build scripts root directory"
35
61
)
36
62
37
63
return parser .parse_args ()
38
64
39
65
40
- def determine_old_version (pkg_name ):
41
- distfile = os .path .join (DEPS_PACKAGING , pkg_name , "distfiles" )
66
+ def determine_old_version (root , pkg_name ):
67
+ distfile = os .path .join (root , DEPS_PACKAGING , pkg_name , "distfiles" )
42
68
with open (distfile , "r" ) as f :
43
69
data = f .read ().strip ().split ()
44
70
filename = data [- 1 ]
@@ -92,12 +118,12 @@ def get_available_versions(proj_id):
92
118
93
119
def select_new_version (
94
120
package_name ,
95
- update_type ,
121
+ bump_version ,
96
122
skip_versions ,
97
123
old_version ,
98
124
available_versions ,
99
125
):
100
- assert len (skip_versions ) % 2 == 0 # Is guaranteed by the argument parser
126
+ assert len (skip_versions ) % 2 == 0 # Is guaranteed by the argument parser
101
127
102
128
old_split = old_version .replace ("-" , "." ).replace ("_" , "." ).split ("." )
103
129
for new_version in available_versions :
@@ -112,11 +138,11 @@ def select_new_version(
112
138
log .info (f"Skipping version { new_version } for package { package_name } " )
113
139
continue
114
140
115
- if update_type == "major" :
141
+ if bump_version == "major" :
116
142
return new_version
117
- if update_type == "minor" and old_split [:1 ] == new_split [:1 ]:
143
+ if bump_version == "minor" and old_split [:1 ] == new_split [:1 ]:
118
144
return new_version
119
- if update_type == "patch" and old_split [:2 ] == new_split [:2 ]:
145
+ if bump_version == "patch" and old_split [:2 ] == new_split [:2 ]:
120
146
return new_version
121
147
return None # Didn't find a suitable version
122
148
@@ -141,22 +167,22 @@ def replace_string_in_file(filename, old, new):
141
167
f .write (contents .replace (old , new ))
142
168
143
169
144
- def update_version_numbers (pkg_name , old_version , new_version ):
170
+ def update_version_numbers (root , pkg_name , old_version , new_version ):
145
171
filenames = [
146
- os .path .join (DEPS_PACKAGING , pkg_name , f"cfbuild-{ pkg_name } .spec" ),
147
- os .path .join (DEPS_PACKAGING , pkg_name , f"cfbuild-{ pkg_name } -aix.spec" ),
148
- os .path .join (DEPS_PACKAGING , pkg_name , "distfiles" ),
149
- os .path .join (DEPS_PACKAGING , pkg_name , "source" ),
172
+ os .path .join (root , DEPS_PACKAGING , pkg_name , f"cfbuild-{ pkg_name } .spec" ),
173
+ os .path .join (root , DEPS_PACKAGING , pkg_name , f"cfbuild-{ pkg_name } -aix.spec" ),
174
+ os .path .join (root , DEPS_PACKAGING , pkg_name , "distfiles" ),
175
+ os .path .join (root , DEPS_PACKAGING , pkg_name , "source" ),
150
176
]
151
177
for filename in filenames :
152
178
replace_string_in_file (filename , old_version , new_version )
153
179
154
180
155
- def update_distfiles_digest (pkg_name ):
156
- with open (os .path .join (DEPS_PACKAGING , pkg_name , "source" ), "r" ) as f :
181
+ def update_distfiles_digest (root , pkg_name ):
182
+ with open (os .path .join (root , DEPS_PACKAGING , pkg_name , "source" ), "r" ) as f :
157
183
source = f .read ().strip ()
158
184
159
- filename = os .path .join (DEPS_PACKAGING , pkg_name , "distfiles" )
185
+ filename = os .path .join (root , DEPS_PACKAGING , pkg_name , "distfiles" )
160
186
with open (filename , "r" ) as f :
161
187
content = f .read ().strip ().split ()
162
188
old_digest = content [0 ]
@@ -174,25 +200,20 @@ def update_distfiles_digest(pkg_name):
174
200
replace_string_in_file (filename , old_digest , new_digest )
175
201
176
202
177
- def main ():
178
- args = parse_args ()
179
- loglevel = "DEBUG" if args .debug else "INFO"
180
- log .basicConfig (
181
- format = "[%(filename)s:%(lineno)d][%(levelname)s]: %(message)s" , level = loglevel
182
- )
183
-
184
- with open (os .path .join (DEPS_PACKAGING , "release-monitoring.json" ), "r" ) as f :
203
+ def update_deps (root , bump , skip ):
204
+ with open (os .path .join (root , DEPS_PACKAGING , "release-monitoring.json" ), "r" ) as f :
185
205
release_monitoring = json .load (f )
186
206
187
- commit_message = ["Updated dependencies\n \n " ]
188
207
for pkg_name , proj_id in release_monitoring .items ():
189
- old_version = determine_old_version (pkg_name )
208
+ old_version = determine_old_version (root , pkg_name )
190
209
if not old_version :
191
210
log .error (f"Failed to determine old version of package { pkg_name } " )
192
211
exit (1 )
193
212
194
213
available_versions = get_available_versions (proj_id )
195
- new_version = select_new_version (pkg_name , args .update , args .skip , old_version , available_versions )
214
+ new_version = select_new_version (
215
+ pkg_name , bump , skip , old_version , available_versions
216
+ )
196
217
if not new_version :
197
218
log .error (f"Could not find a suitable new version for package { pkg_name } " )
198
219
exit (1 )
@@ -210,13 +231,26 @@ def main():
210
231
continue
211
232
log .info (f"Updating { pkg_name } from version { old_version } to { new_version } ..." )
212
233
213
- update_version_numbers (pkg_name , old_version , new_version )
214
- update_distfiles_digest (pkg_name )
234
+ update_version_numbers (root , pkg_name , old_version , new_version )
235
+ update_distfiles_digest (root , pkg_name )
236
+
237
+ if not git_commit (
238
+ root ,
239
+ f"Updated dependency '{ pkg_name } ' from version { old_version } to { new_version } " ,
240
+ ):
241
+ log .error (f"Failed to commit changes after updating package '{ pkg_name } '" )
242
+ exit (1 )
243
+
244
+
245
+ def main ():
246
+ args = parse_args ()
247
+ loglevel = "DEBUG" if args .debug else "INFO"
248
+ log .basicConfig (
249
+ format = "[%(filename)s:%(lineno)d][%(levelname)s]: %(message)s" , level = loglevel
250
+ )
215
251
216
- commit_message . append ( f"- Updated dependency ' { pkg_name } ' from version { old_version } to { new_version } \n " )
252
+ update_deps ( args . root , args . bump , args . skip )
217
253
218
- with open ("/tmp/commit-message.txt" , "w" ) as f :
219
- f .writelines (commit_message )
220
254
221
255
if __name__ == "__main__" :
222
256
main ()
0 commit comments