X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=sha1_file.c;h=f4c742eed4736e121448eb8d24697aa812a0d158;hb=65a9289d7e5207ed66199db94593b31fa5550fde;hp=2d109f928bef6fe74f2a27af1419d9e82a7b9b33;hpb=da27f4f3f4c23d0276a372726ed050ed13e45168;p=git.git diff --git a/sha1_file.c b/sha1_file.c index 2d109f92..f4c742ee 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -50,22 +50,22 @@ static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file; static void setup_git_env(void) { - git_dir = gitenv(GIT_DIR_ENVIRONMENT); + git_dir = getenv(GIT_DIR_ENVIRONMENT); if (!git_dir) git_dir = DEFAULT_GIT_DIR_ENVIRONMENT; - git_object_dir = gitenv(DB_ENVIRONMENT); + git_object_dir = getenv(DB_ENVIRONMENT); if (!git_object_dir) { git_object_dir = xmalloc(strlen(git_dir) + 9); sprintf(git_object_dir, "%s/objects", git_dir); } git_refs_dir = xmalloc(strlen(git_dir) + 6); sprintf(git_refs_dir, "%s/refs", git_dir); - git_index_file = gitenv(INDEX_ENVIRONMENT); + git_index_file = getenv(INDEX_ENVIRONMENT); if (!git_index_file) { git_index_file = xmalloc(strlen(git_dir) + 7); sprintf(git_index_file, "%s/index", git_dir); } - git_graft_file = gitenv(GRAFT_ENVIRONMENT); + git_graft_file = getenv(GRAFT_ENVIRONMENT); if (!git_graft_file) git_graft_file = strdup(git_path("info/grafts")); } @@ -240,14 +240,21 @@ static struct alternate_object_database **alt_odb_tail; * SHA1, an extra slash for the first level indirection, and the * terminating NUL. */ -static void link_alt_odb_entries(const char *alt, const char *ep) +static void link_alt_odb_entries(const char *alt, const char *ep, int sep) { const char *cp, *last; struct alternate_object_database *ent; last = alt; - do { - for (cp = last; cp < ep && *cp != ':'; cp++) + while (last < ep) { + cp = last; + if (cp < ep && *cp == '#') { + while (cp < ep && *cp != sep) + cp++; + last = cp + 1; + continue; + } + for ( ; cp < ep && *cp != sep; cp++) ; if (last != cp) { /* 43 = 40-byte + 2 '/' + terminating NUL */ @@ -264,25 +271,28 @@ static void link_alt_odb_entries(const char *alt, const char *ep) ent->base[pfxlen] = ent->base[pfxlen + 3] = '/'; ent->base[entlen-1] = 0; } - while (cp < ep && *cp == ':') + while (cp < ep && *cp == sep) cp++; last = cp; - } while (cp < ep); + } } void prepare_alt_odb(void) { char path[PATH_MAX]; - char *map, *ep; + char *map; int fd; struct stat st; - char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : ""; + char *alt; + + alt = getenv(ALTERNATE_DB_ENVIRONMENT); + if (!alt) alt = ""; sprintf(path, "%s/info/alternates", get_object_directory()); if (alt_odb_tail) return; alt_odb_tail = &alt_odb_list; - link_alt_odb_entries(alt, alt + strlen(alt)); + link_alt_odb_entries(alt, alt + strlen(alt), ':'); fd = open(path, O_RDONLY); if (fd < 0) @@ -296,10 +306,7 @@ void prepare_alt_odb(void) if (map == MAP_FAILED) return; - /* Remove the trailing newline */ - for (ep = map + st.st_size - 1; map < ep && ep[-1] == '\n'; ep--) - ; - link_alt_odb_entries(map, ep); + link_alt_odb_entries(map, map + st.st_size, '\n'); munmap(map, st.st_size); } @@ -476,12 +483,18 @@ struct packed_git *add_packed_git(char *path, int path_len) struct packed_git *parse_pack_index(unsigned char *sha1) { + char *path = sha1_pack_index_name(sha1); + return parse_pack_index_file(sha1, path); +} + +struct packed_git *parse_pack_index_file(const unsigned char *sha1, char *idx_path) +{ struct packed_git *p; unsigned long idx_size; void *idx_map; - char *path = sha1_pack_index_name(sha1); + char *path; - if (check_packed_git_idx(path, &idx_size, &idx_map)) + if (check_packed_git_idx(idx_path, &idx_size, &idx_map)) return NULL; path = sha1_pack_name(sha1);