Skip to content

Commit e7bcce4

Browse files
enhancement: add initial commit when the project is created
1 parent 501f9a1 commit e7bcce4

File tree

4 files changed

+74
-28
lines changed

4 files changed

+74
-28
lines changed
Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import {ProjectEntity} from '../../models/project';
2-
import {createGithubRepository, createGithubRepositoryBranch} from './github';
3-
import Logger from '../../utils/logger';
2+
import {createGithubRepository} from './github';
3+
import fs from 'fs';
4+
import {GitPlatformEntity} from '../../models/gitPlatform';
5+
import {NewProjectGitServerRequest} from '../simple-git/models';
6+
import {pushNewProjectToGitServer} from '../simple-git/newProject';
7+
import {GitPlatformService} from '../../services/gitPlatformService';
8+
9+
const gitPlatformService = new GitPlatformService();
410

511
export const createRepository = async (projectEntity: ProjectEntity) => {
612
switch (projectEntity.git_platform_name) {
713
case 'github': {
8-
const createGithubRepositoryResponse = await createGithubRepository(projectEntity);
9-
Logger.debug(`createGithubRepositoryResponse: ${JSON.stringify(createGithubRepositoryResponse.data)}`);
10-
const createGithubRepositoryBranchResponse = await createGithubRepositoryBranch(projectEntity);
11-
Logger.debug(`createGithubRepositoryBranchResponse: ${JSON.stringify(createGithubRepositoryBranchResponse.data)}`);
12-
return;
14+
return await createGithubRepository(projectEntity);
1315
}
1416
// case 'gitlab':
1517
// return await createGitlabRepository(projectEntity);
@@ -18,4 +20,31 @@ export const createRepository = async (projectEntity: ProjectEntity) => {
1820
default:
1921
throw new Error('Unsupported git platform');
2022
}
21-
};
23+
};
24+
25+
export const makeInitialCommit = async (projectEntity: ProjectEntity) => {
26+
const createdProjectPath = `/tmp/${projectEntity.id}`;
27+
fs.mkdirSync(createdProjectPath, {recursive: true});
28+
fs.writeFileSync(`${createdProjectPath}/README.md`, `# ${projectEntity.repository_name}`);
29+
const gitPlatform: GitPlatformEntity = await gitPlatformService.getGitPlatform(projectEntity.owner_email, projectEntity.git_platform_name);
30+
const newProjectGitServerRequest: NewProjectGitServerRequest = {
31+
projectVersion: 'v1',
32+
generatedProjectPath: createdProjectPath,
33+
gitProviderDetails: {
34+
platformName: projectEntity.git_platform_name,
35+
platformUrl: gitPlatform.url,
36+
platformUserName: projectEntity.git_platform_user_name,
37+
platformEmail: gitPlatform.owner_email,
38+
platformPersonalAccessToken: gitPlatform.personal_access_token,
39+
repositoryBranch: projectEntity.repository_branch,
40+
repositoryIsPublic: projectEntity.is_repository_public,
41+
repositoryName: projectEntity.repository_name,
42+
}
43+
};
44+
const error = await pushNewProjectToGitServer(newProjectGitServerRequest);
45+
if (error.length !== 0) {
46+
throw new Error(error);
47+
}
48+
// delete the project from temp folder once it's pushed to git server.
49+
fs.rmSync(createdProjectPath, {recursive: true});
50+
};

app/src/integrations/simple-git/common.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {SimpleGit} from 'simple-git';
22
import Logger from '../../utils/logger';
33

