{"thread":{"id":"37552","subject":"[PATCH] refs: make rev-parse --quiet actually quiet","startedAt":"2014-09-13T21:58:06Z","lastAt":"2014-09-13T21:58:06Z","messageCount":1,"participants":["David Aguilar"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"249365","messageId":"1410645486-40818-1-git-send-email-davvid@gmail.com","threadId":"37552","inReplyTo":null,"subject":"[PATCH] refs: make rev-parse --quiet actually quiet","fromName":"David Aguilar","fromEmail":"davvid@gmail.com","sentAt":"2014-09-13T21:58:06Z","receivedAt":"2014-09-13T21:58:06Z","isPatch":true,"sender":{"key":"davvid@gmail.com","avatar":"https://avatars.githubusercontent.com/u/13196?v=4"},"body":"When a reflog is deleted, e.g. when \"git stash\" clears its stashes,\n\"git rev-parse --verify --quiet\" dies:\n\n\tfatal: Log for refs/stash is empty.\n\nThe reason is that the get_sha1() code path does not allow us\nto suppress this message.\n\nPass the flags bitfield through the get_sha1_with_context()\nso that read_ref_at() can suppress the message.\n\nUse get_sha1_with_context1() instead of get_sha1() in rev-parse\nso that the --quiet flag is honored.\n\nSigned-off-by: David Aguilar <davvid@gmail.com>\n---\nThis should be applied before \"stash: prefer --quiet over shell redirection\"\nwhich is currently in pu.\n\nThis fixes t3903-stash.sh.\n\nRonnie, I see you've been making a lot of changes in this area so you\nmay want to take a look.\n\n builtin/rev-parse.c   |  5 ++++-\n builtin/show-branch.c |  5 +++--\n refs.c                | 10 +++++++---\n refs.h                |  3 ++-\n sha1_name.c           |  7 ++++---\n 5 files changed, 20 insertions(+), 10 deletions(-)\n\ndiff --git a/builtin/rev-parse.c b/builtin/rev-parse.c\nindex d85e08c..8bc1374 100644\n--- a/builtin/rev-parse.c\n+++ b/builtin/rev-parse.c\n@@ -508,7 +508,9 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \tint has_dashdash = 0;\n \tint output_prefix = 0;\n \tunsigned char sha1[20];\n+\tunsigned int flags = 0;\n \tconst char *name = NULL;\n+\tstruct object_context unused;\n \n \tif (argc > 1 && !strcmp(\"--parseopt\", argv[1]))\n \t\treturn cmd_parseopt(argc - 1, argv + 1, prefix);\n@@ -596,6 +598,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--quiet\") || !strcmp(arg, \"-q\")) {\n \t\t\t\tquiet = 1;\n+\t\t\t\tflags |= GET_SHA1_QUIETLY;\n \t\t\t\tcontinue;\n \t\t\t}\n \t\t\tif (!strcmp(arg, \"--short\") ||\n@@ -818,7 +821,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)\n \t\t\tname++;\n \t\t\ttype = REVERSED;\n \t\t}\n-\t\tif (!get_sha1(name, sha1)) {\n+\t\tif (!get_sha1_with_context(name, flags, sha1, &unused)) {\n \t\t\tif (verify)\n \t\t\t\trevs_count++;\n \t\t\telse\ndiff --git a/builtin/show-branch.c b/builtin/show-branch.c\nindex 298c95e..46498e1 100644\n--- a/builtin/show-branch.c\n+++ b/builtin/show-branch.c\n@@ -723,6 +723,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \t\tchar nth_desc[256];\n \t\tchar *ref;\n \t\tint base = 0;\n+\t\tunsigned int flags = 0;\n \n \t\tif (ac == 0) {\n \t\t\tstatic const char *fake_av[2];\n@@ -749,7 +750,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \t\t\t\t/* Ah, that is a date spec... */\n \t\t\t\tunsigned long at;\n \t\t\t\tat = approxidate(reflog_base);\n-\t\t\t\tread_ref_at(ref, at, -1, sha1, NULL,\n+\t\t\t\tread_ref_at(ref, flags, at, -1, sha1, NULL,\n \t\t\t\t\t    NULL, NULL, &base);\n \t\t\t}\n \t\t}\n@@ -760,7 +761,7 @@ int cmd_show_branch(int ac, const char **av, const char *prefix)\n \t\t\tunsigned long timestamp;\n \t\t\tint tz;\n \n-\t\t\tif (read_ref_at(ref, 0, base+i, sha1, &logmsg,\n+\t\t\tif (read_ref_at(ref, flags, 0, base+i, sha1, &logmsg,\n \t\t\t\t\t&timestamp, &tz, NULL)) {\n \t\t\t\treflog = i;\n \t\t\t\tbreak;\ndiff --git a/refs.c b/refs.c\nindex 27927f2..fff0513 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -3104,7 +3104,7 @@ static int read_ref_at_ent_oldest(unsigned char *osha1, unsigned char *nsha1,\n \treturn 1;\n }\n \n-int read_ref_at(const char *refname, unsigned long at_time, int cnt,\n+int read_ref_at(const char *refname, unsigned int flags, unsigned long at_time, int cnt,\n \t\tunsigned char *sha1, char **msg,\n \t\tunsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt)\n {\n@@ -3122,8 +3122,12 @@ int read_ref_at(const char *refname, unsigned long at_time, int cnt,\n \n \tfor_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);\n \n-\tif (!cb.reccnt)\n-\t\tdie(\"Log for %s is empty.\", refname);\n+\tif (!cb.reccnt) {\n+\t\tif (flags & GET_SHA1_QUIETLY)\n+\t\t\texit(1);\n+\t\telse\n+\t\t\tdie(\"Log for %s is empty.\", refname);\n+\t}\n \tif (cb.found_it)\n \t\treturn 0;\n \ndiff --git a/refs.h b/refs.h\nindex ec46acd..fb4f2c5 100644\n--- a/refs.h\n+++ b/refs.h\n@@ -171,7 +171,8 @@ extern int write_ref_sha1(struct ref_lock *lock, const unsigned char *sha1, cons\n int log_ref_setup(const char *refname, char *logfile, int bufsize);\n \n /** Reads log for the value of ref during at_time. **/\n-extern int read_ref_at(const char *refname, unsigned long at_time, int cnt,\n+extern int read_ref_at(const char *refname, unsigned int flags,\n+\t\t       unsigned long at_time, int cnt,\n \t\t       unsigned char *sha1, char **msg,\n \t\t       unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt);\n \ndiff --git a/sha1_name.c b/sha1_name.c\nindex 63ee66f..30845f1 100644\n--- a/sha1_name.c\n+++ b/sha1_name.c\n@@ -432,7 +432,8 @@ static inline int upstream_mark(const char *string, int len)\n static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned lookup_flags);\n static int interpret_nth_prior_checkout(const char *name, int namelen, struct strbuf *buf);\n \n-static int get_sha1_basic(const char *str, int len, unsigned char *sha1)\n+static int get_sha1_basic(const char *str, int len, unsigned char *sha1,\n+\t\t\t  unsigned int flags)\n {\n \tstatic const char *warn_msg = \"refname '%.*s' is ambiguous.\";\n \tstatic const char *object_name_msg = N_(\n@@ -545,7 +546,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)\n \t\t\t\treturn -1;\n \t\t\t}\n \t\t}\n-\t\tif (read_ref_at(real_ref, at_time, nth, sha1, NULL,\n+\t\tif (read_ref_at(real_ref, flags, at_time, nth, sha1, NULL,\n \t\t\t\t&co_time, &co_tz, &co_cnt)) {\n \t\t\tif (!len) {\n \t\t\t\tif (starts_with(real_ref, \"refs/heads/\")) {\n@@ -801,7 +802,7 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l\n \tif (!ret)\n \t\treturn 0;\n \n-\tret = get_sha1_basic(name, len, sha1);\n+\tret = get_sha1_basic(name, len, sha1, lookup_flags);\n \tif (!ret)\n \t\treturn 0;\n \n-- \n2.1.0.28.gcf9f0e7.dirty\n"}]}