···428 -- repo identifiers
429 repo_at text not null,
430 ref text not null,
0431432 -- language breakdown
433 language text not null,
···428 -- repo identifiers
429 repo_at text not null,
430 ref text not null,
431+ is_default_ref integer not null default 0,
432433 -- language breakdown
434 language text not null,
+20-8
appview/db/language.go
···8)
910type RepoLanguage struct {
11- Id int64
12- RepoAt syntax.ATURI
13- Ref string
14- Language string
15- Bytes int64
016}
1718func GetRepoLanguages(e Execer, filters ...filter) ([]RepoLanguage, error) {
···29 }
3031 query := fmt.Sprintf(
32- `select id, repo_at, ref, language, bytes from repo_languages %s`,
33 whereClause,
34 )
35 rows, err := e.Query(query, args...)
···41 var langs []RepoLanguage
42 for rows.Next() {
43 var rl RepoLanguage
04445 err := rows.Scan(
46 &rl.Id,
47 &rl.RepoAt,
48 &rl.Ref,
049 &rl.Language,
50 &rl.Bytes,
51 )
52 if err != nil {
53 return nil, fmt.Errorf("failed to scan: %w ", err)
000054 }
5556 langs = append(langs, rl)
···6465func InsertRepoLanguages(e Execer, langs []RepoLanguage) error {
66 stmt, err := e.Prepare(
67- "insert or replace into repo_languages (repo_at, ref, language, bytes) values (?, ?, ?, ?)",
68 )
69 if err != nil {
70 return err
71 }
7273 for _, l := range langs {
74- _, err := stmt.Exec(l.RepoAt, l.Ref, l.Language, l.Bytes)
0000075 if err != nil {
76 return err
77 }
···8)
910type RepoLanguage struct {
11+ Id int64
12+ RepoAt syntax.ATURI
13+ Ref string
14+ IsDefaultRef bool
15+ Language string
16+ Bytes int64
17}
1819func GetRepoLanguages(e Execer, filters ...filter) ([]RepoLanguage, error) {
···30 }
3132 query := fmt.Sprintf(
33+ `select id, repo_at, ref, is_default_ref, language, bytes from repo_languages %s`,
34 whereClause,
35 )
36 rows, err := e.Query(query, args...)
···42 var langs []RepoLanguage
43 for rows.Next() {
44 var rl RepoLanguage
45+ var isDefaultRef int
4647 err := rows.Scan(
48 &rl.Id,
49 &rl.RepoAt,
50 &rl.Ref,
51+ &isDefaultRef,
52 &rl.Language,
53 &rl.Bytes,
54 )
55 if err != nil {
56 return nil, fmt.Errorf("failed to scan: %w ", err)
57+ }
58+59+ if isDefaultRef != 0 {
60+ rl.IsDefaultRef = true
61 }
6263 langs = append(langs, rl)
···7172func InsertRepoLanguages(e Execer, langs []RepoLanguage) error {
73 stmt, err := e.Prepare(
74+ "insert or replace into repo_languages (repo_at, ref, is_default_ref, language, bytes) values (?, ?, ?, ?, ?)",
75 )
76 if err != nil {
77 return err
78 }
7980 for _, l := range langs {
81+ isDefaultRef := 0
82+ if l.IsDefaultRef {
83+ isDefaultRef = 1
84+ }
85+86+ _, err := stmt.Exec(l.RepoAt, l.Ref, isDefaultRef, l.Language, l.Bytes)
87 if err != nil {
88 return err
89 }
+9-5
appview/repo/index.go
···123 }
124 }
125126- languageInfo, err := rp.getLanguageInfo(f, signedClient)
0127 if err != nil {
128 log.Printf("failed to compute language percentages: %s", err)
129 // non-fatal
···158func (rp *Repo) getLanguageInfo(
159 f *reporesolver.ResolvedRepo,
160 signedClient *knotclient.SignedClient,
0161) ([]types.RepoLanguageDetails, error) {
162 // first attempt to fetch from db
163 langs, err := db.GetRepoLanguages(
···175 if ls == nil {
176 return nil, nil
177 }
0178 for l, s := range ls.Languages {
179 langs = append(langs, db.RepoLanguage{
180- RepoAt: f.RepoAt,
181- Ref: f.Ref,
182- Language: l,
183- Bytes: s,
0184 })
185 }
186
···123 }
124 }
125126+ // TODO: a bit dirty
127+ languageInfo, err := rp.getLanguageInfo(f, signedClient, chi.URLParam(r, "ref") == "")
128 if err != nil {
129 log.Printf("failed to compute language percentages: %s", err)
130 // non-fatal
···159func (rp *Repo) getLanguageInfo(
160 f *reporesolver.ResolvedRepo,
161 signedClient *knotclient.SignedClient,
162+ isDefaultRef bool,
163) ([]types.RepoLanguageDetails, error) {
164 // first attempt to fetch from db
165 langs, err := db.GetRepoLanguages(
···177 if ls == nil {
178 return nil, nil
179 }
180+181 for l, s := range ls.Languages {
182 langs = append(langs, db.RepoLanguage{
183+ RepoAt: f.RepoAt,
184+ Ref: f.Ref,
185+ IsDefaultRef: isDefaultRef,
186+ Language: l,
187+ Bytes: s,
188 })
189 }
190