You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repo_indexer.go 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "fmt"
  7. "xorm.io/builder"
  8. )
  9. // RepoIndexerStatus status of a repo's entry in the repo indexer
  10. // For now, implicitly refers to default branch
  11. type RepoIndexerStatus struct {
  12. ID int64 `xorm:"pk autoincr"`
  13. RepoID int64 `xorm:"INDEX"`
  14. CommitSha string `xorm:"VARCHAR(40)"`
  15. }
  16. // GetUnindexedRepos returns repos which do not have an indexer status
  17. func GetUnindexedRepos(maxRepoID int64, page, pageSize int) ([]int64, error) {
  18. ids := make([]int64, 0, 50)
  19. cond := builder.Cond(builder.IsNull{
  20. "repo_indexer_status.id",
  21. })
  22. sess := x.Table("repository").Join("LEFT OUTER", "repo_indexer_status", "repository.id = repo_indexer_status.repo_id")
  23. if maxRepoID > 0 {
  24. cond = builder.And(cond, builder.Lte{
  25. "repository.id": maxRepoID,
  26. })
  27. }
  28. if page >= 0 && pageSize > 0 {
  29. start := 0
  30. if page > 0 {
  31. start = (page - 1) * pageSize
  32. }
  33. sess.Limit(pageSize, start)
  34. }
  35. sess.Where(cond).Cols("repository.id").Desc("repository.id")
  36. err := sess.Find(&ids)
  37. return ids, err
  38. }
  39. // GetIndexerStatus loads repo codes indxer status
  40. func (repo *Repository) GetIndexerStatus() error {
  41. if repo.IndexerStatus != nil {
  42. return nil
  43. }
  44. status := &RepoIndexerStatus{RepoID: repo.ID}
  45. has, err := x.Get(status)
  46. if err != nil {
  47. return err
  48. } else if !has {
  49. status.CommitSha = ""
  50. }
  51. repo.IndexerStatus = status
  52. return nil
  53. }
  54. // UpdateIndexerStatus updates indexer status
  55. func (repo *Repository) UpdateIndexerStatus(sha string) error {
  56. if err := repo.GetIndexerStatus(); err != nil {
  57. return fmt.Errorf("UpdateIndexerStatus: Unable to getIndexerStatus for repo: %s/%s Error: %v", repo.MustOwnerName(), repo.Name, err)
  58. }
  59. if len(repo.IndexerStatus.CommitSha) == 0 {
  60. repo.IndexerStatus.CommitSha = sha
  61. _, err := x.Insert(repo.IndexerStatus)
  62. if err != nil {
  63. return fmt.Errorf("UpdateIndexerStatus: Unable to insert repoIndexerStatus for repo: %s/%s Sha: %s Error: %v", repo.MustOwnerName(), repo.Name, sha, err)
  64. }
  65. return nil
  66. }
  67. repo.IndexerStatus.CommitSha = sha
  68. _, err := x.ID(repo.IndexerStatus.ID).Cols("commit_sha").
  69. Update(repo.IndexerStatus)
  70. if err != nil {
  71. return fmt.Errorf("UpdateIndexerStatus: Unable to update repoIndexerStatus for repo: %s/%s Sha: %s Error: %v", repo.MustOwnerName(), repo.Name, sha, err)
  72. }
  73. return nil
  74. }