Skip to content

refs: support message param when creating reference #1062

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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