Skip to content

Commit

Permalink
refs: support message param when creating refs
Browse files Browse the repository at this point in the history
  • Loading branch information
pmrowla committed Jan 19, 2021
1 parent 45f1145 commit cd0b3c3
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 12 deletions.
13 changes: 9 additions & 4 deletions pygit2/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ def config_snapshot(self):
#
# References
#
def create_reference(self, name, target, force=False):
def create_reference(self, name, target, force=False, message=None):
"""Create a new reference "name" which points to an object or to
another reference.
Expand All @@ -265,10 +265,13 @@ def create_reference(self, name, target, force=False):
Keyword arguments:
force
force : bool
If True references will be overridden, otherwise (the default) an
exception is raised.
message : str
Optional message to use for the reflog.
Examples::
repo.create_reference('refs/heads/foo', repo.head.target)
Expand All @@ -282,9 +285,11 @@ def create_reference(self, name, target, force=False):
and GIT_OID_MINPREFIXLEN <= len(target) <= GIT_OID_HEXSZ))

if direct:
return self.create_reference_direct(name, target, force)
return self.create_reference_direct(name, target, force,
message=message)

return self.create_reference_symbolic(name, target, force)
return self.create_reference_symbolic(name, target, force,
message=message)

def resolve_refish(self, refish):
"""Convert a reference-like short name "ref-ish" to a valid
Expand Down
28 changes: 20 additions & 8 deletions src/repository.c
Original file line number Diff line number Diff line change
Expand Up @@ -1459,7 +1459,7 @@ Repository_lookup_reference_dwim(Repository *self, PyObject *py_name)
}

PyDoc_STRVAR(Repository_create_reference_direct__doc__,
"create_reference_direct(name, target, force)\n"
"create_reference_direct(name, target, force, message=None)\n"
"\n"
"Create a new reference \"name\" which points to an object.\n"
"\n"
Expand All @@ -1471,6 +1471,9 @@ PyDoc_STRVAR(Repository_create_reference_direct__doc__,
" If True references will be overridden, otherwise (the default) an\n"
" exception is raised.\n"
"\n"
"message\n"
" Optional message to use for the reflog.\n"
"\n"
"Examples::\n"
"\n"
" repo.create_reference_direct('refs/heads/foo', repo.head.target, False)");
Expand All @@ -1484,23 +1487,26 @@ Repository_create_reference_direct(Repository *self, PyObject *args,
char *c_name;
git_oid oid;
int err, force;
const char *message = NULL;
char *keywords[] = {"name", "target", "force", "message", NULL};

if (!PyArg_ParseTuple(args, "sOi", &c_name, &py_obj, &force))
if (!PyArg_ParseTupleAndKeywords(args, kw, "sOi|z", keywords,
&c_name, &py_obj, &force, &message))
return NULL;

err = py_oid_to_git_oid_expand(self->repo, py_obj, &oid);
if (err < 0)
return NULL;

err = git_reference_create(&c_reference, self->repo, c_name, &oid, force, NULL);
err = git_reference_create(&c_reference, self->repo, c_name, &oid, force, message);
if (err < 0)
return Error_set(err);

return wrap_reference(c_reference, self);
}

PyDoc_STRVAR(Repository_create_reference_symbolic__doc__,
"create_reference_symbolic(name, source, force)\n"
"create_reference_symbolic(name, source, force, message=None)\n"
"\n"
"Create a new reference \"name\" which points to another reference.\n"
"\n"
Expand All @@ -1512,6 +1518,9 @@ PyDoc_STRVAR(Repository_create_reference_symbolic__doc__,
" If True references will be overridden, otherwise (the default) an\n"
" exception is raised.\n"
"\n"
"message\n"
" Optional message to use for the reflog.\n"
"\n"
"Examples::\n"
"\n"
" repo.create_reference_symbolic('refs/tags/foo', 'refs/heads/master', False)");
Expand All @@ -1523,12 +1532,15 @@ Repository_create_reference_symbolic(Repository *self, PyObject *args,
git_reference *c_reference;
char *c_name, *c_target;
int err, force;
const char *message = NULL;
char *keywords[] = {"name", "target", "force", "message", NULL};

if (!PyArg_ParseTuple(args, "ssi", &c_name, &c_target, &force))
if (!PyArg_ParseTupleAndKeywords(args, kw, "ssi|z", keywords,
&c_name, &c_target, &force, &message))
return NULL;

err = git_reference_symbolic_create(&c_reference, self->repo, c_name,
c_target, force, NULL);
c_target, force, message);
if (err < 0)
return Error_set(err);

Expand Down Expand Up @@ -2099,8 +2111,8 @@ PyMethodDef Repository_methods[] = {
METHOD(Repository, cherrypick, METH_O),
METHOD(Repository, apply, METH_VARARGS),
METHOD(Repository, applies, METH_O),
METHOD(Repository, create_reference_direct, METH_VARARGS),
METHOD(Repository, create_reference_symbolic, METH_VARARGS),
METHOD(Repository, create_reference_direct, METH_VARARGS | METH_KEYWORDS),
METHOD(Repository, create_reference_symbolic, METH_VARARGS | METH_KEYWORDS),
METHOD(Repository, compress_references, METH_NOARGS),
METHOD(Repository, listall_references, METH_NOARGS),
METHOD(Repository, raw_listall_references, METH_NOARGS),
Expand Down
23 changes: 23 additions & 0 deletions test/test_refs.py
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,17 @@ def test_create_reference(testrepo):
LAST_COMMIT, force=True)
assert reference.target.hex == LAST_COMMIT

def test_create_reference_with_message(testrepo):
sig = Signature('foo', 'bar')
testrepo.set_ident('foo', 'bar')
msg = 'Hello log'
reference = testrepo.create_reference('refs/heads/feature',
LAST_COMMIT,
message=msg)
first = list(reference.log())[0]
assert first.message == msg
assert first.committer == sig

def test_create_symbolic_reference(testrepo):
repo = testrepo
# We add a tag as a new symbolic reference that always points to
Expand All @@ -499,6 +510,18 @@ def test_create_symbolic_reference(testrepo):
assert reference.target == 'refs/heads/master'
assert reference.raw_target == b'refs/heads/master'

def test_create_symbolic_reference_with_message(testrepo):
sig = Signature('foo', 'bar')
testrepo.set_ident('foo', 'bar')
msg = 'Hello log'
reference = testrepo.create_reference('HEAD',
'refs/heads/i18n',
force=True,
message=msg)
first = list(reference.log())[0]
assert first.message == msg
assert first.committer == sig

def test_create_invalid_reference(testrepo):
repo = testrepo

Expand Down

0 comments on commit cd0b3c3

Please sign in to comment.