Merge branch 'jh/notes-add-ui'
authorJunio C Hamano <gitster@pobox.com>
Mon, 2 May 2011 22:58:32 +0000 (15:58 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 2 May 2011 22:58:32 +0000 (15:58 -0700)
* jh/notes-add-ui:
Make "git notes add" more user-friendly when there are existing notes

Conflicts:
builtin/notes.c

1  2 
builtin/notes.c
diff --combined builtin/notes.c
index d6dcfcb0149ab6dc45f4a71e21cf77d13b494e18,0d133be49b1987e8a3c6cb8d404654ed9c3328c3..8685d2bda6cbde2fb04fcc29f964c6dd6e444271
@@@ -146,13 -146,13 +146,13 @@@ static void write_commented_object(int 
        show.err = 0;
        show.git_cmd = 1;
        if (start_command(&show))
 -              die("unable to start 'show' for object '%s'",
 +              die(_("unable to start 'show' for object '%s'"),
                    sha1_to_hex(object));
  
        /* Open the output as FILE* so strbuf_getline() can be used. */
        show_out = xfdopen(show.out, "r");
        if (show_out == NULL)
 -              die_errno("can't fdopen 'show' output fd");
 +              die_errno(_("can't fdopen 'show' output fd"));
  
        /* Prepend "# " to each output line and write result to 'fd' */
        while (strbuf_getline(&buf, show_out, '\n') != EOF) {
        }
        strbuf_release(&buf);
        if (fclose(show_out))
 -              die_errno("failed to close pipe to 'show' for object '%s'",
 +              die_errno(_("failed to close pipe to 'show' for object '%s'"),
                          sha1_to_hex(object));
        if (finish_command(&show))
 -              die("failed to finish 'show' for object '%s'",
 +              die(_("failed to finish 'show' for object '%s'"),
                    sha1_to_hex(object));
  }
  
@@@ -182,7 -182,7 +182,7 @@@ static void create_note(const unsigned 
                path = git_pathdup("NOTES_EDITMSG");
                fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
                if (fd < 0)
 -                      die_errno("could not create file '%s'", path);
 +                      die_errno(_("could not create file '%s'"), path);
  
                if (msg->given)
                        write_or_die(fd, msg->buf.buf, msg->buf.len);
                strbuf_reset(&(msg->buf));
  
                if (launch_editor(path, &(msg->buf), NULL)) {
 -                      die("Please supply the note contents using either -m" \
 -                          " or -F option");
 +                      die(_("Please supply the note contents using either -m" \
 +                          " or -F option"));
                }
                stripspace(&(msg->buf), 1);
        }
        }
  
        if (!msg->buf.len) {
 -              fprintf(stderr, "Removing note for object %s\n",
 +              fprintf(stderr, _("Removing note for object %s\n"),
                        sha1_to_hex(object));
                hashclr(result);
        } else {
                if (write_sha1_file(msg->buf.buf, msg->buf.len, blob_type, result)) {
 -                      error("unable to write note object");
 +                      error(_("unable to write note object"));
                        if (path)
 -                              error("The note contents has been left in %s",
 +                              error(_("The note contents has been left in %s"),
                                      path);
                        exit(128);
                }
@@@ -258,9 -258,9 +258,9 @@@ static int parse_file_arg(const struct 
                strbuf_addch(&(msg->buf), '\n');
        if (!strcmp(arg, "-")) {
                if (strbuf_read(&(msg->buf), 0, 1024) < 0)
 -                      die_errno("cannot read '%s'", arg);
 +                      die_errno(_("cannot read '%s'"), arg);
        } else if (strbuf_read_file(&(msg->buf), arg, 1024) < 0)
 -              die_errno("could not open or read '%s'", arg);
 +              die_errno(_("could not open or read '%s'"), arg);
        stripspace(&(msg->buf), 0);
  
        msg->given = 1;
@@@ -279,10 -279,10 +279,10 @@@ static int parse_reuse_arg(const struc
                strbuf_addch(&(msg->buf), '\n');
  
        if (get_sha1(arg, object))
 -              die("Failed to resolve '%s' as a valid ref.", arg);
 +              die(_("Failed to resolve '%s' as a valid ref."), arg);
        if (!(buf = read_sha1_file(object, &type, &len)) || !len) {
                free(buf);
 -              die("Failed to read object '%s'.", arg);;
 +              die(_("Failed to read object '%s'."), arg);;
        }
        strbuf_add(&(msg->buf), buf, len);
        free(buf);
@@@ -306,7 -306,7 +306,7 @@@ void commit_notes(struct notes_tree *t
        if (!t)
                t = &default_notes_tree;
        if (!t->initialized || !t->ref || !*t->ref)
 -              die("Cannot commit uninitialized/unreferenced notes tree");
 +              die(_("Cannot commit uninitialized/unreferenced notes tree"));
        if (!t->dirty)
                return; /* don't have to commit an unchanged tree */
  
@@@ -347,7 -347,7 +347,7 @@@ static int notes_rewrite_config(const c
                        config_error_nonbool(k);
                c->combine = parse_combine_notes_fn(v);
                if (!c->combine) {
 -                      error("Bad notes.rewriteMode value: '%s'", v);
 +                      error(_("Bad notes.rewriteMode value: '%s'"), v);
                        return 1;
                }
                return 0;
                if (!prefixcmp(v, "refs/notes/"))
                        string_list_add_refs_by_glob(c->refs, v);
                else
 -                      warning("Refusing to rewrite notes in %s"
 -                              " (outside of refs/notes/)", v);
 +                      warning(_("Refusing to rewrite notes in %s"
 +                              " (outside of refs/notes/)"), v);
                return 0;
        }
  
@@@ -382,10 -382,8 +382,10 @@@ struct notes_rewrite_cfg *init_copy_not
                c->mode_from_env = 1;
                c->combine = parse_combine_notes_fn(rewrite_mode_env);
                if (!c->combine)
 -                      error("Bad " GIT_NOTES_REWRITE_MODE_ENVIRONMENT
 -                            " value: '%s'", rewrite_mode_env);
 +                      /* TRANSLATORS: The first %s is the name of the
 +                         environment variable, the second %s is its value */
 +                      error(_("Bad %s value: '%s'"), GIT_NOTES_REWRITE_MODE_ENVIRONMENT,
 +                                      rewrite_mode_env);
        }
        if (rewrite_refs_env) {
                c->refs_from_env = 1;
@@@ -448,13 -446,13 +448,13 @@@ static int notes_copy_from_stdin(int fo
  
                split = strbuf_split(&buf, ' ');
                if (!split[0] || !split[1])
 -                      die("Malformed input line: '%s'.", buf.buf);
 +                      die(_("Malformed input line: '%s'."), buf.buf);
                strbuf_rtrim(split[0]);
                strbuf_rtrim(split[1]);
                if (get_sha1(split[0]->buf, from_obj))
 -                      die("Failed to resolve '%s' as a valid ref.", split[0]->buf);
 +                      die(_("Failed to resolve '%s' as a valid ref."), split[0]->buf);
                if (get_sha1(split[1]->buf, to_obj))
 -                      die("Failed to resolve '%s' as a valid ref.", split[1]->buf);
 +                      die(_("Failed to resolve '%s' as a valid ref."), split[1]->buf);
  
                if (rewrite_cmd)
                        err = copy_note_for_rewrite(c, from_obj, to_obj);
                                        combine_notes_overwrite);
  
                if (err) {
 -                      error("Failed to copy notes from '%s' to '%s'",
 +                      error(_("Failed to copy notes from '%s' to '%s'"),
                              split[0]->buf, split[1]->buf);
                        ret = 1;
                }
@@@ -507,20 -505,20 +507,20 @@@ static int list(int argc, const char **
                                     git_notes_list_usage, 0);
  
        if (1 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_list_usage, options);
        }
  
        t = init_notes_check("list");
        if (argc) {
                if (get_sha1(argv[0], object))
 -                      die("Failed to resolve '%s' as a valid ref.", argv[0]);
 +                      die(_("Failed to resolve '%s' as a valid ref."), argv[0]);
                note = get_note(t, object);
                if (note) {
                        puts(sha1_to_hex(note));
                        retval = 0;
                } else
 -                      retval = error("No note found for object %s.",
 +                      retval = error(_("No note found for object %s."),
                                       sha1_to_hex(object));
        } else
                retval = for_each_note(t, 0, list_each_note, NULL);
        return retval;
  }
  
+ static int append_edit(int argc, const char **argv, const char *prefix);
  static int add(int argc, const char **argv, const char *prefix)
  {
        int retval = 0, force = 0;
        };
  
        argc = parse_options(argc, argv, prefix, options, git_notes_add_usage,
-                            0);
+                            PARSE_OPT_KEEP_ARGV0);
  
-       if (1 < argc) {
+       if (2 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_add_usage, options);
        }
  
-       object_ref = argc ? argv[0] : "HEAD";
+       object_ref = argc > 1 ? argv[1] : "HEAD";
  
        if (get_sha1(object_ref, object))
 -              die("Failed to resolve '%s' as a valid ref.", object_ref);
 +              die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
        t = init_notes_check("add");
        note = get_note(t, object);
  
        if (note) {
                if (!force) {
 -                      retval = error("Cannot add notes. Found existing notes "
+                       if (!msg.given) {
+                               /*
+                                * Redirect to "edit" subcommand.
+                                *
+                                * We only end up here if none of -m/-F/-c/-C
+                                * or -f are given. The original args are
+                                * therefore still in argv[0-1].
+                                */
+                               argv[0] = "edit";
+                               free_notes(t);
+                               return append_edit(argc, argv, prefix);
+                       }
 +                      retval = error(_("Cannot add notes. Found existing notes "
                                       "for object %s. Use '-f' to overwrite "
 -                                     "existing notes", sha1_to_hex(object));
 +                                     "existing notes"), sha1_to_hex(object));
                        goto out;
                }
 -              fprintf(stderr, "Overwriting existing notes for object %s\n",
 +              fprintf(stderr, _("Overwriting existing notes for object %s\n"),
                        sha1_to_hex(object));
        }
  
@@@ -620,7 -632,7 +634,7 @@@ static int copy(int argc, const char **
  
        if (from_stdin || rewrite_cmd) {
                if (argc) {
 -                      error("too many parameters");
 +                      error(_("too many parameters"));
                        usage_with_options(git_notes_copy_usage, options);
                } else {
                        return notes_copy_from_stdin(force, rewrite_cmd);
        }
  
        if (argc < 2) {
 -              error("too few parameters");
 +              error(_("too few parameters"));
                usage_with_options(git_notes_copy_usage, options);
        }
        if (2 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_copy_usage, options);
        }
  
        if (get_sha1(argv[0], from_obj))
 -              die("Failed to resolve '%s' as a valid ref.", argv[0]);
 +              die(_("Failed to resolve '%s' as a valid ref."), argv[0]);
  
        object_ref = 1 < argc ? argv[1] : "HEAD";
  
        if (get_sha1(object_ref, object))
 -              die("Failed to resolve '%s' as a valid ref.", object_ref);
 +              die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
        t = init_notes_check("copy");
        note = get_note(t, object);
  
        if (note) {
                if (!force) {
 -                      retval = error("Cannot copy notes. Found existing "
 +                      retval = error(_("Cannot copy notes. Found existing "
                                       "notes for object %s. Use '-f' to "
 -                                     "overwrite existing notes",
 +                                     "overwrite existing notes"),
                                       sha1_to_hex(object));
                        goto out;
                }
 -              fprintf(stderr, "Overwriting existing notes for object %s\n",
 +              fprintf(stderr, _("Overwriting existing notes for object %s\n"),
                        sha1_to_hex(object));
        }
  
        from_note = get_note(t, from_obj);
        if (!from_note) {
 -              retval = error("Missing notes on source object %s. Cannot "
 -                             "copy.", sha1_to_hex(from_obj));
 +              retval = error(_("Missing notes on source object %s. Cannot "
 +                             "copy."), sha1_to_hex(from_obj));
                goto out;
        }
  
@@@ -705,19 -717,19 +719,19 @@@ static int append_edit(int argc, const 
                             PARSE_OPT_KEEP_ARGV0);
  
        if (2 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(usage, options);
        }
  
        if (msg.given && edit)
 -              fprintf(stderr, "The -m/-F/-c/-C options have been deprecated "
 +              fprintf(stderr, _("The -m/-F/-c/-C options have been deprecated "
                        "for the 'edit' subcommand.\n"
 -                      "Please use 'git notes add -f -m/-F/-c/-C' instead.\n");
 +                      "Please use 'git notes add -f -m/-F/-c/-C' instead.\n"));
  
        object_ref = 1 < argc ? argv[1] : "HEAD";
  
        if (get_sha1(object_ref, object))
 -              die("Failed to resolve '%s' as a valid ref.", object_ref);
 +              die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
        t = init_notes_check(argv[0]);
        note = get_note(t, object);
@@@ -752,20 -764,20 +766,20 @@@ static int show(int argc, const char **
                             0);
  
        if (1 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_show_usage, options);
        }
  
        object_ref = argc ? argv[0] : "HEAD";
  
        if (get_sha1(object_ref, object))
 -              die("Failed to resolve '%s' as a valid ref.", object_ref);
 +              die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
        t = init_notes_check("show");
        note = get_note(t, object);
  
        if (!note)
 -              retval = error("No note found for object %s.",
 +              retval = error(_("No note found for object %s."),
                               sha1_to_hex(object));
        else {
                const char *show_args[3] = {"show", sha1_to_hex(note), NULL};
@@@ -963,22 -975,22 +977,22 @@@ static int remove_cmd(int argc, const c
                             git_notes_remove_usage, 0);
  
        if (1 < argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_remove_usage, options);
        }
  
        object_ref = argc ? argv[0] : "HEAD";
  
        if (get_sha1(object_ref, object))
 -              die("Failed to resolve '%s' as a valid ref.", object_ref);
 +              die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
        t = init_notes_check("remove");
  
        retval = remove_note(t, object);
        if (retval)
 -              fprintf(stderr, "Object %s has no note\n", sha1_to_hex(object));
 +              fprintf(stderr, _("Object %s has no note\n"), sha1_to_hex(object));
        else {
 -              fprintf(stderr, "Removing note for object %s\n",
 +              fprintf(stderr, _("Removing note for object %s\n"),
                        sha1_to_hex(object));
  
                commit_notes(t, "Notes removed by 'git notes remove'");
@@@ -1001,7 -1013,7 +1015,7 @@@ static int prune(int argc, const char *
                             0);
  
        if (argc) {
 -              error("too many parameters");
 +              error(_("too many parameters"));
                usage_with_options(git_notes_prune_usage, options);
        }
  
@@@ -1071,7 -1083,7 +1085,7 @@@ int cmd_notes(int argc, const char **ar
        else if (!strcmp(argv[0], "get-ref"))
                result = get_ref(argc, argv, prefix);
        else {
 -              result = error("Unknown subcommand: %s", argv[0]);
 +              result = error(_("Unknown subcommand: %s"), argv[0]);
                usage_with_options(git_notes_usage, options);
        }