Skip to content

Commit

Permalink
sha1_file: normalize alt_odb path before comparing and storing
Browse files Browse the repository at this point in the history
When it needs to compare and add an alt object path to the
alt_odb_list, we normalize this path first since comparing normalized
path is easy to get correct result.

Use strbuf to replace some string operations, since it is cleaner and
safer.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Hui Wang <Hui.Wang@windriver.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Hui Wang authored and Junio C Hamano committed Sep 7, 2011
1 parent f696543 commit 5bdf0a8
Showing 1 changed file with 20 additions and 17 deletions.
37 changes: 20 additions & 17 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -248,27 +248,30 @@ static int link_alt_odb_entry(const char * entry, int len, const char * relative
const char *objdir = get_object_directory();
struct alternate_object_database *ent;
struct alternate_object_database *alt;
/* 43 = 40-byte + 2 '/' + terminating NUL */
int pfxlen = len;
int entlen = pfxlen + 43;
int base_len = -1;
int pfxlen, entlen;
struct strbuf pathbuf = STRBUF_INIT;

if (!is_absolute_path(entry) && relative_base) {
/* Relative alt-odb */
if (base_len < 0)
base_len = strlen(relative_base) + 1;
entlen += base_len;
pfxlen += base_len;
strbuf_addstr(&pathbuf, real_path(relative_base));
strbuf_addch(&pathbuf, '/');
}
ent = xmalloc(sizeof(*ent) + entlen);
strbuf_add(&pathbuf, entry, len);

if (!is_absolute_path(entry) && relative_base) {
memcpy(ent->base, relative_base, base_len - 1);
ent->base[base_len - 1] = '/';
memcpy(ent->base + base_len, entry, len);
}
else
memcpy(ent->base, entry, pfxlen);
normalize_path_copy(pathbuf.buf, pathbuf.buf);

pfxlen = strlen(pathbuf.buf);

/*
* The trailing slash after the directory name is given by
* this function at the end. Remove duplicates.
*/
while (pfxlen && pathbuf.buf[pfxlen-1] == '/')
pfxlen -= 1;

entlen = pfxlen + 43; /* '/' + 2 hex + '/' + 38 hex + NUL */
ent = xmalloc(sizeof(*ent) + entlen);
memcpy(ent->base, pathbuf.buf, pfxlen);
strbuf_release(&pathbuf);

ent->name = ent->base + pfxlen + 1;
ent->base[pfxlen + 3] = '/';
Expand Down

0 comments on commit 5bdf0a8

Please sign in to comment.