diff --git a/go.mod b/go.mod --- a/go.mod +++ b/go.mod @@ -63,6 +63,7 @@ github.com/prometheus/procfs v0.19.2 github.com/redis/go-redis/v9 v9.7.3 github.com/resend/resend-go/v3 v3.5.0 + github.com/samber/lo v1.38.1 github.com/sethvargo/go-envconfig v1.1.0 github.com/sourcegraph/zoekt v0.0.0-20260605122240-893a523804f1 github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c diff --git a/go.sum b/go.sum --- a/go.sum +++ b/go.sum @@ -754,6 +754,8 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= +github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sethvargo/go-envconfig v1.1.0 h1:cWZiJxeTm7AlCvzGXrEXaSTCNgip5oJepekh/BOQuog= diff --git a/appview/db/language.go b/appview/db/language.go --- a/appview/db/language.go +++ b/appview/db/language.go @@ -52,6 +52,29 @@ return err } +func GetRepoLanguages(e Execer, repoDid syntax.DID, ref string) (map[string]int64, error) { + rows, err := e.Query( + `select language, bytes from repo_languages where repo_did = ? and ref = ?`, + repoDid, ref, + ) + if err != nil { + return nil, err + } + defer rows.Close() + + out := make(map[string]int64) + for rows.Next() { + var language string + var bytes int64 + if err := rows.Scan(&language, &bytes); err != nil { + return nil, err + } + out[language] = bytes + } + + return out, rows.Err() +} + func UpdateRepoLanguages(tx *sql.Tx, repoDid syntax.DID, ref string, langs []models.RepoLanguage) error { err := DeleteRepoLanguages( tx, diff --git a/appview/repo/index.go b/appview/repo/index.go --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -3,6 +3,7 @@ import ( "errors" "fmt" + "maps" "net/http" "net/url" "slices" @@ -27,6 +28,7 @@ "github.com/go-chi/chi/v5" "github.com/go-enry/go-enry/v2" + "github.com/samber/lo" ) func (rp *Repo) Index(w http.ResponseWriter, r *http.Request) { @@ -130,24 +132,35 @@ // non-fatal } else if ref == "" { // when request didn't specified ref, we are fetching default branch. if err := func(repo syntax.DID, ref string, langs []*tangled.GitTempListLanguages_Language) error { + current := lo.SliceToMap(langs, func(lang *tangled.GitTempListLanguages_Language) (string, int64) { + return lang.Name, lang.Size + }) + + existing, err := db.GetRepoLanguages(rp.db, repo, ref) + if err != nil { + return err + } + if maps.Equal(current, existing) { + return nil + } + tx, err := rp.db.Begin() if err != nil { return err } defer tx.Rollback() - var mlangs []models.RepoLanguage - for _, lang := range langs { - mlangs = append(mlangs, models.RepoLanguage{ + mlangs := lo.Map(langs, func(lang *tangled.GitTempListLanguages_Language, _ int) models.RepoLanguage { + return models.RepoLanguage{ RepoDid: repo, Ref: ref, IsDefaultRef: true, Language: lang.Name, Bytes: lang.Size, - }) - } + } + }) - if err := db.UpdateRepoLanguages(tx, syntax.DID(f.RepoDid), ref, mlangs); err != nil { + if err := db.UpdateRepoLanguages(tx, repo, ref, mlangs); err != nil { return err }