summaryrefslogtreecommitdiffstats
path: root/vendor/code.gitea.io/git/submodule.go
blob: a0fe7b4a5691c287deab5ac28d424a041e8831f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright 2015 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package git

import "strings"

// SubModule submodule is a reference on git repository
type SubModule struct {
	Name string
	URL  string
}

// SubModuleFile represents a file with submodule type.
type SubModuleFile struct {
	*Commit

	refURL string
	refID  string
}

// NewSubModuleFile create a new submodule file
func NewSubModuleFile(c *Commit, refURL, refID string) *SubModuleFile {
	return &SubModuleFile{
		Commit: c,
		refURL: refURL,
		refID:  refID,
	}
}

// RefURL guesses and returns reference URL.
func (sf *SubModuleFile) RefURL(urlPrefix string, parentPath string) string {
	if sf.refURL == "" {
		return ""
	}

	url := strings.TrimSuffix(sf.refURL, ".git")

	// git://xxx/user/repo
	if strings.HasPrefix(url, "git://") {
		return "http://" + strings.TrimPrefix(url, "git://")
	}

	// http[s]://xxx/user/repo
	if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") {
		return url
	}

	// Relative url prefix check (according to git submodule documentation)
	if strings.HasPrefix(url, "./") || strings.HasPrefix(url, "../") {
		// ...construct and return correct submodule url here...
		idx := strings.Index(parentPath, "/src/")
		if idx == -1 {
			return url
		}
		return strings.TrimSuffix(urlPrefix, "/") + parentPath[:idx] + "/" + url
	}

	// sysuser@xxx:user/repo
	i := strings.Index(url, "@")
	j := strings.LastIndex(url, ":")

	// Only process when i < j because git+ssh://git@git.forwardbias.in/npploader.git
	if i > -1 && j > -1 && i < j {
		// fix problem with reverse proxy works only with local server
		if strings.Contains(urlPrefix, url[i+1:j]) {
			return urlPrefix + url[j+1:]
		}
		return "http://" + url[i+1:j] + "/" + url[j+1:]
	}

	return url
}

// RefID returns reference ID.
func (sf *SubModuleFile) RefID() string {
	return sf.refID
}