Re: [PATCH 19/23] expire_reflog(): treat the policy callback data as opaque

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 05, 2014 at 12:08:31AM +0100, Michael Haggerty wrote:
> Now that expire_reflog() doesn't actually look in the
> expire_reflog_policy_cb data structure, we can make it opaque:
> 
> * Change its callers to pass it a pointer to an entire "struct
>   expire_reflog_policy_cb".
> 
> * Change it to pass the pointer through as a "void *".
> 
> * Change the policy functions, reflog_expiry_prepare(),
>   reflog_expiry_cleanup(), and should_expire_reflog_ent(), to accept
>   "void *cb_data" arguments and cast them to "struct
>   expire_reflog_policy_cb" internally.
> 
> Signed-off-by: Michael Haggerty <mhagger@xxxxxxxxxxxx>

Reviewed-by: Stefan Beller <sbeller@xxxxxxxxxx>
> ---
>  builtin/reflog.c | 73 ++++++++++++++++++++++++++++----------------------------
>  1 file changed, 36 insertions(+), 37 deletions(-)
> 
> diff --git a/builtin/reflog.c b/builtin/reflog.c
> index 01b76d0..c30936bb 100644
> --- a/builtin/reflog.c
> +++ b/builtin/reflog.c
> @@ -43,7 +43,7 @@ struct expire_reflog_policy_cb {
>  	} unreachable_expire_kind;
>  	struct commit_list *mark_list;
>  	unsigned long mark_limit;
> -	struct cmd_reflog_expire_cb *cmd;
> +	struct cmd_reflog_expire_cb cmd;
>  	struct commit *tip_commit;
>  	struct commit_list *tips;
>  };
> @@ -309,22 +309,22 @@ static int should_expire_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
>  	struct expire_reflog_policy_cb *cb = cb_data;
>  	struct commit *old, *new;
>  
> -	if (timestamp < cb->cmd->expire_total)
> +	if (timestamp < cb->cmd.expire_total)
>  		return 1;
>  
>  	old = new = NULL;
> -	if (cb->cmd->stalefix &&
> +	if (cb->cmd.stalefix &&
>  	    (!keep_entry(&old, osha1) || !keep_entry(&new, nsha1)))
>  		return 1;
>  
> -	if (timestamp < cb->cmd->expire_unreachable) {
> +	if (timestamp < cb->cmd.expire_unreachable) {
>  		if (cb->unreachable_expire_kind == UE_ALWAYS)
>  			return 1;
>  		if (unreachable(cb, old, osha1) || unreachable(cb, new, nsha1))
>  			return 1;
>  	}
>  
> -	if (cb->cmd->recno && --(cb->cmd->recno) == 0)
> +	if (cb->cmd.recno && --(cb->cmd.recno) == 0)
>  		return 1;
>  
>  	return 0;
> @@ -378,9 +378,11 @@ static int push_tip_to_list(const char *refname, const unsigned char *sha1,
>  
>  static void reflog_expiry_prepare(const char *refname,
>  				  const unsigned char *sha1,
> -				  struct expire_reflog_policy_cb *cb)
> +				  void *cb_data)
>  {
> -	if (!cb->cmd->expire_unreachable || !strcmp(refname, "HEAD")) {
> +	struct expire_reflog_policy_cb *cb = cb_data;
> +
> +	if (!cb->cmd.expire_unreachable || !strcmp(refname, "HEAD")) {
>  		cb->tip_commit = NULL;
>  		cb->unreachable_expire_kind = UE_HEAD;
>  	} else {
> @@ -391,7 +393,7 @@ static void reflog_expiry_prepare(const char *refname,
>  			cb->unreachable_expire_kind = UE_NORMAL;
>  	}
>  
> -	if (cb->cmd->expire_unreachable <= cb->cmd->expire_total)
> +	if (cb->cmd.expire_unreachable <= cb->cmd.expire_total)
>  		cb->unreachable_expire_kind = UE_ALWAYS;
>  
>  	cb->mark_list = NULL;
> @@ -405,13 +407,15 @@ static void reflog_expiry_prepare(const char *refname,
>  		} else {
>  			commit_list_insert(cb->tip_commit, &cb->mark_list);
>  		}
> -		cb->mark_limit = cb->cmd->expire_total;
> +		cb->mark_limit = cb->cmd.expire_total;
>  		mark_reachable(cb);
>  	}
>  }
>  
> -static void reflog_expiry_cleanup(struct expire_reflog_policy_cb *cb)
> +static void reflog_expiry_cleanup(void *cb_data)
>  {
> +	struct expire_reflog_policy_cb *cb = cb_data;
> +
>  	if (cb->unreachable_expire_kind != UE_ALWAYS) {
>  		if (cb->unreachable_expire_kind == UE_HEAD) {
>  			struct commit_list *elem;
> @@ -427,19 +431,16 @@ static void reflog_expiry_cleanup(struct expire_reflog_policy_cb *cb)
>  static struct lock_file reflog_lock;
>  
>  static int expire_reflog(const char *refname, const unsigned char *sha1,
> -			 unsigned int flags, void *cb_data)
> +			 unsigned int flags, void *policy_cb_data)
>  {
> -	struct cmd_reflog_expire_cb *cmd = cb_data;
>  	struct expire_reflog_cb cb;
> -	struct expire_reflog_policy_cb policy_cb;
>  	struct ref_lock *lock;
>  	char *log_file;
>  	int status = 0;
>  
>  	memset(&cb, 0, sizeof(cb));
> -	memset(&policy_cb, 0, sizeof(policy_cb));
>  	cb.flags = flags;
> -	cb.policy_cb = &policy_cb;
> +	cb.policy_cb = policy_cb_data;
>  
>  	/*
>  	 * we take the lock for the ref itself to prevent it from
> @@ -462,11 +463,9 @@ static int expire_reflog(const char *refname, const unsigned char *sha1,
>  			goto failure;
>  	}
>  
> -	policy_cb.cmd = cmd;
> -
> -	reflog_expiry_prepare(refname, sha1, &policy_cb);
> +	reflog_expiry_prepare(refname, sha1, cb.policy_cb);
>  	for_each_reflog_ent(refname, expire_reflog_ent, &cb);
> -	reflog_expiry_cleanup(&policy_cb);
> +	reflog_expiry_cleanup(cb.policy_cb);
>  
>  	if (!(flags & EXPIRE_REFLOGS_DRY_RUN)) {
>  		if (close_lock_file(&reflog_lock)) {
> @@ -639,7 +638,7 @@ static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, c
>  
>  static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
>  {
> -	struct cmd_reflog_expire_cb cb;
> +	struct expire_reflog_policy_cb cb;
>  	unsigned long now = time(NULL);
>  	int i, status, do_all;
>  	int explicit_expiry = 0;
> @@ -653,25 +652,25 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
>  	do_all = status = 0;
>  	memset(&cb, 0, sizeof(cb));
>  
> -	cb.expire_total = default_reflog_expire;
> -	cb.expire_unreachable = default_reflog_expire_unreachable;
> +	cb.cmd.expire_total = default_reflog_expire;
> +	cb.cmd.expire_unreachable = default_reflog_expire_unreachable;
>  
>  	for (i = 1; i < argc; i++) {
>  		const char *arg = argv[i];
>  		if (!strcmp(arg, "--dry-run") || !strcmp(arg, "-n"))
>  			flags |= EXPIRE_REFLOGS_DRY_RUN;
>  		else if (starts_with(arg, "--expire=")) {
> -			if (parse_expiry_date(arg + 9, &cb.expire_total))
> +			if (parse_expiry_date(arg + 9, &cb.cmd.expire_total))
>  				die(_("'%s' is not a valid timestamp"), arg);
>  			explicit_expiry |= EXPIRE_TOTAL;
>  		}
>  		else if (starts_with(arg, "--expire-unreachable=")) {
> -			if (parse_expiry_date(arg + 21, &cb.expire_unreachable))
> +			if (parse_expiry_date(arg + 21, &cb.cmd.expire_unreachable))
>  				die(_("'%s' is not a valid timestamp"), arg);
>  			explicit_expiry |= EXPIRE_UNREACH;
>  		}
>  		else if (!strcmp(arg, "--stale-fix"))
> -			cb.stalefix = 1;
> +			cb.cmd.stalefix = 1;
>  		else if (!strcmp(arg, "--rewrite"))
>  			flags |= EXPIRE_REFLOGS_REWRITE;
>  		else if (!strcmp(arg, "--updateref"))
> @@ -695,11 +694,11 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
>  	 * even in older repository.  We cannot trust what's reachable
>  	 * from reflog if the repository was pruned with older git.
>  	 */
> -	if (cb.stalefix) {
> -		init_revisions(&cb.revs, prefix);
> +	if (cb.cmd.stalefix) {
> +		init_revisions(&cb.cmd.revs, prefix);
>  		if (flags & EXPIRE_REFLOGS_VERBOSE)
>  			printf("Marking reachable objects...");
> -		mark_reachable_objects(&cb.revs, 0, 0, NULL);
> +		mark_reachable_objects(&cb.cmd.revs, 0, 0, NULL);
>  		if (flags & EXPIRE_REFLOGS_VERBOSE)
>  			putchar('\n');
>  	}
> @@ -712,7 +711,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
>  		for_each_reflog(collect_reflog, &collected);
>  		for (i = 0; i < collected.nr; i++) {
>  			struct collected_reflog *e = collected.e[i];
> -			set_reflog_expiry_param(&cb, explicit_expiry, e->reflog);
> +			set_reflog_expiry_param(&cb.cmd, explicit_expiry, e->reflog);
>  			status |= expire_reflog(e->reflog, e->sha1, flags, &cb);
>  			free(e);
>  		}
> @@ -726,7 +725,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
>  			status |= error("%s points nowhere!", argv[i]);
>  			continue;
>  		}
> -		set_reflog_expiry_param(&cb, explicit_expiry, ref);
> +		set_reflog_expiry_param(&cb.cmd, explicit_expiry, ref);
>  		status |= expire_reflog(ref, sha1, flags, &cb);
>  	}
>  	return status;
> @@ -736,15 +735,15 @@ static int count_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
>  		const char *email, unsigned long timestamp, int tz,
>  		const char *message, void *cb_data)
>  {
> -	struct cmd_reflog_expire_cb *cb = cb_data;
> -	if (!cb->expire_total || timestamp < cb->expire_total)
> -		cb->recno++;
> +	struct expire_reflog_policy_cb *cb = cb_data;
> +	if (!cb->cmd.expire_total || timestamp < cb->cmd.expire_total)
> +		cb->cmd.recno++;
>  	return 0;
>  }
>  
>  static int cmd_reflog_delete(int argc, const char **argv, const char *prefix)
>  {
> -	struct cmd_reflog_expire_cb cb;
> +	struct expire_reflog_policy_cb cb;
>  	int i, status = 0;
>  	unsigned int flags = 0;
>  
> @@ -791,12 +790,12 @@ static int cmd_reflog_delete(int argc, const char **argv, const char *prefix)
>  
>  		recno = strtoul(spec + 2, &ep, 10);
>  		if (*ep == '}') {
> -			cb.recno = -recno;
> +			cb.cmd.recno = -recno;
>  			for_each_reflog_ent(ref, count_reflog_ent, &cb);
>  		} else {
> -			cb.expire_total = approxidate(spec + 2);
> +			cb.cmd.expire_total = approxidate(spec + 2);
>  			for_each_reflog_ent(ref, count_reflog_ent, &cb);
> -			cb.expire_total = 0;
> +			cb.cmd.expire_total = 0;
>  		}
>  
>  		status |= expire_reflog(ref, sha1, flags, &cb);
> -- 
> 2.1.3
> 
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]