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/head.py | 102 ++++++------------------------------------------------- 1 file changed, 11 insertions(+), 91 deletions(-) (limited to 'git/refs/head.py') diff --git a/git/refs/head.py b/git/refs/head.py index d8729434..dec03551 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -1,33 +1,15 @@ -from symbolic import SymbolicReference -from reference import Reference - -from git.config import SectionConstraint - -from git.util import join_path +from gitdb.ref.head import HEAD as GitDB_HEAD +from gitdb.ref.head import Head as GitDB_Head from git.exc import GitCommandError +from git.util import RepoAliasMixin __all__ = ["HEAD", "Head"] - -class HEAD(SymbolicReference): - """Special case of a Symbolic Reference as it represents the repository's - HEAD reference.""" - _HEAD_NAME = 'HEAD' - _ORIG_HEAD_NAME = 'ORIG_HEAD' +class HEAD(GitDB_HEAD, RepoAliasMixin): + """Provides additional functionality using the git command""" __slots__ = tuple() - - def __init__(self, repo, path=_HEAD_NAME): - if path != self._HEAD_NAME: - raise ValueError("HEAD instance must point to %r, got %r" % (self._HEAD_NAME, path)) - super(HEAD, self).__init__(repo, path) - - def orig_head(self): - """ - :return: SymbolicReference pointing at the ORIG_HEAD, which is maintained - to contain the previous value of HEAD""" - return SymbolicReference(self.repo, self._ORIG_HEAD_NAME) def reset(self, commit='HEAD', index=True, working_tree = False, paths=None, **kwargs): @@ -91,8 +73,10 @@ class HEAD(SymbolicReference): return self -class Head(Reference): - """A Head is a named reference to a Commit. Every Head instance contains a name +class Head(GitDB_Head, RepoAliasMixin): + """The GitPyhton Head implementation provides more git-command based features + + A Head is a named reference to a Commit. Every Head instance contains a name and a Commit object. Examples:: @@ -108,6 +92,8 @@ class Head(Reference): >>> head.commit.hexsha '1c09f116cbc2cb4100fb6935bb162daa4723f455'""" + __slots__ = tuple() + _common_path_default = "refs/heads" k_config_remote = "remote" k_config_remote_ref = "merge" # branch to merge from remote @@ -125,47 +111,7 @@ class Head(Reference): flag = "-D" repo.git.branch(flag, *heads) - def set_tracking_branch(self, remote_reference): - """ - Configure this branch to track the given remote reference. This will alter - this branch's configuration accordingly. - - :param remote_reference: The remote reference to track or None to untrack - any references - :return: self""" - if remote_reference is not None and not isinstance(remote_reference, RemoteReference): - raise ValueError("Incorrect parameter type: %r" % remote_reference) - # END handle type - - writer = self.config_writer() - if remote_reference is None: - writer.remove_option(self.k_config_remote) - writer.remove_option(self.k_config_remote_ref) - if len(writer.options()) == 0: - writer.remove_section() - # END handle remove section - else: - writer.set_value(self.k_config_remote, remote_reference.remote_name) - writer.set_value(self.k_config_remote_ref, Head.to_full_path(remote_reference.remote_head)) - # END handle ref value - - return self - - def tracking_branch(self): - """ - :return: The remote_reference we are tracking, or None if we are - not a tracking branch""" - reader = self.config_reader() - if reader.has_option(self.k_config_remote) and reader.has_option(self.k_config_remote_ref): - ref = Head(self.repo, Head.to_full_path(reader.get_value(self.k_config_remote_ref))) - remote_refpath = RemoteReference.to_full_path(join_path(reader.get_value(self.k_config_remote), ref.name)) - return RemoteReference(self.repo, remote_refpath) - # END handle have tracking branch - - # we are not a tracking branch - return None - def rename(self, new_path, force=False): """Rename self to a new path @@ -217,30 +163,4 @@ class Head(Reference): self.repo.git.checkout(self, **kwargs) return self.repo.active_branch - - #{ Configruation - - def _config_parser(self, read_only): - if read_only: - parser = self.repo.config_reader() - else: - parser = self.repo.config_writer() - # END handle parser instance - - return SectionConstraint(parser, 'branch "%s"' % self.name) - - def config_reader(self): - """ - :return: A configuration parser instance constrained to only read - this instance's values""" - return self._config_parser(read_only=True) - - def config_writer(self): - """ - :return: A configuration writer instance with read-and write acccess - to options of this head""" - return self._config_parser(read_only=False) - - #} END configuration - -- cgit v1.2.3 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/head.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'git/refs/head.py') diff --git a/git/refs/head.py b/git/refs/head.py index dec03551..8ebb409c 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -1,13 +1,12 @@ from gitdb.ref.head import HEAD as GitDB_HEAD -from gitdb.ref.head import Head as GitDB_Head +from gitdb.ref.headref import Head as GitDB_Head from git.exc import GitCommandError -from git.util import RepoAliasMixin __all__ = ["HEAD", "Head"] -class HEAD(GitDB_HEAD, RepoAliasMixin): +class HEAD(GitDB_HEAD): """Provides additional functionality using the git command""" __slots__ = tuple() @@ -73,7 +72,7 @@ class HEAD(GitDB_HEAD, RepoAliasMixin): return self -class Head(GitDB_Head, RepoAliasMixin): +class Head(GitDB_Head): """The GitPyhton Head implementation provides more git-command based features A Head is a named reference to a Commit. Every Head instance contains a name -- cgit v1.2.3 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/head.py | 112 +++++++++---------------------------------------------- 1 file changed, 17 insertions(+), 95 deletions(-) (limited to 'git/refs/head.py') diff --git a/git/refs/head.py b/git/refs/head.py index 8ebb409c..702ce468 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -1,14 +1,28 @@ -from gitdb.ref.head import HEAD as GitDB_HEAD -from gitdb.ref.headref import Head as GitDB_Head +from symbolic import SymbolicReference from git.exc import GitCommandError __all__ = ["HEAD", "Head"] -class HEAD(GitDB_HEAD): +class HEAD(SymbolicReference): """Provides additional functionality using the git command""" __slots__ = tuple() + + _HEAD_NAME = 'HEAD' + _ORIG_HEAD_NAME = 'ORIG_HEAD' + __slots__ = tuple() + + def __init__(self, repo, path=_HEAD_NAME): + if path != self._HEAD_NAME: + raise ValueError("HEAD instance must point to %r, got %r" % (self._HEAD_NAME, path)) + super(HEAD, self).__init__(repo, path) + + def orig_head(self): + """ + :return: SymbolicReference pointing at the ORIG_HEAD, which is maintained + to contain the previous value of HEAD""" + return SymbolicReference(self.repo, self._ORIG_HEAD_NAME) def reset(self, commit='HEAD', index=True, working_tree = False, paths=None, **kwargs): @@ -71,95 +85,3 @@ class HEAD(GitDB_HEAD): return self - -class Head(GitDB_Head): - """The GitPyhton Head implementation provides more git-command based features - - A Head is a named reference to a Commit. Every Head instance contains a name - and a Commit object. - - Examples:: - - >>> repo = Repo("/path/to/repo") - >>> head = repo.heads[0] - - >>> head.name - 'master' - - >>> head.commit - - - >>> head.commit.hexsha - '1c09f116cbc2cb4100fb6935bb162daa4723f455'""" - __slots__ = tuple() - - _common_path_default = "refs/heads" - k_config_remote = "remote" - k_config_remote_ref = "merge" # branch to merge from remote - - @classmethod - def delete(cls, repo, *heads, **kwargs): - """Delete the given heads - :param force: - If True, the heads will be deleted even if they are not yet merged into - the main development stream. - Default False""" - force = kwargs.get("force", False) - flag = "-d" - if force: - flag = "-D" - repo.git.branch(flag, *heads) - - - def rename(self, new_path, force=False): - """Rename self to a new path - - :param new_path: - Either a simple name or a path, i.e. new_name or features/new_name. - The prefix refs/heads is implied - - :param force: - If True, the rename will succeed even if a head with the target name - already exists. - - :return: self - :note: respects the ref log as git commands are used""" - flag = "-m" - if force: - flag = "-M" - - self.repo.git.branch(flag, self, new_path) - self.path = "%s/%s" % (self._common_path_default, new_path) - return self - - def checkout(self, force=False, **kwargs): - """Checkout this head by setting the HEAD to this reference, by updating the index - to reflect the tree we point to and by updating the working tree to reflect - the latest index. - - The command will fail if changed working tree files would be overwritten. - - :param force: - If True, changes to the index and the working tree will be discarded. - If False, GitCommandError will be raised in that situation. - - :param kwargs: - Additional keyword arguments to be passed to git checkout, i.e. - b='new_branch' to create a new branch at the given spot. - - :return: - The active branch after the checkout operation, usually self unless - a new branch has been created. - - :note: - By default it is only allowed to checkout heads - everything else - will leave the HEAD detached which is allowed and possible, but remains - a special state that some tools might not be able to handle.""" - args = list() - kwargs['f'] = force - if kwargs['f'] == False: - kwargs.pop('f') - - self.repo.git.checkout(self, **kwargs) - return self.repo.active_branch - -- cgit v1.2.3 From 7ae36c3e019a5cc16924d1b6007774bfb625036f Mon Sep 17 00:00:00 2001 From: Sebastian Thiel Date: Fri, 6 May 2011 18:53:59 +0200 Subject: Started to fix imports - tests still have no chance to work as database changed drastically. Now the actual work begins --- git/refs/head.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'git/refs/head.py') diff --git a/git/refs/head.py b/git/refs/head.py index 702ce468..4345528b 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -2,7 +2,7 @@ from symbolic import SymbolicReference from git.exc import GitCommandError -__all__ = ["HEAD", "Head"] +__all__ = ["HEAD"] class HEAD(SymbolicReference): -- cgit v1.2.3