|
1 | 1 | #!/usr/bin/env python
|
| 2 | +from __future__ import annotations |
2 | 3 |
|
3 | 4 | import os
|
4 | 5 | import re
|
5 | 6 | import subprocess
|
6 | 7 | import sys
|
7 | 8 | import textwrap
|
8 | 9 | import time
|
| 10 | +from contextlib import suppress |
| 11 | +from itertools import starmap |
9 | 12 |
|
10 | 13 | import setuptools
|
11 | 14 | from setuptools import _normalization
|
|
30 | 33 | package_data.setdefault('setuptools.command', []).extend(['*.xml'])
|
31 | 34 |
|
32 | 35 |
|
| 36 | +_VERSION_FALLBACK = [ |
| 37 | + ("PKG-INFO", r"^Version: (\d+\.\d+\.\d+.*)$", "{match[1]}"), # sdist |
| 38 | + ("NEWS.rst", r"^v(\d+\.\d+\.\d+)", "{match[1]}.dev+{timestamp}"), # latest version |
| 39 | +] |
| 40 | + |
| 41 | + |
| 42 | +def _extract_version(file: str, pattern: str, fmt: str) -> str | None: |
| 43 | + with suppress(FileNotFoundError), open(file, encoding="utf-8") as fp: |
| 44 | + if match := re.search(pattern, fp.read(), re.M): |
| 45 | + return fmt.format(match=match, timestamp=time.strftime("%Y%m%d")) |
| 46 | + return None |
| 47 | + |
| 48 | + |
33 | 49 | def _get_version() -> str:
|
34 | 50 | cmd = ["git", "describe", "--abbrev", "--match", "v?[0-9]*", "--dirty"]
|
35 | 51 | try:
|
36 | 52 | version = subprocess.check_output(cmd, encoding="utf-8")
|
37 | 53 | return _normalization.best_effort_version(version, "{safe}.dev+{sanitized}")
|
38 | 54 | except subprocess.CalledProcessError: # e.g.: git not installed or history missing
|
39 |
| - if os.path.exists("PKG-INFO"): # building wheel from sdist |
40 |
| - with open("PKG-INFO", encoding="utf-8") as fp: |
41 |
| - if match := re.search(r"^Version: (\d+\.\d+\.\d+.*)$", fp.read(), re.M): |
42 |
| - return match[1] |
43 |
| - with open("NEWS.rst", encoding="utf-8") as fp: |
44 |
| - match = re.search(r"v\d+\.\d+\.\d+", fp.read()) # latest version |
45 |
| - return f"{match[0] if match else '0.0.0'}.dev+{time.strftime('%Y%m%d')}" |
| 55 | + candidates = filter(None, starmap(_extract_version, _VERSION_FALLBACK)) |
| 56 | + return next(candidates, f"0.0.0.dev+{time.strftime('%Y%m%d')}") |
46 | 57 |
|
47 | 58 |
|
48 | 59 | def pypi_link(pkg_filename):
|
|
0 commit comments