diff options
-rw-r--r-- | Documentation/git-notes.txt | 11 | ||||
-rw-r--r-- | builtin-notes.c | 30 | ||||
-rwxr-xr-x | t/t3301-notes.sh | 55 |
3 files changed, 74 insertions, 22 deletions
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt index 8969f6f8fa..94e12b57e4 100644 --- a/Documentation/git-notes.txt +++ b/Documentation/git-notes.txt @@ -9,6 +9,7 @@ SYNOPSIS -------- [verse] 'git notes' [list [<object>]] +'git notes' add [-f] [-F <file> | -m <msg>] [<object>] 'git notes' edit [-F <file> | -m <msg>] [<object>] 'git notes' show [<object>] 'git notes' remove [<object>] @@ -41,6 +42,11 @@ list:: annotate (in the format "<note object> <annotated object>"). This is the default subcommand if no subcommand is given. +add:: + Add notes for a given object (defaults to HEAD). Abort if the + object already has notes, abort. (use `-f` to overwrite an + existing note). + edit:: Edit the notes for a given object (defaults to HEAD). @@ -57,6 +63,11 @@ prune:: OPTIONS ------- +-f:: +--force:: + When adding notes to an object that already has notes, + overwrite the existing notes (instead of aborting). + -m <msg>:: --message=<msg>:: Use the given note message (instead of prompting). diff --git a/builtin-notes.c b/builtin-notes.c index ec959bcb31..006edf6b19 100644 --- a/builtin-notes.c +++ b/builtin-notes.c @@ -19,6 +19,7 @@ static const char * const git_notes_usage[] = { "git notes [list [<object>]]", + "git notes add [-f] [-m <msg> | -F <file>] [<object>]", "git notes edit [-m <msg> | -F <file>] [<object>]", "git notes show [<object>]", "git notes remove [<object>]", @@ -211,7 +212,8 @@ int cmd_notes(int argc, const char **argv, const char *prefix) const char *object_ref; char logmsg[100]; - int list = 0, edit = 0, show = 0, remove = 0, prune = 0; + int list = 0, add = 0, edit = 0, show = 0, remove = 0, prune = 0, + force = 0; int given_object; const char *msgfile = NULL; struct msg_arg msg = { 0, STRBUF_INIT }; @@ -220,6 +222,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix) OPT_CALLBACK('m', "message", &msg, "msg", "note contents as a string", parse_msg_arg), OPT_FILENAME('F', "file", &msgfile, "note contents in a file"), + OPT_BOOLEAN('f', "force", &force, "replace existing notes"), OPT_END() }; @@ -229,6 +232,8 @@ int cmd_notes(int argc, const char **argv, const char *prefix) if (argc && !strcmp(argv[0], "list")) list = 1; + else if (argc && !strcmp(argv[0], "add")) + add = 1; else if (argc && !strcmp(argv[0], "edit")) edit = 1; else if (argc && !strcmp(argv[0], "show")) @@ -240,10 +245,10 @@ int cmd_notes(int argc, const char **argv, const char *prefix) else if (!argc) list = 1; /* Default to 'list' if no other subcommand given */ - if (list + edit + show + remove + prune != 1) + if (list + add + edit + show + remove + prune != 1) usage_with_options(git_notes_usage, options); - if ((msg.given || msgfile) && !edit) { + if ((msg.given || msgfile) && !(add || edit)) { error("cannot use -m/-F options with %s subcommand.", argv[0]); usage_with_options(git_notes_usage, options); } @@ -253,6 +258,11 @@ int cmd_notes(int argc, const char **argv, const char *prefix) usage_with_options(git_notes_usage, options); } + if (force && !add) { + error("cannot use -f option with %s subcommand.", argv[0]); + usage_with_options(git_notes_usage, options); + } + given_object = argc == 2; object_ref = given_object ? argv[1] : "HEAD"; if (argc > 2 || (prune && argc > 1)) { @@ -294,7 +304,19 @@ int cmd_notes(int argc, const char **argv, const char *prefix) return execv_git_cmd(show_args); } - /* edit/remove/prune command */ + /* add/edit/remove/prune command */ + + if (add && note) { + if (force) + fprintf(stderr, "Overwriting existing notes for object %s\n", + sha1_to_hex(object)); + else { + error("Cannot add notes. Found existing notes for object %s. " + "Use '-f' to overwrite existing notes", + sha1_to_hex(object)); + return 1; + } + } if (remove) strbuf_reset(&buf); diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index 768a1cb028..df458ca939 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -16,7 +16,7 @@ GIT_EDITOR=./fake_editor.sh export GIT_EDITOR test_expect_success 'cannot annotate non-existing HEAD' ' - (MSG=3 && export MSG && test_must_fail git notes edit) + (MSG=3 && export MSG && test_must_fail git notes add) ' test_expect_success setup ' @@ -32,18 +32,18 @@ test_expect_success setup ' test_expect_success 'need valid notes ref' ' (MSG=1 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF && - test_must_fail git notes edit) && + test_must_fail git notes add) && (MSG=2 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF && test_must_fail git notes show) ' -test_expect_success 'refusing to edit in refs/heads/' ' +test_expect_success 'refusing to add notes in refs/heads/' ' (MSG=1 GIT_NOTES_REF=refs/heads/bogus && export MSG GIT_NOTES_REF && - test_must_fail git notes edit) + test_must_fail git notes add) ' -test_expect_success 'refusing to edit in refs/remotes/' ' +test_expect_success 'refusing to edit notes in refs/remotes/' ' (MSG=1 GIT_NOTES_REF=refs/remotes/bogus && export MSG GIT_NOTES_REF && test_must_fail git notes edit) @@ -56,16 +56,34 @@ test_expect_success 'handle empty notes gracefully' ' test_expect_success 'create notes' ' git config core.notesRef refs/notes/commits && - MSG=b0 git notes edit && + MSG=b4 git notes add && test ! -f .git/NOTES_EDITMSG && test 1 = $(git ls-tree refs/notes/commits | wc -l) && - test b0 = $(git notes show) && + test b4 = $(git notes show) && git show HEAD^ && test_must_fail git notes show HEAD^ ' test_expect_success 'edit existing notes' ' - MSG=b1 git notes edit && + MSG=b3 git notes edit && + test ! -f .git/NOTES_EDITMSG && + test 1 = $(git ls-tree refs/notes/commits | wc -l) && + test b3 = $(git notes show) && + git show HEAD^ && + test_must_fail git notes show HEAD^ +' + +test_expect_success 'cannot add note where one exists' ' + ! MSG=b2 git notes add && + test ! -f .git/NOTES_EDITMSG && + test 1 = $(git ls-tree refs/notes/commits | wc -l) && + test b3 = $(git notes show) && + git show HEAD^ && + test_must_fail git notes show HEAD^ +' + +test_expect_success 'can overwrite existing note with "git notes add -f"' ' + MSG=b1 git notes add -f && test ! -f .git/NOTES_EDITMSG && test 1 = $(git ls-tree refs/notes/commits | wc -l) && test b1 = $(git notes show) && @@ -89,6 +107,7 @@ test_expect_success 'show notes' ' git log -1 > output && test_cmp expect output ' + test_expect_success 'create multi-line notes (setup)' ' : > a3 && git add a3 && @@ -96,7 +115,7 @@ test_expect_success 'create multi-line notes (setup)' ' git commit -m 3rd && MSG="b3 c3c3c3c3 -d3d3d3" git notes edit +d3d3d3" git notes add ' cat > expect-multiline << EOF @@ -125,7 +144,7 @@ test_expect_success 'create -F notes (setup)' ' test_tick && git commit -m 4th && echo "xyzzy" > note5 && - git notes edit -F note5 + git notes add -F note5 ' cat > expect-F << EOF @@ -205,7 +224,7 @@ test_expect_success 'create -m notes (setup)' ' git add a5 && test_tick && git commit -m 5th && - git notes edit -m spam -m "foo + git notes add -m spam -m "foo bar baz" ' @@ -234,8 +253,8 @@ test_expect_success 'show -m notes' ' test_cmp expect-m output ' -test_expect_success 'remove note with -F /dev/null (setup)' ' - git notes edit -F /dev/null +test_expect_success 'remove note with add -f -F /dev/null (setup)' ' + git notes add -f -F /dev/null ' cat > expect-rm-F << EOF @@ -256,7 +275,7 @@ test_expect_success 'verify note removal with -F /dev/null' ' ' test_expect_success 'do not create empty note with -m "" (setup)' ' - git notes edit -m "" + git notes add -m "" ' test_expect_success 'verify non-creation of note with -m ""' ' @@ -329,7 +348,7 @@ test_expect_success 'create other note on a different notes ref (setup)' ' git add a6 && test_tick && git commit -m 6th && - GIT_NOTES_REF="refs/notes/other" git notes edit -m "other note" + GIT_NOTES_REF="refs/notes/other" git notes add -m "other note" ' cat > expect-other << EOF @@ -374,17 +393,17 @@ test_expect_success 'Do not show note when core.notesRef is overridden' ' test_expect_success 'Allow notes on non-commits (trees, blobs, tags)' ' echo "Note on a tree" > expect - git notes edit -m "Note on a tree" HEAD: && + git notes add -m "Note on a tree" HEAD: && git notes show HEAD: > actual && test_cmp expect actual && echo "Note on a blob" > expect filename=$(git ls-tree --name-only HEAD | head -n1) && - git notes edit -m "Note on a blob" HEAD:$filename && + git notes add -m "Note on a blob" HEAD:$filename && git notes show HEAD:$filename > actual && test_cmp expect actual && echo "Note on a tag" > expect git tag -a -m "This is an annotated tag" foobar HEAD^ && - git notes edit -m "Note on a tag" foobar && + git notes add -m "Note on a tag" foobar && git notes show foobar > actual && test_cmp expect actual ' |