summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin-pack-objects.c4
-rw-r--r--builtin-rev-list.c8
-rw-r--r--list-objects.c10
-rw-r--r--list-objects.h2
-rw-r--r--revision.c4
-rw-r--r--revision.h2
-rw-r--r--upload-pack.c4
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)