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_tag_nogogit.go 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. //go:build !gogit
  5. package git
  6. import (
  7. "errors"
  8. "io"
  9. "code.gitea.io/gitea/modules/log"
  10. )
  11. // IsTagExist returns true if given tag exists in the repository.
  12. func (repo *Repository) IsTagExist(name string) bool {
  13. if repo == nil || name == "" {
  14. return false
  15. }
  16. return repo.IsReferenceExist(TagPrefix + name)
  17. }
  18. // GetTags returns all tags of the repository.
  19. // returning at most limit tags, or all if limit is 0.
  20. func (repo *Repository) GetTags(skip, limit int) (tags []string, err error) {
  21. tags, _, err = callShowRef(repo.Ctx, repo.Path, TagPrefix, TrustedCmdArgs{TagPrefix, "--sort=-taggerdate"}, skip, limit)
  22. return tags, err
  23. }
  24. // GetTagType gets the type of the tag, either commit (simple) or tag (annotated)
  25. func (repo *Repository) GetTagType(id SHA1) (string, error) {
  26. wr, rd, cancel := repo.CatFileBatchCheck(repo.Ctx)
  27. defer cancel()
  28. _, err := wr.Write([]byte(id.String() + "\n"))
  29. if err != nil {
  30. return "", err
  31. }
  32. _, typ, _, err := ReadBatchLine(rd)
  33. if IsErrNotExist(err) {
  34. return "", ErrNotExist{ID: id.String()}
  35. }
  36. return typ, nil
  37. }
  38. func (repo *Repository) getTag(tagID SHA1, name string) (*Tag, error) {
  39. t, ok := repo.tagCache.Get(tagID.String())
  40. if ok {
  41. log.Debug("Hit cache: %s", tagID)
  42. tagClone := *t.(*Tag)
  43. tagClone.Name = name // This is necessary because lightweight tags may have same id
  44. return &tagClone, nil
  45. }
  46. tp, err := repo.GetTagType(tagID)
  47. if err != nil {
  48. return nil, err
  49. }
  50. // Get the commit ID and tag ID (may be different for annotated tag) for the returned tag object
  51. commitIDStr, err := repo.GetTagCommitID(name)
  52. if err != nil {
  53. // every tag should have a commit ID so return all errors
  54. return nil, err
  55. }
  56. commitID, err := NewIDFromString(commitIDStr)
  57. if err != nil {
  58. return nil, err
  59. }
  60. // If type is "commit, the tag is a lightweight tag
  61. if ObjectType(tp) == ObjectCommit {
  62. commit, err := repo.GetCommit(commitIDStr)
  63. if err != nil {
  64. return nil, err
  65. }
  66. tag := &Tag{
  67. Name: name,
  68. ID: tagID,
  69. Object: commitID,
  70. Type: tp,
  71. Tagger: commit.Committer,
  72. Message: commit.Message(),
  73. }
  74. repo.tagCache.Set(tagID.String(), tag)
  75. return tag, nil
  76. }
  77. // The tag is an annotated tag with a message.
  78. wr, rd, cancel := repo.CatFileBatch(repo.Ctx)
  79. defer cancel()
  80. if _, err := wr.Write([]byte(tagID.String() + "\n")); err != nil {
  81. return nil, err
  82. }
  83. _, typ, size, err := ReadBatchLine(rd)
  84. if err != nil {
  85. if errors.Is(err, io.EOF) || IsErrNotExist(err) {
  86. return nil, ErrNotExist{ID: tagID.String()}
  87. }
  88. return nil, err
  89. }
  90. if typ != "tag" {
  91. return nil, ErrNotExist{ID: tagID.String()}
  92. }
  93. // then we need to parse the tag
  94. // and load the commit
  95. data, err := io.ReadAll(io.LimitReader(rd, size))
  96. if err != nil {
  97. return nil, err
  98. }
  99. _, err = rd.Discard(1)
  100. if err != nil {
  101. return nil, err
  102. }
  103. tag, err := parseTagData(data)
  104. if err != nil {
  105. return nil, err
  106. }
  107. tag.Name = name
  108. tag.ID = tagID
  109. tag.Type = tp
  110. repo.tagCache.Set(tagID.String(), tag)
  111. return tag, nil
  112. }