diff options
Diffstat (limited to 'git/refs/head.py')
-rw-r--r-- | git/refs/head.py | 114 |
1 files changed, 56 insertions, 58 deletions
diff --git a/git/refs/head.py b/git/refs/head.py index 6e4879fe..2ef7c23e 100644 --- a/git/refs/head.py +++ b/git/refs/head.py @@ -10,75 +10,75 @@ from git.exc import GitCommandError __all__ = ["HEAD", "Head"] - class HEAD(SymbolicReference): - """Special case of a Symbolic Reference as it represents the repository's + + """Special case of a Symbolic Reference as it represents the repository's HEAD reference.""" _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 + :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, + + def reset(self, commit='HEAD', index=True, working_tree=False, paths=None, **kwargs): - """Reset our HEAD to the given commit optionally synchronizing - the index and working tree. The reference we refer to will be set to + """Reset our HEAD to the given commit optionally synchronizing + the index and working tree. The reference we refer to will be set to commit as well. - + :param commit: - Commit object, Reference Object or string identifying a revision we + Commit object, Reference Object or string identifying a revision we should reset HEAD to. - + :param index: If True, the index will be set to match the given commit. Otherwise it will not be touched. - + :param working_tree: If True, the working tree will be forcefully adjusted to match the given commit, possibly overwriting uncommitted changes without warning. If working_tree is True, index must be true as well - + :param paths: Single path or list of paths relative to the git root directory that are to be reset. This allows to partially reset individual files. - + :param kwargs: - Additional arguments passed to git-reset. - + Additional arguments passed to git-reset. + :return: self""" mode = "--soft" add_arg = None if index: mode = "--mixed" - + # it appears, some git-versions declare mixed and paths deprecated # see http://github.com/Byron/GitPython/issues#issue/2 if paths: mode = None # END special case # END handle index - + if working_tree: mode = "--hard" if not index: - raise ValueError( "Cannot reset the working tree if the index is not reset as well") - + raise ValueError("Cannot reset the working tree if the index is not reset as well") + # END working tree handling - + if paths: add_arg = "--" # END nicely separate paths from rest - + try: self.repo.git.reset(mode, commit, add_arg, paths, **kwargs) except GitCommandError, e: @@ -87,11 +87,12 @@ class HEAD(SymbolicReference): if e.status != 1: raise # END handle exception - + return self - + class Head(Reference): + """A Head is a named reference to a Commit. Every Head instance contains a name and a Commit object. @@ -111,7 +112,7 @@ class Head(Reference): _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 @@ -124,19 +125,19 @@ class Head(Reference): if force: 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 + + :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) @@ -148,13 +149,12 @@ class Head(Reference): 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 + :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): @@ -162,50 +162,50 @@ class Head(Reference): 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 - + :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) + 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 + 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 @@ -214,33 +214,31 @@ class Head(Reference): kwargs['f'] = force if kwargs['f'] == False: kwargs.pop('f') - + 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 + :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 - + #} END configuration |