diff options
-rw-r--r-- | builtin-pack-objects.c | 4 | ||||
-rw-r--r-- | builtin-rev-list.c | 8 | ||||
-rw-r--r-- | list-objects.c | 10 | ||||
-rw-r--r-- | list-objects.h | 2 | ||||
-rw-r--r-- | revision.c | 4 | ||||
-rw-r--r-- | revision.h | 2 | ||||
-rw-r--r-- | upload-pack.c | 4 |
7 files changed, 20 insertions, 14 deletions
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index dde8cc3f01..71041453f2 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -1856,8 +1856,10 @@ static void show_commit(struct commit *commit) commit->object.flags |= OBJECT_ADDED; } -static void show_object(struct object *obj, const char *name) +static void show_object(struct object *obj, const struct name_path *path, const char *last) { + char *name = path_name(path, last); + add_preferred_base_object(name); add_object_entry(obj->sha1, obj->type, name, 0); obj->flags |= OBJECT_ADDED; diff --git a/builtin-rev-list.c b/builtin-rev-list.c index 759e6714ce..aa3c962e56 100644 --- a/builtin-rev-list.c +++ b/builtin-rev-list.c @@ -169,20 +169,21 @@ static void finish_commit(struct commit *commit) commit->buffer = NULL; } -static void finish_object(struct object *obj, const char *name) +static void finish_object(struct object *obj, const struct name_path *path, const char *name) { if (obj->type == OBJ_BLOB && !has_sha1_file(obj->sha1)) die("missing blob object '%s'", sha1_to_hex(obj->sha1)); } -static void show_object(struct object *obj, const char *name) +static void show_object(struct object *obj, const struct name_path *path, const char *component) { + char *name = path_name(path, component); /* An object with name "foo\n0000000..." can be used to * confuse downstream "git pack-objects" very badly. */ const char *ep = strchr(name, '\n'); - finish_object(obj, name); + finish_object(obj, path, name); if (ep) { printf("%s %.*s\n", sha1_to_hex(obj->sha1), (int) (ep - name), @@ -190,6 +191,7 @@ static void show_object(struct object *obj, const char *name) } else printf("%s %s\n", sha1_to_hex(obj->sha1), name); + free(name); } static void show_edge(struct commit *commit) diff --git a/list-objects.c b/list-objects.c index 5a4af62bdc..30ded3d4dd 100644 --- a/list-objects.c +++ b/list-objects.c @@ -23,7 +23,7 @@ static void process_blob(struct rev_info *revs, if (obj->flags & (UNINTERESTING | SEEN)) return; obj->flags |= SEEN; - show(obj, path_name(path, name)); + show(obj, path, name); } /* @@ -77,7 +77,7 @@ static void process_tree(struct rev_info *revs, if (parse_tree(tree) < 0) die("bad tree object %s", sha1_to_hex(obj->sha1)); obj->flags |= SEEN; - show(obj, path_name(path, name)); + show(obj, path, name); me.up = path; me.elem = name; me.elem_len = strlen(name); @@ -140,8 +140,8 @@ static void add_pending_tree(struct rev_info *revs, struct tree *tree) } void traverse_commit_list(struct rev_info *revs, - void (*show_commit)(struct commit *), - void (*show_object)(struct object *, const char *)) + show_commit_fn show_commit, + show_object_fn show_object) { int i; struct commit *commit; @@ -158,7 +158,7 @@ void traverse_commit_list(struct rev_info *revs, continue; if (obj->type == OBJ_TAG) { obj->flags |= SEEN; - show_object(obj, name); + show_object(obj, NULL, name); continue; } if (obj->type == OBJ_TREE) { diff --git a/list-objects.h b/list-objects.h index 13b0dd998e..0b2de64301 100644 --- a/list-objects.h +++ b/list-objects.h @@ -2,7 +2,7 @@ #define LIST_OBJECTS_H typedef void (*show_commit_fn)(struct commit *); -typedef void (*show_object_fn)(struct object *, const char *); +typedef void (*show_object_fn)(struct object *, const struct name_path *, const char *); typedef void (*show_edge_fn)(struct commit *); void traverse_commit_list(struct rev_info *revs, show_commit_fn, show_object_fn); diff --git a/revision.c b/revision.c index f95104b080..69d5fd4784 100644 --- a/revision.c +++ b/revision.c @@ -14,9 +14,9 @@ volatile show_early_output_fn_t show_early_output; -char *path_name(struct name_path *path, const char *name) +char *path_name(const struct name_path *path, const char *name) { - struct name_path *p; + const struct name_path *p; char *n, *m; int nlen = strlen(name); int len = nlen + 1; diff --git a/revision.h b/revision.h index 6fcfb8ce0c..e5b8908fde 100644 --- a/revision.h +++ b/revision.h @@ -141,7 +141,7 @@ struct name_path { const char *elem; }; -char *path_name(struct name_path *path, const char *name); +char *path_name(const struct name_path *path, const char *name); extern void add_object(struct object *obj, struct object_array *p, diff --git a/upload-pack.c b/upload-pack.c index bdbd67bc1d..d8ce30654b 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -78,11 +78,12 @@ static void show_commit(struct commit *commit) commit->buffer = NULL; } -static void show_object(struct object *obj, const char *name) +static void show_object(struct object *obj, const struct name_path *path, const char *component) { /* An object with name "foo\n0000000..." can be used to * confuse downstream git-pack-objects very badly. */ + const char *name = path_name(path, component); const char *ep = strchr(name, '\n'); if (ep) { 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) else fprintf(pack_pipe, "%s %s\n", sha1_to_hex(obj->sha1), name); + free((char *)name); } static void show_edge(struct commit *commit) |