GitPython 3.1.60__py3-none-any.whl → 3.1.62__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- git/__init__.py +1 -1
- git/config.py +62 -1
- git/objects/submodule/base.py +12 -0
- git/repo/base.py +4 -0
- git/util.py +23 -3
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/METADATA +1 -1
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/RECORD +11 -11
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/WHEEL +0 -0
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/licenses/AUTHORS +0 -0
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/licenses/LICENSE +0 -0
- {gitpython-3.1.60.dist-info → gitpython-3.1.62.dist-info}/top_level.txt +0 -0
git/__init__.py
CHANGED
git/config.py
CHANGED
|
@@ -467,6 +467,45 @@ class GitConfigParser(cp.RawConfigParser, metaclass=MetaParserBuilder):
|
|
|
467
467
|
|
|
468
468
|
# END string_decode
|
|
469
469
|
|
|
470
|
+
def is_line_continuation(value: str) -> bool:
|
|
471
|
+
quoted = escaped = False
|
|
472
|
+
for char in value:
|
|
473
|
+
if escaped:
|
|
474
|
+
escaped = False
|
|
475
|
+
elif char == "\\":
|
|
476
|
+
escaped = True
|
|
477
|
+
elif char == '"':
|
|
478
|
+
quoted = not quoted
|
|
479
|
+
elif char in "#;" and not quoted:
|
|
480
|
+
return False
|
|
481
|
+
return escaped
|
|
482
|
+
|
|
483
|
+
def parse_value(value: str) -> str:
|
|
484
|
+
parsed: List[str] = []
|
|
485
|
+
whitespace: List[str] = []
|
|
486
|
+
quoted = escaped = False
|
|
487
|
+
escapes = {"b": "\b", "n": "\n", "t": "\t", '"': '"', "\\": "\\"}
|
|
488
|
+
for char in value:
|
|
489
|
+
if escaped:
|
|
490
|
+
parsed.append(escapes.get(char, "\\" + char))
|
|
491
|
+
escaped = False
|
|
492
|
+
continue
|
|
493
|
+
if char.isspace() and not quoted:
|
|
494
|
+
if parsed:
|
|
495
|
+
whitespace.append(char)
|
|
496
|
+
continue
|
|
497
|
+
if char in "#;" and not quoted:
|
|
498
|
+
break
|
|
499
|
+
parsed.extend(whitespace)
|
|
500
|
+
whitespace.clear()
|
|
501
|
+
if char == "\\":
|
|
502
|
+
escaped = True
|
|
503
|
+
elif char == '"':
|
|
504
|
+
quoted = not quoted
|
|
505
|
+
else:
|
|
506
|
+
parsed.append(char)
|
|
507
|
+
return "".join(parsed)
|
|
508
|
+
|
|
470
509
|
while True:
|
|
471
510
|
# We assume to read binary!
|
|
472
511
|
line = fp.readline().decode(defenc)
|
|
@@ -513,7 +552,29 @@ class GitConfigParser(cp.RawConfigParser, metaclass=MetaParserBuilder):
|
|
|
513
552
|
|
|
514
553
|
if len(optval) < 2 or optval[0] != '"':
|
|
515
554
|
# Does not open quoting.
|
|
516
|
-
|
|
555
|
+
# A value ending in an odd number of backslashes
|
|
556
|
+
# continues on the next line, exactly as git does: the
|
|
557
|
+
# final backslash and the newline are removed and the
|
|
558
|
+
# next line is appended before the complete value is
|
|
559
|
+
# parsed. An even number means the last backslash is
|
|
560
|
+
# escaped and the value ends there.
|
|
561
|
+
continued = False
|
|
562
|
+
while True:
|
|
563
|
+
if not is_line_continuation(optval):
|
|
564
|
+
break
|
|
565
|
+
continuation = fp.readline()
|
|
566
|
+
if not continuation:
|
|
567
|
+
# Backslash at end of file: git drops it.
|
|
568
|
+
optval = optval[:-1]
|
|
569
|
+
break
|
|
570
|
+
lineno = lineno + 1
|
|
571
|
+
joined = continuation.decode(defenc)
|
|
572
|
+
while joined.endswith("\n") or joined.endswith("\r"):
|
|
573
|
+
joined = joined[:-1]
|
|
574
|
+
optval = optval[:-1] + joined
|
|
575
|
+
continued = True
|
|
576
|
+
if continued:
|
|
577
|
+
optval = parse_value(optval)
|
|
517
578
|
elif optval[-1] != '"':
|
|
518
579
|
# Opens quoting and does not close: appears to start multi-line quoting.
|
|
519
580
|
is_multi_line = True
|
git/objects/submodule/base.py
CHANGED
|
@@ -414,6 +414,18 @@ class Submodule(IndexObject, TraversableIterableObj):
|
|
|
414
414
|
|
|
415
415
|
return path
|
|
416
416
|
|
|
417
|
+
@property
|
|
418
|
+
def abspath(self) -> PathLike:
|
|
419
|
+
root = self.repo.working_tree_dir
|
|
420
|
+
if root is None:
|
|
421
|
+
return super().abspath
|
|
422
|
+
path = root
|
|
423
|
+
for component in os.fspath(self._to_relative_path(self.repo, self.path)).split("/"):
|
|
424
|
+
path = join_path_native(path, component)
|
|
425
|
+
if osp.islink(path):
|
|
426
|
+
raise ValueError("Submodule checkout path %r contains a symbolic link" % self.path)
|
|
427
|
+
return path
|
|
428
|
+
|
|
417
429
|
@classmethod
|
|
418
430
|
def _write_git_file_and_module_config(cls, working_tree_dir: PathLike, module_abspath: PathLike) -> None:
|
|
419
431
|
"""Write a ``.git`` file containing a (preferably) relative path to the actual
|
git/repo/base.py
CHANGED
|
@@ -386,6 +386,10 @@ class Repo:
|
|
|
386
386
|
# Let's not assume the option exists, although it should.
|
|
387
387
|
pass
|
|
388
388
|
|
|
389
|
+
# A linked worktree is not bare even when its main repository is.
|
|
390
|
+
if self._bare and self._working_tree_dir and osp.isfile(osp.join(self.git_dir, "commondir")):
|
|
391
|
+
self._bare = False
|
|
392
|
+
|
|
389
393
|
# Adjust the working directory in case we are actually bare - we didn't know
|
|
390
394
|
# that in the first place.
|
|
391
395
|
if self._bare:
|
git/util.py
CHANGED
|
@@ -80,6 +80,7 @@ from typing import (
|
|
|
80
80
|
Sequence,
|
|
81
81
|
Tuple,
|
|
82
82
|
TYPE_CHECKING,
|
|
83
|
+
Type,
|
|
83
84
|
TypeVar,
|
|
84
85
|
Union,
|
|
85
86
|
cast,
|
|
@@ -108,6 +109,7 @@ from git.types import (
|
|
|
108
109
|
|
|
109
110
|
T_IterableObj = TypeVar("T_IterableObj", bound=Union["IterableObj", "Has_id_attribute"], covariant=True)
|
|
110
111
|
# So IterableList[Head] is subtype of IterableList[IterableObj].
|
|
112
|
+
T_Actor = TypeVar("T_Actor", bound="Actor")
|
|
111
113
|
|
|
112
114
|
_logger = logging.getLogger(__name__)
|
|
113
115
|
|
|
@@ -853,11 +855,27 @@ class CallableRemoteProgress(RemoteProgress):
|
|
|
853
855
|
self._callable(*args, **kwargs)
|
|
854
856
|
|
|
855
857
|
|
|
858
|
+
class _DeprecatedActorNameEmailRegex:
|
|
859
|
+
_pattern = re.compile(r"(.*) <(.*?)>")
|
|
860
|
+
|
|
861
|
+
def __get__(self, _instance: Any, _owner: Any) -> Pattern[str]:
|
|
862
|
+
warnings.warn(
|
|
863
|
+
"Actor.name_email_regex is deprecated and will be removed in GitPython 4.0.0 because searching long "
|
|
864
|
+
"malformed strings with it can take quadratic time. Use Actor.from_string() to parse actor identities, "
|
|
865
|
+
"or Actor(name, email) when the fields are already separate.",
|
|
866
|
+
DeprecationWarning,
|
|
867
|
+
stacklevel=2,
|
|
868
|
+
)
|
|
869
|
+
return self._pattern
|
|
870
|
+
|
|
871
|
+
|
|
856
872
|
class Actor:
|
|
857
873
|
"""Actors hold information about a person acting on the repository. They can be
|
|
858
874
|
committers and authors or anything with a name and an email as mentioned in the git
|
|
859
875
|
log entries."""
|
|
860
876
|
|
|
877
|
+
name_email_regex = _DeprecatedActorNameEmailRegex()
|
|
878
|
+
|
|
861
879
|
# ENVIRONMENT VARIABLES
|
|
862
880
|
# These are read when creating new commits.
|
|
863
881
|
env_author_name = "GIT_AUTHOR_NAME"
|
|
@@ -891,7 +909,7 @@ class Actor:
|
|
|
891
909
|
return '<git.Actor "%s <%s>">' % (self.name, self.email)
|
|
892
910
|
|
|
893
911
|
@classmethod
|
|
894
|
-
def
|
|
912
|
+
def from_string(cls: Type[T_Actor], string: str) -> T_Actor:
|
|
895
913
|
"""Create an :class:`Actor` from a string.
|
|
896
914
|
|
|
897
915
|
:param string:
|
|
@@ -906,10 +924,12 @@ class Actor:
|
|
|
906
924
|
left_bracket = line.find("<")
|
|
907
925
|
right_bracket = line.find(">", left_bracket + 1)
|
|
908
926
|
if left_bracket >= 0 and right_bracket >= 0:
|
|
909
|
-
return
|
|
927
|
+
return cls(line[:left_bracket].rstrip(), line[left_bracket + 1 : right_bracket])
|
|
910
928
|
|
|
911
929
|
# Assume the best and use the whole string as name.
|
|
912
|
-
return
|
|
930
|
+
return cls(string, None)
|
|
931
|
+
|
|
932
|
+
_from_string = from_string
|
|
913
933
|
|
|
914
934
|
@classmethod
|
|
915
935
|
def _main_actor(
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
git/__init__.py,sha256=
|
|
1
|
+
git/__init__.py,sha256=rd1vUhNuzo6FFHAATYj5FYGWRA0dq3E1qUVR6ZucIUs,8899
|
|
2
2
|
git/cmd.py,sha256=y-7TVp8PVWVkXcQrKqrSO2vaD6Bdiue73ZzFlWzLryU,77137
|
|
3
3
|
git/compat.py,sha256=y1E6y6O2q5r8clSlr8ZNmuIWG9nmHuehQEsVsmBffs8,4526
|
|
4
|
-
git/config.py,sha256=
|
|
4
|
+
git/config.py,sha256=G_Xwo8BCClPo8CpbZdolhYzM2fVRKBrffST-G3LvAsY,42778
|
|
5
5
|
git/db.py,sha256=X19omm9sk3eEy5WAzMoZ2tG9UmdPZFQYf-8yqpvsYF0,3202
|
|
6
6
|
git/diff.py,sha256=e2ljcabFPkl4BVDjIhsxEkhcF3hQ_jva_BVDimyN5PQ,28898
|
|
7
7
|
git/exc.py,sha256=Gc7g1pHpn8OmTse30NHmJVsBJ2CYH8LxaR8y8UA3lIM,7119
|
|
8
8
|
git/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
git/remote.py,sha256=d68K7XmkYXZUlIoLBDRpRom_df6mbkhWMrcPAP5s11c,46900
|
|
10
10
|
git/types.py,sha256=d3oDduUGjfoqffcUL_GOD-3qroF8m3r9ai6Xi9_FraM,10279
|
|
11
|
-
git/util.py,sha256=
|
|
11
|
+
git/util.py,sha256=NPPk11jSohWD7E9-LNY0AlL_x8Qp6G2H_cBpn3vUiuw,48679
|
|
12
12
|
git/index/__init__.py,sha256=i-Nqb8Lufp9aFbmxpQBORmmQnjEVVM1Pn58fsQkyGgQ,406
|
|
13
13
|
git/index/base.py,sha256=cOeIjjS2LYZwqKdSGvrcgVC37TNZcTNtQzHWbGPyRwk,64775
|
|
14
14
|
git/index/fun.py,sha256=AIW3T6Gr6h5E22z_2wKHevzh5K0HhjjEO9kXAK3nHOM,22419
|
|
@@ -23,7 +23,7 @@ git/objects/tag.py,sha256=jAGESnpmTEv-dLakPzheT5ILZFFArcItnXYqfxfDrgc,4441
|
|
|
23
23
|
git/objects/tree.py,sha256=MmExcS59Iamb2cBqUvoHPdzgixabyvv5voHabossrl8,13898
|
|
24
24
|
git/objects/util.py,sha256=Nlza4zLgdPmr_Yasyvvs6c1rKtW_wMxI6wDmQpQ3ufw,23846
|
|
25
25
|
git/objects/submodule/__init__.py,sha256=6xySp767LVz3UylWgUalntS_nGXRuVzXxDuFAv_Wc2c,303
|
|
26
|
-
git/objects/submodule/base.py,sha256=
|
|
26
|
+
git/objects/submodule/base.py,sha256=pDVdSeC3XHx-dNM6xw_5VQ-UDJd4SMmdpA60HgNLGJw,67544
|
|
27
27
|
git/objects/submodule/root.py,sha256=767GIhBwCwn2xvXeMHm2uEO3kZlRyaIaFXnSqcfdZxU,20277
|
|
28
28
|
git/objects/submodule/util.py,sha256=sQqAYaiSJdFkZa9NlAuK_wTsMNiS-kkQnQjvIoJtc_o,3509
|
|
29
29
|
git/refs/__init__.py,sha256=DWlJNnsx-4jM_E-VycbP-FZUdn6iWhjnH_uZ_pZXBro,509
|
|
@@ -34,11 +34,11 @@ git/refs/remote.py,sha256=WTlkJtpu895jJxbknDNOwL31tivQY_AHQrvroUoFBX4,2902
|
|
|
34
34
|
git/refs/symbolic.py,sha256=MPi5UN0ujdE2GMOrzfW2zt-6HlVreuY5W4P7tnBg4V8,36103
|
|
35
35
|
git/refs/tag.py,sha256=Gm1jn9kClc6f6jGQXRrpLyelrM3-KDcqHRRkD0mL4SE,5510
|
|
36
36
|
git/repo/__init__.py,sha256=CILSVH36fX_WxVFSjD9o1WF5LgsNedPiJvSngKZqfVU,210
|
|
37
|
-
git/repo/base.py,sha256=
|
|
37
|
+
git/repo/base.py,sha256=AGkZ_-xm3G79SSZ6fh1PivZi4Pz5LLppfCs-hwlbl74,67544
|
|
38
38
|
git/repo/fun.py,sha256=LeInQM4xN_DuNcTJ0vlRhjTzgBcZ1m5Os9_RO-Xep-w,24901
|
|
39
|
-
gitpython-3.1.
|
|
40
|
-
gitpython-3.1.
|
|
41
|
-
gitpython-3.1.
|
|
42
|
-
gitpython-3.1.
|
|
43
|
-
gitpython-3.1.
|
|
44
|
-
gitpython-3.1.
|
|
39
|
+
gitpython-3.1.62.dist-info/licenses/AUTHORS,sha256=Iucx_CH3w7_4084yjM6C5BvKfLA8cVfYHWW2pVmpxSk,2410
|
|
40
|
+
gitpython-3.1.62.dist-info/licenses/LICENSE,sha256=hvyUwyGpr7wRUUcTURuv3tIl8lEA3MD3NQ6CvCMbi-s,1503
|
|
41
|
+
gitpython-3.1.62.dist-info/METADATA,sha256=rKMsD3wuor-sivzUK0SrkveTUreIIiJwz5rAH9iVbGE,13558
|
|
42
|
+
gitpython-3.1.62.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
43
|
+
gitpython-3.1.62.dist-info/top_level.txt,sha256=0hzDuIp8obv624V3GmbqsagBWkk8ohtGU-Bc1PmTT0o,4
|
|
44
|
+
gitpython-3.1.62.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|