All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: "John Cai via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, "René Scharfe" <l.s.r@web.de>,
	"John Cai" <johncai86@gmail.com>
Subject: Re: [PATCH v2 2/2] builtin/reflog.c: switch to use parse-options API for delete subcommand
Date: Mon, 03 Jan 2022 18:36:42 -0800	[thread overview]
Message-ID: <xmqqfsq4fcqt.fsf@gitster.g> (raw)
In-Reply-To: f9de21e0f26fd8411ffee141ec67916b1440ad67.1641223223.git.gitgitgadget@gmail.com

"John Cai via GitGitGadget" <gitgitgadget@gmail.com> writes:

> From: John Cai <johncai86@gmail.com>
>
> Address NEEDSWORK by switching out manual arg parsing for the
> parse-options API for the delete subcommand.
>
> Moves explicit_expiry flag into cmd_reflog_expire_cb struct so a
> callback can set both the value of the expiration as well as the
> explicit_expiry flag.
>
> Signed-off-by: "John Cai" <johncai86@gmail.com>
> ---
>  builtin/reflog.c | 168 ++++++++++++++++++++++++-----------------------
>  1 file changed, 87 insertions(+), 81 deletions(-)
>
> diff --git a/builtin/reflog.c b/builtin/reflog.c
> index 175c83e7cc2..3552d749e4b 100644
> --- a/builtin/reflog.c
> +++ b/builtin/reflog.c
> @@ -12,15 +12,6 @@
>  #include "reachable.h"
>  #include "worktree.h"
>  
> -/* NEEDSWORK: switch to using parse_options */
> -static const char reflog_expire_usage[] =
> -N_("git reflog expire [--expire=<time>] "
> -   "[--expire-unreachable=<time>] "
> -   "[--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] "
> -   "[--verbose] [--all] <refs>...");
> -static const char reflog_delete_usage[] =
> -N_("git reflog delete [--rewrite] [--updateref] "
> -   "[--dry-run | -n] [--verbose] <refs>...");
>  static const char reflog_exists_usage[] =
>  N_("git reflog exists <ref>");
>  
> @@ -30,6 +21,7 @@ static timestamp_t default_reflog_expire_unreachable;
>  struct cmd_reflog_expire_cb {
>  	struct rev_info revs;
>  	int stalefix;
> +	int explicit_expiry;
>  	timestamp_t expire_total;
>  	timestamp_t expire_unreachable;
>  	int recno;
> @@ -504,18 +496,17 @@ static int reflog_expire_config(const char *var, const char *value, void *cb)
>  	return 0;
>  }
>  
> -static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, const char *ref)
> +static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, const char *ref)
>  {
>  	struct reflog_expire_cfg *ent;
> -
> -	if (slot == (EXPIRE_TOTAL|EXPIRE_UNREACH))
> +	if (cb->explicit_expiry == (EXPIRE_TOTAL|EXPIRE_UNREACH))
>  		return; /* both given explicitly -- nothing to tweak */
>  
>  	for (ent = reflog_expire_cfg; ent; ent = ent->next) {
>  		if (!wildmatch(ent->pattern, ref, 0)) {
> -			if (!(slot & EXPIRE_TOTAL))
> +			if (!(cb->explicit_expiry & EXPIRE_TOTAL))
>  				cb->expire_total = ent->expire_total;
> -			if (!(slot & EXPIRE_UNREACH))
> +			if (!(cb->explicit_expiry & EXPIRE_UNREACH))
>  				cb->expire_unreachable = ent->expire_unreachable;
>  			return;
>  		}
> @@ -525,27 +516,75 @@ static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, c
>  	 * If unconfigured, make stash never expire
>  	 */
>  	if (!strcmp(ref, "refs/stash")) {
> -		if (!(slot & EXPIRE_TOTAL))
> +		if (!(cb->explicit_expiry & EXPIRE_TOTAL))
>  			cb->expire_total = 0;
> -		if (!(slot & EXPIRE_UNREACH))
> +		if (!(cb->explicit_expiry & EXPIRE_UNREACH))
>  			cb->expire_unreachable = 0;
>  		return;
>  	}
>  
>  	/* Nothing matched -- use the default value */
> -	if (!(slot & EXPIRE_TOTAL))
> +	if (!(cb->explicit_expiry & EXPIRE_TOTAL))
>  		cb->expire_total = default_reflog_expire;
> -	if (!(slot & EXPIRE_UNREACH))
> +	if (!(cb->explicit_expiry & EXPIRE_UNREACH))
>  		cb->expire_unreachable = default_reflog_expire_unreachable;
>  }

OK.

> +static const char * reflog_expire_usage[] = {
> +	N_("git reflog expire [--expire=<time>] "
> +   "[--expire-unreachable=<time>] "
> +   "[--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] "
> +   "[--verbose] [--all] <refs>..."),
> +	NULL
> +};
> +
> +static int expire_unreachable_callback(const struct option *opt,
> +				 const char *arg,
> +				 int unset)
> +{
> +	struct cmd_reflog_expire_cb *cmd = opt->value;
> +	cmd->explicit_expiry |= EXPIRE_UNREACH;
> +	return parse_opt_expiry_date(&cmd->expire_unreachable, arg, unset);

Just as I suspected in the previous step.  Get rid of [1/2] and
add the new helper as a static function to this file.

The thing is that we shouldn't confuse future developers by adding a
random function that cannot be used as OPTION_CALLBACK function in
the parse-options-cb.c file.

> +	for (int i = 0; i < argc; i++) {

Documentation/CodingGuidelines:

 - Declaring a variable in the for loop "for (int i = 0; i < 10; i++)"
   is still not allowed in this codebase.

We have floated a weather balloon by adding a single use of this
construct so that when somebody finds a compiler that do not like
the construct it is easy to revert, and waiting for a feedback.  We
do not want to add the use of the construct to random places yet
that makes us scramble and revert them from all over the place.

>  		const char *spec = strstr(argv[i], "@{");
>  		char *ep, *ref;
>  		int recno;

  reply	other threads:[~2022-01-04  2:36 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-31  6:29 [PATCH 0/2] reflog.c: switch to use parse-options API John Cai via GitGitGadget
2021-12-31  6:29 ` [PATCH 1/2] builtin/reflog.c: use parse-options for expire subcommand John Cai via GitGitGadget
2022-01-01  2:06   ` John Cai
2022-01-01 11:16     ` René Scharfe
2022-01-01 19:09       ` John Cai
2022-01-02  9:00         ` René Scharfe
2021-12-31  6:29 ` [PATCH 2/2] builtin/reflog.c: switch to use parse-options API for delete subcommand John Cai via GitGitGadget
2022-01-03 15:20 ` [PATCH v2 0/2] reflog.c: switch to use parse-options API John Cai via GitGitGadget
2022-01-03 15:20   ` [PATCH v2 1/2] parse-options.h: add parse_opt_expiry_date helper John Cai via GitGitGadget
2022-01-04  2:26     ` Junio C Hamano
2022-01-03 15:20   ` [PATCH v2 2/2] builtin/reflog.c: switch to use parse-options API for delete subcommand John Cai via GitGitGadget
2022-01-04  2:36     ` Junio C Hamano [this message]
2022-01-04 17:41   ` [PATCH v3] builtin/reflog.c: use parse-options api for expire, delete subcommands John Cai via GitGitGadget
2022-01-04 22:04     ` Junio C Hamano
2022-01-05  4:06     ` [PATCH v4] " John Cai via GitGitGadget
2022-01-05 20:34       ` Junio C Hamano
2022-01-06 19:06       ` [PATCH v5] " John Cai via GitGitGadget
2022-01-06 21:09         ` Junio C Hamano
2022-01-06 21:32           ` John Cai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqfsq4fcqt.fsf@gitster.g \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=johncai86@gmail.com \
    --cc=l.s.r@web.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.