aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api/git.js103
1 files changed, 75 insertions, 28 deletions
diff --git a/src/api/git.js b/src/api/git.js
index f0c2783..35b83cf 100644
--- a/src/api/git.js
+++ b/src/api/git.js
@@ -315,50 +315,97 @@ function connectToGitHTTPBackend(base_dir, req, reply)
git_pack.on("close", () => reply.raw.end());
}
-function getTreeEntries(entries)
+async function getTree(base_dir, repo_name, tree_path)
{
- return entries.reduce((acc, entry) =>
+ repo_name = addRepoDirSuffix(repo_name);
+
+ const repo = await git.Repository.openBare(`${base_dir}/${repo_name}`);
+ const master_commit = await repo.getMasterCommit();
+
+ const tree = await master_commit.getTree();
+
+ let entries;
+ if(tree_path) {
+ try {
+ const path_entry = await tree.getEntry(tree_path);
+
+ if(path_entry.isBlob()) {
+ return { type: "blob", content: (await path_entry.getBlob()).content().toString() };
+ }
+
+ entries = await (await path_entry.getTree()).entries();
+ }
+ catch(err) {
+ if(err.errno === -3) {
+ return { error: 404 };
+ }
+ return { error: 500 };
+ }
+ }
+ else {
+ entries = tree.entries();
+ }
+
+ return { type: "tree", tree: await entries.reduce((acc, entry) =>
{
return acc.then((obj) =>
{
- const basename = path.parse(entry.path()).base;
-
- if(entry.isBlob()) {
- console.log("blob " + entry.path());
- obj[basename] = { oid: entry.oid(), type: "blob" };
+ return getTreeEntryLastCommit(repo, entry).then((last_commit) =>
+ {
+ obj[path.parse(entry.path()).base] = {
+ oid: entry.oid(),
+ type: entry.isBlob() ? "blob" : "tree",
+ last_commit: {
+ id: last_commit.id,
+ message: last_commit.message,
+ time: last_commit.time
+ }
+ };
return obj;
- }
+ });
+ });
+ }, Promise.resolve({})) };
+}
+
+async function getTreeEntryLastCommit(repo, tree_entry)
+{
+ const walker = git.Revwalk.create(repo);
+ walker.pushHead();
+
+ const raw_commits = await walker.getCommitsUntil(() => true);
- if(entry.isTree()) {
- console.log("tree " + entry.path());
- return entry.getTree().then((tree) =>
+ return raw_commits.reduce((acc, commit) =>
+ {
+ return acc.then((obj) =>
+ {
+ if(Object.keys(obj).length == 0) {
+ return commit.getDiff().then((diffs) =>
{
- console.log("LMAO " + tree.path());
- return getTreeEntries(tree.entries()).then((tree_entries) =>
+ return diffs[0].patches().then((patches) =>
{
- obj[basename] = { oid: entry.oid(), type: "tree", tree: tree_entries };
+ let matching_path_patch;
+ if(tree_entry.isBlob()) {
+ matching_path_patch = patches.find((patch) => patch.newFile().path() === tree_entry.path());
+ }
+ else {
+ matching_path_patch = patches.find((patch) => path.parse(patch.newFile().path()).dir.startsWith(tree_entry.path()));
+ }
+
+ if(matching_path_patch) {
+ obj.id = commit.sha();
+ obj.message = commit.message().replace(/\n/g, "");
+ obj.time = commit.date();
+ }
return obj;
});
});
}
+
+ return obj;
});
-
}, Promise.resolve({}));
}
-async function getTree(base_dir, repo_name)
-{
- repo_name = addRepoDirSuffix(repo_name);
-
- const repo = await git.Repository.openBare(`${base_dir}/${repo_name}`);
- const master_commit = await repo.getMasterCommit();
-
- const tree = await master_commit.getTree();
- const entries = tree.entries();
-
- return await getTreeEntries(entries);
-}
-
module.exports.getLog = getLog;
module.exports.getRepos = getRepos;
module.exports.getRepoFile = getRepoFile;