summaryrefslogtreecommitdiff
path: root/git/refs/head.py
diff options
context:
space:
mode:
Diffstat (limited to 'git/refs/head.py')
-rw-r--r--git/refs/head.py114
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