Every single user actually wanted this only for commit objects, and we
have no reason to waste space on it for other object types. So just move
the structure member from the low-level "struct object" into the "struct
commit".
This leaves the commit object the same size, and removes one unnecessary
pointer from all other object allocations.
This shrinks memory usage (still at a fairly hefty half-gig, admittedly)
of "git-rev-list --all --objects" on the mozilla repo by another 5% in my
tests.
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
xdemitconf_t xecfg;
mmfile_t file_c, file_o;
xdemitcb_t ecb;
xdemitconf_t xecfg;
mmfile_t file_c, file_o;
xdemitcb_t ecb;
- struct util_info *info_c = (struct util_info *)commit->object.util;
- struct util_info *info_o = (struct util_info *)other->object.util;
+ struct util_info *info_c = (struct util_info *)commit->util;
+ struct util_info *info_o = (struct util_info *)other->util;
struct timeval tv_start, tv_end;
get_blob(commit);
struct timeval tv_start, tv_end;
get_blob(commit);
static void get_blob(struct commit *commit)
{
static void get_blob(struct commit *commit)
{
- struct util_info *info = commit->object.util;
+ struct util_info *info = commit->util;
char type[20];
if (info->buf)
char type[20];
if (info->buf)
/* For debugging only */
static void print_map(struct commit *cmit, struct commit *other)
{
/* For debugging only */
static void print_map(struct commit *cmit, struct commit *other)
{
- struct util_info *util = cmit->object.util;
- struct util_info *util2 = other->object.util;
+ struct util_info *util = cmit->util;
+ struct util_info *util2 = other->util;
static void fill_line_map(struct commit *commit, struct commit *other,
struct patch *p)
{
static void fill_line_map(struct commit *commit, struct commit *other,
struct patch *p)
{
- struct util_info *util = commit->object.util;
- struct util_info *util2 = other->object.util;
+ struct util_info *util = commit->util;
+ struct util_info *util2 = other->util;
int *map = util->line_map;
int *map2 = util2->line_map;
int cur_chunk = 0;
int *map = util->line_map;
int *map2 = util2->line_map;
int cur_chunk = 0;
static int map_line(struct commit *commit, int line)
{
static int map_line(struct commit *commit, int line)
{
- struct util_info *info = commit->object.util;
+ struct util_info *info = commit->util;
assert(line >= 0 && line < info->num_lines);
return info->line_map[line];
}
static struct util_info* get_util(struct commit *commit)
{
assert(line >= 0 && line < info->num_lines);
return info->line_map[line];
}
static struct util_info* get_util(struct commit *commit)
{
- struct util_info *util = commit->object.util;
+ struct util_info *util = commit->util;
util->line_map = NULL;
util->num_lines = -1;
util->pathname = NULL;
util->line_map = NULL;
util->num_lines = -1;
util->pathname = NULL;
- commit->object.util = util;
return util;
}
static int fill_util_info(struct commit *commit)
{
return util;
}
static int fill_util_info(struct commit *commit)
{
- struct util_info *util = commit->object.util;
+ struct util_info *util = commit->util;
assert(util);
assert(util->pathname);
assert(util);
assert(util->pathname);
static void alloc_line_map(struct commit *commit)
{
static void alloc_line_map(struct commit *commit)
{
- struct util_info *util = commit->object.util;
+ struct util_info *util = commit->util;
int i;
if (util->line_map)
int i;
if (util->line_map)
static void init_first_commit(struct commit* commit, const char* filename)
{
static void init_first_commit(struct commit* commit, const char* filename)
{
- struct util_info* util = commit->object.util;
+ struct util_info* util = commit->util;
int i;
util->pathname = filename;
int i;
util->pathname = filename;
- util = commit->object.util;
for (i = 0; i < util->num_lines; i++)
util->line_map[i] = i;
for (i = 0; i < util->num_lines; i++)
util->line_map[i] = i;
assert(commit);
init_first_commit(commit, path);
assert(commit);
init_first_commit(commit, path);
- util = commit->object.util;
num_blame_lines = util->num_lines;
blame_lines = xmalloc(sizeof(struct commit *) * num_blame_lines);
blame_contents = util->buf;
num_blame_lines = util->num_lines;
blame_lines = xmalloc(sizeof(struct commit *) * num_blame_lines);
blame_contents = util->buf;
continue;
alloc_line_map(commit);
continue;
alloc_line_map(commit);
- util = commit->object.util;
for (parents = commit->parents;
parents != NULL; parents = parents->next) {
for (parents = commit->parents;
parents != NULL; parents = parents->next) {
{
int ret;
const char* paths[2];
{
int ret;
const char* paths[2];
- struct util_info* util = c2->object.util;
+ struct util_info* util = c2->util;
paths[0] = util->pathname;
paths[1] = NULL;
paths[0] = util->pathname;
paths[1] = NULL;
static const char* find_rename(struct commit* commit, struct commit* parent)
{
static const char* find_rename(struct commit* commit, struct commit* parent)
{
- struct util_info* cutil = commit->object.util;
+ struct util_info* cutil = commit->util;
struct diff_options diff_opts;
const char *paths[1];
int i;
struct diff_options diff_opts;
const char *paths[1];
int i;
return;
if (!commit->parents) {
return;
if (!commit->parents) {
- struct util_info* util = commit->object.util;
+ struct util_info* util = commit->util;
if (!same_tree_as_empty_path(revs, commit->tree,
util->pathname))
commit->object.flags |= TREECHANGE;
if (!same_tree_as_empty_path(revs, commit->tree,
util->pathname))
commit->object.flags |= TREECHANGE;
- struct util_info* util = commit->object.util;
+ struct util_info* util = commit->util;
if (revs->remove_empty_trees &&
same_tree_as_empty_path(revs, p->tree,
util->pathname)) {
if (revs->remove_empty_trees &&
same_tree_as_empty_path(revs, p->tree,
util->pathname)) {
static void topo_setter(struct commit* c, void* data)
{
static void topo_setter(struct commit* c, void* data)
{
- struct util_info* util = c->object.util;
+ struct util_info* util = c->util;
util->topo_data = data;
}
static void* topo_getter(struct commit* c)
{
util->topo_data = data;
}
static void* topo_getter(struct commit* c)
{
- struct util_info* util = c->object.util;
+ struct util_info* util = c->util;
return util->topo_data;
}
return util->topo_data;
}
struct util_info* u;
if (!c)
c = initial;
struct util_info* u;
if (!c)
c = initial;
if (!found_rename && strcmp(filename, u->pathname))
found_rename = 1;
if (!found_rename && strcmp(filename, u->pathname))
found_rename = 1;
get_commit_info(c, &ci);
fwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);
if(compability) {
get_commit_info(c, &ci);
fwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout);
if(compability) {
static void name_commit(struct commit *commit, const char *head_name, int nth)
{
struct commit_name *name;
static void name_commit(struct commit *commit, const char *head_name, int nth)
{
struct commit_name *name;
- if (!commit->object.util)
- commit->object.util = xmalloc(sizeof(struct commit_name));
- name = commit->object.util;
+ if (!commit->util)
+ commit->util = xmalloc(sizeof(struct commit_name));
+ name = commit->util;
name->head_name = head_name;
name->generation = nth;
}
name->head_name = head_name;
name->generation = nth;
}
*/
static void name_parent(struct commit *commit, struct commit *parent)
{
*/
static void name_parent(struct commit *commit, struct commit *parent)
{
- struct commit_name *commit_name = commit->object.util;
- struct commit_name *parent_name = parent->object.util;
+ struct commit_name *commit_name = commit->util;
+ struct commit_name *parent_name = parent->util;
if (!commit_name)
return;
if (!parent_name ||
if (!commit_name)
return;
if (!parent_name ||
int i = 0;
while (c) {
struct commit *p;
int i = 0;
while (c) {
struct commit *p;
break;
if (!c->parents)
break;
p = c->parents->item;
break;
if (!c->parents)
break;
p = c->parents->item;
name_parent(c, p);
i++;
}
name_parent(c, p);
i++;
}
/* First give names to the given heads */
for (cl = list; cl; cl = cl->next) {
c = cl->item;
/* First give names to the given heads */
for (cl = list; cl; cl = cl->next) {
c = cl->item;
continue;
for (i = 0; i < num_rev; i++) {
if (rev[i] == c) {
continue;
for (i = 0; i < num_rev; i++) {
if (rev[i] == c) {
struct commit_name *n;
int nth;
c = cl->item;
struct commit_name *n;
int nth;
c = cl->item;
parents = c->parents;
nth = 0;
while (parents) {
parents = c->parents;
nth = 0;
while (parents) {
char newname[1000], *en;
parents = parents->next;
nth++;
char newname[1000], *en;
parents = parents->next;
nth++;
continue;
en = newname;
switch (n->generation) {
continue;
en = newname;
switch (n->generation) {
static void show_one_commit(struct commit *commit, int no_name)
{
char pretty[256], *cp;
static void show_one_commit(struct commit *commit, int no_name)
{
char pretty[256], *cp;
- struct commit_name *name = commit->object.util;
+ struct commit_name *name = commit->util;
if (commit->object.parsed)
pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
pretty, sizeof(pretty), 0, NULL, NULL);
if (commit->object.parsed)
pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
pretty, sizeof(pretty), 0, NULL, NULL);
void topo_sort_default_setter(struct commit *c, void *data)
{
void topo_sort_default_setter(struct commit *c, void *data)
{
}
void *topo_sort_default_getter(struct commit *c)
{
}
void *topo_sort_default_getter(struct commit *c)
{
struct commit {
struct object object;
struct commit {
struct object object;
unsigned long date;
struct commit_list *parents;
struct tree *tree;
unsigned long date;
struct commit_list *parents;
struct tree *tree;
const char *tip_name, int merge_traversals, int generation,
int deref)
{
const char *tip_name, int merge_traversals, int generation,
int deref)
{
- struct rev_name *name = (struct rev_name *)commit->object.util;
+ struct rev_name *name = (struct rev_name *)commit->util;
struct commit_list *parents;
int parent_number = 1;
struct commit_list *parents;
int parent_number = 1;
if (name == NULL) {
name = xmalloc(sizeof(rev_name));
if (name == NULL) {
name = xmalloc(sizeof(rev_name));
- commit->object.util = name;
goto copy_data;
} else if (name->merge_traversals > merge_traversals ||
(name->merge_traversals == merge_traversals &&
goto copy_data;
} else if (name->merge_traversals > merge_traversals ||
(name->merge_traversals == merge_traversals &&
static const char* get_rev_name(struct object *o)
{
static char buffer[1024];
static const char* get_rev_name(struct object *o)
{
static char buffer[1024];
- struct rev_name *n = (struct rev_name *)o->util;
+ struct rev_name *n;
+ struct commit *c;
+
+ if (o->type != TYPE_COMMIT)
+ return "undefined";
+ c = (struct commit *) o;
+ n = c->util;
if (!n)
return "undefined";
if (!n)
return "undefined";
unsigned flags : FLAG_BITS;
unsigned char sha1[20];
struct object_refs *refs;
unsigned flags : FLAG_BITS;
unsigned char sha1[20];
struct object_refs *refs;
};
extern int track_object_refs;
};
extern int track_object_refs;