Skip to content

Commit a6617dd

Browse files
authored
Merge pull request #65 from DaanIhomer/fix-gl-group-bug
Fix gl group bug
2 parents 6699ef3 + f5ac676 commit a6617dd

2 files changed

Lines changed: 52 additions & 3 deletions

File tree

src/common/parseGitRemote.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,32 @@ const validProviders: Record<string, 'gh' | 'gl' | 'bb'> = {
44
bitbucket: 'bb',
55
}
66

7+
interface GitRemoteInfo {
8+
provider: 'gh' | 'gl' | 'bb'
9+
organization: string
10+
repository: string
11+
originalRepository?: string
12+
}
13+
14+
/**
15+
* Normalize repository name based on provider
16+
* For GitLab, extracts the last part of group/subgroup/project path
17+
*/
18+
const normalizeRepositoryName = (provider: 'gh' | 'gl' | 'bb', repository: string): string => {
19+
if (provider === 'gl') {
20+
// For GitLab, take the last part of the path
21+
const parts = repository.split('/')
22+
return parts[parts.length - 1]
23+
}
24+
return repository
25+
}
26+
727
/**
828
* Parse a git remote URL into its component parts
929
* @param remoteUrl
10-
* @returns
30+
* @returns GitRemoteInfo with normalized repository name and original if different
1131
*/
12-
export const parseGitRemote = (remoteUrl: string) => {
32+
export const parseGitRemote = (remoteUrl: string): GitRemoteInfo => {
1333
const pattern = /^.*(github|gitlab|bitbucket)\.(?:com|org)[:|/](.+?)\/(.+?)(\.git)?$/
1434
const match = remoteUrl.match(pattern)
1535

@@ -19,17 +39,20 @@ export const parseGitRemote = (remoteUrl: string) => {
1939

2040
const providerName = match[1]
2141
const organization = match[2]
22-
const repository = match[3]
42+
const originalRepository = match[3]
2343

2444
const provider = validProviders[providerName]
2545

2646
if (!provider) {
2747
throw new Error(`Invalid provider: ${providerName}`)
2848
}
2949

50+
const repository = normalizeRepositoryName(provider, originalRepository)
51+
3052
return {
3153
provider,
3254
organization,
3355
repository,
56+
...(repository !== originalRepository ? { originalRepository } : {}),
3457
}
3558
}

src/test/suite/common/parseGitRemote.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const GITHUB_SSH_REMOTE_MOCK = 'git@github.com:organization/repository.git'
55
const GITHUB_HTTPS_REMOTE_MOCK = 'https://github.com/organization/repository.git'
66
const GITLAB_SSH_REMOTE_MOCK = 'git@gitlab.com:organization/repository.git'
77
const GITLAB_HTTPS_REMOTE_MOCK = 'https://gitlab.com/organization/repository.git'
8+
const GITLAB_GROUP_SSH_REMOTE_MOCK = 'git@gitlab.com:group/subgroup/repository.git'
9+
const GITLAB_GROUP_HTTPS_REMOTE_MOCK = 'https://gitlab.com/group/subgroup/repository.git'
810
const BITBUCKET_SSH_REMOTE_MOCK = 'git@bitbucket.org:organization/repository.git'
911
const BITBUCKET_HTTPS_REMOTE_MOCK = 'https://user@bitbucket.org/organization/repository.git'
1012

@@ -15,6 +17,7 @@ suite('parseGitRemote', () => {
1517
assert.strictEqual(parsed.provider, 'gh')
1618
assert.strictEqual(parsed.organization, 'organization')
1719
assert.strictEqual(parsed.repository, 'repository')
20+
assert.strictEqual(parsed.originalRepository, undefined)
1821
})
1922

2023
test('parses GitHub HTTPS remote format', () => {
@@ -23,6 +26,7 @@ suite('parseGitRemote', () => {
2326
assert.strictEqual(parsed.provider, 'gh')
2427
assert.strictEqual(parsed.organization, 'organization')
2528
assert.strictEqual(parsed.repository, 'repository')
29+
assert.strictEqual(parsed.originalRepository, undefined)
2630
})
2731

2832
test('parses GitLab SSH remote format', () => {
@@ -31,6 +35,7 @@ suite('parseGitRemote', () => {
3135
assert.strictEqual(parsed.provider, 'gl')
3236
assert.strictEqual(parsed.organization, 'organization')
3337
assert.strictEqual(parsed.repository, 'repository')
38+
assert.strictEqual(parsed.originalRepository, undefined)
3439
})
3540

3641
test('parses GitLab HTTPS remote format', () => {
@@ -39,6 +44,25 @@ suite('parseGitRemote', () => {
3944
assert.strictEqual(parsed.provider, 'gl')
4045
assert.strictEqual(parsed.organization, 'organization')
4146
assert.strictEqual(parsed.repository, 'repository')
47+
assert.strictEqual(parsed.originalRepository, undefined)
48+
})
49+
50+
test('parses GitLab group/subgroup SSH remote format', () => {
51+
const parsed = parseGitRemote(GITLAB_GROUP_SSH_REMOTE_MOCK)
52+
53+
assert.strictEqual(parsed.provider, 'gl')
54+
assert.strictEqual(parsed.organization, 'group')
55+
assert.strictEqual(parsed.repository, 'repository')
56+
assert.strictEqual(parsed.originalRepository, 'subgroup/repository')
57+
})
58+
59+
test('parses GitLab group/subgroup HTTPS remote format', () => {
60+
const parsed = parseGitRemote(GITLAB_GROUP_HTTPS_REMOTE_MOCK)
61+
62+
assert.strictEqual(parsed.provider, 'gl')
63+
assert.strictEqual(parsed.organization, 'group')
64+
assert.strictEqual(parsed.repository, 'repository')
65+
assert.strictEqual(parsed.originalRepository, 'subgroup/repository')
4266
})
4367

4468
test('parses Bitbucket SSH remote format', () => {
@@ -47,6 +71,7 @@ suite('parseGitRemote', () => {
4771
assert.strictEqual(parsed.provider, 'bb')
4872
assert.strictEqual(parsed.organization, 'organization')
4973
assert.strictEqual(parsed.repository, 'repository')
74+
assert.strictEqual(parsed.originalRepository, undefined)
5075
})
5176

5277
test('parses Bitbucket HTTPS remote format', () => {
@@ -55,5 +80,6 @@ suite('parseGitRemote', () => {
5580
assert.strictEqual(parsed.provider, 'bb')
5681
assert.strictEqual(parsed.organization, 'organization')
5782
assert.strictEqual(parsed.repository, 'repository')
83+
assert.strictEqual(parsed.originalRepository, undefined)
5884
})
5985
})

0 commit comments

Comments
 (0)