summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2016-09-11 18:30:21 +0200
committerSebastian Thiel <byronimo@gmail.com>2016-09-11 18:30:21 +0200
commit06c9c919707ba4116442ca53ac7cf035540981f2 (patch)
tree7a5207918e9e05ae059019f1945f84813d60cf90
parent2ba897b12024fd20681b7c2f1b40bdbbccd5df59 (diff)
downloadgitpython-06c9c919707ba4116442ca53ac7cf035540981f2.tar.gz
fix(Head): checkout() handles detached head
It's not optimal, as we can now return one of two types which are only compatible in the most basic ways. However, it is better than before, I presume. Fixes #510
-rw-r--r--doc/source/changes.rst2
-rw-r--r--git/refs/head.py7
-rw-r--r--git/test/test_refs.py6
3 files changed, 14 insertions, 1 deletions
diff --git a/doc/source/changes.rst b/doc/source/changes.rst
index 62f8ab45..fcd8240c 100644
--- a/doc/source/changes.rst
+++ b/doc/source/changes.rst
@@ -7,6 +7,8 @@ Changelog
* `tag.commit` will now resolve commits deeply.
* `Repo` objects can now be pickled, which helps with multi-processing.
+* `Head.checkout()` now deals with detached heads, which is when it will return
+ the `HEAD` reference instead.
* `DiffIndex.iter_change_type(...)` produces better results when diffing
2.0.8 - Features and Bugfixes
diff --git a/git/refs/head.py b/git/refs/head.py
index 06207e0a..fe820b10 100644
--- a/git/refs/head.py
+++ b/git/refs/head.py
@@ -202,6 +202,8 @@ class Head(Reference):
:return:
The active branch after the checkout operation, usually self unless
a new branch has been created.
+ If there is no active branch, as the HEAD is now detached, the HEAD
+ reference will be returned instead.
:note:
By default it is only allowed to checkout heads - everything else
@@ -212,7 +214,10 @@ class Head(Reference):
kwargs.pop('f')
self.repo.git.checkout(self, **kwargs)
- return self.repo.active_branch
+ if self.repo.head.is_detached:
+ return self.repo.head
+ else:
+ return self.repo.active_branch
#{ Configruation
diff --git a/git/test/test_refs.py b/git/test/test_refs.py
index 879b8caa..9816fb50 100644
--- a/git/test/test_refs.py
+++ b/git/test/test_refs.py
@@ -175,6 +175,12 @@ class TestRefs(TestBase):
def test_orig_head(self):
assert type(self.rorepo.head.orig_head()) == SymbolicReference
+
+ @with_rw_repo('0.1.6')
+ def test_head_checkout_detached_head(self, rw_repo):
+ res = rw_repo.remotes.origin.refs.master.checkout()
+ assert isinstance(res, SymbolicReference)
+ assert res.name == 'HEAD'
@with_rw_repo('0.1.6')
def test_head_reset(self, rw_repo):