From 030f1f5cc6548da92b41b50d5a3cd7dbf8577e90 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Mon, 18 May 2026 14:33:08 +0900 Subject: [PATCH] wip Signed-off-by: Seongmin Lee --- knotmirror/repoindexer/language.go | 33 +++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/knotmirror/repoindexer/language.go b/knotmirror/repoindexer/language.go index 4377d8bf..bb9c37bc 100644 --- a/knotmirror/repoindexer/language.go +++ b/knotmirror/repoindexer/language.go @@ -1,6 +1,7 @@ package repoindexer import ( + "bufio" "context" "database/sql" "encoding/json" @@ -15,6 +16,7 @@ import ( "github.com/go-enry/go-enry/v2" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/filemode" "github.com/go-git/go-git/v5/plumbing/object" "github.com/redis/go-redis/v9" "tangled.org/core/knotmirror/config" @@ -107,8 +109,9 @@ func (i *Indexer) indexLanguagesAtHead(ctx context.Context, repoId syntax.DID) e // - [x] cache indexLanguages result after processing request // - [ ] impl indexLanguages(ctx,repo,ref) using CatFile batch // - [ ] use that in all places including post-receive hook (hopefully it will be super fast) -// - [ ] impl background ingest worker with "repo_stats_update" queue +// - [x] impl background ingest worker with "repo_stats_update" queue // - [ ] cleanup appview side language code (don't ever try to sync that) +// - how about appview side indexer? // "repo_stats_update" should be its own runtime queue so we can dump triggers @@ -127,8 +130,32 @@ func (i *Indexer) indexLanguagesAtHead(ctx context.Context, repoId syntax.DID) e // 2. index language stats in current HEAD // 3. store db (ofc, cache it too) -// func (i *Indexer) ListLanguages(ctx context.Context, repoId syntax.DID, ref string) (map[string]int64, error) { -// } +func (i *Indexer) IndexLanguages2(ctx context.Context, repoId syntax.DID, commitId plumbing.Hash) (map[string]int64, error) { + repoPath := i.repoPath(repoId) + tree, err := gitea.GetTree(ctx, repoPath, commitId.String()+"^{tree}") + if err != nil { + panic("unimplemented") + } + + bw, br, close := gitea.CatFileBatch(ctx, repoPath) + defer close() + + sizes, err := analizeTree(ctx, bw, br, tree) + panic("unimplemented") +} + +// tree->(sizes) +func analizeTree(ctx context.Context, bw io.WriteCloser, br *bufio.Reader, tree *object.Tree) (map[string]int64, error) { + for _, entry := range tree.Entries { + switch entry.Mode { + case filemode.Dir: + // TODO + default: + // TODO + } + } + panic("unimplemented") +} // IndexLanguages index the repository language stats at given commit func (i *Indexer) IndexLanguages(ctx context.Context, repoId syntax.DID, commitId plumbing.Hash) (map[string]int64, error) { -- 2.51.2