From e77d2d0ebb9487b696835f219e4a23a558462a55 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 7 Apr 2011 12:14:04 +0200 Subject: Removed all parts of the reference implementation which doesn't require the git command. everything else was moved to GitDB. None of the tests is yet expected to run, although git-python should have less trouble getting the tests back up running than GitDB. plenty of code needs to be de-duplicated though in case of the tests, which will be some work --- git/refs/reference.py | 84 +++------------------------------------------------ 1 file changed, 4 insertions(+), 80 deletions(-) (limited to 'git/refs/reference.py') diff --git a/git/refs/reference.py b/git/refs/reference.py index 1a745ee9..135277e6 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -1,84 +1,8 @@ -from symbolic import SymbolicReference -import os -from git.objects import Object -from git.util import ( - LazyMixin, - Iterable, - ) - -from gitdb.util import ( - isfile, - hex_to_bin - ) +from gitdb.ref.reference import Reference as GitDB_Reference +from git.util import RepoAliasMixin __all__ = ["Reference"] - -class Reference(SymbolicReference, LazyMixin, Iterable): - """Represents a named reference to any object. Subclasses may apply restrictions though, - i.e. Heads can only point to commits.""" +class Reference(GitDB_Reference, RepoAliasMixin): __slots__ = tuple() - _points_to_commits_only = False - _resolve_ref_on_create = True - _common_path_default = "refs" - - def __init__(self, repo, path): - """Initialize this instance - :param repo: Our parent repository - - :param path: - Path relative to the .git/ directory pointing to the ref in question, i.e. - refs/heads/master""" - if not path.startswith(self._common_path_default+'/'): - raise ValueError("Cannot instantiate %r from path %s" % ( self.__class__.__name__, path )) - super(Reference, self).__init__(repo, path) - - - def __str__(self): - return self.name - - def set_object(self, object, logmsg = None): - """Special version which checks if the head-log needs an update as well""" - oldbinsha = None - if logmsg is not None: - head = self.repo.head - if not head.is_detached and head.ref == self: - oldbinsha = self.commit.binsha - #END handle commit retrieval - #END handle message is set - - super(Reference, self).set_object(object, logmsg) - - if oldbinsha is not None: - # /* from refs.c in git-source - # * Special hack: If a branch is updated directly and HEAD - # * points to it (may happen on the remote side of a push - # * for example) then logically the HEAD reflog should be - # * updated too. - # * A generic solution implies reverse symref information, - # * but finding all symrefs pointing to the given branch - # * would be rather costly for this rare event (the direct - # * update of a branch) to be worth it. So let's cheat and - # * check with HEAD only which should cover 99% of all usage - # * scenarios (even 100% of the default ones). - # */ - self.repo.head.log_append(oldbinsha, logmsg) - #END check if the head - - # NOTE: Don't have to overwrite properties as the will only work without a the log - - @property - def name(self): - """:return: (shortest) Name of this reference - it may contain path components""" - # first two path tokens are can be removed as they are - # refs/heads or refs/tags or refs/remotes - tokens = self.path.split('/') - if len(tokens) < 3: - return self.path # could be refs/HEAD - return '/'.join(tokens[2:]) - - @classmethod - def iter_items(cls, repo, common_path = None): - """Equivalent to SymbolicReference.iter_items, but will return non-detached - references as well.""" - return cls._iter_items(repo, common_path) + pass -- cgit v1.2.1 From 3fe1a7f87d511758adf2e56803cb3610b80c5f08 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 29 Apr 2011 17:04:37 +0200 Subject: Moved rev_parse code into gitdb, this probably broke pretty much here, which is still to be fixed of course --- git/refs/reference.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'git/refs/reference.py') diff --git a/git/refs/reference.py b/git/refs/reference.py index 135277e6..cead66ce 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -1,8 +1,7 @@ from gitdb.ref.reference import Reference as GitDB_Reference -from git.util import RepoAliasMixin __all__ = ["Reference"] -class Reference(GitDB_Reference, RepoAliasMixin): +class Reference(GitDB_Reference): __slots__ = tuple() pass -- cgit v1.2.1 From 4177eefd7bdaea96a529b00ba9cf751924ede202 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Thu, 5 May 2011 19:43:22 +0200 Subject: Added all code from gitdb to gitpython. Next is to make it generally work. Then the tests will need some work --- git/refs/reference.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) (limited to 'git/refs/reference.py') diff --git a/git/refs/reference.py b/git/refs/reference.py index cead66ce..6373cb3e 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -1,7 +1,82 @@ +import os + +from symbolic import SymbolicReference +from head import HEAD +from gitdb.util import ( + LazyMixin, + Iterable, + isfile, + hex_to_bin + ) -from gitdb.ref.reference import Reference as GitDB_Reference __all__ = ["Reference"] -class Reference(GitDB_Reference): + +class Reference(SymbolicReference, LazyMixin, Iterable): + """Represents a named reference to any object. Subclasses may apply restrictions though, + i.e. Heads can only point to commits.""" __slots__ = tuple() - pass + _points_to_commits_only = False + _resolve_ref_on_create = True + _common_path_default = "refs" + + def __init__(self, repo, path): + """Initialize this instance + :param repo: Our parent repository + + :param path: + Path relative to the .git/ directory pointing to the ref in question, i.e. + refs/heads/master""" + if not path.startswith(self._common_path_default+'/'): + raise ValueError("Cannot instantiate %r from path %s" % ( self.__class__.__name__, path )) + super(Reference, self).__init__(repo, path) + + + def __str__(self): + return self.name + + def set_object(self, object, logmsg = None): + """Special version which checks if the head-log needs an update as well""" + oldbinsha = None + head = HEAD(self.repo) + if logmsg is not None: + if not head.is_detached and head.ref == self: + oldbinsha = self.commit.binsha + #END handle commit retrieval + #END handle message is set + + super(Reference, self).set_object(object, logmsg) + + if oldbinsha is not None: + # /* from refs.c in git-source + # * Special hack: If a branch is updated directly and HEAD + # * points to it (may happen on the remote side of a push + # * for example) then logically the HEAD reflog should be + # * updated too. + # * A generic solution implies reverse symref information, + # * but finding all symrefs pointing to the given branch + # * would be rather costly for this rare event (the direct + # * update of a branch) to be worth it. So let's cheat and + # * check with HEAD only which should cover 99% of all usage + # * scenarios (even 100% of the default ones). + # */ + head.log_append(oldbinsha, logmsg) + #END check if the head + + # NOTE: Don't have to overwrite properties as the will only work without a the log + + @property + def name(self): + """:return: (shortest) Name of this reference - it may contain path components""" + # first two path tokens are can be removed as they are + # refs/heads or refs/tags or refs/remotes + tokens = self.path.split('/') + if len(tokens) < 3: + return self.path # could be refs/HEAD + return '/'.join(tokens[2:]) + + @classmethod + def iter_items(cls, repo, common_path = None): + """Equivalent to SymbolicReference.iter_items, but will return non-detached + references as well.""" + return cls._iter_items(repo, common_path) -- cgit v1.2.1 From acf5e6ea64a2f24117f1d419c208ed1c38c43690 Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 6 May 2011 15:03:14 +0200 Subject: replaced all gitdb strings with git --- git/refs/reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git/refs/reference.py') diff --git a/git/refs/reference.py b/git/refs/reference.py index 6373cb3e..838a29e3 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -2,7 +2,7 @@ import os from symbolic import SymbolicReference from head import HEAD -from gitdb.util import ( +from git.util import ( LazyMixin, Iterable, isfile, -- cgit v1.2.1 From 1f71ed94578799ee1667ba54b66a369e307f415b Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Mon, 30 May 2011 16:32:56 +0200 Subject: git cmd implementation of repository appears to work, at least this is what the test suggests. Pure python implementation still has some trouble, but this should be very fixable --- git/refs/reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git/refs/reference.py') diff --git a/git/refs/reference.py b/git/refs/reference.py index 838a29e3..5cff74bb 100644 --- a/git/refs/reference.py +++ b/git/refs/reference.py @@ -28,7 +28,7 @@ class Reference(SymbolicReference, LazyMixin, Iterable): Path relative to the .git/ directory pointing to the ref in question, i.e. refs/heads/master""" if not path.startswith(self._common_path_default+'/'): - raise ValueError("Cannot instantiate %r from path %s" % ( self.__class__.__name__, path )) + raise ValueError("Cannot instantiate %r from path %s, maybe use %s.to_full_path(name) to safely generate a valid full path from a name" % ( self.__class__.__name__, path, type(self).__name__)) super(Reference, self).__init__(repo, path) -- cgit v1.2.1