gitea源码

commit_submodule_file.go 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Copyright 2015 The Gogs Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. package git
  5. import (
  6. "context"
  7. "path"
  8. "strings"
  9. giturl "code.gitea.io/gitea/modules/git/url"
  10. "code.gitea.io/gitea/modules/util"
  11. )
  12. // CommitSubmoduleFile represents a file with submodule type.
  13. type CommitSubmoduleFile struct {
  14. repoLink string
  15. fullPath string
  16. refURL string
  17. refID string
  18. parsed bool
  19. parsedTargetLink string
  20. }
  21. // NewCommitSubmoduleFile create a new submodule file
  22. func NewCommitSubmoduleFile(repoLink, fullPath, refURL, refID string) *CommitSubmoduleFile {
  23. return &CommitSubmoduleFile{repoLink: repoLink, fullPath: fullPath, refURL: refURL, refID: refID}
  24. }
  25. // RefID returns the commit ID of the submodule, it returns empty string for nil receiver
  26. func (sf *CommitSubmoduleFile) RefID() string {
  27. if sf == nil {
  28. return ""
  29. }
  30. return sf.refID
  31. }
  32. func (sf *CommitSubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, moreLinkPath string) *SubmoduleWebLink {
  33. if sf == nil || sf.refURL == "" {
  34. return nil
  35. }
  36. if strings.HasPrefix(sf.refURL, "../") {
  37. targetLink := path.Join(sf.repoLink, sf.refURL)
  38. return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath}
  39. }
  40. if !sf.parsed {
  41. sf.parsed = true
  42. parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
  43. if err != nil {
  44. return nil
  45. }
  46. sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL)
  47. }
  48. return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath}
  49. }
  50. // SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver
  51. // It returns nil if the submodule does not have a valid URL or is nil
  52. func (sf *CommitSubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, optCommitID ...string) *SubmoduleWebLink {
  53. return sf.getWebLinkInTargetRepo(ctx, "/tree/"+util.OptionalArg(optCommitID, sf.RefID()))
  54. }
  55. // SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver
  56. // It returns nil if the submodule does not have a valid URL or is nil
  57. func (sf *CommitSubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, commitID1, commitID2 string) *SubmoduleWebLink {
  58. return sf.getWebLinkInTargetRepo(ctx, "/compare/"+commitID1+"..."+commitID2)
  59. }