git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v8 1/7] refs.c: add err arguments to reflog functions

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Jul 21, 2015, 13:17 UTC
Message-ID
<55AE465C.6000905@alum.mit.edu>
In-Reply-To
<1436482260-28088-2-git-send-email-dturner@twopensource.com>
On 07/09/2015 03:50 PM, David Turner wrote:
Show 44 quoted lines
> Add an err argument to log_ref_setup that can explain the reason
> for a failure. This then eliminates the need to manage errno through
> this function since we can just add strerror(errno) to the err string
> when meaningful. No callers relied on errno from this function for
> anything else than the error message.
> 
> Also add err arguments to private functions write_ref_to_lockfile,
> log_ref_write_1, commit_ref_update. This again eliminates the need to
> manage errno in these functions.
> 
> Some error messages are slightly reordered.
> 
> Update of a patch by Ronnie Sahlberg.
> 
> Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
> Signed-off-by: David Turner <dturner@twopensource.com>
> ---
>  builtin/checkout.c |   8 ++--
>  refs.c             | 127 +++++++++++++++++++++++++++++++----------------------
>  refs.h             |   4 +-
>  3 files changed, 81 insertions(+), 58 deletions(-)
> 
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index c018ab3..93f63d3 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -624,16 +624,18 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
>  				struct strbuf log_file = STRBUF_INIT;
>  				int ret;
>  				const char *ref_name;
> +				struct strbuf err = STRBUF_INIT;
>  
>  				ref_name = mkpath("refs/heads/%s", opts->new_orphan_branch);
>  				temp = log_all_ref_updates;
>  				log_all_ref_updates = 1;
> -				ret = log_ref_setup(ref_name, &log_file);
> +				ret = log_ref_setup(ref_name, &log_file, &err);
>  				log_all_ref_updates = temp;
>  				strbuf_release(&log_file);
>  				if (ret) {
> -					fprintf(stderr, _("Can not do reflog for '%s'\n"),
> -					    opts->new_orphan_branch);
> +					fprintf(stderr, _("Can not do reflog for '%s'. %s\n"),
> +						opts->new_orphan_branch, err.buf);
Our usual pattern for chaining error messages is
    $problem: $reason
In this patch (and maybe later patches too? I haven't checked yet) I see
    $problem. $reason
and also
    $problem. '$reason'
I think it would be good to use the first pattern consistently.
Show 33 quoted lines
> +					strbuf_release(&err);
>  					return;
>  				}
>  			}
> diff --git a/refs.c b/refs.c
> index fb568d7..03e7505 100644
> --- a/refs.c
> +++ b/refs.c
> [...]
> @@ -3247,25 +3247,28 @@ int is_branch(const char *refname)
>  
>  /*
>   * Write sha1 into the open lockfile, then close the lockfile. On
> - * errors, rollback the lockfile and set errno to reflect the problem.
> + * errors, rollback the lockfile, fill in *err and
> + * return -1.
>   */
>  static int write_ref_to_lockfile(struct ref_lock *lock,
> -				 const unsigned char *sha1)
> +				 const unsigned char *sha1, struct strbuf *err)
>  {
>  	static char term = '\n';
>  	struct object *o;
>  
>  	o = parse_object(sha1);
>  	if (!o) {
> -		error("Trying to write ref %s with nonexistent object %s",
> -			lock->ref_name, sha1_to_hex(sha1));
> +		strbuf_addf(err,
> +			    "Trying to write ref %s with nonexistent object %s",
> +			    lock->ref_name, sha1_to_hex(sha1));
>  		unlock_ref(lock);
>  		errno = EINVAL;

Is it intentional that this function is still setting errno (here and a few lines farther down)? I'm guessing that this is no longer needed, though I haven't audited the callers.

Show 12 quoted lines
>  		return -1;
>  	}
>  	if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
> -		error("Trying to write non-commit object %s to branch %s",
> -			sha1_to_hex(sha1), lock->ref_name);
> +		strbuf_addf(err,
> +			    "Trying to write non-commit object %s to branch %s",
> +			    sha1_to_hex(sha1), lock->ref_name);
>  		unlock_ref(lock);
>  		errno = EINVAL;
>  		return -1;
> [...]
Michael
-- 
Michael Haggerty
mhagger@alum.mit.edu
Previous: David TurnerNext: David Turner
Message 3 of 14 in “ref backend preamble”
  1. 0/7 ref backend preambleDavid Turner, Jul 9, 2015
  2. 1/7 refs.c: add err arguments to reflog functionsDavid Turner, Jul 9, 2015
  3. Michael HaggertyJul 21, 2015
  4. 2/7 refs: Break out check for reflog autocreationDavid Turner, Jul 9, 2015
  5. 3/7 refs: new public ref function: safe_create_reflogDavid Turner, Jul 9, 2015
  6. 4/7 git-reflog: add exists commandDavid Turner, Jul 9, 2015
  7. Michael HaggertyJul 21, 2015
  8. 5/7 refs: add REF_FORCE_CREATE_REFLOG flagDavid Turner, Jul 9, 2015
  9. 6/7 update-ref and tag: add --create-reflog argDavid Turner, Jul 9, 2015
  10. Michael HaggertyJul 21, 2015
  11. 7/7 git-stash: use update-ref --create-reflog instead of creating filesDavid Turner, Jul 9, 2015
  12. Philip OakleyJul 10, 2015
  13. David TurnerJul 10, 2015
  14. Michael HaggertyJul 21, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.