Skip to content

drsungwon/loose-diff

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Loose Diff Utility

alt text alt text alt text

loose-diff는 두 텍스트 파일을 비교하되, 파일 맨 끝에 있는 중요하지 않은 공백과 줄바꿈을 모두 무시하는 간단한 커맨드라인 유틸리티입니다. 코드의 기능에 영향을 주지 않는 사소한 포맷팅 차이로 인해 표준 diff 도구가 두 파일을 다르다고 판단하는 문제를 해결하기 위해 만들어졌습니다.


왜 이 도구가 필요한가? (The Problem & Its Context)

버전 관리 시스템(VCS)에서 특정 시점의 파일을 복원할 때, 복원 방식에 따라 원본과 미세한 차이가 발생할 수 있습니다. 이 유틸리티는 특히 diff/patch 이력을 기반으로 파일을 복원하는 과정에서 발생하는 "실질적 동일성" 문제를 해결하기 위해 설계되었습니다.

보고서: 버전 관리 시스템의 파일 복원 방식에 따른 동일성 분석

1. 목적

Git과 같은 버전 관리 시스템에서, diff 이력을 순차적으로 적용(patch)하여 파일의 최종 버전을 복원할 경우, 그 결과물이 원본 스냅샷과 완전히 동일한지 여부를 확인합니다.

2. 관찰 결과

  • Git 내부 객체(blob)를 통한 복원

    • git show <commit_hash>:<file_path>와 같이 저장소에 기록된 blob 데이터를 직접 이용하면, 바이트 단위로 100% 동일한 파일이 복원됩니다. 이는 가장 안전하고 정확한 방법입니다.
    • 차이 없음.
  • diff/patch 이력을 통한 수동 복원

    • 로그에 기록된 diff 정보를 patch와 유사한 방식으로 순차 적용하여 복원할 경우, 일부 환경이나 도구의 구현 방식에 따라 원본과 미세한 차이가 발생할 수 있습니다.
      1. 파일 끝 개행(Newline) 처리 차이:
        • diff 로그의 \ No newline at end of file 구문이 무시되거나 반영 방식이 달라져, 복원된 파일의 마지막에 빈 줄이 추가되거나 삭제될 수 있습니다.
      2. 운영체제 개행(CRLF/LF) 차이:
        • Windows(CRLF)와 Unix 계열(LF) 환경을 오가며 작업할 때, Git의 core.autocrlf 설정이나 텍스트 편집기의 자동 변환으로 인해 diff 내용과 실제 파일 간의 개행 문자가 달라질 수 있습니다.
      3. 공백(Whitespace) 처리 차이:
        • 일부 patch 유틸리티나 서드파티 복원 도구가 줄 끝의 공백(trailing whitespace)을 다르게 적용하거나 제거할 수 있습니다.

3. 결론

  • 정확히 동일한 파일을 복원하는 것이 목표라면, diff/patch 방식 대신 Git의 blob 스냅샷을 직접 사용하는 것이 가장 안전합니다.
  • diff 기반 복원 시, 위와 같은 요인들로 인해 최종 결과물에서 "기능적으로는 동일하지만, 문자열로는 다른" 파일이 생성될 수 있습니다.

4. loose-diff의 역할

loose-diff는 바로 이 지점에서 중요한 역할을 합니다. diff/patch 기반으로 복원된 파일이 원본과 실질적으로 동일한지를 검증할 필요가 있을 때, 파일 끝 개행이나 공백 같은 무의미한 차이를 무시하고 코드의 본질적인 내용이 같은지를 빠르고 정확하게 판단해줍니다.


주요 기능 (Features)

  • 끝 공백 무시: 파일의 맨 끝에 있는 모든 종류의 공백 문자(스페이스, 탭, 줄바꿈)를 제거한 후 비교합니다.
  • 명확한 결과: 파일이 실질적으로 동일한 경우 성공 메시지를, 차이가 있는 경우 실패 메시지와 함께 상세 unified diff를 출력합니다.
  • 간단한 사용법: 복잡한 옵션 없이 두 개의 파일 경로만 인자로 받습니다.
  • 순수 파이썬: 추가 라이브러리 설치 없이 파이썬 표준 라이브러리만으로 동작합니다.

요구 사항 (Prerequisites)

  • Python 3.x

사용 방법 (Usage)

터미널에서 다음과 같이 스크립트를 실행합니다.

python loose_diff.py <비교할_파일_1> <비교할_파일_2>

예시 1: 파일이 실질적으로 동일할 경우

$ python loose_diff.py original_file.py restored_file.py

출력 결과:

--- Loose Diff ---------------------------------
 a: original_file.py
 b: restored_file.py
----------------------------------------------
✅ 파일이 실질적으로 동일합니다 (끝 공백/줄바꿈 무시).

예시 2: 파일 내용에 차이가 있을 경우

$ python loose_diff.py file_with_changes.py original_file.py

출력 결과:

--- Loose Diff ---------------------------------
 a: file_with_changes.py
 b: original_file.py
----------------------------------------------

⚠️  파일 내용에 차이가 있습니다:
--- a/file_with_changes.py
+++ b/original_file.py
@@ -3,5 +3,5 @@
 a
 b
-Hello World
+Hello Python
 c
 d

라이선스 (License)

이 프로젝트는 MIT 라이선스를 따릅니다. 자세한 내용은 LICENSE 파일을 참고하십시오.

About

중요하지 않은 끝 공백을 무시하고 파일을 비교하는 커맨드라인 도구

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages