diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-10-05 12:36:22 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-10-05 12:36:22 -0700 |
commit | e99f8c6dcf0f924f1a7702bdd2d6f50e9fbb8fbb (patch) | |
tree | 3fed4e38243fb2ed25be9168a7f4c7592a270b41 | |
parent | 7451aee8e594fe902856a9bf418ca804171f9d19 (diff) | |
parent | 5bdf0a8468efd55cf8f13cafdb946c0ade3372fe (diff) | |
download | git-e99f8c6dcf0f924f1a7702bdd2d6f50e9fbb8fbb.tar.gz |
Merge branch 'wh/normalize-alt-odb-path'
* wh/normalize-alt-odb-path:
sha1_file: normalize alt_odb path before comparing and storing
-rw-r--r-- | sha1_file.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/sha1_file.c b/sha1_file.c index e002056b85..3401301444 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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] = '/'; |