From: Stefan Beller <sbeller@google.com>
To: Michael Haggerty <mhagger@alum.mit.edu>
Cc: Jonathan Nieder <jrnieder@gmail.com>,
Junio C Hamano <gitster@pobox.com>,
Ronnie Sahlberg <ronniesahlberg@gmail.com>,
git@vger.kernel.org
Subject: Re: [PATCH 19/23] expire_reflog(): treat the policy callback data as opaque
Date: Mon, 8 Dec 2014 15:12:42 -0800 [thread overview]
Message-ID: <20141208231242.GK25562@google.com> (raw)
In-Reply-To: <1417734515-11812-20-git-send-email-mhagger@alum.mit.edu>
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@alum.mit.edu>
Reviewed-by: Stefan Beller <sbeller@google.com>
> ---
> 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
>
next prev parent reply other threads:[~2014-12-08 23:12 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-04 23:08 [PATCH 00/23] Add reflog_expire() to the references API Michael Haggerty
2014-12-04 23:08 ` [PATCH 01/23] refs.c: make ref_transaction_create a wrapper for ref_transaction_update Michael Haggerty
2014-12-04 23:08 ` [PATCH 02/23] refs.c: make ref_transaction_delete " Michael Haggerty
2014-12-04 23:08 ` [PATCH 03/23] refs.c: add a function to append a reflog entry to a fd Michael Haggerty
2014-12-04 23:08 ` [PATCH 04/23] expire_reflog(): remove unused parameter Michael Haggerty
2014-12-04 23:20 ` Jonathan Nieder
2014-12-04 23:28 ` Jonathan Nieder
2014-12-05 12:43 ` Michael Haggerty
2014-12-04 23:08 ` [PATCH 05/23] expire_reflog(): rename "ref" parameter to "refname" Michael Haggerty
2014-12-04 23:44 ` Jonathan Nieder
2014-12-04 23:08 ` [PATCH 06/23] expire_reflog(): exit early if the reference has no reflog Michael Haggerty
2014-12-04 23:48 ` Jonathan Nieder
2014-12-04 23:53 ` Jonathan Nieder
2014-12-05 15:10 ` Michael Haggerty
2014-12-04 23:08 ` [PATCH 07/23] expire_reflog(): use a lock_file for rewriting the reflog file Michael Haggerty
2014-12-05 0:23 ` Jonathan Nieder
2014-12-05 2:19 ` Stefan Beller
2014-12-08 10:07 ` Michael Haggerty
2014-12-09 18:47 ` Junio C Hamano
2014-12-09 18:54 ` Jeff King
2014-12-05 19:18 ` Stefan Beller
2014-12-05 19:32 ` Junio C Hamano
2014-12-05 19:41 ` Stefan Beller
2014-12-05 20:55 ` Junio C Hamano
2014-12-08 14:05 ` Michael Haggerty
2014-12-05 2:59 ` ronnie sahlberg
2014-12-08 10:40 ` Michael Haggerty
[not found] ` <CAN05THTTba-1n12hBszJAU-O+wsbSFd5Lt+kMk7_MU_0C=wZGQ@mail.gmail.com>
2014-12-05 17:47 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 08/23] Extract function should_expire_reflog_ent() Michael Haggerty
2014-12-08 22:33 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 09/23] expire_reflog(): extract two policy-related functions Michael Haggerty
2014-12-05 19:02 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 10/23] expire_reflog(): add a "flags" argument Michael Haggerty
2014-12-08 22:35 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 11/23] expire_reflog(): move dry_run to flags argument Michael Haggerty
2014-12-08 22:38 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 12/23] expire_reflog(): move updateref " Michael Haggerty
2014-12-08 22:42 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 13/23] Rename expire_reflog_cb to expire_reflog_policy_cb Michael Haggerty
2014-12-08 22:46 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 14/23] struct expire_reflog_cb: a new callback data type Michael Haggerty
2014-12-08 22:49 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 15/23] expire_reflog(): pass flags through to expire_reflog_ent() Michael Haggerty
2014-12-08 22:55 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 16/23] expire_reflog(): move verbose to flags argument Michael Haggerty
2014-12-08 22:56 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 17/23] expire_reflog(): move rewrite " Michael Haggerty
2014-12-08 22:58 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 18/23] Move newlog and last_kept_sha1 to "struct expire_reflog_cb" Michael Haggerty
2014-12-08 22:59 ` Stefan Beller
2014-12-04 23:08 ` [PATCH 19/23] expire_reflog(): treat the policy callback data as opaque Michael Haggerty
2014-12-08 23:12 ` Stefan Beller [this message]
2014-12-04 23:08 ` [PATCH 20/23] reflog_expire(): new function in the reference API Michael Haggerty
2014-12-08 23:32 ` Stefan Beller
2014-12-12 8:23 ` Michael Haggerty
2014-12-12 8:50 ` Jeff King
2014-12-12 18:57 ` Junio C Hamano
2014-12-04 23:08 ` [PATCH 21/23] refs.c: remove unlock_ref/close_ref/commit_ref from the refs api Michael Haggerty
2014-12-04 23:08 ` [PATCH 22/23] lock_any_ref_for_update(): inline function Michael Haggerty
2014-12-08 23:34 ` Stefan Beller
2014-12-11 0:13 ` Michael Haggerty
2014-12-04 23:08 ` [PATCH 23/23] refs.c: don't expose the internal struct ref_lock in the header file Michael Haggerty
2014-12-04 23:47 ` [PATCH 00/23] Add reflog_expire() to the references API Junio C Hamano
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=20141208231242.GK25562@google.com \
--to=sbeller@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=mhagger@alum.mit.edu \
--cc=ronniesahlberg@gmail.com \
/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.