Summary
Project Navigator의 프로젝트 삭제 흐름을 휴지통 이동 기반으로 전환하고, 드라이브/볼륨 루트·심볼릭 링크·Windows 정션 등 위험 경로에 대한 가드를 강화합니다. 또한 최근 목록의 경로 비교를 정규화하고, 다이얼로그가 사용자 입력을 리치텍스트로 해석하지 않도록 합니다.
Parent Issue
#2
Area
Application
Target Sprint
Sprint 1
Scope
ProjectPersistence::deleteProject가 QDir::removeRecursively 대신 QFile::moveToTrash로 휴지통에 이동하도록 변경합니다. 휴지통 이동 실패 시 영구 삭제로 폴백하지 않고 사용자에게 명확한 오류를 반환합니다.
canDeleteProjectFolder에서 폴더 자체와 내부 엔트리에 대해 심볼릭 링크 / Windows 정션을 거부합니다.
- 드라이브 루트 검사 결함을 수정합니다(
QDir::isRoot + QStorageInfo로 드라이브/볼륨 루트 모두 검출).
removeRecentProject / upsertRecentProject가 공통 헬퍼로 정규화된(canonical, Windows/macOS는 대소문자 무시) 경로 키로 비교하도록 통일하고, 쓰기 실패는 qWarning으로 로깅합니다.
MainWindow의 삭제 확인/경고 다이얼로그를 Qt::PlainText로 강제하고, 안내 문구를 휴지통 이동 동작에 맞춰 갱신합니다.
Acceptance Criteria
- 일반 프로젝트 삭제 시 프로젝트 폴더가 OS 휴지통으로 이동하고, 휴지통에서 복원할 수 있습니다.
- 휴지통 이동에 실패하면 폴더는 그대로 보존되고 사용자에게 실패 사유가 표시됩니다.
- 다음 경우 삭제가 거부됩니다: 비관리 파일/하위 폴더가 있는 경우, 폴더가 심볼릭 링크/정션인 경우, 폴더가 드라이브 또는 볼륨의 루트인 경우.
- 동일 폴더가 대소문자만 다르게 등록되어 있어도 최근 목록에서 한 번에 정리됩니다.
- 삭제 확인/경고 다이얼로그에서 사용자 프로젝트 이름이나 경로가 리치텍스트로 해석되지 않습니다.
Architecture / Dependency Check
- 변경 범위는
src/application/에 한정합니다(ProjectPersistence.{h,cpp}, MainWindow.cpp).
domain / engine에 의존성을 추가하지 않습니다.
- include는
application/... 경로를 사용하며, Qt 사용은 application 레이어 안에서만 이루어집니다.
Verification Plan
cmake --preset windows-debug
cmake --build --preset build-debug
ctest --preset test-debug
- 수동 검증:
- 프로젝트 생성 후 최근 목록에서 삭제 → 휴지통 이동 및 복원 가능 여부 확인
- 비관리 파일/하위 폴더 포함 폴더 삭제 시도 → 거부 메시지 확인
- 정션/심링크로 만든 가짜 프로젝트 폴더 삭제 시도 → 거부 메시지 확인
- 동일 경로를 대소문자 다르게 등록 후 삭제 → 최근 목록에서 모두 사라지는지 확인
Dependencies / Blockers
Repository Checks
Summary
Project Navigator의 프로젝트 삭제 흐름을 휴지통 이동 기반으로 전환하고, 드라이브/볼륨 루트·심볼릭 링크·Windows 정션 등 위험 경로에 대한 가드를 강화합니다. 또한 최근 목록의 경로 비교를 정규화하고, 다이얼로그가 사용자 입력을 리치텍스트로 해석하지 않도록 합니다.
Parent Issue
#2
Area
Application
Target Sprint
Sprint 1
Scope
ProjectPersistence::deleteProject가QDir::removeRecursively대신QFile::moveToTrash로 휴지통에 이동하도록 변경합니다. 휴지통 이동 실패 시 영구 삭제로 폴백하지 않고 사용자에게 명확한 오류를 반환합니다.canDeleteProjectFolder에서 폴더 자체와 내부 엔트리에 대해 심볼릭 링크 / Windows 정션을 거부합니다.QDir::isRoot+QStorageInfo로 드라이브/볼륨 루트 모두 검출).removeRecentProject/upsertRecentProject가 공통 헬퍼로 정규화된(canonical, Windows/macOS는 대소문자 무시) 경로 키로 비교하도록 통일하고, 쓰기 실패는qWarning으로 로깅합니다.MainWindow의 삭제 확인/경고 다이얼로그를Qt::PlainText로 강제하고, 안내 문구를 휴지통 이동 동작에 맞춰 갱신합니다.Acceptance Criteria
Architecture / Dependency Check
src/application/에 한정합니다(ProjectPersistence.{h,cpp},MainWindow.cpp).domain/engine에 의존성을 추가하지 않습니다.application/...경로를 사용하며, Qt 사용은 application 레이어 안에서만 이루어집니다.Verification Plan
cmake --preset windows-debugcmake --build --preset build-debugctest --preset test-debugDependencies / Blockers
Repository Checks