From: Christian Couder <chriscool@tuxfamily.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: [PATCH 1/3] list-objects: add "void *data" parameter to show functions
Date: Mon, 6 Apr 2009 21:28:36 +0200 [thread overview]
Message-ID: <20090407040854.4338.94304.chriscool@tuxfamily.org> (raw)
In-Reply-To: <20090407040819.4338.4291.chriscool@tuxfamily.org>
The goal of this patch is to get rid of the "static struct rev_info
revs" static variable in "builtin-rev-list.c".
To do that, we need to pass the revs to the "show_commit" function
in "builtin-rev-list.c" and this in turn means that the
"traverse_commit_list" function in "list-objects.c" must be passed
functions pointers to functions with 2 parameters instead of one.
So we have to change all the callers and all the functions passed
to "traverse_commit_list".
Anyway this makes the code more clean and more generic, so it
should be a good thing in the long run.
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
builtin-pack-objects.c | 6 ++--
builtin-rev-list.c | 68 ++++++++++++++++++++++++-----------------------
list-objects.c | 9 +++---
list-objects.h | 6 ++--
upload-pack.c | 6 ++--
5 files changed, 49 insertions(+), 46 deletions(-)
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c
index 50f8cc1..8c5eaba 100644
--- a/builtin-pack-objects.c
+++ b/builtin-pack-objects.c
@@ -1901,13 +1901,13 @@ static void read_object_list_from_stdin(void)
#define OBJECT_ADDED (1u<<20)
-static void show_commit(struct commit *commit)
+static void show_commit(struct commit *commit, void *data)
{
add_object_entry(commit->object.sha1, OBJ_COMMIT, NULL, 0);
commit->object.flags |= OBJECT_ADDED;
}
-static void show_object(struct object_array_entry *p)
+static void show_object(struct object_array_entry *p, void *data)
{
add_preferred_base_object(p->name);
add_object_entry(p->item->sha1, p->item->type, p->name, 0);
@@ -2071,7 +2071,7 @@ static void get_object_list(int ac, const char **av)
if (prepare_revision_walk(&revs))
die("revision walk setup failed");
mark_edges_uninteresting(revs.commits, &revs, show_edge);
- traverse_commit_list(&revs, show_commit, show_object);
+ traverse_commit_list(&revs, show_commit, show_object, NULL);
if (keep_unreachable)
add_objects_in_unpacked_packs(&revs);
diff --git a/builtin-rev-list.c b/builtin-rev-list.c
index eb34147..cd6f6b8 100644
--- a/builtin-rev-list.c
+++ b/builtin-rev-list.c
@@ -42,72 +42,72 @@ static const char rev_list_usage[] =
" --bisect-all"
;
-static struct rev_info revs;
-
static int show_timestamp;
static int hdr_termination;
static const char *header_prefix;
-static void finish_commit(struct commit *commit);
-static void show_commit(struct commit *commit)
+static void finish_commit(struct commit *commit, void *data);
+static void show_commit(struct commit *commit, void *data)
{
- graph_show_commit(revs.graph);
+ struct rev_info *revs = data;
+
+ graph_show_commit(revs->graph);
if (show_timestamp)
printf("%lu ", commit->date);
if (header_prefix)
fputs(header_prefix, stdout);
- if (!revs.graph) {
+ if (!revs->graph) {
if (commit->object.flags & BOUNDARY)
putchar('-');
else if (commit->object.flags & UNINTERESTING)
putchar('^');
- else if (revs.left_right) {
+ else if (revs->left_right) {
if (commit->object.flags & SYMMETRIC_LEFT)
putchar('<');
else
putchar('>');
}
}
- if (revs.abbrev_commit && revs.abbrev)
- fputs(find_unique_abbrev(commit->object.sha1, revs.abbrev),
+ if (revs->abbrev_commit && revs->abbrev)
+ fputs(find_unique_abbrev(commit->object.sha1, revs->abbrev),
stdout);
else
fputs(sha1_to_hex(commit->object.sha1), stdout);
- if (revs.print_parents) {
+ if (revs->print_parents) {
struct commit_list *parents = commit->parents;
while (parents) {
printf(" %s", sha1_to_hex(parents->item->object.sha1));
parents = parents->next;
}
}
- if (revs.children.name) {
+ if (revs->children.name) {
struct commit_list *children;
- children = lookup_decoration(&revs.children, &commit->object);
+ children = lookup_decoration(&revs->children, &commit->object);
while (children) {
printf(" %s", sha1_to_hex(children->item->object.sha1));
children = children->next;
}
}
- show_decorations(&revs, commit);
- if (revs.commit_format == CMIT_FMT_ONELINE)
+ show_decorations(revs, commit);
+ if (revs->commit_format == CMIT_FMT_ONELINE)
putchar(' ');
else
putchar('\n');
- if (revs.verbose_header && commit->buffer) {
+ if (revs->verbose_header && commit->buffer) {
struct strbuf buf = STRBUF_INIT;
- pretty_print_commit(revs.commit_format, commit,
- &buf, revs.abbrev, NULL, NULL,
- revs.date_mode, 0);
- if (revs.graph) {
+ pretty_print_commit(revs->commit_format, commit,
+ &buf, revs->abbrev, NULL, NULL,
+ revs->date_mode, 0);
+ if (revs->graph) {
if (buf.len) {
- if (revs.commit_format != CMIT_FMT_ONELINE)
- graph_show_oneline(revs.graph);
+ if (revs->commit_format != CMIT_FMT_ONELINE)
+ graph_show_oneline(revs->graph);
- graph_show_commit_msg(revs.graph, &buf);
+ graph_show_commit_msg(revs->graph, &buf);
/*
* Add a newline after the commit message.
@@ -125,7 +125,7 @@ static void show_commit(struct commit *commit)
* format doesn't explicitly end in a newline.)
*/
if (buf.len && buf.buf[buf.len - 1] == '\n')
- graph_show_padding(revs.graph);
+ graph_show_padding(revs->graph);
putchar('\n');
} else {
/*
@@ -133,7 +133,7 @@ static void show_commit(struct commit *commit)
* the rest of the graph output for this
* commit.
*/
- if (graph_show_remainder(revs.graph))
+ if (graph_show_remainder(revs->graph))
putchar('\n');
}
} else {
@@ -142,14 +142,14 @@ static void show_commit(struct commit *commit)
}
strbuf_release(&buf);
} else {
- if (graph_show_remainder(revs.graph))
+ if (graph_show_remainder(revs->graph))
putchar('\n');
}
maybe_flush_or_die(stdout, "stdout");
- finish_commit(commit);
+ finish_commit(commit, data);
}
-static void finish_commit(struct commit *commit)
+static void finish_commit(struct commit *commit, void *data)
{
if (commit->parents) {
free_commit_list(commit->parents);
@@ -159,20 +159,20 @@ static void finish_commit(struct commit *commit)
commit->buffer = NULL;
}
-static void finish_object(struct object_array_entry *p)
+static void finish_object(struct object_array_entry *p, void *data)
{
if (p->item->type == OBJ_BLOB && !has_sha1_file(p->item->sha1))
die("missing blob object '%s'", sha1_to_hex(p->item->sha1));
}
-static void show_object(struct object_array_entry *p)
+static void show_object(struct object_array_entry *p, void *data)
{
/* An object with name "foo\n0000000..." can be used to
* confuse downstream "git pack-objects" very badly.
*/
const char *ep = strchr(p->name, '\n');
- finish_object(p);
+ finish_object(p, data);
if (ep) {
printf("%s %.*s\n", sha1_to_hex(p->item->sha1),
(int) (ep - p->name),
@@ -264,7 +264,7 @@ int show_bisect_vars(struct rev_info *revs, int reaches, int all, int flags)
strcpy(hex, sha1_to_hex(revs->commits->item->object.sha1));
if (flags & BISECT_SHOW_ALL) {
- traverse_commit_list(revs, show_commit, show_object);
+ traverse_commit_list(revs, show_commit, show_object, revs);
printf("------\n");
}
@@ -297,6 +297,7 @@ int show_bisect_vars(struct rev_info *revs, int reaches, int all, int flags)
int cmd_rev_list(int argc, const char **argv, const char *prefix)
{
+ struct rev_info revs;
struct commit_list *list;
int i;
int read_from_stdin = 0;
@@ -391,8 +392,9 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
}
traverse_commit_list(&revs,
- quiet ? finish_commit : show_commit,
- quiet ? finish_object : show_object);
+ quiet ? finish_commit : show_commit,
+ quiet ? finish_object : show_object,
+ &revs);
return 0;
}
diff --git a/list-objects.c b/list-objects.c
index c8b8375..208a4cb 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -137,8 +137,9 @@ void mark_edges_uninteresting(struct commit_list *list,
}
void traverse_commit_list(struct rev_info *revs,
- void (*show_commit)(struct commit *),
- void (*show_object)(struct object_array_entry *))
+ show_commit_fn show_commit,
+ show_object_fn show_object,
+ void *data)
{
int i;
struct commit *commit;
@@ -146,7 +147,7 @@ void traverse_commit_list(struct rev_info *revs,
while ((commit = get_revision(revs)) != NULL) {
process_tree(revs, commit->tree, &objects, NULL, "");
- show_commit(commit);
+ show_commit(commit, data);
}
for (i = 0; i < revs->pending.nr; i++) {
struct object_array_entry *pending = revs->pending.objects + i;
@@ -173,7 +174,7 @@ void traverse_commit_list(struct rev_info *revs,
sha1_to_hex(obj->sha1), name);
}
for (i = 0; i < objects.nr; i++)
- show_object(&objects.objects[i]);
+ show_object(&objects.objects[i], data);
free(objects.objects);
if (revs->pending.nr) {
free(revs->pending.objects);
diff --git a/list-objects.h b/list-objects.h
index 0f41391..47fae2e 100644
--- a/list-objects.h
+++ b/list-objects.h
@@ -1,11 +1,11 @@
#ifndef LIST_OBJECTS_H
#define LIST_OBJECTS_H
-typedef void (*show_commit_fn)(struct commit *);
-typedef void (*show_object_fn)(struct object_array_entry *);
+typedef void (*show_commit_fn)(struct commit *, void *);
+typedef void (*show_object_fn)(struct object_array_entry *, void *);
typedef void (*show_edge_fn)(struct commit *);
-void traverse_commit_list(struct rev_info *revs, show_commit_fn, show_object_fn);
+void traverse_commit_list(struct rev_info *, show_commit_fn, show_object_fn, void *);
void mark_edges_uninteresting(struct commit_list *, struct rev_info *, show_edge_fn);
diff --git a/upload-pack.c b/upload-pack.c
index 4d7357f..a28a0c4 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -66,7 +66,7 @@ static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
}
static FILE *pack_pipe = NULL;
-static void show_commit(struct commit *commit)
+static void show_commit(struct commit *commit, void *data)
{
if (commit->object.flags & BOUNDARY)
fputc('-', pack_pipe);
@@ -78,7 +78,7 @@ static void show_commit(struct commit *commit)
commit->buffer = NULL;
}
-static void show_object(struct object_array_entry *p)
+static void show_object(struct object_array_entry *p, void *data)
{
/* An object with name "foo\n0000000..." can be used to
* confuse downstream git-pack-objects very badly.
@@ -134,7 +134,7 @@ static int do_rev_list(int fd, void *create_full_pack)
if (prepare_revision_walk(&revs))
die("revision walk setup failed");
mark_edges_uninteresting(revs.commits, &revs, show_edge);
- traverse_commit_list(&revs, show_commit, show_object);
+ traverse_commit_list(&revs, show_commit, show_object, NULL);
fflush(pack_pipe);
fclose(pack_pipe);
return 0;
--
1.6.2.2.537.g3b83b
next parent reply other threads:[~2009-04-07 4:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090407040819.4338.4291.chriscool@tuxfamily.org>
2009-04-06 19:28 ` Christian Couder [this message]
2009-04-06 20:28 ` [PATCH 2/3] rev-list: remove last static vars used in "show_commit" Christian Couder
2009-04-07 3:08 ` [PATCH 3/3] rev-list: add "int bisect_show_flags" in "struct rev_list_info" Christian Couder
2009-04-08 7:40 ` [PATCH 2/3] rev-list: remove last static vars used in "show_commit" Paolo Bonzini
2009-04-09 3:11 ` Christian Couder
2009-04-08 2:29 ` [PATCH 1/3] list-objects: add "void *data" parameter to show functions Junio C Hamano
2009-04-08 4:39 ` Christian Couder
2009-04-08 5:10 ` 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=20090407040854.4338.94304.chriscool@tuxfamily.org \
--to=chriscool@tuxfamily.org \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).