You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A Git instance produced by pickle deserialization always has a version_info of None. This prevents version information from being accessed through version_info. It also causes the version_info property not to satisfy its type annotation as a tuple of ints (independently of #1830). This is the case whether or not version_info has been accessed on the original instance before it was pickled:
This is due to an inconsistency in how the state of not yet having computed version_info is represented in the backing attribute _version_info:
Git uses LazyMixin caching for _version_info, which treats the attribute as uncomputed when absent and computed when present.
Git defines __getstate__ and __setstate__ for pickling and unpickling to represent state pickling does not preserve by setting attributes to None.
The _version_info attribute is set to None on a Git object created by unpickling, so when accessing the version_info property delegates to the _version_info attribute, its value of None is returned and the if attr == "_version_info" logic in the _set_cache_ method (inherited from LazyMixin and overridden) is never run.
The intention is that an unpickled Git object have version_info in the uncomputed state. This works for the other two excluded attributes, which use the same None convention as in the __getstate__ and __setstate__ implementations, and which do not use any LazyMixin functionality for their caching:
This is natural to fix at the same time as #1829, because a fix for that should change the way caching works. LazyMixin caching supports attributes that are computed once and never become stale, so version_info/_version_info should implement caching in a different way to fix #1829, and that can fix this too if consistent with __getstate__/__setstate__.
The text was updated successfully, but these errors were encountered:
EliahKagan
added a commit
to EliahKagan/GitPython
that referenced
this issue
Feb 22, 2024
For gitpython-developers#1836.
This uses a property with the same logic as before for version_info
caching, except that the _version_info backing attribute holds the
value None, rather than being unset, for the uncomputed state. This
rectifies the inconistency between the property's behavior and the
way the associated states are represented by its __setstate__ and
__getstate__ methods for pickling.
Because the Git class only used LazyMixin as an implementation
detail of the version_info attribute, it is removed as a subclass.
A
Git
instance produced by pickle deserialization always has aversion_info
ofNone
. This prevents version information from being accessed throughversion_info
. It also causes theversion_info
property not to satisfy its type annotation as a tuple ofint
s (independently of #1830). This is the case whether or notversion_info
has been accessed on the original instance before it was pickled:This is due to an inconsistency in how the state of not yet having computed
version_info
is represented in the backing attribute_version_info
:Git
usesLazyMixin
caching for_version_info
, which treats the attribute as uncomputed when absent and computed when present.Git
defines__getstate__
and__setstate__
for pickling and unpickling to represent state pickling does not preserve by setting attributes toNone
.The
_version_info
attribute is set toNone
on aGit
object created by unpickling, so when accessing theversion_info
property delegates to the_version_info
attribute, its value ofNone
is returned and theif attr == "_version_info"
logic in the_set_cache_
method (inherited fromLazyMixin
and overridden) is never run.The intention is that an unpickled
Git
object haveversion_info
in the uncomputed state. This works for the other two excluded attributes, which use the sameNone
convention as in the__getstate__
and__setstate__
implementations, and which do not use anyLazyMixin
functionality for their caching:GitPython/git/cmd.py
Line 315 in afa5754
GitPython/git/cmd.py
Lines 319 to 323 in afa5754
Unlike
_version_info
, which is managed by_set_cache_
, thecat_file_all
andcat_file_header
attributes are initialized toNone
inGit.__init__
:GitPython/git/cmd.py
Lines 786 to 788 in afa5754
This is natural to fix at the same time as #1829, because a fix for that should change the way caching works.
LazyMixin
caching supports attributes that are computed once and never become stale, soversion_info
/_version_info
should implement caching in a different way to fix #1829, and that can fix this too if consistent with__getstate__
/__setstate__
.The text was updated successfully, but these errors were encountered: