Skip to content

Commit cf2ab91

Browse files
torvaldsgitster
authored andcommitted
show_object(): push path_name() call further down
In particular, pushing the "path_name()" call _into_ the show() function would seem to allow - more clarity into who "owns" the name (ie now when we free the name in the show_object callback, it's because we generated it ourselves by calling path_name()) - not calling path_name() at all, either because we don't care about the name in the first place, or because we are actually happy walking the linked list of "struct name_path *" and the last component. Now, I didn't do that latter optimization, because it would require some more coding, but especially looking at "builtin-pack-objects.c", we really don't even want the whole pathname, we really would be better off with the list of path components. Why? We use that name for two things: - add_preferred_base_object(), which actually _wants_ to traverse the path, and now does it by looking for '/' characters! - for 'name_hash()', which only cares about the last 16 characters of a name, so again, generating the full name seems to be just unnecessary work. Anyway, so I didn't look any closer at those things, but it did convince me that the "show_object()" calling convention was crazy, and we're actually better off doing _less_ in list-objects.c, and giving people access to the internal data structures so that they can decide whether they want to generate a path-name or not. This patch does that, and then for people who did use the name (even if they might do something more clever in the future), it just does the straightforward "name = path_name(path, component); .. free(name);" thing. Signed-off-by: Linus Torvalds <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 8d2dfc4 commit cf2ab91

File tree

7 files changed

+20
-14
lines changed

7 files changed

+20
-14
lines changed

builtin-pack-objects.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1856,8 +1856,10 @@ static void show_commit(struct commit *commit)
18561856
commit->object.flags |= OBJECT_ADDED;
18571857
}
18581858

1859-
static void show_object(struct object *obj, const char *name)
1859+
static void show_object(struct object *obj, const struct name_path *path, const char *last)
18601860
{
1861+
char *name = path_name(path, last);
1862+
18611863
add_preferred_base_object(name);
18621864
add_object_entry(obj->sha1, obj->type, name, 0);
18631865
obj->flags |= OBJECT_ADDED;

builtin-rev-list.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,27 +169,29 @@ static void finish_commit(struct commit *commit)
169169
commit->buffer = NULL;
170170
}
171171

172-
static void finish_object(struct object *obj, const char *name)
172+
static void finish_object(struct object *obj, const struct name_path *path, const char *name)
173173
{
174174
if (obj->type == OBJ_BLOB && !has_sha1_file(obj->sha1))
175175
die("missing blob object '%s'", sha1_to_hex(obj->sha1));
176176
}
177177

178-
static void show_object(struct object *obj, const char *name)
178+
static void show_object(struct object *obj, const struct name_path *path, const char *component)
179179
{
180+
char *name = path_name(path, component);
180181
/* An object with name "foo\n0000000..." can be used to
181182
* confuse downstream "git pack-objects" very badly.
182183
*/
183184
const char *ep = strchr(name, '\n');
184185

185-
finish_object(obj, name);
186+
finish_object(obj, path, name);
186187
if (ep) {
187188
printf("%s %.*s\n", sha1_to_hex(obj->sha1),
188189
(int) (ep - name),
189190
name);
190191
}
191192
else
192193
printf("%s %s\n", sha1_to_hex(obj->sha1), name);
194+
free(name);
193195
}
194196

195197
static void show_edge(struct commit *commit)

list-objects.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static void process_blob(struct rev_info *revs,
2323
if (obj->flags & (UNINTERESTING | SEEN))
2424
return;
2525
obj->flags |= SEEN;
26-
show(obj, path_name(path, name));
26+
show(obj, path, name);
2727
}
2828

2929
/*
@@ -77,7 +77,7 @@ static void process_tree(struct rev_info *revs,
7777
if (parse_tree(tree) < 0)
7878
die("bad tree object %s", sha1_to_hex(obj->sha1));
7979
obj->flags |= SEEN;
80-
show(obj, path_name(path, name));
80+
show(obj, path, name);
8181
me.up = path;
8282
me.elem = name;
8383
me.elem_len = strlen(name);
@@ -140,8 +140,8 @@ static void add_pending_tree(struct rev_info *revs, struct tree *tree)
140140
}
141141

142142
void traverse_commit_list(struct rev_info *revs,
143-
void (*show_commit)(struct commit *),
144-
void (*show_object)(struct object *, const char *))
143+
show_commit_fn show_commit,
144+
show_object_fn show_object)
145145
{
146146
int i;
147147
struct commit *commit;
@@ -158,7 +158,7 @@ void traverse_commit_list(struct rev_info *revs,
158158
continue;
159159
if (obj->type == OBJ_TAG) {
160160
obj->flags |= SEEN;
161-
show_object(obj, name);
161+
show_object(obj, NULL, name);
162162
continue;
163163
}
164164
if (obj->type == OBJ_TREE) {

list-objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define LIST_OBJECTS_H
33

44
typedef void (*show_commit_fn)(struct commit *);
5-
typedef void (*show_object_fn)(struct object *, const char *);
5+
typedef void (*show_object_fn)(struct object *, const struct name_path *, const char *);
66
typedef void (*show_edge_fn)(struct commit *);
77

88
void traverse_commit_list(struct rev_info *revs, show_commit_fn, show_object_fn);

revision.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
volatile show_early_output_fn_t show_early_output;
1616

17-
char *path_name(struct name_path *path, const char *name)
17+
char *path_name(const struct name_path *path, const char *name)
1818
{
19-
struct name_path *p;
19+
const struct name_path *p;
2020
char *n, *m;
2121
int nlen = strlen(name);
2222
int len = nlen + 1;

revision.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ struct name_path {
141141
const char *elem;
142142
};
143143

144-
char *path_name(struct name_path *path, const char *name);
144+
char *path_name(const struct name_path *path, const char *name);
145145

146146
extern void add_object(struct object *obj,
147147
struct object_array *p,

upload-pack.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,12 @@ static void show_commit(struct commit *commit)
7878
commit->buffer = NULL;
7979
}
8080

81-
static void show_object(struct object *obj, const char *name)
81+
static void show_object(struct object *obj, const struct name_path *path, const char *component)
8282
{
8383
/* An object with name "foo\n0000000..." can be used to
8484
* confuse downstream git-pack-objects very badly.
8585
*/
86+
const char *name = path_name(path, component);
8687
const char *ep = strchr(name, '\n');
8788
if (ep) {
8889
fprintf(pack_pipe, "%s %.*s\n", sha1_to_hex(obj->sha1),
@@ -92,6 +93,7 @@ static void show_object(struct object *obj, const char *name)
9293
else
9394
fprintf(pack_pipe, "%s %s\n",
9495
sha1_to_hex(obj->sha1), name);
96+
free((char *)name);
9597
}
9698

9799
static void show_edge(struct commit *commit)

0 commit comments

Comments
 (0)