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_gogit.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. "strings"
  8. "github.com/go-git/go-git/v5/plumbing"
  9. "github.com/go-git/go-git/v5/plumbing/object"
  10. )
  11. // GetRefCommitID returns the last commit ID string of given reference (branch or tag).
  12. func (repo *Repository) GetRefCommitID(name string) (string, error) {
  13. ref, err := repo.gogitRepo.Reference(plumbing.ReferenceName(name), true)
  14. if err != nil {
  15. if err == plumbing.ErrReferenceNotFound {
  16. return "", ErrNotExist{
  17. ID: name,
  18. }
  19. }
  20. return "", err
  21. }
  22. return ref.Hash().String(), nil
  23. }
  24. // SetReference sets the commit ID string of given reference (e.g. branch or tag).
  25. func (repo *Repository) SetReference(name, commitID string) error {
  26. return repo.gogitRepo.Storer.SetReference(plumbing.NewReferenceFromStrings(name, commitID))
  27. }
  28. // RemoveReference removes the given reference (e.g. branch or tag).
  29. func (repo *Repository) RemoveReference(name string) error {
  30. return repo.gogitRepo.Storer.RemoveReference(plumbing.ReferenceName(name))
  31. }
  32. // ConvertToSHA1 returns a Hash object from a potential ID string
  33. func (repo *Repository) ConvertToSHA1(commitID string) (SHA1, error) {
  34. if len(commitID) == SHAFullLength {
  35. sha1, err := NewIDFromString(commitID)
  36. if err == nil {
  37. return sha1, nil
  38. }
  39. }
  40. actualCommitID, _, err := NewCommand(repo.Ctx, "rev-parse", "--verify").AddDynamicArguments(commitID).RunStdString(&RunOpts{Dir: repo.Path})
  41. if err != nil {
  42. if strings.Contains(err.Error(), "unknown revision or path") ||
  43. strings.Contains(err.Error(), "fatal: Needed a single revision") {
  44. return SHA1{}, ErrNotExist{commitID, ""}
  45. }
  46. return SHA1{}, err
  47. }
  48. return NewIDFromString(actualCommitID)
  49. }
  50. // IsCommitExist returns true if given commit exists in current repository.
  51. func (repo *Repository) IsCommitExist(name string) bool {
  52. hash := plumbing.NewHash(name)
  53. _, err := repo.gogitRepo.CommitObject(hash)
  54. return err == nil
  55. }
  56. func (repo *Repository) getCommit(id SHA1) (*Commit, error) {
  57. var tagObject *object.Tag
  58. gogitCommit, err := repo.gogitRepo.CommitObject(id)
  59. if err == plumbing.ErrObjectNotFound {
  60. tagObject, err = repo.gogitRepo.TagObject(id)
  61. if err == plumbing.ErrObjectNotFound {
  62. return nil, ErrNotExist{
  63. ID: id.String(),
  64. }
  65. }
  66. if err == nil {
  67. gogitCommit, err = repo.gogitRepo.CommitObject(tagObject.Target)
  68. }
  69. // if we get a plumbing.ErrObjectNotFound here then the repository is broken and it should be 500
  70. }
  71. if err != nil {
  72. return nil, err
  73. }
  74. commit := convertCommit(gogitCommit)
  75. commit.repo = repo
  76. tree, err := gogitCommit.Tree()
  77. if err != nil {
  78. return nil, err
  79. }
  80. commit.Tree.ID = tree.Hash
  81. commit.Tree.gogitTree = tree
  82. return commit, nil
  83. }