Skip to content

Commit 74717be

Browse files
committed
Merge remote-tracking branch 'tmr232/references-object'
2 parents 706c60c + 3818555 commit 74717be

File tree

3 files changed

+246
-35
lines changed

3 files changed

+246
-35
lines changed

docs/references.rst

+12-5
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,21 @@ References
44

55
.. contents::
66

7-
.. automethod:: pygit2.Repository.listall_reference_objects
8-
.. automethod:: pygit2.Repository.listall_references
9-
.. automethod:: pygit2.Repository.lookup_reference
7+
.. autoattribute:: pygit2.Repository.references
108

119
Example::
1210

13-
>>> all_refs = repo.listall_references()
11+
>>> all_refs = list(repo.references)
12+
1413
>>> master_ref = repo.lookup_reference("refs/heads/master")
1514
>>> commit = master_ref.get_object() # or repo[master_ref.target]
1615

16+
# Create a reference
17+
>>> ref = repo.references.create('refs/tags/version1', LAST_COMMIT)
18+
19+
# Delete a reference
20+
>>> repo.references.delete('refs/tags/version1')
21+
1722

1823
The Reference type
1924
====================
@@ -116,7 +121,9 @@ The reference log
116121

117122
Example::
118123

119-
>>> head = repo.lookup_reference('refs/heads/master')
124+
>>> head = repo.references.get('refs/heads/master') # Returns None if not found
125+
>>> # Almost equivalent to
126+
>>> head = repo.references['refs/heads/master'] # Raises KeyError if not found
120127
>>> for entry in head.log():
121128
... print(entry.message)
122129

pygit2/repository.py

+31-5
Original file line numberDiff line numberDiff line change
@@ -1037,13 +1037,38 @@ def delete(self, name):
10371037
self[name].delete()
10381038

10391039
def __contains__(self, name):
1040-
try:
1041-
# If the lookup succeeds, the name is present.
1042-
_ = self[name]
1043-
return True
1040+
return self.get(name) is not None
1041+
10441042

1043+
class References(object):
1044+
def __init__(self, repository):
1045+
self._repository = repository
1046+
1047+
def __getitem__(self, name):
1048+
return self._repository.lookup_reference(name)
1049+
1050+
def get(self, key):
1051+
try:
1052+
return self[key]
10451053
except KeyError:
1046-
return False
1054+
return None
1055+
1056+
def __iter__(self):
1057+
for ref_name in self._repository.listall_references():
1058+
yield ref_name
1059+
1060+
def create(self, name, target, force=False):
1061+
return self._repository.create_reference(name, target, force)
1062+
1063+
def delete(self, name):
1064+
self[name].delete()
1065+
1066+
def __contains__(self, name):
1067+
return self.get(name) is not None
1068+
1069+
@property
1070+
def objects(self):
1071+
return self._repository.listall_reference_objects()
10471072

10481073

10491074
class Repository(BaseRepository):
@@ -1055,6 +1080,7 @@ def __init__(self, path, *args, **kwargs):
10551080
super(Repository, self).__init__(backend=path_backend, *args, **kwargs)
10561081

10571082
self.branches = Branches(self)
1083+
self.references = References(self)
10581084

10591085
@classmethod
10601086
def _from_c(cls, ptr, owned):

0 commit comments

Comments
 (0)