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_commit_nogogit.go 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. //go:build !gogit
  4. package git
  5. import (
  6. "bufio"
  7. "errors"
  8. "io"
  9. "strings"
  10. "code.gitea.io/gitea/modules/log"
  11. )
  12. // ResolveReference resolves a name to a reference
  13. func (repo *Repository) ResolveReference(name string) (string, error) {
  14. stdout, _, err := NewCommand(repo.Ctx, "show-ref", "--hash").AddDynamicArguments(name).RunStdString(&RunOpts{Dir: repo.Path})
  15. if err != nil {
  16. if strings.Contains(err.Error(), "not a valid ref") {
  17. return "", ErrNotExist{name, ""}
  18. }
  19. return "", err
  20. }
  21. stdout = strings.TrimSpace(stdout)
  22. if stdout == "" {
  23. return "", ErrNotExist{name, ""}
  24. }
  25. return stdout, nil
  26. }
  27. // GetRefCommitID returns the last commit ID string of given reference (branch or tag).
  28. func (repo *Repository) GetRefCommitID(name string) (string, error) {
  29. wr, rd, cancel := repo.CatFileBatchCheck(repo.Ctx)
  30. defer cancel()
  31. _, err := wr.Write([]byte(name + "\n"))
  32. if err != nil {
  33. return "", err
  34. }
  35. shaBs, _, _, err := ReadBatchLine(rd)
  36. if IsErrNotExist(err) {
  37. return "", ErrNotExist{name, ""}
  38. }
  39. return string(shaBs), nil
  40. }
  41. // SetReference sets the commit ID string of given reference (e.g. branch or tag).
  42. func (repo *Repository) SetReference(name, commitID string) error {
  43. _, _, err := NewCommand(repo.Ctx, "update-ref").AddDynamicArguments(name, commitID).RunStdString(&RunOpts{Dir: repo.Path})
  44. return err
  45. }
  46. // RemoveReference removes the given reference (e.g. branch or tag).
  47. func (repo *Repository) RemoveReference(name string) error {
  48. _, _, err := NewCommand(repo.Ctx, "update-ref", "--no-deref", "-d").AddDynamicArguments(name).RunStdString(&RunOpts{Dir: repo.Path})
  49. return err
  50. }
  51. // IsCommitExist returns true if given commit exists in current repository.
  52. func (repo *Repository) IsCommitExist(name string) bool {
  53. _, _, err := NewCommand(repo.Ctx, "cat-file", "-e").AddDynamicArguments(name).RunStdString(&RunOpts{Dir: repo.Path})
  54. return err == nil
  55. }
  56. func (repo *Repository) getCommit(id ObjectID) (*Commit, error) {
  57. wr, rd, cancel := repo.CatFileBatch(repo.Ctx)
  58. defer cancel()
  59. _, _ = wr.Write([]byte(id.String() + "\n"))
  60. return repo.getCommitFromBatchReader(rd, id)
  61. }
  62. func (repo *Repository) getCommitFromBatchReader(rd *bufio.Reader, id ObjectID) (*Commit, error) {
  63. _, typ, size, err := ReadBatchLine(rd)
  64. if err != nil {
  65. if errors.Is(err, io.EOF) || IsErrNotExist(err) {
  66. return nil, ErrNotExist{ID: id.String()}
  67. }
  68. return nil, err
  69. }
  70. switch typ {
  71. case "missing":
  72. return nil, ErrNotExist{ID: id.String()}
  73. case "tag":
  74. // then we need to parse the tag
  75. // and load the commit
  76. data, err := io.ReadAll(io.LimitReader(rd, size))
  77. if err != nil {
  78. return nil, err
  79. }
  80. _, err = rd.Discard(1)
  81. if err != nil {
  82. return nil, err
  83. }
  84. tag, err := parseTagData(id.Type(), data)
  85. if err != nil {
  86. return nil, err
  87. }
  88. commit, err := tag.Commit(repo)
  89. if err != nil {
  90. return nil, err
  91. }
  92. return commit, nil
  93. case "commit":
  94. commit, err := CommitFromReader(repo, id, io.LimitReader(rd, size))
  95. if err != nil {
  96. return nil, err
  97. }
  98. _, err = rd.Discard(1)
  99. if err != nil {
  100. return nil, err
  101. }
  102. return commit, nil
  103. default:
  104. log.Debug("Unknown typ: %s", typ)
  105. _, err = rd.Discard(int(size) + 1)
  106. if err != nil {
  107. return nil, err
  108. }
  109. return nil, ErrNotExist{
  110. ID: id.String(),
  111. }
  112. }
  113. }
  114. // ConvertToGitID returns a GitHash object from a potential ID string
  115. func (repo *Repository) ConvertToGitID(commitID string) (ObjectID, error) {
  116. IDType := repo.objectFormat
  117. if len(commitID) == IDType.FullLength() && IDType.IsValid(commitID) {
  118. ID, err := NewIDFromString(commitID)
  119. if err == nil {
  120. return ID, nil
  121. }
  122. }
  123. wr, rd, cancel := repo.CatFileBatchCheck(repo.Ctx)
  124. defer cancel()
  125. _, err := wr.Write([]byte(commitID + "\n"))
  126. if err != nil {
  127. return nil, err
  128. }
  129. sha, _, _, err := ReadBatchLine(rd)
  130. if err != nil {
  131. if IsErrNotExist(err) {
  132. return nil, ErrNotExist{commitID, ""}
  133. }
  134. return nil, err
  135. }
  136. return MustIDFromString(string(sha)), nil
  137. }