115
/*
116
* Ordered list of offsets of objects in the pack.
117
*/
118
-static void create_pack_revindex(struct pack_revindex *rix)
118
+static void create_pack_revindex(struct packed_git *p)
119
{
120
- struct packed_git *p = rix->p;
120
unsigned num_ent = p->num_objects;
121
unsigned i;
122
const char *index = p->index_data;
123
125
- rix->revindex = xmalloc(sizeof(*rix->revindex) * (num_ent + 1));
124
+ p->revindex = xmalloc(sizeof(*p->revindex) * (num_ent + 1));
125
index += 4 * 256;
126
127
if (p->index_version > 1) {
131
for (i = 0; i < num_ent; i++) {
132
uint32_t off = ntohl(*off_32++);
133
if (!(off & 0x80000000)) {
135
- rix->revindex[i].offset = off;
134
+ p->revindex[i].offset = off;
135
} else {
137
- rix->revindex[i].offset =
136
+ p->revindex[i].offset =
137
((uint64_t)ntohl(*off_64++)) << 32;
139
- rix->revindex[i].offset |=
138
+ p->revindex[i].offset |=
139
ntohl(*off_64++);
140
}
142
- rix->revindex[i].nr = i;
141
+ p->revindex[i].nr = i;
142
}
143
} else {
144
for (i = 0; i < num_ent; i++) {
145
uint32_t hl = *((uint32_t *)(index + 24 * i));
147
- rix->revindex[i].offset = ntohl(hl);
148
- rix->revindex[i].nr = i;
146
+ p->revindex[i].offset = ntohl(hl);
147
+ p->revindex[i].nr = i;
148
}
149
}
150
151
/* This knows the pack format -- the 20-byte trailer
152
* follows immediately after the last object data.
153
*/
155
- rix->revindex[num_ent].offset = p->pack_size - 20;
156
- rix->revindex[num_ent].nr = -1;
157
- sort_revindex(rix->revindex, num_ent, p->pack_size);
154
+ p->revindex[num_ent].offset = p->pack_size - 20;
155
+ p->revindex[num_ent].nr = -1;
156
+ sort_revindex(p->revindex, num_ent, p->pack_size);
157
}
158
160
-struct pack_revindex *revindex_for_pack(struct packed_git *p)
159
+void load_pack_revindex(struct packed_git *p)
160
{
162
- struct pack_revindex *rix = &p->reverse_index;
163
- if (!rix->revindex) {
164
- rix->p = p;
165
- create_pack_revindex(rix);
166
- }
167
- return rix;
161
+ if (!p->revindex)
162
+ create_pack_revindex(p);
163
}
164
170
-int find_revindex_position(struct pack_revindex *pridx, off_t ofs)
165
+int find_revindex_position(struct packed_git *p, off_t ofs)
166
{
167
int lo = 0;
173
- int hi = pridx->p->num_objects + 1;
174
- struct revindex_entry *revindex = pridx->revindex;
168
+ int hi = p->num_objects + 1;
169
+ struct revindex_entry *revindex = p->revindex;
170
171
do {
172
unsigned mi = lo + (hi - lo) / 2;
184
185
struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
186
{
192
- struct pack_revindex *pridx = revindex_for_pack(p);
193
- int pos = find_revindex_position(pridx, ofs);
187
+ int pos;
188
+
189
+ load_pack_revindex(p);
190
+ pos = find_revindex_position(p, ofs);
191
192
if (pos < 0)
193
return NULL;
194
198
- return pridx->revindex + pos;
195
+ return p->revindex + pos;
196
}