mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 01:05:26 +01:00 
			
		
		
		
	Add tea clone (#411)
				
					
				
			Adds a new subcommand to clone repos: ``` tea clone --login try --depth 1 norwin/test tea clone gitea/tea tea clone noerw/tea # will set up `master` to track `upstream` remote tea clone try.gitea.io/noerw/test # will automatically set --login ``` This is just a replacement for `git clone` with small benefits: - [x] does not depend on `git`, as tea ships with go-git - [x] spares you typing of URLs and autoselects https/ssh based on your login config - [x] forked repos: set up origin + upstream remote Co-authored-by: Norwin <git@nroo.de> Co-authored-by: techknowlogick <techknowlogick@gitea.io> Reviewed-on: https://gitea.com/gitea/tea/pulls/411 Reviewed-by: Andrew Thornton <art27@cantab.net> Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Norwin <noerw@noreply.gitea.io> Co-committed-by: Norwin <noerw@noreply.gitea.io>
This commit is contained in:
		| @@ -22,13 +22,18 @@ type URLParser struct { | ||||
| func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) { | ||||
| 	rawURL = strings.TrimSpace(rawURL) | ||||
|  | ||||
| 	// convert the weird git ssh url format to a canonical url: | ||||
| 	// git@gitea.com:gitea/tea -> ssh://git@gitea.com/gitea/tea | ||||
| 	if !protocolRe.MatchString(rawURL) && | ||||
| 		strings.Contains(rawURL, ":") && | ||||
| 		// not a Windows path | ||||
| 		!strings.Contains(rawURL, "\\") { | ||||
| 		rawURL = "ssh://" + strings.Replace(rawURL, ":", "/", 1) | ||||
| 	if !protocolRe.MatchString(rawURL) { | ||||
| 		// convert the weird git ssh url format to a canonical url: | ||||
| 		// git@gitea.com:gitea/tea -> ssh://git@gitea.com/gitea/tea | ||||
| 		if strings.Contains(rawURL, ":") && | ||||
| 			// not a Windows path | ||||
| 			!strings.Contains(rawURL, "\\") { | ||||
| 			rawURL = "ssh://" + strings.Replace(rawURL, ":", "/", 1) | ||||
| 		} else if !strings.Contains(rawURL, "@") && | ||||
| 			strings.Count(rawURL, "/") == 2 { | ||||
| 			// match cases like gitea.com/gitea/tea | ||||
| 			rawURL = "https://" + rawURL | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	u, err = url.Parse(rawURL) | ||||
|   | ||||
							
								
								
									
										56
									
								
								modules/git/url_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								modules/git/url_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| // Copyright 2019 The Gitea 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 ( | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestParseUrl(t *testing.T) { | ||||
| 	u, err := ParseURL("ssh://git@gitea.com:3000/gitea/tea") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "gitea.com:3000", u.Host) | ||||
| 	assert.Equal(t, "ssh", u.Scheme) | ||||
| 	assert.Equal(t, "/gitea/tea", u.Path) | ||||
|  | ||||
| 	u, err = ParseURL("https://gitea.com/gitea/tea") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "gitea.com", u.Host) | ||||
| 	assert.Equal(t, "https", u.Scheme) | ||||
| 	assert.Equal(t, "/gitea/tea", u.Path) | ||||
|  | ||||
| 	u, err = ParseURL("git@gitea.com:gitea/tea") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "gitea.com", u.Host) | ||||
| 	assert.Equal(t, "ssh", u.Scheme) | ||||
| 	assert.Equal(t, "/gitea/tea", u.Path) | ||||
|  | ||||
| 	u, err = ParseURL("gitea.com/gitea/tea") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "gitea.com", u.Host) | ||||
| 	assert.Equal(t, "https", u.Scheme) | ||||
| 	assert.Equal(t, "/gitea/tea", u.Path) | ||||
|  | ||||
| 	u, err = ParseURL("foo/bar") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "", u.Host) | ||||
| 	assert.Equal(t, "", u.Scheme) | ||||
| 	assert.Equal(t, "foo/bar", u.Path) | ||||
|  | ||||
| 	u, err = ParseURL("/foo/bar") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "", u.Host) | ||||
| 	assert.Equal(t, "https", u.Scheme) | ||||
| 	assert.Equal(t, "/foo/bar", u.Path) | ||||
|  | ||||
| 	// this case is unintuitive, but to ambiguous to be handled differently | ||||
| 	u, err = ParseURL("gitea.com") | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "", u.Host) | ||||
| 	assert.Equal(t, "", u.Scheme) | ||||
| 	assert.Equal(t, "gitea.com", u.Path) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Norwin
					Norwin