Skip to content

Commit 6fc3718

Browse files
authored
fix(codecommit): add a Repository.fromRepositoryName() method. (#2515)
Fixes #2514
1 parent 145da28 commit 6fc3718

File tree

2 files changed

+76
-8
lines changed

2 files changed

+76
-8
lines changed

packages/@aws-cdk/aws-codecommit/lib/repository.ts

+34-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import events = require('@aws-cdk/aws-events');
2-
import { CfnOutput, Construct, IResource, Resource } from '@aws-cdk/cdk';
2+
import { CfnOutput, Construct, IConstruct, IResource, Resource, Stack } from '@aws-cdk/cdk';
33
import { CfnRepository } from './codecommit.generated';
44

55
export interface IRepository extends IResource {
@@ -244,14 +244,12 @@ export class Repository extends RepositoryBase {
244244
public static fromRepositoryArn(scope: Construct, id: string, repositoryArn: string): IRepository {
245245
const stack = scope.node.stack;
246246
const repositoryName = stack.parseArn(repositoryArn).resource;
247-
const makeCloneUrl = (protocol: 'https' | 'ssh') =>
248-
`${protocol}://git-codecommit.${stack.region}.${stack.urlSuffix}/v1/repos/${repositoryName}`;
249247

250248
class Import extends RepositoryBase {
251249
public readonly repositoryArn = repositoryArn;
252250
public readonly repositoryName = repositoryName;
253-
public readonly repositoryCloneUrlHttp = makeCloneUrl('https');
254-
public readonly repositoryCloneUrlSsh = makeCloneUrl('ssh');
251+
public readonly repositoryCloneUrlHttp = Repository.makeCloneUrl(stack, repositoryName, 'https');
252+
public readonly repositoryCloneUrlSsh = Repository.makeCloneUrl(stack, repositoryName, 'ssh');
255253
public export() {
256254
return {
257255
repositoryArn: this.repositoryArn,
@@ -263,6 +261,37 @@ export class Repository extends RepositoryBase {
263261
return new Import(scope, id);
264262
}
265263

264+
public static fromRepositoryName(scope: Construct, id: string, repositoryName: string): IRepository {
265+
const stack = scope.node.stack;
266+
267+
class Import extends RepositoryBase {
268+
public repositoryName = repositoryName;
269+
public repositoryArn = Repository.arnForLocalRepository(repositoryName, scope);
270+
public readonly repositoryCloneUrlHttp = Repository.makeCloneUrl(stack, repositoryName, 'https');
271+
public readonly repositoryCloneUrlSsh = Repository.makeCloneUrl(stack, repositoryName, 'ssh');
272+
273+
public export() {
274+
return {
275+
repositoryArn: this.repositoryArn,
276+
repositoryName: this.repositoryName,
277+
};
278+
}
279+
}
280+
281+
return new Import(scope, id);
282+
}
283+
284+
private static makeCloneUrl(stack: Stack, repositoryName: string, protocol: 'https' | 'ssh') {
285+
return `${protocol}://git-codecommit.${stack.region}.${stack.urlSuffix}/v1/repos/${repositoryName}`;
286+
}
287+
288+
private static arnForLocalRepository(repositoryName: string, scope: IConstruct): string {
289+
return scope.node.stack.formatArn({
290+
service: 'codecommit',
291+
resource: repositoryName,
292+
});
293+
}
294+
266295
private readonly repository: CfnRepository;
267296
private readonly triggers = new Array<CfnRepository.RepositoryTriggerProperty>();
268297

packages/@aws-cdk/aws-codecommit/test/test.codecommit.ts

+42-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Test } from 'nodeunit';
33
import { Repository, RepositoryProps } from '../lib';
44

55
export = {
6-
'default properties': {
6+
'CodeCommit Repositories': {
77
'add an SNS trigger to repository'(test: Test) {
88
const app = new TestApp();
99

@@ -49,8 +49,47 @@ export = {
4949
test.throws(() => myRepository.notify('myTrigger'));
5050

5151
test.done();
52-
}
53-
}
52+
},
53+
54+
'can be imported using a Repository ARN'(test: Test) {
55+
// GIVEN
56+
const stack = new Stack();
57+
const repositoryArn = 'arn:aws:codecommit:us-east-1:585695036304:my-repo';
58+
59+
// WHEN
60+
const repo = Repository.fromRepositoryArn(stack, 'ImportedRepo', repositoryArn);
61+
62+
// THEN
63+
test.deepEqual(repo.node.resolve(repo.repositoryArn), repositoryArn);
64+
test.deepEqual(repo.node.resolve(repo.repositoryName), 'my-repo');
65+
66+
test.done();
67+
},
68+
69+
'can be imported using just a Repository name (the ARN is deduced)'(test: Test) {
70+
// GIVEN
71+
const stack = new Stack();
72+
73+
// WHEN
74+
const repo = Repository.fromRepositoryName(stack, 'ImportedRepo', 'my-repo');
75+
76+
// THEN
77+
test.deepEqual(repo.node.resolve(repo.repositoryArn), {
78+
'Fn::Join': [ '', [
79+
'arn:',
80+
{ Ref: 'AWS::Partition' },
81+
':codecommit:',
82+
{ Ref: 'AWS::Region' },
83+
':',
84+
{ Ref: 'AWS::AccountId' },
85+
':my-repo'
86+
]],
87+
});
88+
test.deepEqual(repo.node.resolve(repo.repositoryName), 'my-repo');
89+
90+
test.done();
91+
},
92+
},
5493
};
5594

5695
class TestApp {

0 commit comments

Comments
 (0)