Skip to content

Commit 7f0fa2c

Browse files
peffgitster
authored andcommitted
alternates: provide helper for allocating alternate
Allocating a struct alternate_object_database is tricky, as we must over-allocate the buffer to provide scratch space, and then put in particular '/' and NUL markers. Let's encapsulate this in a function so that the complexity doesn't leak into callers (and so that we can modify it later). Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent a5b34d2 commit 7f0fa2c

File tree

3 files changed

+26
-15
lines changed

3 files changed

+26
-15
lines changed

cache.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,12 @@ extern char *compute_alternate_path(const char *path, struct strbuf *err);
13921392
typedef int alt_odb_fn(struct alternate_object_database *, void *);
13931393
extern int foreach_alt_odb(alt_odb_fn, void*);
13941394

1395+
/*
1396+
* Allocate a "struct alternate_object_database" but do _not_ actually
1397+
* add it to the list of alternates.
1398+
*/
1399+
struct alternate_object_database *alloc_alt_odb(const char *dir);
1400+
13951401
/*
13961402
* Add the directory to the on-disk alternates file; the new entry will also
13971403
* take effect in the current process.

sha1_file.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
283283
int depth, const char *normalized_objdir)
284284
{
285285
struct alternate_object_database *ent;
286-
size_t entlen;
287286
struct strbuf pathbuf = STRBUF_INIT;
288287

289288
if (!is_absolute_path(entry) && relative_base) {
@@ -311,14 +310,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
311310
return -1;
312311
}
313312

314-
entlen = st_add(pathbuf.len, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */
315-
ent = xmalloc(st_add(sizeof(*ent), entlen));
316-
memcpy(ent->base, pathbuf.buf, pathbuf.len);
317-
318-
ent->name = ent->base + pathbuf.len + 1;
319-
ent->base[pathbuf.len] = '/';
320-
ent->base[pathbuf.len + 3] = '/';
321-
ent->base[entlen-1] = 0;
313+
ent = alloc_alt_odb(pathbuf.buf);
322314

323315
/* add the alternate entry */
324316
*alt_odb_tail = ent;
@@ -395,6 +387,24 @@ void read_info_alternates(const char * relative_base, int depth)
395387
munmap(map, mapsz);
396388
}
397389

390+
struct alternate_object_database *alloc_alt_odb(const char *dir)
391+
{
392+
struct alternate_object_database *ent;
393+
size_t dirlen = strlen(dir);
394+
size_t entlen;
395+
396+
entlen = st_add(dirlen, 43); /* '/' + 2 hex + '/' + 38 hex + NUL */
397+
ent = xmalloc(st_add(sizeof(*ent), entlen));
398+
memcpy(ent->base, dir, dirlen);
399+
400+
ent->name = ent->base + dirlen + 1;
401+
ent->base[dirlen] = '/';
402+
ent->base[dirlen + 3] = '/';
403+
ent->base[entlen-1] = 0;
404+
405+
return ent;
406+
}
407+
398408
void add_to_alternates_file(const char *reference)
399409
{
400410
struct lock_file *lock = xcalloc(1, sizeof(struct lock_file));

sha1_name.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,7 @@ static void find_short_object_filename(int len, const char *hex_pfx, struct disa
8686
* alt->name/alt->base while iterating over the
8787
* object databases including our own.
8888
*/
89-
const char *objdir = get_object_directory();
90-
size_t objdir_len = strlen(objdir);
91-
fakeent = xmalloc(st_add3(sizeof(*fakeent), objdir_len, 43));
92-
memcpy(fakeent->base, objdir, objdir_len);
93-
fakeent->name = fakeent->base + objdir_len + 1;
94-
fakeent->name[-1] = '/';
89+
fakeent = alloc_alt_odb(get_object_directory());
9590
}
9691
fakeent->next = alt_odb_list;
9792

0 commit comments

Comments
 (0)