17
17
18
18
from pdm .backend ._vendor .packaging import tags
19
19
from pdm .backend ._vendor .packaging .specifiers import SpecifierSet
20
- from pdm .backend ._vendor .packaging .utils import canonicalize_name
20
+ from pdm .backend ._vendor .packaging .utils import _build_tag_regex , canonicalize_name
21
21
from pdm .backend .base import Builder
22
22
from pdm .backend .hooks import Context
23
23
from pdm .backend .hooks .setuptools import SetuptoolsBuildHook
46
46
Tag: {tag}
47
47
"""
48
48
49
+ BUILD_TAG_FORMAT = "Build: {build_number}"
50
+
49
51
# Fix the date time for reproducible builds
50
52
try :
51
53
_env_date = time .gmtime (int (os .environ ["SOURCE_DATE_EPOCH" ]))[:6 ]
@@ -77,6 +79,7 @@ def __init__(
77
79
) -> None :
78
80
super ().__init__ (location , config_settings )
79
81
self .__tag : str | None = None
82
+ self .__build_number : str | None = None
80
83
81
84
def scheme_path (self , name : str , relative : str ) -> str :
82
85
if name not in SCHEME_NAMES :
@@ -156,7 +159,11 @@ def build_artifact(
156
159
records .append (self ._add_file_to_zip (zf , rel_path , full_path ))
157
160
self ._write_record (zf , records )
158
161
159
- target = context .dist_dir / f"{ self .name_version } -{ self .tag } .whl"
162
+ name_version = self .name_version
163
+ if self .build_number :
164
+ name_version = f"{ name_version } -{ self .build_number } "
165
+
166
+ target = context .dist_dir / f"{ name_version } -{ self .tag } .whl"
160
167
if target .exists ():
161
168
target .unlink ()
162
169
shutil .move (temp_name , target )
@@ -168,6 +175,12 @@ def name_version(self) -> str:
168
175
version = to_filename (safe_version (self .config .metadata ["version" ]))
169
176
return f"{ name } -{ version } "
170
177
178
+ @property
179
+ def build_number (self ) -> str | None :
180
+ if not self .__build_number :
181
+ self .__build_number = self ._get_build_number ()
182
+ return self .__build_number
183
+
171
184
@property
172
185
def dist_info_name (self ) -> str :
173
186
return f"{ self .name_version } .dist-info"
@@ -178,6 +191,18 @@ def tag(self) -> str:
178
191
self .__tag = self ._get_tag ()
179
192
return self .__tag
180
193
194
+ def _get_build_number (self ) -> str | None :
195
+ cmd = "--build-number"
196
+ if cmd not in self .config_settings :
197
+ return None
198
+ build_number = self .config_settings [cmd ]
199
+ if not _build_tag_regex .match (build_number ):
200
+ raise ValueError (
201
+ f"Invalid build number: { build_number } , please refer to PEP 427"
202
+ )
203
+
204
+ return build_number
205
+
181
206
def _get_tag (self ) -> str :
182
207
impl , abi , platform = self ._get_platform_tags ()
183
208
is_purelib = self .config .build_config .is_purelib
@@ -276,12 +301,15 @@ def _write_wheel_file(self, fp: IO[str], is_purelib: bool) -> None:
276
301
except ModuleNotFoundError :
277
302
version = "0.0.0+local"
278
303
279
- fp .write (
280
- WHEEL_FILE_FORMAT .format (
281
- is_purelib = str (is_purelib ).lower (), tag = self .tag , version = version
282
- )
304
+ wheel_metadata = WHEEL_FILE_FORMAT .format (
305
+ is_purelib = str (is_purelib ).lower (), tag = self .tag , version = version
283
306
)
284
307
308
+ if self .build_number :
309
+ wheel_metadata = f"{ wheel_metadata } { BUILD_TAG_FORMAT .format (build_number = self .build_number )} "
310
+
311
+ fp .write (wheel_metadata )
312
+
285
313
def _write_entry_points (
286
314
self , fp : IO [str ], entry_points : dict [str , dict [str , str ]]
287
315
) -> None :
0 commit comments