Skip to content

Commit bae2e6a

Browse files
authored
1단계 - 레거시 코드 리팩터링 (#801)
* feat: 개발 환경 자동화 및 코드 포맷터(Spotless) 적용 .gitignore - diff 디렉토리 무시 규칙 추가 .sdkmanrc - Java 버전 설정 파일 추가 (11.0.21-tem) Makefile - diff 생성/정리, validation, init 등 스크립트 실행 타겟 추가 build.gradle - Spotless 플러그인 추가 - Java 포맷팅 규칙(palantir format 등) 설정 적용 clean-diff.sh - diff/commit 디렉토리 내 패치 파일 정리 로직 추가 commit-diff.sh - 스테이지된 변경사항을 timestamp 포함 패치 파일로 저장 기능 추가 origin-ghtjr410-diff.sh - origin/ghtjr410 대비 현재 브랜치 diff 생성 스크립트 추가 pre-commit - Java 변경 시 Spotless 검사 자동 수행 훅 추가 init.sh - Git hook 설정 및 스크립트 실행 권한 부여 자동화 validate.sh - Spotless 적용/검사 및 프로젝트 빌드를 자동 수행하는 검증 스크립트 추가 * docs: README 수정 및 1단계 리팩터링 문서/체크리스트 추가 README.md - 프로젝트 제목 수정 및 LMS/TDD 소개 추가 - 단계별 문서 링크(1~4단계) 추가 01-legacy-code-refactoring.md - 1단계 리팩터링 학습 목표, 요구사항, 힌트, PR 체크 항목 문서화 checklist.md - 미션 제출 전 객체지향 원칙, TDD 원칙, 테스트 품질 등 체크리스트 추가 * style: Spotless 코드 포맷팅 적용 * refactor: Answer 삭제 로직을 도메인 메서드로 캡슐화하고 테스트 추가 Answer.java - setDeleted(boolean) 메서드 제거 - delete(LocalDateTime) 도메인 메서드 추가하여 삭제 처리 및 DeleteHistory 생성 일원화 - delete 호출 시 deleted 플래그 true 설정 QnAService.java - Answer 삭제 시 setDeleted + DeleteHistory 생성 로직을 answer.delete(now) 호출로 단순화 AnswerTest.java - delete 메서드 동작 검증 테스트 추가 - 삭제 후 DeleteHistory 반환 및 deleted 플래그 true 검증 * refactor: Question 삭제 로직 도메인으로 이동 및 권한 검증 테스트 추가 Question.java - isOwner 메서드를 private으로 변경하여 외부 직접 호출 차단 - setDeleted(boolean) 제거 - delete(loginUser, now) 메서드 추가하여 권한 검증 및 DeleteHistory 생성 일원화 - 삭제 권한 없을 경우 CannotDeleteException 발생 처리 추가 QnAService.java - 서비스 레이어에서의 직접 권한 검사 및 삭제 처리 로직 제거 - question.delete(...) 호출로 삭제 처리 단일화 QuestionTest.java - 질문 삭제 성공 테스트 추가 - 소유자 불일치 시 CannotDeleteException 발생 테스트 추가 * refactor: 질문·답변 삭제 로직을 Question 도메인으로 완전 통합하고 검증 강화 Question.java - getAnswers 제거하여 외부 접근 최소화 - delete 메서드를 Question 내부에서 답변까지 함께 삭제하도록 변경 - validateDeletable 추가: 질문 소유자 검증, 타인 답변 존재 시 예외 처리 - delete 시 질문/답변 DeleteHistory 목록 생성 후 반환 QnAService.java - 서비스 레이어 삭제 검증 및 반복 로직 제거 - question.delete(...) 호출만으로 삭제 처리 일원화 QuestionTest.java - 삭제 성공 테스트 수정: 답변 존재 시 DeleteHistory 리스트 검증 - 소유자 불일치 예외 검증 추가 - 타인 답변 존재 시 CannotDeleteException 발생 테스트 추가 * refactor: 중복 삭제 메서드 및 불필요한 접근자 정리 Answer.java - delete(LocalDateTime) 메서드를 클래스 상단으로 이동하고 중복 정의 제거 - 불필요한 getContents() 제거 Question.java - delete 메서드 및 validateDeletable 메서드를 상단으로 재배치하고 중복 블록 제거 - title/contents setter 제거로 불변성 강화 - 전체 구조 정리하여 중복 코드 제거 및 가독성 향상 * refactor: Answer 목록 전용 값 객체 Answers 추가 및 삭제/검증 로직 위임 Answers.java - Answer 리스트를 캡슐화하는 값 객체 추가 - deleteAll(now): 모든 Answer 삭제 수행 후 DeleteHistory 리스트 반환 - validateDeletable(loginUser): 삭제 가능 여부 검증(타인 답변 존재 시 예외 발생) AnswersTest.java - 소유자 일치 시 예외 없이 통과하는 검증 테스트 추가 - 소유자 불일치 시 CannotDeleteException 발생 테스트 추가 * refactor: Question이 Answer 컬렉션을 Answers 값 객체로 위임하도록 구조 개선 Answers.java - add 메서드 추가로 Answer 등록 책임 부여 - deleteAll(now) 기존 로직 유지 - validateDeletable(loginUser) 그대로 활용 Question.java - answers 필드를 List → Answers 로 교체하여 컬렉션 캡슐화 - 삭제 시 answers.deleteAll(now) 사용으로 책임 위임 - 검증 로직도 answers.validateDeletable(loginUser) 호출로 단순화 * refactor: 공통 엔티티 속성을 BaseEntity로 분리하고 Answer·Question에 상속 적용 Answer.java - BaseEntity 상속 적용으로 id/createdDate/updatedDate 필드 제거 - 생성자에서 super(id) 호출로 id 설정 위임 - delete 시 getId() 사용하도록 변경 - 중복 필드 제거로 엔티티 구조 단순화 BaseEntity.java - id, createdDate, updatedDate 공통 필드 추가 - getId() 제공 - Answer/Question의 공통 속성을 추출한 추상 엔티티 생성 Question.java - BaseEntity 상속 적용 및 id 관련 필드 제거 - 생성자에서 super(id) 호출하도록 변경 - DeleteHistory 생성 시 getId() 사용하도록 수정 * refactor: Question의 title/contents를 전용 값 객체로 분리하여 응집도 향상 Question.java - title, contents 필드를 제거하고 QuestionContent 값 객체로 대체 - 생성자에서 QuestionContent 생성하여 content 필드에 저장 - toString 수정: content 정보 출력하도록 변경 - 전체 구조를 값 객체 기반으로 단순화 QuestionContent.java - title, contents를 보관하는 값 객체 추가 - toString 재정의하여 도메인 표현 명확화 * test: Question 삭제 테스트 간소화 및 불필요한 테스트 제거 QuestionTest.java - 삭제 성공 테스트 수정: 반환된 DeleteHistory 리스트 크기 검증 후 QUESTION 기록 포함 여부만 확인하도록 단순화 - 삭제 여부(isDeleted) 검사 유지 - 중복되는 ‘다른 사람 답변 예외’ 테스트 제거(AnswersTest로 책임 분리됨) * refactor: 연관관계 설정 위치 정리 및 QuestionContent 접근자 추가 Answer.java - toQuestion 위치 조정 및 중복 메서드 제거 - 불필요한 코드 정리로 클래스 구조 단순화 Question.java - addAnswer에서 Answer ↔ Question 연관관계 설정(toQuestion) 명확히 수행 - getWriter 위치 조정 및 중복 제거 - 전체 구조 정돈 QuestionContent.java - title, contents 조회용 getter 추가 - 값 객체로서 외부 접근이 필요한 영역을 최소한으로 허용 * feat: Answer 삭제 이력 생성 기능 분리 추가 Answer.java - deleteHistory(LocalDateTime) 메서드 추가하여 삭제 여부 변경 없이 DeleteHistory만 생성하도록 분리 AnswerTest.java - deleteHistory 동작 검증 테스트 추가 - 특정 시각을 지정해 DeleteHistory 생성 값 검증 * feat: 삭제 이력 생성 기능을 엔티티/컬렉션에서 분리 제공하도록 확장 Answers.java - deleteHistories(deletedAt) 추가: 삭제 플래그 변경 없이 Answer들의 DeleteHistory만 생성 - 책임 분리로 deleteAll vs deleteHistories 용도 명확화 Question.java - deleteHistories(deletedAt) 추가: Question + Answers의 DeleteHistory 목록 생성 전용 메서드 제공 - 삭제 여부 변경 없이 이력 생성만 수행 QuestionTest.java - deleteHistories 테스트 추가 - Question 및 Answer의 DeleteHistory 생성 여부 검증 * refactor: 삭제 행위와 삭제 이력 생성을 완전히 분리하여 도메인 책임 명확화 Answer.java - delete(LocalDateTime) → delete()로 변경하여 삭제 상태만 변경 - 삭제 이력 생성을 담당하는 deleteHistory(LocalDateTime) 분리 - 내부 delete 로직 단순화 및 책임 분리 Answers.java - deleteAll(now) 제거 → deleteAll()로 변경하여 상태 변경만 수행 - 삭제 이력 생성 기능은 deleteHistories(LocalDateTime)로 분리하여 순수 히스토리 생성 책임만 담당 Question.java - delete(loginUser, now) → delete(loginUser)로 변경해 삭제 시각 의존 제거 - 내부적으로 Answer 삭제는 answers.deleteAll() 호출로 단순화 - 삭제 이력 생성은 deleteHistories(LocalDateTime)에서 전담 QnAService.java - 도메인 delete 호출 후 별도로 deleteHistories(now) 호출하여 이력 생성 - 삭제와 삭제 이력 저장을 명확히 분리 AnswerTest.java - delete()는 상태 변경만 검증하도록 테스트 단순화 QuestionTest.java - delete() 결과로 DeleteHistory가 반환되지 않으므로 관련 검증 제거 - 삭제 여부 검증만 유지 - 소유자 불일치 테스트는 delete(loginUser)로 수정 * refactor: 삭제 시각을 고정하여 일관된 DeleteHistory 생성 QnAService.java - LocalDateTime.now()를 한 번만 호출해 fixedNow로 저장 - question.delete(loginUser) 이후 deleteHistories 생성 시 fixedNow를 재사용하여 삭제 이력 시간 불일치 문제 해결 * docs: 리팩터링 PR 링크 및 구현 기능 목록 문서에 추가 01-legacy-code-refactoring.md - PR 링크 추가 - 구현 기능 목록 상세 추가(도메인 리팩터링·서비스 로직·테스트 항목 정리) - 전체 리팩터링 진행 내역을 문서로 구조화하여 가독성 향상 * refactor: 엔티티 공통 삭제 기능을 DeletableBaseEntity로 통합하고 Answer/Question 구조 개선 Answer.java - BaseEntity → DeletableBaseEntity 상속으로 변경 - deleted 필드 제거 (부모로 이동) - delete() 제거 및 상위 protected delete() 활용 - deleteHistory 메서드는 그대로 유지 - toString 개선 및 중복 코드 정리 BaseEntity.java - 기존 BaseEntity 삭제 (DeletableBaseEntity로 통합) DeletableBaseEntity.java - id, createdDate, updatedDate, deleted 공통 관리 - delete(), isDeleted() 제공 - 엔티티 공통 toString 구현 Question.java - BaseEntity → DeletableBaseEntity 상속 변경 - deleted 필드 제거 (부모 클래스에서 관리) - delete() 내부에서 상위 delete() 호출 - isDeleted() 제거 (상위 클래스 제공) - toString 개선 및 구조 단순화 * feat: Answer 삭제 시 소유자 검증 로직 추가 및 테스트 보강 Answer.java - delete(NsUser) 추가: 삭제 전 소유자 검증 수행 - 소유자 불일치 시 CannotDeleteException 발생 - 기존 delete() 로직을 상위 delete() 호출로 위임 AnswerTest.java - delete_소유자일치_성공 테스트 추가 - delete_소유자불일치_예외발생 테스트 추가 - 삭제 이력 생성 테스트(deleteHistory)는 그대로 유지 * refactor: Answer 개별 삭제 책임 이전으로 Answers의 삭제 검증 제거 및 관련 테스트 삭제 Answers.java - validateDeletable 제거 → 소유자 검증 책임을 Answer.delete(loginUser)로 완전히 이관 - Answers는 컬렉션 관리와 일괄 삭제(deleteAll)·이력 생성(deleteHistories)만 담당 Question.java - validateDeletable 삭제에 따라 내부 검증 로직 단순화 → 질문 소유자 검증만 수행 → 답변 삭제는 answers.deleteAll()이 Answer.delete()를 호출하며 처리 AnswersTest.java - validateDeletable 제거에 따라 해당 테스트 클래스 전체 삭제 * refactor: 삭제 권한 검증을 Answer로 위임하고 출력 포맷 및 일괄 삭제 로직 개선 Answer.java - toString에서 question 정보 제거하여 간결화 Answers.java - deleteAll(loginUser)로 변경하여 각 Answer가 소유자 검증을 수행하도록 위임 - Answer.delete(loginUser) 호출 구조로 일관성 확보 DeletableBaseEntity.java - toString 포맷 수정(불필요한 '}' 제거) Question.java - delete 수행 시 answers.deleteAll(loginUser) 호출로 삭제 권한 검증 일관화 * test: Question 삭제 테스트 이름을 의도에 맞게 명확화 QuestionTest.java - `delete_성공` → `delete_소유자일치_성공` 으로 테스트명 변경하여 검증 목적을 더 분명하게 표현 * refactor: 삭제 도메인 로직 및 테스트 명세 정리 01-legacy-code-refactoring.md - Answer: 삭제 시 소유자 검증 및 상태 변경 단계 명시 - Answers: 불필요해진 삭제 가능 여부 검증 항목 제거 - Question: 삭제 처리 흐름을 단순화(답변 삭제 포함) - DeletableBaseEntity: 공통 삭제 필드 및 delete() 기능 명세 추가 - 테스트: 메서드명과 시나리오를 명확하게 정리(성공/실패 구분)
1 parent de587b9 commit bae2e6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+539
-201
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ out/
3131

3232
### VS Code ###
3333
.vscode/
34+
35+
/diff

.sdkmanrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
java=11.0.21-tem

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
clean-diff:
2+
./scripts/git/diff/clean-diff.sh
3+
4+
commit-diff:
5+
./scripts/git/diff/commit-diff.sh
6+
7+
ghtjr410-diff:
8+
./scripts/git/diff/origin-ghtjr410-diff.sh
9+
10+
validate:
11+
./scripts/validation/validate.sh
12+
13+
init:
14+
./scripts/setup/init.sh

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
# 학습 관리 시스템(Learning Management System)
1+
# NextStep TDD Java LMS(Learning Management System)
2+
## 학습 관리 시스템
3+
본 저장소는 TDD 학습을 위한 단계별 과제를 포함합니다.
4+
## 단계별 문서
5+
- **[1단계 - 레거시 코드 리팩터링](./docs/01-legacy-code-refactoring.md)**
6+
- **[2단계 - 수강신청(도메인 모델)]()**
7+
- **[3단계 - 수강신청(DB 신청)]()**
8+
- **[4단계 - 수강신청(요구사항 변경)]()**
29
## 진행 방법
310
* 학습 관리 시스템의 수강신청 요구사항을 파악한다.
411
* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.

build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ plugins {
22
id 'org.springframework.boot' version '2.7.9'
33
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
44
id 'java'
5+
id 'com.diffplug.spotless' version '6.25.0'
56
}
67

78
group = 'camp.nextstep'
@@ -12,6 +13,16 @@ repositories {
1213
mavenCentral()
1314
}
1415

16+
spotless {
17+
java {
18+
palantirJavaFormat()
19+
removeUnusedImports()
20+
trimTrailingWhitespace()
21+
endWithNewline()
22+
target 'src/**/*.java'
23+
}
24+
}
25+
1526
dependencies {
1627
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
1728
runtimeOnly 'com.h2database:h2'

docs/01-legacy-code-refactoring.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# 1단계 - 레거시 코드 리팩터링
2+
***
3+
## 코드 리뷰
4+
> PR 링크:
5+
> **[https://github.com/next-step/java-lms/pull/801](https://github.com/next-step/java-lms/pull/801)**
6+
## 나의 학습 목표
7+
- TDD 사이클로 구현
8+
- 객체지향 생활 체조 원칙 준수
9+
- 테스트 작성하기 쉬운 구조로 설계
10+
- 자기 점검 체크리스트 준수
11+
## 기능 요구사항
12+
### 질문 삭제하기
13+
- 질문 데이터를 완전히 삭제하는 것이 아니라 데이터의 상태를 삭제 상태(deleted - boolean type)로 변경한다.
14+
- 로그인 사용자와 질문한 사람이 같은 경우 삭제 가능하다.
15+
- 답변이 없는 경우 삭제가 가능하다.
16+
- 질문자와 답변 글의 모든 답변자가 같은 경우 삭제가 가능하다.
17+
- 질문을 삭제할 때 답변 또한 삭제해야 하며, 답변의 삭제 또한 삭제 상태(deleted)를 변경한다.
18+
- 질문자와 답변자가 다른 경우 답변을 삭제할 수 없다.
19+
- 질문과 답변 삭제 이력에 대한 정보를 DeleteHistory를 활용해 남긴다.
20+
## 리팩터링 요구사항
21+
- nextstep.qna.service.QnaService의 deleteQuestion()는 앞의 질문 삭제 기능을 구현한 코드이다.
22+
- 이 메소드는 단위 테스트하기 어려운 코드와 단위 테스트 가능한 코드가 섞여 있다.
23+
- QnaService의 deleteQuestion() 메서드에 단위 테스트 가능한 코드(핵심 비지니스 로직)를 도메인 모델 객체에 구현한다.
24+
- QnaService의 비지니스 로직을 도메인 모델로 이동하는 리팩터링을 진행할 때 TDD로 구현한다.
25+
- QnaService의 deleteQuestion() 메서드에 대한 단위 테스트는 src/test/java 폴더 nextstep.qna.service.QnaServiceTest이다. 도메인 모델로 로직을 이동한 후에도 QnaServiceTest의 모든 테스트는 통과해야 한다.
26+
## 힌트
27+
- 객체의 상태 데이터를 꺼내지(get)말고 메시지를 보낸다.
28+
- 규칙 8: 일급 콜렉션을 쓴다.
29+
- Question의 List를 일급 콜렉션으로 구현해 본다.
30+
- 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
31+
- 인스턴스 변수의 수를 줄이기 위해 도전한다.
32+
- 도메인 모델에 setter 메서드 추가하지 않는다.
33+
## PR 전 점검
34+
**[체크리스트 확인하기](checklist.md)**
35+
## 구현 기능 목록
36+
### 도메인 모델 리팩터링
37+
#### Answer
38+
- [x] 삭제 (`delete()`)
39+
- 소유자 검증
40+
- 답변 삭제 상태 변경
41+
- [x] 삭제 이력 생성 (`deleteHistory(LocalDateTime)`)
42+
- [x] 소유자 확인 (`isOwner(NsUser)`)
43+
44+
#### Answers (일급 컬렉션)
45+
- [x] 답변 추가 (`add(Answer)`)
46+
- [x] 전체 답변 삭제 (`deleteAll()`)
47+
- [x] 전체 답변 삭제 이력 생성 (`deleteHistories(LocalDateTime)`)
48+
49+
#### Question
50+
- [x] 삭제 (`delete(NsUser)`)
51+
- 소유자 검증
52+
- 질문 삭제 상태 변경
53+
- 답변 삭제
54+
- [x] 삭제 이력 생성 (`deleteHistories(LocalDateTime)`)
55+
- 질문 삭제 이력 생성
56+
- 답변 삭제 이력 생성
57+
- [x] 답변 추가 (`addAnswer(Answer)`)
58+
59+
#### DeletableBaseEntity
60+
- [x] 공통 필드 추출 (id, deleted, createdDate, updatedDate)
61+
- [x] 삭제 상태 변경 (`delete()`)
62+
63+
#### QuestionContent (VO)
64+
- [x] 질문 내용 필드 추출 (title, contents)
65+
66+
### Service 리팩터링
67+
68+
#### QnAService
69+
- [x] 삭제 로직을 도메인으로 위임
70+
- [x] 삭제와 이력 생성 분리
71+
- `question.delete(loginUser)`
72+
- `question.deleteHistories(now)`
73+
74+
### 테스트
75+
76+
#### AnswerTest
77+
- [x] `delete_소유자일치_성공()` - 삭제 시 상태 변경
78+
- [x] `delete_소유자불일치_예외발생()` - 예외 발생
79+
- [x] `deleteHistory()` - 삭제 이력 생성
80+
81+
#### QuestionTest
82+
- [x] `delete_소유자일치_성공()` - 질문 삭제 상태 변경
83+
- [x] `delete_소유자불일치_예외발생()` - 예외 발생
84+
- [x] `deleteHistories()` - 삭제 이력 생성
85+
86+
#### QnaServiceTest
87+
- [x] 기존 테스트 모두 통과

docs/checklist.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# 미션 제출 전 체크리스트
2+
3+
### 1. 객체지향 생활체조 원칙
4+
- 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기(indent)만 사용
5+
- 규칙 2: else 예약어 사용 금지
6+
- 규칙 3: 모든 원시값과 문자열을 포장 (Primitive Obsession 제거)
7+
- 규칙 4: 한 줄에 점(.) 하나만 사용 (Law of Demeter)
8+
- 규칙 5: 축약 금지 (명확한 네이밍)
9+
- 규칙 6: 모든 엔티티 작게 유지
10+
- 규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스 지양
11+
- 규칙 8: 일급 콜렉션 사용
12+
- 규칙 9: Getter/Setter 사용 지양 (Tell, Don't Ask)
13+
14+
### 2. 메서드 작성 원칙
15+
- 한 가지 일만 수행하는 작은 메서드 (최대 10라인)
16+
17+
### 2. 객체지향 설계 품질
18+
- 가장 작은 단위의 객체부터 시작 (상향식 개발)
19+
- 객체에게 상태 노출 대신 책임 위임
20+
- 불변성을 최대한 유지
21+
- 도메인 용어로 네이밍
22+
- 협력 구조가 자연스럽게 읽힘
23+
24+
### 3. TDD
25+
- TDD 사이클(Red-Green-Refactor)로 구현
26+
- TDD 사이클 단위 커밋
27+
28+
### 4. 테스트 품질
29+
- 객체의 책임과 결과만 검증 (구현 세부사항 테스트 지양)
30+
- 단순 위임은 테스트 생략, 조건·분기·조합이 있다면 테스트
31+
- 테스트 객체 생성 헬퍼메서드가 반복되면 부생성자 도입 검토
32+
33+

scripts/git/diff/clean-diff.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
3+
DIFF_DIR="./diff"
4+
5+
if [ -d "$DIFF_DIR/commit" ]; then
6+
echo "Cleaning commit patches..."
7+
rm -f "$DIFF_DIR/commit"/*
8+
fi
9+
10+
echo "Diff directories cleaned."

scripts/git/diff/commit-diff.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
branch_name=$(git rev-parse --abbrev-ref HEAD | tr '/' '_')
4+
timestamp=$(date +"%Y%m%d_%H%M%S")
5+
output_file="diff/commit/${branch_name}_${timestamp}.patch"
6+
7+
mkdir -p "$(dirname "$output_file")"
8+
9+
git diff --staged > "$output_file"
10+
11+
echo "Staged diff saved to $output_file"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
3+
branch_name=$(git rev-parse --abbrev-ref HEAD | tr '/' '_')
4+
timestamp=$(date +"%Y%m%d_%H%M%S")
5+
output_file="diff/commit/${branch_name}_vs_origin_ghtjr410_${timestamp}.patch"
6+
7+
mkdir -p "$(dirname "$output_file")"
8+
git fetch origin ghtjr410 --quiet
9+
git diff origin/ghtjr410...HEAD > "$output_file"
10+
11+
echo "Diff between current branch and origin/ghtjr410 saved to $output_file"

0 commit comments

Comments
 (0)