submodule.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package git
  2. import "strings"
  3. type SubModule struct {
  4. Name string
  5. URL string
  6. }
  7. // SubModuleFile represents a file with submodule type.
  8. type SubModuleFile struct {
  9. *Commit
  10. refURL string
  11. refID string
  12. }
  13. func NewSubModuleFile(c *Commit, refURL, refID string) *SubModuleFile {
  14. return &SubModuleFile{
  15. Commit: c,
  16. refURL: refURL,
  17. refID: refID,
  18. }
  19. }
  20. // RefURL guesses and returns reference URL.
  21. func (sf *SubModuleFile) RefURL(urlPrefix string, parentPath string) string {
  22. if sf.refURL == "" {
  23. return ""
  24. }
  25. url := strings.TrimSuffix(sf.refURL, ".git")
  26. // git://xxx/user/repo
  27. if strings.HasPrefix(url, "git://") {
  28. return "http://" + strings.TrimPrefix(url, "git://")
  29. }
  30. // http[s]://xxx/user/repo
  31. if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") {
  32. return url
  33. }
  34. // Relative url prefix check (according to git submodule documentation)
  35. if strings.HasPrefix(url, "./") || strings.HasPrefix(url, "../") {
  36. // ...construct and return correct submodule url here...
  37. idx := strings.Index(parentPath, "/src/")
  38. if idx == -1 {
  39. return url
  40. }
  41. return strings.TrimSuffix(urlPrefix, "/") + parentPath[:idx] + "/" + url
  42. }
  43. // sysuser@xxx:user/repo
  44. i := strings.Index(url, "@")
  45. j := strings.LastIndex(url, ":")
  46. // Only process when i < j because git+ssh://git@git.forwardbias.in/npploader.git
  47. if i > -1 && j > -1 && i < j {
  48. // fix problem with reverse proxy works only with local server
  49. if strings.Contains(urlPrefix, url[i+1:j]) {
  50. return urlPrefix + url[j+1:]
  51. } else {
  52. return "http://" + url[i+1:j] + "/" + url[j+1:]
  53. }
  54. }
  55. return url
  56. }
  57. // RefID returns reference ID.
  58. func (sf *SubModuleFile) RefID() string {
  59. return sf.refID
  60. }