+ last = alt;
+ do {
+ for (cp = last; cp < ep && *cp != ':'; cp++)
+ ;
+ if (last != cp) {
+ /* 43 = 40-byte + 2 '/' + terminating NUL */
+ int pfxlen = cp - last;
+ int entlen = pfxlen + 43;
+
+ ent = xmalloc(sizeof(*ent) + entlen);
+ *alt_odb_tail = ent;
+ alt_odb_tail = &(ent->next);
+ ent->next = NULL;
+
+ memcpy(ent->base, last, pfxlen);
+ ent->name = ent->base + pfxlen + 1;
+ ent->base[pfxlen] = ent->base[pfxlen + 3] = '/';
+ ent->base[entlen-1] = 0;
+ }
+ while (cp < ep && *cp == ':')
+ cp++;
+ last = cp;
+ } while (cp < ep);
+}
+
+void prepare_alt_odb(void)
+{
+ char path[PATH_MAX];
+ char *map, *ep;
+ int fd;
+ struct stat st;
+ char *alt = gitenv(ALTERNATE_DB_ENVIRONMENT) ? : "";
+
+ 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));
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ return;
+ if (fstat(fd, &st) || (st.st_size == 0)) {
+ close(fd);