아래 글에서 컨벤션에 대해 불편함을 토로한 적이 있다.
코드는 깃허브에 공개되어 있으니 내 저장소의 컨벤션에 맞게 수정해보았다.
🧩 내 컨벤션 vs 백준 허브 컨벤션
내 컨벤션
- 파일 이름 :
Algorithm/codes/boj/python/[문제 번호]번 [문제 이름].py
형식으로 저장했다. - 커밋 메시지 (커밋은 boj 브랜치에 올라간다.)
- 최초 문제 풀이 :
add: a boj problem [문제 번호]
- 리팩토링 or 수정 :
modify: a boj problem [문제 번호]
- 최초 문제 풀이 :
백준 허브 컨벤션
- 파일 이름(코드) :
백준/[등급]/[문제 번호].[문제 이름]/[문제 이름].py
- 문제 설명(리드미) :
백준/[등급]/[문제 번호].[문제 이름]/readme.md
- 커밋 메시지 :
[등급] Title: [문제 이름], Time: [실행 시간] ms, Memory: [메모리] KB
이미 작성한 코드가 적어도 백개는 넘기 때문에 백준 허브 컨벤션을 수용하기 어렵다.
최대한 기존 컨벤션을 유지할 생각이다.
🧐 리드미 내용을 작성하는 포인트 찾기
제일 먼저 찾은 부분은 리드미였다.
프로젝트가 크지 않아 vscode의 전체 검색(⌘⇧F)으로 readme를 검색했다.
리드미에 작성되는 내용은 parsing.js
의 makeDetailMessageAndReadme()
에서 쉽게 찾을 수 있었는데,
리드미 내용과 함께 커밋메시지, 파일 이름, 폴더 이름까지 전부 같이 있었다.
📝 바로 수정
아래와 같이 기존 컨벤션에 맞게 손봐주었고, 리드미 파일은 당장 지울 수 없어 'nothings'으로 지정해주었다.
function makeDetailMessageAndReadme(data) {
...
const directory = `codes/boj/${langType}`
// const directory = `백준/${level.replace(/ .*/, '')}/${problemId}. ${convertSingleCharToDoubleChar(title)}`;
const message = `add: a boj problem ${problemId}:${title}`
// const message = `[${level}] Title: ${title}, Time: ${runtime} ms, Memory: ${memory} KB -BaekjoonHub`;
...
const fileName = `${problemId}번 ${convertSingleCharToDoubleChar(title)}.${lang}`
// const fileName = `${convertSingleCharToDoubleChar(title)}.${languages[language]}`;
// prettier-ignore-start
// const readme = `# [${level}] ${title} - ${problemId} \n\n`
// + `[문제 링크](https://www.acmicpc.net/problem/${problemId}) \n\n`
// + `### 성능 요약\n\n`
// + `메모리: ${memory} KB, `
// + `시간: ${runtime} ms\n\n`
// + `### 분류\n\n`
// + `${category || "Empty"}\n\n` + (!!problem_description ? ''
// + `### 문제 설명\n\n${problem_description}\n\n`
// + `### 입력 \n\n ${problem_input}\n\n`
// + `### 출력 \n\n ${problem_output}\n\n` : '');
// prettier-ignore-end
return {
directory,
fileName,
message,
readme: 'nothings',
code
};
}
리팩토링을 통해 깔끔히 제거하고 싶었지만, 순수 js코드인 관계로 리팩토링이 힘들 것 같다.
그리고 '일단은' 기능 수정이 목표였기 때문에 이것에 집중하고자 한다.
리드미 파일은 텍스트만 바꾼 것이라 다른 곳에서 커밋을 막아야 한다.
커밋을 찾고자 했고, Github.js
파일이 보이길래 안에 있는 클래스 사용처를 기점으로 찾았다.
쉽게 커밋은 uploadfunctions.js
의 upload()
에서 하는 것을 알게 되었고,
역시나 모든 파일이 여기서 바로 커밋되었다.
단순히 readme 파일을 주석처리하면 해결되는 문제였다.
async function upload(token, hook, sourceText, readmeText, directory, filename, commitMessage, cb) {
/* 업로드 후 커밋 */
const git = new GitHub(hook, token);
const stats = await getStats();
let default_branch = stats.branches[hook];
if (isNull(default_branch)) {
default_branch = await git.getDefaultBranchOnRepo();
stats.branches[hook] = default_branch;
}
const { refSHA, ref } = await git.getReference(default_branch);
const source = await git.createBlob(sourceText, `${directory}/${filename}`); // 소스코드 파일
//const readme = await git.createBlob(readmeText, `${directory}/README.md`); // readme 파일
...
}
짜잔! 이제 원래의 컨벤션과 맞춰 비슷하게 돌아간다.
🤔 브랜치 관리
이제 브랜치에 대해 고민을 해야한다.
백준 허브는 main에 모든 커밋을 보내기 때문에 boj 커밋에 보내도록 수정해야 한다.
업로드 로직을 보면 아래와 같은 구문이 있다.
let default_branch = stats.branches[hook];
if (isNull(default_branch)) {
default_branch = await git.getDefaultBranchOnRepo();
stats.branches[hook] = default_branch;
}
디폴트 브랜치로 설정하는 것 같은데 디버깅을 해보니 브랜치를 문자열로 정하고 있었다.
이 구문을 전부 주석처리 한 후 'boj'로 수정해 주었다.
let default_branch = 'boj';//stats.branches[hook];
// if (isNull(default_branch)) {
// default_branch = await git.getDefaultBranchOnRepo();
// stats.branches[hook] = default_branch;
// }
이렇게 해도 되는 것인가? 싶지만 일단 작동은 하니 되었다.
👏 마무리
백준 허브의 코드를 직접 수정해서 내가 원하는 컨벤션을 만족시켰다.
사실 백준 허브는 다양한 언어와 백준 이외의 프로그래머스, 삼성 아카데미도 지원하기 때문에 그 부분도 수정이 필요할 것 같다.
또, 가능하면 필요없는 기능을 지우고 싶다.
'프로그래밍 > 기타' 카테고리의 다른 글
실제하지 않는 엔티티 (0) | 2023.02.26 |
---|---|
LocalDateTime의 약간 이상한 시간 표시 (0) | 2023.02.22 |
9번째 스프린트 회고 - 게시판 좋아요 구현과 JWT활용 (0) | 2023.01.25 |
백준 허브 사용 후기 (0) | 2023.01.21 |
스타듀밸리 순무 모드 업데이트 0.7.0 (1) | 2023.01.18 |