|
88 | 88 |
|
89 | 89 | __version__="git" |
90 | 90 |
|
91 | | -fromtypingimportList,Optional,Sequence,TYPE_CHECKING,Tuple,Union |
| 91 | +fromtypingimportAny,List,Optional,Sequence,TYPE_CHECKING,Tuple,Union |
| 92 | + |
| 93 | +ifTYPE_CHECKING: |
| 94 | +fromtypesimportModuleType |
92 | 95 |
|
93 | 96 | fromgitdb.utilimportto_hex_sha |
94 | 97 |
|
|
144 | 147 | SymbolicReference, |
145 | 148 | Tag, |
146 | 149 | TagReference, |
147 | | -head,# noqa: F401 # Nonpublic. May disappear! Use git.refs.head. |
148 | | -log,# noqa: F401 # Nonpublic. May disappear! Use git.refs.log. |
149 | | -reference,# noqa: F401 # Nonpublic. May disappear! Use git.refs.reference. |
150 | | -symbolic,# noqa: F401 # Nonpublic. May disappear! Use git.refs.symbolic. |
151 | | -tag,# noqa: F401 # Nonpublic. May disappear! Use git.refs.tag. |
152 | 150 | ) |
153 | 151 | fromgit.diffimport (# @NoMove |
154 | 152 | INDEX, |
|
169 | 167 | IndexEntry, |
170 | 168 | IndexFile, |
171 | 169 | StageType, |
172 | | -base,# noqa: F401 # Nonpublic. May disappear! Use git.index.base. |
173 | | -fun,# noqa: F401 # Nonpublic. May disappear! Use git.index.fun. |
174 | | -typ,# noqa: F401 # Nonpublic. May disappear! Use git.index.typ. |
175 | | -# |
176 | | -# NOTE: The expression `git.util` evaluates to git.index.util, and the import |
177 | | -# `from git import util` imports git.index.util, NOT git.util. It may not be |
178 | | -# feasible to change this until the next major version, to avoid breaking code |
179 | | -# inadvertently relying on it. If git.index.util really is what you want, use or |
180 | | -# import from that name, to avoid confusion. To use the "real" git.util module, |
181 | | -# write `from git.util import ...`, or access it as `sys.modules["git.util"]`. |
182 | | -# (This differs from other historical indirect-submodule imports that are |
183 | | -# unambiguously nonpublic and are subject to immediate removal. Here, the public |
184 | | -# git.util module, even though different, makes it less discoverable that the |
185 | | -# expression `git.util` refers to a non-public attribute of the git module.) |
186 | | -util,# noqa: F401 |
187 | 170 | ) |
188 | 171 | fromgit.utilimport (# @NoMove |
189 | 172 | Actor, |
|
196 | 179 | exceptGitErroras_exc: |
197 | 180 | raiseImportError("%s: %s"% (_exc.__class__.__name__,_exc))from_exc |
198 | 181 |
|
| 182 | + |
| 183 | +# NOTE: The expression `git.util` evaluates to git.index.util and `from git import util` |
| 184 | +# imports git.index.util, NOT git.util. It may not be feasible to change this until the |
| 185 | +# next major version, to avoid breaking code inadvertently relying on it. |
| 186 | +# |
| 187 | +# - If git.index.util *is* what you want, use or import from that, to avoid confusion. |
| 188 | +# |
| 189 | +# - To use the "real" git.util module, write `from git.util import ...`, or if necessary |
| 190 | +# access it as `sys.modules["git.util"]`. |
| 191 | +# |
| 192 | +# (This differs from other indirect-submodule imports that are unambiguously non-public |
| 193 | +# and subject to immediate removal. Here, the public git.util module, though different, |
| 194 | +# makes less discoverable that the expression `git.util` refers to a non-public |
| 195 | +# attribute of the git module.) |
| 196 | +# |
| 197 | +# This had come about by a wildcard import. Now that all intended imports are explicit, |
| 198 | +# the intuitive but potentially incompatible binding occurs due to the usual rules for |
| 199 | +# Python submodule bindings. So for now we delete that and let __getattr__ handle it. |
| 200 | +# |
| 201 | +delutil# type: ignore[name-defined] # noqa: F821 |
| 202 | + |
| 203 | + |
| 204 | +def_warned_import(message:str,fullname:str)->"ModuleType": |
| 205 | +importimportlib |
| 206 | +importwarnings |
| 207 | + |
| 208 | +warnings.warn(message,DeprecationWarning,stacklevel=3) |
| 209 | +returnimportlib.import_module(fullname) |
| 210 | + |
| 211 | + |
| 212 | +def_getattr(name:str)->Any: |
| 213 | +# TODO: If __version__ is made dynamic and lazily fetched, put that case right here. |
| 214 | + |
| 215 | +ifname=="util": |
| 216 | +return_warned_import( |
| 217 | +"The expression `git.util` and the import `from git import util` actually " |
| 218 | +"reference git.index.util, and not the git.util module accessed in " |
| 219 | +'`from git.util import XYZ` or `sys.modules["git.util"]`. This potentially ' |
| 220 | +"confusing behavior is currently preserved for compatibility, but may be " |
| 221 | +"changed in the future and should not be relied on.", |
| 222 | +fullname="git.index.util", |
| 223 | + ) |
| 224 | + |
| 225 | +fornames,prefixin ( |
| 226 | + ({"head","log","reference","symbolic","tag"},"git.refs"), |
| 227 | + ({"base","fun","typ"},"git.index"), |
| 228 | + ): |
| 229 | +ifnamenotinnames: |
| 230 | +continue |
| 231 | + |
| 232 | +fullname=f"{prefix}.{name}" |
| 233 | + |
| 234 | +return_warned_import( |
| 235 | +f"{__name__}.{name} is a private alias of{fullname} and subject to " |
| 236 | +f"immediate removal. Use{fullname} instead.", |
| 237 | +fullname=fullname, |
| 238 | + ) |
| 239 | + |
| 240 | +raiseAttributeError(f"module{__name__!r} has no attribute{name!r}") |
| 241 | + |
| 242 | + |
| 243 | +ifnotTYPE_CHECKING:# Preserve static checking for undefined/misspelled attributes. |
| 244 | +__getattr__=_getattr |
| 245 | + |
199 | 246 | # { Initialize git executable path |
| 247 | + |
200 | 248 | GIT_OK=None |
201 | 249 |
|
202 | 250 |
|
@@ -232,12 +280,9 @@ def refresh(path: Optional[PathLike] = None) -> None: |
232 | 280 | GIT_OK=True |
233 | 281 |
|
234 | 282 |
|
235 | | -# } END initialize git executable path |
236 | | - |
237 | | - |
238 | | -################# |
239 | 283 | try: |
240 | 284 | refresh() |
241 | 285 | exceptExceptionas_exc: |
242 | 286 | raiseImportError("Failed to initialize: {0}".format(_exc))from_exc |
243 | | -################# |
| 287 | + |
| 288 | +# } END initialize git executable path |