From 0713b4be87d15382804abfac20cf058846369657 Mon Sep 17 00:00:00 2001 From: oppiliappan Date: Tue, 30 Sep 2025 23:59:38 +0100 Subject: [PATCH] appview/languages: fix logic bug in updating language breakdowns Change-Id: zomkuzmzokvlnmwvrmrqwqkkqqsxoxwk Signed-off-by: oppiliappan --- appview/db/language.go | 35 +++++++++++++++++++++++++++++++++++ appview/repo/index.go | 13 ++++++++++++- appview/state/knotstream.go | 16 ++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/appview/db/language.go b/appview/db/language.go index ea3a2b33..7e2b9e27 100644 --- a/appview/db/language.go +++ b/appview/db/language.go @@ -1,9 +1,12 @@ package db import ( + "database/sql" "fmt" "strings" + "github.com/bluesky-social/indigo/atproto/syntax" + "tangled.org/core/appview/db" "tangled.org/core/appview/models" ) @@ -82,3 +85,35 @@ func InsertRepoLanguages(e Execer, langs []models.RepoLanguage) error { return nil } + +func DeleteRepoLanguages(e Execer, filters ...filter) error { + var conditions []string + var args []any + for _, filter := range filters { + conditions = append(conditions, filter.Condition()) + args = append(args, filter.Arg()...) + } + + whereClause := "" + if conditions != nil { + whereClause = " where " + strings.Join(conditions, " and ") + } + + query := fmt.Sprintf(`delete from repo_languages %s`, whereClause) + + _, err := e.Exec(query, args...) + return err +} + +func UpdateRepoLanguages(tx *sql.Tx, repoAt syntax.ATURI, ref string, langs []models.RepoLanguage) error { + err := DeleteRepoLanguages( + tx, + FilterEq("repo_at", repoAt), + FilterEq("ref", ref), + ) + if err != nil { + return fmt.Errorf("failed to delete existing languages: %w", err) + } + + return InsertRepoLanguages(tx, langs) +} diff --git a/appview/repo/index.go b/appview/repo/index.go index db4bfcd7..179f3646 100644 --- a/appview/repo/index.go +++ b/appview/repo/index.go @@ -200,12 +200,23 @@ func (rp *Repo) getLanguageInfo( }) } + tx, err := rp.db.Begin() + if err != nil { + return nil, err + } + defer tx.Rollback() + // update appview's cache - err = db.InsertRepoLanguages(rp.db, langs) + err = db.UpdateRepoLanguages(tx, f.RepoAt(), currentRef, langs) if err != nil { // non-fatal log.Println("failed to cache lang results", err) } + + err = tx.Commit() + if err != nil { + return nil, err + } } var total int64 diff --git a/appview/state/knotstream.go b/appview/state/knotstream.go index 8a64fbe6..3ce16006 100644 --- a/appview/state/knotstream.go +++ b/appview/state/knotstream.go @@ -172,6 +172,22 @@ func updateRepoLanguages(d *db.DB, record tangled.GitRefUpdate) error { }) } + tx, err := d.Begin() + if err != nil { + return err + } + defer tx.Rollback() + + // update appview's cache + err = db.UpdateRepoLanguages(tx, repo.RepoAt(), ref.Short(), langs) + if err != nil { + // non-fatal + } + + err = tx.Commit() + if err != nil { + return err + } return db.InsertRepoLanguages(d, langs) } -- 2.43.0