githru / githru-vscode-ext

Lightweight but robust Githru for VSCode Extension
Apache License 2.0
49 stars 83 forks source link

[engine] git log 파싱에 사용되는 separator 개선 #759

Closed yoouyeon closed 6 days ago

yoouyeon commented 3 weeks ago

내용

지금은 git log 파싱에 사용하는 Separator를 난수 문자열로 하고 있기 때문에

의 문제가 있어 Separator를 다른 것으로 바꿀 필요가 있습니다.

관련 논의 history

  1. Originally posted posted by @ytaek in https://github.com/githru/githru-vscode-ext/pull/708#pullrequestreview-2283403106

저는 개인적으로는 separator를 newline(\n)으로 하는게 가독성이 좋은 것 같습니다.

  • 임의로 생성된 값은 언젠가는 문제가 발생할 수도 있고 (거의 없지만)
  • \n 로 하면 사람이 읽기 편합니다 😺
  • commit message를 마지막에 놓으면 데이터에 \n이 들어가서 헷갈리는 일이 없을 것 같습니다.

실제로 이메일 등의 포맷에는 \n\n 으로 제목을 구분합니다. 개인적으로 랜덤한 값보다는 rule을 정해서 절대 올 수 없는 값으로 구분하는게 좋아보이긴 하네요 : )

  1. Originally posted by @yoouyeon in https://github.com/githru/githru-vscode-ext/issues/708#issuecomment-2334205508

제가 보기에도 log의 가독성이 너무 좋지 않아서 seperator에 대한 고민은 계속 하고 있습니다 😵‍💫 저번 pr 리뷰에서도 seperator를 new line으로 하는 방식을 말씀해주셔서 시도해보았는데요.

(2개의 커밋 log를 seperator를 \n으로 해서 출력한 결과입니다.)

git --no-pager log --all --parents --date-order --pretty=format:%H%n%P%n%D%n%an%n%ae%n%ad%n%cn%n%ce%n%cd%n%s%n%b --numstat -2
Screen_Shot 2024-09-06 22 50 06
  • 각 Commit을 구분하기 위한 COMMIT_SEPERATOR\n으로 하게 되면 commit message body가 여러 줄일 경우를 처리하기 어려울 것 같아 보였구요.

  • 각 Commit 내의 데이터를 구분하기 위한 GIT_LOG_SEPARATOR는 말씀해주신대로 commit message를 가장 아래쪽으로 옮긴다면 \n\n으로 할 수 있을 것 같지만 format을 지정하는 --pretty 옵션으로는 --numstat으로 출력하는 diffstat을 처리할 수 없는 것으로 알고 있습니다...

~~간단히 실험해봤을 때에는 commit message를 가장 아래쪽으로 옮기지 않아도 commit message body에 빈 줄이 2개 이상 못 들어가는 것 같아서 3개 이상의 new line으로 seperator를 지정해도 괜찮을 것 같긴 한데 이거는 좀 더 확인이 필요하긴 합니다.. 🥺~~

확인 결과 commit message body에 2개 이상의 \n이 포함되는 경우도 있었습니다.. 🥲 Screen_Shot 2024-10-04 16 22 43

  • git cli로 커밋하는 경우에는 commit message body에 2개 이상의 \n은 모두 \n 2개로 치환되어 커밋됩니다.
  • github web에서 커밋하는 경우에는 3개 이상의 \n들이 그대로 커밋됩니다.
  1. Originally posted by @ytaek in https://github.com/githru/githru-vscode-ext/issues/753#issuecomment-2395326018

https://github.com/githru/githru-vscode-ext/pull/708#issuecomment-2334205508 에서 언급하신 부분은,

각 Commit 내의 데이터를 구분하기 위한 GIT_LOG_SEPARATOR는 말씀해주신대로 commit message를 가장 아래쪽으로 옮긴다면 \n\n으로 할 수 있을 것 같지만 format을 지정하는 --pretty 옵션으로는 --numstat으로 출력하는 diffstat을 처리할 수 없는 것으로 알고 있습니다...

기존 코드들을 보면 pretty=fuller 옵션을 주고, https://github.com/githru/githru-vscode-ext/blob/68d4aaaeb3074f3ca16a1c02eca96678f770ed92/packages/vscode/src/utils/git.util.ts#L164

End of message인 \n 이 나올 때 까지 message 로 인식합니다. (fuller가 알아서 body는 indentation 해줌) https://github.com/githru/githru-vscode-ext/blob/68d4aaaeb3074f3ca16a1c02eca96678f770ed92/packages/analysis-engine/src/parser.ts#L68-L80

저희도 옵션을 잘 활용하면 body 에다가 앞에 space를 주면서 다른 내용들(numstat)과 구분이 가게 할 수 있습니다.

git --no-pager log --all --parents --date-order --pretty='format:%H%n%P%n%D%n%an%n%ae%n%ad%n%cn%n%ce%n%cd%n%w(120,8)%s%w(120,8)%b%n' --numstat -1

위처럼 %w를 사용하면 가능하구요 (한참 찾았네요;;;) 이렇게 하면 별도의 separator의 정의 없이, git log에서 활용하는 \n을 그대로 이용해서 작업가능합니다 😺

TODO

ytaek commented 3 weeks ago

https://github.com/githru/githru-vscode-ext/pull/753#issuecomment-2395391676 에 이어서...

commit_separator같은 경우도 유사하게 처리하면 될 것 같습니다. 얼핏 생각할 때는, 어차피 마지막에 뿌려지는게 --numstat 의 내용이라면, 끝 부분에서는 아마 \n이 없을 것이므로, format에 \n을 한두개 넣어주면 충분히 구분이 가능하지 않을까요?

yoouyeon commented 3 weeks ago

현재 파싱 로직상으로는 commit_separator가 먼저 log들을 커밋단위로 분리해야 하는 상황이라 commit_separator에 \n만 있는 경우에 commit message body에 들어가는 빈 줄 여러개를 구분하지 못하게 되는 것이 문제였는데요,,

이걸 적으면서 생각해보니 만약 말씀해주신 방법대로 commit message body 출력앞에 space를 넣게 되면 body 출력에 연속으로 \n이 등장하지 않게 되어 (중간중간 space가 있으니까요) 문제가 없을 것 같기도 합니다.. 🤔

일단 commit message 출력에 indentation을 넣는 것이 관건이겠네요!! 이 방식으로 우선 시도해 보도록 하겠습니다!!