builtin-notes: Add "list" subcommand for listing note objects
"git notes list" will list all note objects in the current notes ref (in the format "<note object> <annotated object>"). "git notes list <object>" will list the note object associated with the given <object>, or fail loudly if the given <object> has no associated notes. If no arguments are given to "git notes", it defaults to the "list" subcommand. This is for pseudo-compatibility with "git tag" and "git branch". The patch includes tests verifying correct behaviour of the new subcommand. Suggested-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
7d54117465
commit
e397421abf
@ -8,7 +8,12 @@ git-notes - Add/inspect object notes
|
||||
SYNOPSIS
|
||||
--------
|
||||
[verse]
|
||||
'git notes' (edit [-F <file> | -m <msg>] | show | remove | prune) [object]
|
||||
'git notes' [list [<object>]]
|
||||
'git notes' edit [-F <file> | -m <msg>] [<object>]
|
||||
'git notes' show [<object>]
|
||||
'git notes' remove [<object>]
|
||||
'git notes' prune
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
@ -30,6 +35,12 @@ by the environment variable "GIT_NOTES_REF".
|
||||
SUBCOMMANDS
|
||||
-----------
|
||||
|
||||
list::
|
||||
List the notes object for a given object. If no object is
|
||||
given, show a list of all note objects and the objects they
|
||||
annotate (in the format "<note object> <annotated object>").
|
||||
This is the default subcommand if no subcommand is given.
|
||||
|
||||
edit::
|
||||
Edit the notes for a given object (defaults to HEAD).
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "parse-options.h"
|
||||
|
||||
static const char * const git_notes_usage[] = {
|
||||
"git notes [list [<object>]]",
|
||||
"git notes edit [-m <msg> | -F <file>] [<object>]",
|
||||
"git notes show [<object>]",
|
||||
"git notes remove [<object>]",
|
||||
@ -31,6 +32,14 @@ static const char note_template[] =
|
||||
"# Write/edit the notes for the following object:\n"
|
||||
"#\n";
|
||||
|
||||
static int list_each_note(const unsigned char *object_sha1,
|
||||
const unsigned char *note_sha1, char *note_path,
|
||||
void *cb_data)
|
||||
{
|
||||
printf("%s %s\n", sha1_to_hex(note_sha1), sha1_to_hex(object_sha1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void write_note_data(int fd, const unsigned char *sha1)
|
||||
{
|
||||
unsigned long size;
|
||||
@ -202,7 +211,8 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
|
||||
const char *object_ref;
|
||||
char logmsg[100];
|
||||
|
||||
int edit = 0, show = 0, remove = 0, prune = 0;
|
||||
int list = 0, edit = 0, show = 0, remove = 0, prune = 0;
|
||||
int given_object;
|
||||
const char *msgfile = NULL;
|
||||
struct msg_arg msg = { 0, STRBUF_INIT };
|
||||
struct option options[] = {
|
||||
@ -217,7 +227,9 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
|
||||
|
||||
argc = parse_options(argc, argv, prefix, options, git_notes_usage, 0);
|
||||
|
||||
if (argc && !strcmp(argv[0], "edit"))
|
||||
if (argc && !strcmp(argv[0], "list"))
|
||||
list = 1;
|
||||
else if (argc && !strcmp(argv[0], "edit"))
|
||||
edit = 1;
|
||||
else if (argc && !strcmp(argv[0], "show"))
|
||||
show = 1;
|
||||
@ -225,8 +237,10 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
|
||||
remove = 1;
|
||||
else if (argc && !strcmp(argv[0], "prune"))
|
||||
prune = 1;
|
||||
else if (!argc)
|
||||
list = 1; /* Default to 'list' if no other subcommand given */
|
||||
|
||||
if (edit + show + remove + prune != 1)
|
||||
if (list + edit + show + remove + prune != 1)
|
||||
usage_with_options(git_notes_usage, options);
|
||||
|
||||
if ((msg.given || msgfile) && !edit) {
|
||||
@ -239,7 +253,8 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
|
||||
usage_with_options(git_notes_usage, options);
|
||||
}
|
||||
|
||||
object_ref = argc == 2 ? argv[1] : "HEAD";
|
||||
given_object = argc == 2;
|
||||
object_ref = given_object ? argv[1] : "HEAD";
|
||||
if (argc > 2 || (prune && argc > 1)) {
|
||||
error("too many parameters");
|
||||
usage_with_options(git_notes_usage, options);
|
||||
@ -257,9 +272,21 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
|
||||
|
||||
note = get_note(t, object);
|
||||
|
||||
/* list command */
|
||||
|
||||
if (list) {
|
||||
if (given_object) {
|
||||
if (note) {
|
||||
puts(sha1_to_hex(note));
|
||||
return 0;
|
||||
}
|
||||
} else
|
||||
return for_each_note(t, 0, list_each_note, NULL);
|
||||
}
|
||||
|
||||
/* show command */
|
||||
|
||||
if (show && !note) {
|
||||
if ((list || show) && !note) {
|
||||
error("No note found for object %s.", sha1_to_hex(object));
|
||||
return 1;
|
||||
} else if (show) {
|
||||
|
@ -292,6 +292,38 @@ test_expect_success 'verify note removal with "git notes remove"' '
|
||||
! git notes show HEAD^
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
c18dc024e14f08d18d14eea0d747ff692d66d6a3 1584215f1d29c65e99c6c6848626553fdd07fd75
|
||||
c9c6af7f78bc47490dbf3e822cf2f3c24d4b9061 268048bfb8a1fb38e703baceb8ab235421bf80c5
|
||||
EOF
|
||||
|
||||
test_expect_success 'list notes with "git notes list"' '
|
||||
git notes list > output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
test_expect_success 'list notes with "git notes"' '
|
||||
git notes > output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
c18dc024e14f08d18d14eea0d747ff692d66d6a3
|
||||
EOF
|
||||
|
||||
test_expect_success 'list specific note with "git notes list <object>"' '
|
||||
git notes list HEAD^^ > output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
cat > expect << EOF
|
||||
EOF
|
||||
|
||||
test_expect_success 'listing non-existing notes fails' '
|
||||
test_must_fail git notes list HEAD > output &&
|
||||
test_cmp expect output
|
||||
'
|
||||
|
||||
test_expect_success 'create other note on a different notes ref (setup)' '
|
||||
: > a6 &&
|
||||
git add a6 &&
|
||||
|
Loading…
Reference in New Issue
Block a user