Get rid of a settable Reference.target

Updating the target of a reference is not like setting a property. It
involves appending to the reflog under the same lock, so we must do it
all the same time. Thus setting the target becomes a function which
takes the new target and what the use would like to add to the reflog.
This commit is contained in:
Carlos Martín Nieto
2014-08-28 01:04:55 +02:00
parent f35f58ca45
commit 4d053cf066
2 changed files with 16 additions and 22 deletions

View File

@@ -205,10 +205,7 @@ Reference_resolve(Reference *self, PyObject *args)
PyDoc_STRVAR(Reference_target__doc__,
"The reference target: If direct the value will be an Oid object, if it\n"
"is symbolic it will be an string with the full name of the target\n"
"reference.\n"
"\n"
"The target is writable. Setting the Reference's target to another Oid\n"
"object will direct the reference to that Oid instead.");
"reference.\n");
PyObject *
Reference_target__get__(Reference *self)
@@ -230,17 +227,6 @@ Reference_target__get__(Reference *self)
return to_path(c_name);
}
int
Reference_target__set__(Reference *self, PyObject *py_target)
{
CHECK_REFERENCE_INT(self);
if (!PyObject_CallMethod(self, "set_target", "O", py_target))
return -1;
return 0;
}
PyDoc_STRVAR(Reference_set_target__doc__,
"set_target(target, [signature, message])\n"
"\n"
@@ -499,7 +485,7 @@ PyMethodDef Reference_methods[] = {
PyGetSetDef Reference_getseters[] = {
GETTER(Reference, name),
GETTER(Reference, shorthand),
GETSET(Reference, target),
GETTER(Reference, target),
GETTER(Reference, type),
{NULL}
};

View File

@@ -31,7 +31,7 @@ from __future__ import absolute_import
from __future__ import unicode_literals
import unittest
from pygit2 import GitError, GIT_REF_OID, GIT_REF_SYMBOLIC
from pygit2 import GitError, GIT_REF_OID, GIT_REF_SYMBOLIC, Signature
from . import utils
@@ -77,13 +77,13 @@ class ReferencesTest(utils.RepoTestCase):
def test_reference_set_sha(self):
NEW_COMMIT = '5ebeeebb320790caf276b9fc8b24546d63316533'
reference = self.repo.lookup_reference('refs/heads/master')
reference.target = NEW_COMMIT
reference.set_target(NEW_COMMIT)
self.assertEqual(reference.target.hex, NEW_COMMIT)
def test_reference_set_sha_prefix(self):
NEW_COMMIT = '5ebeeebb320790caf276b9fc8b24546d63316533'
reference = self.repo.lookup_reference('refs/heads/master')
reference.target = NEW_COMMIT[0:6]
reference.set_target(NEW_COMMIT[0:6])
self.assertEqual(reference.target.hex, NEW_COMMIT)
@@ -100,7 +100,7 @@ class ReferencesTest(utils.RepoTestCase):
def test_set_target(self):
reference = self.repo.lookup_reference('HEAD')
self.assertEqual(reference.target, 'refs/heads/master')
reference.target = 'refs/heads/i18n'
reference.set_target('refs/heads/i18n')
self.assertEqual(reference.target, 'refs/heads/i18n')
def test_get_shorthand(self):
@@ -109,6 +109,16 @@ class ReferencesTest(utils.RepoTestCase):
reference = self.repo.create_reference('refs/remotes/origin/master', LAST_COMMIT)
self.assertEqual(reference.shorthand, 'origin/master')
def test_set_target_with_message(self):
reference = self.repo.lookup_reference('HEAD')
self.assertEqual(reference.target, 'refs/heads/master')
sig = Signature('foo', 'bar')
msg = 'Hello log'
reference.set_target('refs/heads/i18n', signature=sig, message=msg)
self.assertEqual(reference.target, 'refs/heads/i18n')
self.assertEqual(list(reference.log())[0].message, msg)
self.assertEqualSignature(list(reference.log())[0].committer, sig)
def test_delete(self):
repo = self.repo
@@ -124,8 +134,6 @@ class ReferencesTest(utils.RepoTestCase):
self.assertRaises(GitError, getattr, reference, 'name')
self.assertRaises(GitError, getattr, reference, 'type')
self.assertRaises(GitError, getattr, reference, 'target')
self.assertRaises(GitError, setattr, reference, 'target', LAST_COMMIT)
self.assertRaises(GitError, setattr, reference, 'target', "a/b/c")
self.assertRaises(GitError, reference.delete)
self.assertRaises(GitError, reference.resolve)
self.assertRaises(GitError, reference.rename, "refs/tags/version2")