4-
export const gitOperations = async (git: SimpleGit, repositoryBranch: string, projectVersion: string): Promise<string> => {
4+
export const gitOperations = async (git: SimpleGit, repositoryBranch?: string, projectVersion?: string): Promise<string> => {
55
// Add all files for commit
66
let error: string = '';
77
await git.add('.')
@@ -16,8 +16,14 @@ export const gitOperations = async (git: SimpleGit, repositoryBranch: string, pr
1616
return error;
1717
}
1818

19-
// Commit files as Initial Commit
20-
await git.commit(`commit by compage : generated files through compage for version: ${projectVersion}`)
19+
let message: string = '';
20+
if (!repositoryBranch && !projectVersion) {
21+
message = 'Initial Commit';
22+
} else {
23+
message = `commit by compage : generated files through compage for version: ${projectVersion}`;
24+
}
25+
// Commit files
26+
await git.commit(message)
2127
.then(
2228
(success: any) => {
2329
Logger.debug(`git commit succeeded: ${success}`);
@@ -29,21 +35,30 @@ export const gitOperations = async (git: SimpleGit, repositoryBranch: string, pr
2935
return error;
3036
}
3137

32-
// checkoutLocalBranch checks out local branch with name supplied
33-
await git.checkoutLocalBranch(repositoryBranch + '-' + projectVersion)
34-
.then(
35-
(success: any) => {
36-
Logger.debug(`git checkoutLocalBranch succeeded: ${success}`);
37-
}, (failure: any) => {
38-
Logger.debug(`git checkoutLocalBranch failed: ${failure}`);
39-
error = `git checkoutLocalBranch failed: ${failure}`;
40-
});
41-
if (error.length > 0) {
42-
return error;
38+
let branchName: string = '';
39+
if (!repositoryBranch && !projectVersion) {
40+
branchName = 'main';
41+
} else {
42+
branchName = repositoryBranch + '-' + projectVersion;
43+
}
44+
45+
if (repositoryBranch && projectVersion) {
46+
// checkoutLocalBranch checks out local branch with name supplied
47+
await git.checkoutLocalBranch(branchName)
48+
.then(
49+
(success: any) => {
50+
Logger.debug(`git checkoutLocalBranch succeeded: ${success}`);
51+
}, (failure: any) => {
52+
Logger.debug(`git checkoutLocalBranch failed: ${failure}`);
53+
error = `git checkoutLocalBranch failed: ${failure}`;
54+
});
55+
if (error.length > 0) {
56+
return error;
57+
}
4358
}
4459

4560
// Finally push to online repository
46-
await git.push('origin', repositoryBranch + '-' + projectVersion, {'--force': null})
61+
await git.push('origin', branchName, {'--force': null})
4762
.then((success: any) => {
4863
Logger.debug(`git push succeeded: ${success}`);
4964
}, (failure: any) => {

app/src/integrations/simple-git/newProject.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export const pushNewProjectToGitServer = async (newProjectGitServerRequest: NewP
3333

3434
// TODO when the support for other git providers will be added, need to change below hardcoded string.
3535
// Set up GitHub url like this so no manual entry of user pass needed
36-
const gitServerUrl = `https://${newProjectGitServerRequest.gitProviderDetails.platformUserName}:${newProjectGitServerRequest.gitProviderDetails.platformPersonalAccessToken}@${newProjectGitServerRequest.gitProviderDetails.platformUrl}/${newProjectGitServerRequest.gitProviderDetails.platformUserName}/${newProjectGitServerRequest.gitProviderDetails.repositoryName}.git`;
36+
const gitServerUrl = `https://${newProjectGitServerRequest.gitProviderDetails.platformUserName}:${newProjectGitServerRequest.gitProviderDetails.platformPersonalAccessToken}@${newProjectGitServerRequest.gitProviderDetails.platformUrl.replace('https://', '')}/${newProjectGitServerRequest.gitProviderDetails.platformUserName}/${newProjectGitServerRequest.gitProviderDetails.repositoryName}.git`;
3737

3838
// Add remote repository url as origin to repository
3939
await git.addRemote('origin', gitServerUrl).then(
@@ -48,5 +48,6 @@ export const pushNewProjectToGitServer = async (newProjectGitServerRequest: NewP
4848
}
4949

5050
// add, commit and push
51-
return await gitOperations(git, newProjectGitServerRequest.gitProviderDetails.repositoryBranch, newProjectGitServerRequest.projectVersion);
51+
// default branch is main
52+
return await gitOperations(git);
5253
};

app/src/routes/projectsOperations.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
ProjectDTO,
1515
ProjectEntity
1616
} from '../models/project';
17-
import {createRepository} from '../integrations/git-platforms';
17+
import {createRepository, makeInitialCommit} from '../integrations/git-platforms';
1818
import {ProjectService} from '../services/projectService';
1919

2020
const projectsOperationsRouter = Router();
@@ -35,7 +35,9 @@ projectsOperationsRouter.post('/users/:email/projects', requireEmailMiddleware,
3535
projectDTO.updatedAt = new Date().toISOString();
3636
savedProjectEntity = await projectService.createProject(getProjectEntity(projectDTO));
3737
if (savedProjectEntity.id.length !== 0) {
38-
await createRepository(savedProjectEntity);
38+
const createRepositoryResponse = await createRepository(savedProjectEntity);
39+
Logger.debug(`createRepositoryResponse: ${JSON.stringify(createRepositoryResponse.data)}`);
40+
await makeInitialCommit(savedProjectEntity);
3941
const successMessage = `[${savedProjectEntity.owner_email}] project[${savedProjectEntity.id}] created.`;
4042
Logger.info(successMessage);
4143
return response.status(201).json(getCreateProjectResponse(savedProjectEntity));
@@ -62,7 +64,6 @@ projectsOperationsRouter.post('/users/:email/projects', requireEmailMiddleware,
6264

6365
// get project by owner_email and id for given project
6466
projectsOperationsRouter.get('/users/:email/projects/:id', requireEmailMiddleware, async (request: Request, response: Response) => {
65-
const ownerEmail = request.params.email;
6667
const id = request.params.id;
6768
try {
6869
const projectEntity: ProjectEntity = await projectService.getProject(id as string);

0 commit comments

Comments
 (0)