summaryrefslogtreecommitdiff
path: root/lib/git/head.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2009-10-11 22:50:44 +0200
committerSebastian Thiel <byronimo@gmail.com>2009-10-11 22:50:44 +0200
commit3c0a65226f038c58fc6d6ed525f38fc00b3579b7 (patch)
treea5b715a490d9cbd8f45eabc1968374c96bdea1c0 /lib/git/head.py
parent9c0c2fc4ee2d8a5d0a2de50ba882657989dedc51 (diff)
parentc68459a17ff59043d29c90020fffe651b2164e6a (diff)
downloadgitpython-3c0a65226f038c58fc6d6ed525f38fc00b3579b7.tar.gz
Merge branch 'hierarchyfix' into improvements
* hierarchyfix: Added remaining tests for new base classes and removed some methods whose existance was doubtful or unsafe Fixed remaining tests to deal with the changes commit: fixed failing commit tests as the mocked git command would always return the same thing which does not work anymore - re-implemented it in a more dynamic manner, but in the end tests will have to be revised anyway mode-only change for test system - this should be in a separate repository in fact so that changes are a little more self-contained and not depending on the actual source repository fixed issue in Ref.name implementation which would not handle components properly lazymixin system now supports per-attribute baking, it is up to the class whether it bakes more. This also leads to more efficient use of memory as values are only cached and set when required - the baking system does not require an own tracking variable anymore, and values are only to be cached once - then python will natively find the cache without involving any additional overhead. This works by using __getattr__ instead of __get_attribute__ which would always be called put Tree and Blob onto a new base class suitable to deal with IndexObjects blob tests fixed to deal with changes to the Blob type converted all spaces to tabs ( 4 spaces = 1 tab ) just to allow me and my editor to work with the files properly. Can convert it back for releaes Re-designed the tag testing - it does not use fixtures anymore but dyamically checks the existance of tags within the repository - it basically tests the interface and checks that expected return types are actually returned Intermediate commit: commit,tree and blob objects now derive from object - test is in place which still fails on purpose. Need to integrate tags which can be objects or just a special form of a ref Renamed lazy.py to base.py to have a file for base classes - lazy not yet changed to allow proper rename tracking
Diffstat (limited to 'lib/git/head.py')
-rw-r--r--lib/git/head.py153
1 files changed, 42 insertions, 111 deletions
diff --git a/lib/git/head.py b/lib/git/head.py
index 639cee40..42dfd735 100644
--- a/lib/git/head.py
+++ b/lib/git/head.py
@@ -5,114 +5,45 @@
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
import commit
-
-class Head(object):
- """
- 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
- <git.Commit "1c09f116cbc2cb4100fb6935bb162daa4723f455">
-
- >>> head.commit.id
- '1c09f116cbc2cb4100fb6935bb162daa4723f455'
- """
-
- def __init__(self, name, commit):
- """
- Initialize a newly instanced Head
-
- `name`
- is the name of the head
-
- `commit`
- is the Commit object that the head points to
- """
- self.name = name
- self.commit = commit
-
- @classmethod
- def find_all(cls, repo, **kwargs):
- """
- Find all Heads in the repository
-
- `repo`
- is the Repo
-
- `kwargs`
- Additional options given as keyword arguments, will be passed
- to git-for-each-ref
-
- Returns
- git.Head[]
-
- List is sorted by committerdate
- """
-
- options = {'sort': "committerdate",
- 'format': "%(refname)%00%(objectname)"}
- options.update(kwargs)
-
- output = repo.git.for_each_ref("refs/heads", **options)
- return cls.list_from_string(repo, output)
-
- @classmethod
- def list_from_string(cls, repo, text):
- """
- Parse out head information into a list of head objects
-
- ``repo``
- is the Repo
- ``text``
- is the text output from the git-for-each-ref command
-
- Returns
- git.Head[]
- """
- heads = []
-
- for line in text.splitlines():
- heads.append(cls.from_string(repo, line))
-
- return heads
-
- @classmethod
- def from_string(cls, repo, line):
- """
- Create a new Head instance from the given string.
-
- ``repo``
- is the Repo
-
- ``line``
- is the formatted head information
-
- Format::
-
- name: [a-zA-Z_/]+
- <null byte>
- id: [0-9A-Fa-f]{40}
-
- Returns
- git.Head
- """
- full_name, ids = line.split("\x00")
-
- if full_name.startswith('refs/heads/'):
- name = full_name[len('refs/heads/'):]
- else:
- name = full_name
-
- c = commit.Commit(repo, id=ids)
- return Head(name, c)
-
- def __repr__(self):
- return '<git.Head "%s">' % self.name
+import base
+
+class Head(base.Ref):
+ """
+ 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
+ <git.Commit "1c09f116cbc2cb4100fb6935bb162daa4723f455">
+
+ >>> head.commit.id
+ '1c09f116cbc2cb4100fb6935bb162daa4723f455'
+ """
+
+ @property
+ def commit(self):
+ """
+ Returns
+ Commit object the head points to
+ """
+ return self.object
+
+ @classmethod
+ def find_all(cls, repo, common_path = "refs/heads", **kwargs):
+ """
+ Returns
+ git.Head[]
+
+ For more documentation, please refer to git.base.Ref.find_all
+ """
+ return super(Head,cls).find_all(repo, common_path, **kwargs)
+
+ def __repr__(self):
+ return '<git.Head "%s">' % self.name