+ unsigned char sha1[20];
+ enum object_type type;
+ char *buf;
+ unsigned long size;
+ struct commit *commit;
+ const char *paths[] = {path, NULL};
+ if (get_sha1(head, sha1))
+ return -1;
+ type = sha1_object_info(sha1, &size);
+ if(type == OBJ_COMMIT && path) {
+ commit = lookup_commit_reference(sha1);
+ match_path = path;
+ matched_sha1 = sha1;
+ found_path = 0;
+ read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL);
+ if (!found_path)
+ return -1;
+ type = sha1_object_info(sha1, &size);
+ }
+ if (type == OBJ_BAD)
+ return -1;
+ buf = read_sha1_file(sha1, &type, &size);
+ if (!buf)
+ return -1;
+ buf[size] = '\0';
+ write(htmlfd, buf, size);
+ return 0;
+}