- for (i = 0; i < entries; i++) {
- struct cache_entry *ce = active_cache[i];
- if (check_valid_sha1(ce->sha1) < 0)
+ nr = 0;
+ do {
+ struct cache_entry *ce = cachep[nr];
+ const char *pathname = ce->name, *filename, *dirname;
+ int pathlen = ce->namelen, entrylen;
+ unsigned char *sha1;
+ unsigned int mode;
+
+ /* Did we hit the end of the directory? Return how many we wrote */
+ if (baselen >= pathlen || memcmp(base, pathname, baselen))
+ break;
+
+ sha1 = ce->sha1;
+ mode = ce->st_mode;
+
+ /* Do we have _further_ subdirectories? */
+ filename = pathname + baselen;
+ dirname = strchr(filename, '/');
+ if (dirname) {
+ int subdir_written;
+
+ subdir_written = write_tree(cachep + nr, maxentries - nr, pathname, dirname-pathname+1, subdir_sha1);
+ fprintf(stderr, "Wrote %d entries from subdirectory '%.*s'\n",
+ subdir_written, dirname-pathname, pathname);
+ nr += subdir_written;
+
+ /* Now we need to write out the directory entry into this tree.. */
+ mode = S_IFDIR;
+ pathlen = dirname - pathname;
+
+ /* ..but the directory entry doesn't count towards the total count */
+ nr--;
+ sha1 = subdir_sha1;
+ }
+
+ if (check_valid_sha1(sha1) < 0)