diff options
-rw-r--r-- | server-info.c | 120 |
1 files changed, 10 insertions, 110 deletions
diff --git a/server-info.c b/server-info.c index e4006f0b5..2cd143224 100644 --- a/server-info.c +++ b/server-info.c @@ -51,7 +51,6 @@ static struct pack_info { int nr_alloc; int nr_heads; unsigned char (*head)[20]; - char dep[0]; /* more */ } **info; static int num_pack; static const char *objdir; @@ -123,49 +122,12 @@ static int parse_pack_def(const char *line, int old_cnt) return 0; } else { - /* The file describes a pack that is no longer here; - * dependencies between packs needs to be recalculated. - */ + /* The file describes a pack that is no longer here */ return 1; } } -/* Returns non-zero when we detect that the info in the - * old file is useless. - */ -static int parse_depend_def(char *line) -{ - unsigned long num; - char *cp, *ep; - struct pack_info *this, *that; - - cp = line + 2; - num = strtoul(cp, &ep, 10); - if (ep == cp) - return error("invalid input %s", line); - this = find_pack_by_old_num(num); - if (!this) - return 0; - while (ep && *(cp = ep)) { - num = strtoul(cp, &ep, 10); - if (ep == cp) - break; - that = find_pack_by_old_num(num); - if (!that) - /* The pack this one depends on does not - * exist; this should not happen because - * we write out the list of packs first and - * then dependency information, but it means - * the file is useless anyway. - */ - return 1; - this->dep[that->new_num] = 1; - } - return 0; -} - -/* Returns non-zero when we detect that the info in the - * old file is useless. +/* Returns non-zero when we detect that the info in the old file is useless. */ static int parse_head_def(char *line) { @@ -212,9 +174,8 @@ static int read_pack_info_file(const char *infofile) if (parse_pack_def(line, old_cnt++)) goto out_stale; break; - case 'D': /* D ix dep-ix1 dep-ix2... */ - if (parse_depend_def(line)) - goto out_stale; + case 'D': /* we used to emit D but that was misguided. */ + goto out_stale; break; case 'T': /* T ix sha1 type */ if (parse_head_def(line)) @@ -286,7 +247,6 @@ static void init_pack_info(const char *infofile, int force) struct packed_git *p; int stale; int i = 0; - char *dep_temp; objdir = get_object_directory(); objdirlen = strlen(objdir); @@ -307,7 +267,7 @@ static void init_pack_info(const char *infofile, int force) if (strncmp(p->pack_name, objdir, objdirlen) || p->pack_name[objdirlen] != '/') continue; - info[i] = xcalloc(1, sizeof(struct pack_info) + num_pack); + info[i] = xcalloc(1, sizeof(struct pack_info)); info[i]->p = p; info[i]->old_num = -1; i++; @@ -321,41 +281,16 @@ static void init_pack_info(const char *infofile, int force) for (i = 0; i < num_pack; i++) { if (stale) { info[i]->old_num = -1; - memset(info[i]->dep, 0, num_pack); info[i]->nr_heads = 0; } if (info[i]->old_num < 0) info[i]->latest = get_latest_commit_date(info[i]->p); } + /* renumber them */ qsort(info, num_pack, sizeof(info[0]), compare_info); for (i = 0; i < num_pack; i++) info[i]->new_num = i; - - /* we need to fix up the dependency information - * for the old ones. - */ - dep_temp = NULL; - for (i = 0; i < num_pack; i++) { - int old; - - if (info[i]->old_num < 0) - continue; - if (! dep_temp) - dep_temp = xmalloc(num_pack); - memset(dep_temp, 0, num_pack); - for (old = 0; old < num_pack; old++) { - struct pack_info *base; - if (!info[i]->dep[old]) - continue; - base = find_pack_by_old_num(old); - if (!base) - die("internal error renumbering"); - dep_temp[base->new_num] = 1; - } - memcpy(info[i]->dep, dep_temp, num_pack); - } - free(dep_temp); } static void write_pack_info_file(FILE *fp) @@ -363,17 +298,6 @@ static void write_pack_info_file(FILE *fp) int i, j; for (i = 0; i < num_pack; i++) fprintf(fp, "P %s\n", info[i]->p->pack_name + objdirlen + 6); - - for (i = 0; i < num_pack; i++) { - fprintf(fp, "D %1d", i); - for (j = 0; j < num_pack; j++) { - if ((i == j) || !(info[i]->dep[j])) - continue; - fprintf(fp, " %1d", j); - } - fputc('\n', fp); - } - for (i = 0; i < num_pack; i++) { struct pack_info *this = info[i]; for (j = 0; j < this->nr_heads; j++) { @@ -386,37 +310,18 @@ static void write_pack_info_file(FILE *fp) } #define REFERENCED 01 -#define INTERNAL 02 #define EMITTED 04 static void show(struct object *o, int pack_ix) { /* * We are interested in objects that are not referenced, - * and objects that are referenced but not internal. */ if (o->flags & EMITTED) return; if (!(o->flags & REFERENCED)) add_head_def(info[pack_ix], o->sha1); - else if ((o->flags & REFERENCED) && !(o->flags & INTERNAL)) { - int i; - - /* Which pack contains this object? That is what - * pack_ix can depend on. We earlier sorted info - * array from youngest to oldest, so try newer packs - * first to favor them here. - */ - for (i = num_pack - 1; 0 <= i; i--) { - struct packed_git *p = info[i]->p; - struct pack_entry ent; - if (find_pack_entry_one(o->sha1, &ent, p)) { - info[pack_ix]->dep[i] = 1; - break; - } - } - } o->flags |= EMITTED; } @@ -445,7 +350,7 @@ static void find_pack_info_one(int pack_ix) o->flags = 0; } - /* Mark all the internal ones */ + /* Mark all the referenced ones */ for (i = 0; i < num; i++) { if (nth_packed_object_sha1(p, i, sha1)) die("corrupt pack file %s?", p->pack_name); @@ -457,7 +362,6 @@ static void find_pack_info_one(int pack_ix) for (j = 0; j < refs->count; j++) refs->ref[j]->flags |= REFERENCED; } - o->flags |= INTERNAL; } for (i = 0; i < num; i++) { @@ -465,14 +369,7 @@ static void find_pack_info_one(int pack_ix) die("corrupt pack file %s?", p->pack_name); if ((o = lookup_object(sha1)) == NULL) die("cannot find %s", sha1_to_hex(sha1)); - show(o, pack_ix); - if (o->refs) { - struct object_refs *refs = o->refs; - int j; - for (j = 0; j < refs->count; j++) - show(refs->ref[j], pack_ix); - } } } @@ -530,5 +427,8 @@ int update_server_info(int force) errs = errs | update_info_refs(force); errs = errs | update_info_packs(force); + /* remove leftover rev-cache file if there is any */ + unlink(git_path("info/rev-cache")); + return errs; } |