diff --git a/knotserver/git/tree.go b/knotserver/git/tree.go index a01742f7..3553ccff 100644 --- a/knotserver/git/tree.go +++ b/knotserver/git/tree.go @@ -48,7 +48,17 @@ func (g *GitRepo) FileTree(ctx context.Context, path string) ([]types.NiceTree, func (g *GitRepo) makeNiceTree(ctx context.Context, subtree *object.Tree, parent string) []types.NiceTree { nts := []types.NiceTree{} - times, err := g.calculateCommitTimeIn(ctx, subtree, parent, 2*time.Second) + entries := make([]string, len(subtree.Entries)) + for _, e := range subtree.Entries { + entries = append(entries, e.Name) + } + + lastCommitDir := lastCommitDir{ + dir: parent, + entries: entries, + } + + times, err := g.lastCommitDirIn(ctx, lastCommitDir, 2*time.Second) if err != nil { return nts } diff --git a/knotserver/xrpc/repo_blob.go b/knotserver/xrpc/repo_blob.go index 3c07b736..c8add0c7 100644 --- a/knotserver/xrpc/repo_blob.go +++ b/knotserver/xrpc/repo_blob.go @@ -147,14 +147,12 @@ func (x *Xrpc) RepoBlob(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second) defer cancel() - lastCommit, err := gr.GetLastCommitForPath(ctx, treePath) + lastCommit, err := gr.LastCommitFile(ctx, treePath) if err == nil && lastCommit != nil { - shortHash := lastCommit.Hash.String()[:8] response.LastCommit = &tangled.RepoBlob_LastCommit{ - Hash: lastCommit.Hash.String(), - ShortHash: &shortHash, - Message: lastCommit.Message, - When: lastCommit.When.Format(time.RFC3339), + Hash: lastCommit.Hash.String(), + Message: lastCommit.Message, + When: lastCommit.When.Format(time.RFC3339), } // try to get author information diff --git a/knotserver/xrpc/repo_tree.go b/knotserver/xrpc/repo_tree.go index 7e2ad01d..cb2cb929 100644 --- a/knotserver/xrpc/repo_tree.go +++ b/knotserver/xrpc/repo_tree.go @@ -9,6 +9,7 @@ import ( "tangled.org/core/api/tangled" "tangled.org/core/appview/pages/markup" "tangled.org/core/knotserver/git" + "tangled.org/core/types" xrpcerr "tangled.org/core/xrpc/errors" ) @@ -107,5 +108,39 @@ func (x *Xrpc) RepoTree(w http.ResponseWriter, r *http.Request) { }, } + // calculate lastCommit for the directory as a whole + var lastCommitTree *types.LastCommitInfo + for _, e := range files { + if e.LastCommit == nil { + continue + } + + if lastCommitTree == nil { + lastCommitTree = e.LastCommit + continue + } + + if lastCommitTree.When.After(e.LastCommit.When) { + lastCommitTree = e.LastCommit + } + } + + if lastCommitTree != nil { + response.LastCommit = &tangled.RepoTree_LastCommit{ + Hash: lastCommitTree.Hash.String(), + Message: lastCommitTree.Message, + When: lastCommitTree.When.Format(time.RFC3339), + } + + // try to get author information + commit, err := gr.Commit(lastCommitTree.Hash) + if err == nil { + response.LastCommit.Author = &tangled.RepoTree_Signature{ + Name: commit.Author.Name, + Email: commit.Author.Email, + } + } + } + writeJson(w, response) }