1- """
2- Version helper for vcs-versioning package.
3-
4- This module allows vcs-versioning to use VCS metadata for its own version,
5- with the tag prefix 'vcs-versioning-'.
6-
7- Used by hatchling's code version source.
8- """
1+ """Build entry point: compute ``version`` here so it is not part of the installed package."""
92
103from __future__ import annotations
114
125import logging
136import os
7+ import sys
148from collections .abc import Callable
159from pathlib import Path
1610
11+ from setuptools import setup
12+
13+ _root = Path (__file__ ).resolve ().parent
14+ sys .path .insert (0 , str (_root / "src" ))
15+
1716from vcs_versioning import Configuration
1817from vcs_versioning import _types as _t
1918from vcs_versioning ._backends import _git as git
2019from vcs_versioning ._backends import _hg as hg
2120from vcs_versioning ._fallbacks import fallback_version , parse_pkginfo
22- from vcs_versioning ._get_version_impl import get_version
21+ from vcs_versioning ._get_version_impl import get_version , resolved_fallback_root
2322from vcs_versioning ._version_schemes import (
2423 ScmVersion ,
2524 get_local_node_and_date ,
2928
3029log = logging .getLogger ("vcs_versioning" )
3130
32- # Try these parsers in order for vcs-versioning's own version
33- try_parse : list [Callable [[_t .PathT , Configuration ], ScmVersion | None ]] = [
31+ _try_parse : list [Callable [[_t .PathT , Configuration ], ScmVersion | None ]] = [
3432 parse_pkginfo ,
3533 git .parse ,
3634 hg .parse ,
3735 git .parse_archival ,
3836 hg .parse_archival ,
39- fallback_version , # Last resort: use fallback_version from config
37+ fallback_version ,
4038]
4139
4240
43- def parse (root : str , config : Configuration ) -> ScmVersion | None :
44- for maybe_parse in try_parse :
41+ def _parse (root : str , config : Configuration ) -> ScmVersion | None :
42+ for maybe_parse in _try_parse :
4543 try :
46- parsed = maybe_parse (root , config )
44+ parse_root = (
45+ resolved_fallback_root (config ) if maybe_parse is parse_pkginfo else root
46+ )
47+ parsed = maybe_parse (parse_root , config )
4748 except OSError as e :
4849 log .warning ("parse with %s failed with: %s" , maybe_parse , e )
4950 else :
@@ -52,26 +53,26 @@ def parse(root: str, config: Configuration) -> ScmVersion | None:
5253 return None
5354
5455
55- def _get_version () -> str :
56- """Get version from VCS with vcs-versioning- tag prefix."""
57- # Use no-local-version if VCS_VERSIONING_NO_LOCAL is set (for CI uploads)
56+ def _package_version () -> str :
57+ """Version from VCS with ``vcs-versioning-`` tag prefix.
58+
59+ ``root`` is the monorepo (``..`` relative to ``pyproject.toml``) for SCM
60+ discovery. ``fallback_root`` is ``.`` (the package tree next to
61+ ``pyproject.toml``) so ``PKG-INFO`` from an sdist is read from the right
62+ place (see ``_parse`` / ``_pkginfo_root``).
63+ """
5864 local_scheme = (
5965 get_no_local_node
6066 if os .environ .get ("VCS_VERSIONING_NO_LOCAL" )
6167 else get_local_node_and_date
6268 )
63-
64- # Resolve repo root from this file's location so version detection works
65- # regardless of cwd (e.g. when uv build runs from workspace root).
66- _here = Path (__file__ ).resolve ()
67- _repo_root = _here .parent .parent
68- _pyproject_path = _here .parent / "pyproject.toml"
69+ _pyproject_path = _root / "pyproject.toml"
6970
7071 return get_version (
71- root = str ( _repo_root ) ,
72- fallback_root = str ( _here . parent ) ,
72+ root = ".." ,
73+ fallback_root = "." ,
7374 relative_to = str (_pyproject_path ),
74- parse = parse ,
75+ parse = _parse ,
7576 version_scheme = guess_next_dev_version ,
7677 local_scheme = local_scheme ,
7778 tag_regex = r"^vcs-versioning-(?P<version>v?\d+(?:\.\d+){0,2}[^\+]*)(?:\+.*)?$" ,
@@ -82,4 +83,5 @@ def _get_version() -> str:
8283 )
8384
8485
85- __version__ : str = _get_version ()
86+ if __name__ == "__main__" :
87+ setup (version = _package_version ())
0 commit comments