gitea源码

git.go 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package utils
  4. import (
  5. "errors"
  6. repo_model "code.gitea.io/gitea/models/repo"
  7. "code.gitea.io/gitea/modules/git"
  8. "code.gitea.io/gitea/modules/gitrepo"
  9. "code.gitea.io/gitea/modules/reqctx"
  10. "code.gitea.io/gitea/services/context"
  11. )
  12. type RefCommit struct {
  13. InputRef string
  14. RefName git.RefName
  15. Commit *git.Commit
  16. CommitID string
  17. }
  18. // ResolveRefCommit resolve ref to a commit if exist
  19. func ResolveRefCommit(ctx reqctx.RequestContext, repo *repo_model.Repository, inputRef string, minCommitIDLen ...int) (_ *RefCommit, err error) {
  20. gitRepo, err := gitrepo.RepositoryFromRequestContextOrOpen(ctx, repo)
  21. if err != nil {
  22. return nil, err
  23. }
  24. refCommit := RefCommit{InputRef: inputRef}
  25. if gitrepo.IsBranchExist(ctx, repo, inputRef) {
  26. refCommit.RefName = git.RefNameFromBranch(inputRef)
  27. } else if gitrepo.IsTagExist(ctx, repo, inputRef) {
  28. refCommit.RefName = git.RefNameFromTag(inputRef)
  29. } else if git.IsStringLikelyCommitID(git.ObjectFormatFromName(repo.ObjectFormatName), inputRef, minCommitIDLen...) {
  30. refCommit.RefName = git.RefNameFromCommit(inputRef)
  31. }
  32. if refCommit.RefName == "" {
  33. return nil, git.ErrNotExist{ID: inputRef}
  34. }
  35. if refCommit.Commit, err = gitRepo.GetCommit(refCommit.RefName.String()); err != nil {
  36. return nil, err
  37. }
  38. refCommit.CommitID = refCommit.Commit.ID.String()
  39. return &refCommit, nil
  40. }
  41. func NewRefCommit(refName git.RefName, commit *git.Commit) *RefCommit {
  42. return &RefCommit{InputRef: refName.ShortName(), RefName: refName, Commit: commit, CommitID: commit.ID.String()}
  43. }
  44. // GetGitRefs return git references based on filter
  45. func GetGitRefs(ctx *context.APIContext, filter string) ([]*git.Reference, string, error) {
  46. if ctx.Repo.GitRepo == nil {
  47. return nil, "", errors.New("no open git repo found in context")
  48. }
  49. if len(filter) > 0 {
  50. filter = "refs/" + filter
  51. }
  52. refs, err := ctx.Repo.GitRepo.GetRefsFiltered(filter)
  53. return refs, "GetRefsFiltered", err
  54. }