summaryrefslogtreecommitdiff
path: root/git/objects/submodule/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'git/objects/submodule/base.py')
-rw-r--r--git/objects/submodule/base.py44
1 files changed, 30 insertions, 14 deletions
diff --git a/git/objects/submodule/base.py b/git/objects/submodule/base.py
index d6f8982b..0ec6f656 100644
--- a/git/objects/submodule/base.py
+++ b/git/objects/submodule/base.py
@@ -1,5 +1,5 @@
-import util
-from util import (
+from . import util
+from .util import (
mkhead,
sm_name,
sm_section,
@@ -8,7 +8,7 @@ from util import (
find_first_remote_branch
)
from git.objects.util import Traversable
-from StringIO import StringIO # need a dict to set bloody .name field
+from io import BytesIO # need a dict to set bloody .name field
from git.util import (
Iterable,
join_path_native,
@@ -17,11 +17,15 @@ from git.util import (
rmtree
)
-from git.config import SectionConstraint
+from git.config import (
+ SectionConstraint,
+ cp
+)
from git.exc import (
InvalidGitRepositoryError,
NoSuchPathError
)
+from git.compat import string_types
import stat
import git
@@ -93,7 +97,7 @@ class Submodule(util.IndexObject, Iterable, Traversable):
if url is not None:
self._url = url
if branch_path is not None:
- assert isinstance(branch_path, basestring)
+ assert isinstance(branch_path, string_types)
self._branch_path = branch_path
if name is not None:
self._name = name
@@ -186,8 +190,8 @@ class Submodule(util.IndexObject, Iterable, Traversable):
@classmethod
def _sio_modules(cls, parent_commit):
- """:return: Configuration file as StringIO - we only access it through the respective blob's data"""
- sio = StringIO(parent_commit.tree[cls.k_modules_file].data_stream.read())
+ """:return: Configuration file as BytesIO - we only access it through the respective blob's data"""
+ sio = BytesIO(parent_commit.tree[cls.k_modules_file].data_stream.read())
sio.name = cls.k_modules_file
return sio
@@ -301,6 +305,7 @@ class Submodule(util.IndexObject, Iterable, Traversable):
writer.set_value(cls.k_head_option, br.path)
sm._branch_path = br.path
# END handle path
+ writer.release()
del(writer)
# we deliberatly assume that our head matches our index !
@@ -418,7 +423,9 @@ class Submodule(util.IndexObject, Iterable, Traversable):
# the default implementation will be offended and not update the repository
# Maybe this is a good way to assure it doesn't get into our way, but
# we want to stay backwards compatible too ... . Its so redundant !
- self.repo.config_writer().set_value(sm_section(self.name), 'url', self.url)
+ writer = self.repo.config_writer()
+ writer.set_value(sm_section(self.name), 'url', self.url)
+ writer.release()
# END handle dry_run
# END handle initalization
@@ -575,6 +582,7 @@ class Submodule(util.IndexObject, Iterable, Traversable):
writer = self.config_writer(index=index) # auto-write
writer.set_value('path', module_path)
self.path = module_path
+ writer.release()
del(writer)
# END handle configuration flag
except Exception:
@@ -699,8 +707,12 @@ class Submodule(util.IndexObject, Iterable, Traversable):
# now git config - need the config intact, otherwise we can't query
# inforamtion anymore
- self.repo.config_writer().remove_section(sm_section(self.name))
- self.config_writer().remove_section()
+ writer = self.repo.config_writer()
+ writer.remove_section(sm_section(self.name))
+ writer.release()
+ writer = self.config_writer()
+ writer.remove_section()
+ writer.release()
# END delete configuration
# void our data not to delay invalid access
@@ -799,14 +811,18 @@ class Submodule(util.IndexObject, Iterable, Traversable):
"""
:return: True if the submodule exists, False otherwise. Please note that
a submodule may exist (in the .gitmodules file) even though its module
- doesn't exist"""
+ doesn't exist on disk"""
# keep attributes for later, and restore them if we have no valid data
# this way we do not actually alter the state of the object
loc = locals()
for attr in self._cache_attrs:
- if hasattr(self, attr):
- loc[attr] = getattr(self, attr)
- # END if we have the attribute cache
+ try:
+ if hasattr(self, attr):
+ loc[attr] = getattr(self, attr)
+ # END if we have the attribute cache
+ except cp.NoSectionError:
+ # on PY3, this can happen apparently ... don't know why this doesn't happen on PY2
+ pass
# END for each attr
self._clear_cache()