[Githru.v] git log 자동 실행 및 log parse

Chaejung·2022년 7월 30일
1
post-thumbnail

초기 설정_jest

⚾️ jest.config.ts: ts-jest를 이용해 jest를 설정하였다.
🏓 yarn test를 실행하면 설정해놓은 test가 실행된다.

<예시 화면>

  • test 파일 생성
    __test__> 🎱 parser.test.ts
    data> ⛳️ example.ts
    data에는 Githru.v의 기본 git log 명령어 설정에 따라 출력되는 mock data를 넣었다.

<예시 data_exampleLog02>

기능 구현_git log 실행

콘솔에서 직접 git log를 쳐서 나오는 출력값들을 가져오는 것까지, node에서 실행할 수 있도록 코드로 작성하였다.

키워드는 node.child_process

해당 코드의 존재를 알고 있었다면 쉽게 구현가능한 부분이다.

<실행 코드>

🥏 spawnLog.ts

import { spawn, exec } from "child_process";

// git log 실행할 option 설정
let git = spawn("git", [
  "--no-pager",
  "log",
  "--all",
  "--parents",
  "--numstat",
  "--date-order",
  "--pretty=fuller",
  "-c",
]);

export function getGitLog(): Promise<string> {
  return new Promise((resolve, reject) => {
    // Log로 받을 문자열 모음
    let gitLog = "";

    // 명령어 실행 뒤 하나씩 담아주기
    git.stdout.on("data", (data) => {
      gitLog += data.toString();
    });

    // 에러 발생 시 Promise.reject로 반환
    git.stderr.on("data", (data) => {
      console.error(`stderr: ${data}`);
      reject(data);
    });

    // 코드 실행 및 출력이 완료되면 모아둔 gitLog를 Promise.resolve로 반환
    git.on("close", () => {
      resolve(gitLog);
    });
  });
}

기능 구현_parse 함수 생성

🏸 logToJson.ts

  1. 출력할 JSON 형태의 interface인 logInfo 세팅
  2. log를 newline 별로 분리하기
  3. 각 line에서 시작하는 문자열이 'commit', 'Author', 'AuthorEmail',''AuthorDate', 'Committer', 'CommitterEmail', 'CommitDate', 'message', 'fileChanged'로 시작하면 각각의 카테고리 배열에 넣어주기

<예시 console>

  1. message, file changed의 경우 Date 두 줄 아래 나타나기 때문에 이 속성을 가지고 parse했다.
  2. 각각의 카테고리 배열을 commit 순으로 분리가 되어 있으므로, 조건문을 돌려 최종 JSONArray에 JSON 하나씩 담아주기

<예시 console>

자세한 구현 코드가 궁금하다면 여기

궁금한 점 및 더 공부할 점

  • jest test

    	현재는 간단하게 mock data로만 test해봤지만, 추후 복잡한 로직에 대해서도 test case를 추가해보고 싶다.
  • TypeScript interface, type check

    	간단한 로직 구현인데도, object의 key 타입 설정 등 오류나는 부분이 정말 많았다. 이 부분에서 가장 시간을 많이 잡아먹은 것 같다. TypeScript 기초 공부가 절실히 필요하다고 느꼈다.

느낀 점

나는 정말 아는 게 없다...

그래도 React가 아닌 TypeScript를 쓰는 건 처음이라 새롭고, 재밌었다. 특히나 jest 설정하는 부분과 명령어를 실행시키는 코드를 작성하는 부분이 정말 흥미로웠다. 이 부분은 Githru.v가 아니더라도 추후 웹 프로젝트에서도 쓸 수 있을지 고민해봐야겠다.
(하지만 사용자가 git log 또는 ls 등의 linux 명령어를 쓸 일이 있을까...?)

또한 고수분들께서 라이브 코딩 및 PR 코드리뷰로 많은 의견 및 조언을 주셔서 감사할 따름이다. 이 조언들을 하나하나 곱씹어보고 깊이 있게 공부해야겠다. 시간을 가지고 하나씩 기초를 다져봐야지.

profile
프론트엔드 기술 학습 및 공유를 활발하게 하기 위해 노력합니다.

0개의 댓글