From e13057745931a16172fa3003352b12dd8472c056 Mon Sep 17 00:00:00 2001 From: Seito Tanaka Date: Sat, 9 Sep 2023 19:56:04 +0900 Subject: [PATCH] Fix parsing of ssh userinfo (#110) --- shared/remote.go | 3 ++- shared/remote_test.go | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/shared/remote.go b/shared/remote.go index 81b81fa..3579da8 100644 --- a/shared/remote.go +++ b/shared/remote.go @@ -13,7 +13,8 @@ type ( } ) -var regex = regexp.MustCompile(`^(?:\w+://|\w+@)?([a-zA-Z0-9\.-]+)[:/](.+?/.+?)(?:\.git|)$`) +// https://datatracker.ietf.org/doc/html/rfc3986#section-2.3 +var regex = regexp.MustCompile(`^(?:(?:[a-zA-Z0-9-._~]+)(?:://|@))?([a-zA-Z0-9-._~]+)[:/](.+?/.+?)(?:\.git|)$`) func NewRemote(remoteConfig string) Remote { splitConfig := strings.Fields(remoteConfig) diff --git a/shared/remote_test.go b/shared/remote_test.go index 635f667..4de0c40 100644 --- a/shared/remote_test.go +++ b/shared/remote_test.go @@ -17,6 +17,17 @@ func Test_CreateRemoteWithScpLikeUrl(t *testing.T) { ) } +func Test_CreateRemoteWithScpLikeUrlAndCustomUserinfo(t *testing.T) { + assert.Equal(t, + Remote{ + Name: "origin", + Hostname: "github.com", + RepoName: "org/repo", + }, + NewRemote("origin git0-._~@github.com:org/repo (fetch)"), + ) +} + func Test_CreateRemoteWithScpLikeUrlWithoutUserinfo(t *testing.T) { assert.Equal(t, Remote{