aboutsummaryrefslogtreecommitdiff
path: root/rhodecode/lib/vcs/backends/git/changeset.py
diff options
context:
space:
mode:
authorMarcin Kuzminski <marcin@python-works.com>2012-03-08 22:01:51 +0200
committerMarcin Kuzminski <marcin@python-works.com>2012-03-08 22:01:51 +0200
commit9a1c148d6419ee4b1650c8266cc4ab922f935e7b (patch)
treed3f11da648bf1fba4453785ec1105477ef40d5ee /rhodecode/lib/vcs/backends/git/changeset.py
parentf9e980f0c7e9196a96f3c5642071599cd1d6c1b7 (diff)
temporarly fixed git _get_id_for_path problem in vcs.
Will iterate later while there's a nicer fix. --HG-- branch : beta
Diffstat (limited to 'rhodecode/lib/vcs/backends/git/changeset.py')
-rw-r--r--rhodecode/lib/vcs/backends/git/changeset.py60
1 files changed, 34 insertions, 26 deletions
diff --git a/rhodecode/lib/vcs/backends/git/changeset.py b/rhodecode/lib/vcs/backends/git/changeset.py
index 33c46061..c527de7f 100644
--- a/rhodecode/lib/vcs/backends/git/changeset.py
+++ b/rhodecode/lib/vcs/backends/git/changeset.py
@@ -68,19 +68,24 @@ class GitChangeset(BaseChangeset):
def branch(self):
# TODO: Cache as we walk (id <-> branch name mapping)
refs = self.repository._repo.get_refs()
- heads = [(key[len('refs/heads/'):], val) for key, val in refs.items()
- if key.startswith('refs/heads/')]
-
- for name, id in heads:
+ heads = {}
+ for key, val in refs.items():
+ for ref_key in ['refs/heads/', 'refs/remotes/origin/']:
+ if key.startswith(ref_key):
+ n = key[len(ref_key):]
+ if n not in ['HEAD']:
+ heads[n] = val
+
+ for name, id in heads.iteritems():
walker = self.repository._repo.object_store.get_graph_walker([id])
while True:
- id = walker.next()
- if not id:
+ id_ = walker.next()
+ if not id_:
break
- if id == self.id:
+ if id_ == self.id:
return safe_unicode(name)
raise ChangesetError("This should not happen... Have you manually "
- "change id of the changeset?")
+ "change id of the changeset?")
def _fix_path(self, path):
"""
@@ -92,6 +97,7 @@ class GitChangeset(BaseChangeset):
return path
def _get_id_for_path(self, path):
+
# FIXME: Please, spare a couple of minutes and make those codes cleaner;
if not path in self._paths:
path = path.strip('/')
@@ -103,24 +109,23 @@ class GitChangeset(BaseChangeset):
splitted = path.split('/')
dirs, name = splitted[:-1], splitted[-1]
curdir = ''
+
+ # initially extract things from root dir
+ for item, stat, id in tree.iteritems():
+ if curdir:
+ name = '/'.join((curdir, item))
+ else:
+ name = item
+ self._paths[name] = id
+ self._stat_modes[name] = stat
+
for dir in dirs:
if curdir:
curdir = '/'.join((curdir, dir))
else:
curdir = dir
- #if curdir in self._paths:
- ## This path have been already traversed
- ## Update tree and continue
- #tree = self.repository._repo[self._paths[curdir]]
- #continue
dir_id = None
for item, stat, id in tree.iteritems():
- if curdir:
- item_path = '/'.join((curdir, item))
- else:
- item_path = item
- self._paths[item_path] = id
- self._stat_modes[item_path] = stat
if dir == item:
dir_id = id
if dir_id:
@@ -130,13 +135,16 @@ class GitChangeset(BaseChangeset):
raise ChangesetError('%s is not a directory' % curdir)
else:
raise ChangesetError('%s have not been found' % curdir)
- for item, stat, id in tree.iteritems():
- if curdir:
- name = '/'.join((curdir, item))
- else:
- name = item
- self._paths[name] = id
- self._stat_modes[name] = stat
+
+ # cache all items from the given traversed tree
+ for item, stat, id in tree.iteritems():
+ if curdir:
+ name = '/'.join((curdir, item))
+ else:
+ name = item
+ self._paths[name] = id
+ self._stat_modes[name] = stat
+
if not path in self._paths:
raise NodeDoesNotExistError("There is no file nor directory "
"at the given path %r at revision %r"