chore: 프로젝트 공용 도구 초기 커밋

- release.bat: Gitea 릴리즈 자동화 (태그+릴리즈+파일업로드)
- newproject.bat: 새 프로젝트 초기화 (git+템플릿+remote 설정)
- template/: 공용 설정 파일 (.gitignore, .gitattributes, .gitmessage)

파일: release.bat
- git remote에서 Gitea 정보 자동 추출
- 태그 생성, 릴리즈 생성, 파일 업로드 일괄 처리
- 한글 릴리즈 노트 지원 (JSON 파일 방식)

파일: newproject.bat
- 현재 폴더에 git init + 템플릿 복사
- 커밋 메시지 규칙 자동 적용
- Gitea 원격 저장소 연결

파일: template/
- .gitignore: Python/빌드/IDE 제외 규칙
- .gitattributes: LF/CRLF 줄바꿈 관리
- .gitmessage: 한글 커밋 메시지 규칙

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
insulee
2026-02-10 12:46:20 +09:00
commit 70340486ff
5 changed files with 391 additions and 0 deletions

124
newproject.bat Normal file
View File

@@ -0,0 +1,124 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
REM ============================================================
REM 새 프로젝트 초기화 스크립트
REM
REM 현재 폴더에 git 초기화 + 템플릿 파일 복사 + 커밋 규칙 적용
REM Gitea 저장소가 있으면 remote까지 연결
REM
REM 사용법: newproject [gitea저장소URL]
REM 예시: newproject http://dabit.synology.me:3052/islee/my_project
REM newproject (URL 없이 로컬 초기화만)
REM ============================================================
set TEMPLATE_DIR=%~dp0template
set CURRENT_DIR=%CD%
set FOLDER_NAME=%~n0
REM --- 현재 폴더명 추출 ---
for %%a in ("%CURRENT_DIR%") do set FOLDER_NAME=%%~na
echo.
echo ============================================================
echo 새 프로젝트 초기화
echo ============================================================
echo 폴더: %CURRENT_DIR%
echo 이름: %FOLDER_NAME%
echo ============================================================
REM --- 이미 git 저장소인지 확인 ---
git rev-parse --git-dir >nul 2>&1
if %errorlevel%==0 (
echo.
echo [알림] 이미 git 저장소입니다. 템플릿 파일만 추가합니다.
goto :copy_templates
)
REM --- git 초기화 ---
echo.
echo [1/4] git 저장소 초기화...
git init
echo 완료.
:copy_templates
REM --- 템플릿 파일 복사 ---
echo [2/4] 템플릿 파일 복사...
if not exist "%TEMPLATE_DIR%" (
echo [오류] 템플릿 폴더를 찾을 수 없습니다: %TEMPLATE_DIR%
exit /b 1
)
REM .gitignore (기존 파일이 있으면 건너뛰기)
if not exist ".gitignore" (
copy "%TEMPLATE_DIR%\.gitignore" ".gitignore" >nul
echo .gitignore 복사됨
) else (
echo .gitignore 이미 존재 - 건너뜀
)
REM .gitattributes
if not exist ".gitattributes" (
copy "%TEMPLATE_DIR%\.gitattributes" ".gitattributes" >nul
echo .gitattributes 복사됨
) else (
echo .gitattributes 이미 존재 - 건너뜀
)
REM .gitmessage
if not exist ".gitmessage" (
copy "%TEMPLATE_DIR%\.gitmessage" ".gitmessage" >nul
echo .gitmessage 복사됨
) else (
echo .gitmessage 이미 존재 - 건너뜀
)
REM --- 커밋 메시지 템플릿 적용 (로컬 git 설정) ---
echo [3/4] 커밋 규칙 적용...
git config --local commit.template .gitmessage
echo 커밋 메시지 템플릿 적용됨
REM --- Gitea 원격 저장소 연결 ---
echo [4/4] 원격 저장소 설정...
set GITEA_URL=%~1
if "%GITEA_URL%"=="" (
echo 원격 저장소 URL이 없습니다. 나중에 아래 명령으로 추가하세요:
echo git remote add origin http://dabit.synology.me:3052/islee/%FOLDER_NAME%
goto :done
)
REM .git 접미사 추가
echo %GITEA_URL% | findstr /r "\.git$" >nul
if %errorlevel% neq 0 set GITEA_URL=%GITEA_URL%.git
REM 기존 remote 확인
git remote get-url origin >nul 2>&1
if %errorlevel%==0 (
echo origin이 이미 설정되어 있습니다.
git remote get-url origin
) else (
git remote add origin %GITEA_URL%
echo 원격 저장소 연결됨: %GITEA_URL%
)
:done
echo.
echo ============================================================
echo 초기화 완료!
echo ============================================================
echo.
echo 적용된 항목:
echo .gitignore - Python/빌드/IDE 파일 제외
echo .gitattributes - 줄바꿈 자동 관리 (LF/CRLF)
echo .gitmessage - 커밋 메시지 규칙 (feat/fix/docs...)
echo.
echo 다음 단계:
echo 1. 파일 추가: git add -A
echo 2. 첫 커밋: git commit -m "chore: 프로젝트 초기 설정"
echo 3. 푸시: git push -u origin master
echo.
endlocal

149
release.bat Normal file
View File

@@ -0,0 +1,149 @@
@echo off
chcp 65001 >nul
setlocal EnableDelayedExpansion
REM ============================================================
REM Gitea 릴리즈 스크립트 (글로벌)
REM
REM 어떤 프로젝트 폴더에서든 실행 가능
REM git remote 정보를 자동으로 읽어서 동작합니다
REM
REM 사용법: release [버전] [첨부파일경로]
REM 예시: release v1.0 dist\MyApp.exe
REM release v2.1
REM ============================================================
REM --- git remote에서 Gitea 정보 자동 추출 ---
for /f "tokens=*" %%a in ('git remote get-url origin 2^>nul') do set REMOTE_URL=%%a
if "%REMOTE_URL%"=="" (
echo [오류] git 저장소가 아니거나 remote가 설정되지 않았습니다.
echo git 프로젝트 폴더에서 실행해주세요.
exit /b 1
)
REM --- URL 파싱: http://host:port/owner/repo.git ---
REM .git 제거
set REMOTE_URL=%REMOTE_URL:.git=%
REM 마지막 두 경로에서 owner/repo 추출
for %%a in ("%REMOTE_URL%") do set REPO_NAME=%%~na
for %%a in ("%REMOTE_URL%") do set TEMP_PARENT=%%~dpa
set TEMP_PARENT=%TEMP_PARENT:~0,-1%
for %%a in ("%TEMP_PARENT%") do set OWNER=%%~na
REM base URL 추출 (owner 앞까지)
call set GITEA_URL=%%REMOTE_URL:/!OWNER!/!REPO_NAME!=%%
echo.
echo ============================================================
echo Gitea 릴리즈 스크립트
echo ============================================================
echo 서버 : %GITEA_URL%
echo 소유자: %OWNER%
echo 저장소: %REPO_NAME%
echo ============================================================
REM --- 버전 입력 ---
set VERSION=%~1
if "%VERSION%"=="" (
echo.
set /p VERSION="버전을 입력하세요 (예: v1.0): "
)
REM --- 첨부 파일 ---
set EXE_PATH=%~2
set HAS_FILE=0
if not "%EXE_PATH%"=="" (
if exist "%EXE_PATH%" (
set HAS_FILE=1
for %%F in ("%EXE_PATH%") do set EXE_NAME=%%~nxF
for %%F in ("%EXE_PATH%") do set EXE_SIZE=%%~zF
) else (
echo [경고] 파일을 찾을 수 없습니다: %EXE_PATH%
set /p CONTINUE="파일 없이 릴리즈만 생성할까요? (y/n): "
if /i not "!CONTINUE!"=="y" exit /b 1
)
)
echo.
echo 버전 : %VERSION%
if %HAS_FILE%==1 (
echo 파일 : %EXE_NAME% (%EXE_SIZE% bytes)
) else (
echo 파일 : 없음 (릴리즈만 생성)
)
echo.
REM --- 비밀번호 입력 ---
set /p GITEA_PASS="%OWNER% 계정 비밀번호: "
REM --- 1단계: 태그 생성 & 푸시 ---
echo.
echo [1/4] 태그 %VERSION% 생성 중...
git tag %VERSION% 2>nul
if %errorlevel% neq 0 (
echo 태그 %VERSION%이(가) 이미 존재합니다. 기존 태그를 사용합니다.
)
git push origin %VERSION% 2>nul
if %errorlevel% neq 0 (
echo [오류] 태그 푸시에 실패했습니다. 네트워크를 확인하세요.
exit /b 1
)
echo 태그 푸시 완료.
REM --- 2단계: 릴리즈 생성 (JSON 파일로 전송하여 한글 깨짐 방지) ---
echo [2/4] Gitea 릴리즈 생성 중...
REM 릴리즈 노트 입력 (선택)
set /p RELEASE_NOTE="릴리즈 노트 (Enter로 건너뛰기): "
if "!RELEASE_NOTE!"=="" set RELEASE_NOTE=%REPO_NAME% %VERSION%
REM JSON 파일 생성 (UTF-8)
echo {"tag_name": "%VERSION%", "name": "%VERSION% - %REPO_NAME%", "body": "## %REPO_NAME% %VERSION%\n\n!RELEASE_NOTE!", "draft": false, "prerelease": false}> _release_body.json
curl -s -o _release_resp.json -X POST "%GITEA_URL%/api/v1/repos/%OWNER%/%REPO_NAME%/releases" ^
-u "%OWNER%:%GITEA_PASS%" ^
-H "Content-Type: application/json; charset=utf-8" ^
-d @_release_body.json
REM --- 릴리즈 ID 추출 ---
for /f "tokens=2 delims=:," %%a in ('type _release_resp.json ^| findstr /r "\"id\":"') do (
set RELEASE_ID=%%a
goto :got_id
)
:got_id
set RELEASE_ID=%RELEASE_ID: =%
if "%RELEASE_ID%"=="" (
echo [오류] 릴리즈 생성 실패. 비밀번호 또는 권한을 확인하세요.
type _release_resp.json
del _release_resp.json _http_code.txt 2>nul
exit /b 1
)
echo 릴리즈 생성 완료 (ID: %RELEASE_ID%).
REM --- 3단계: 파일 업로드 ---
if %HAS_FILE%==1 (
echo [3/4] %EXE_NAME% 업로드 중... 잠시 기다려주세요.
curl -s -o _upload_resp.json -X POST "%GITEA_URL%/api/v1/repos/%OWNER%/%REPO_NAME%/releases/%RELEASE_ID%/assets?name=%EXE_NAME%" ^
-u "%OWNER%:%GITEA_PASS%" ^
-H "Content-Type: application/octet-stream" ^
--data-binary "@%EXE_PATH%"
echo 업로드 완료.
) else (
echo [3/4] 첨부 파일 없음. 건너뜁니다.
)
REM --- 4단계: 결과 출력 ---
echo [4/4] 완료!
echo.
echo ============================================================
echo 릴리즈 URL: %GITEA_URL%/%OWNER%/%REPO_NAME%/releases/tag/%VERSION%
echo ============================================================
echo.
REM --- 임시파일 정리 ---
del _release_resp.json _upload_resp.json _release_body.json 2>nul
endlocal

14
template/.gitattributes vendored Normal file
View File

@@ -0,0 +1,14 @@
# Auto-detect text files and normalize line endings
* text=auto
# Force LF for scripts and source files (Linux에서 실행되는 파일)
*.sh text eol=lf
*.py text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.env* text eol=lf
Dockerfile text eol=lf
# Force CRLF for Windows-only files
*.bat text eol=crlf
*.ps1 text eol=crlf

52
template/.gitignore vendored Normal file
View File

@@ -0,0 +1,52 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
dist/
*.egg-info/
*.egg
# 가상환경
venv/
.venv/
ENV/
env/
# 환경변수 (민감정보)
.env
.env.local
.env.*.local
# IDE
.idea/
.vscode/
*.swp
*.swo
.cursor/
# 로그
logs/
*.log
# 데이터베이스
*.db
*.sqlite3
# OS
.DS_Store
Thumbs.db
# Jupyter
.ipynb_checkpoints/
# 테스트
.pytest_cache/
.coverage
htmlcov/
# 임시 파일
*.tmp
*.bak

52
template/.gitmessage Normal file
View File

@@ -0,0 +1,52 @@
# <type>: <파일/컴포넌트> <제목> (70자 이내)
#
# <본문 - 변경 사항>
# - 항목1
# - 항목2
# - 항목3
#
# <파일별 상세 (필수)>
# 파일: <경로>
# - 변경 내용 1
# - 변경 내용 2
#
# <추가 컨텍스트/이유 (선택)>
#
# --- 커밋 규칙 ---
# Type:
# feat: 새 기능
# fix: 버그 수정
# docs: 문서 변경
# refactor: 리팩토링
# chore: 빌드/설정
# perf: 성능 개선
# test: 테스트
#
# 제목:
# - 70자 이내
# - 파일/컴포넌트 명시 (예: "admin.html", "logging_service.py", "관리자 페이지")
# - 명령형 ("추가", "수정")
# - 마침표 없음
# - 구체적으로
#
# 본문:
# - 불릿 포인트 사용
# - 무엇을, 왜 변경했는지
# - 파일별 상세 섹션 필수 (어떤 함수/클래스를 추가/수정했는지)
#
# 좋은 예시:
# feat: admin.html 세션 목록에 읽음 상태 뱃지 추가
#
# - localStorage 기반 세션 읽음 상태 관리
# - 읽지 않음 뱃지(빨강): 한 번도 클릭하지 않은 세션
# - 신규 메시지 뱃지(주황): 마지막 확인 이후 추가된 메시지 수
#
# 파일: apps/user_chatbot/static/admin.html
# - getSessionReadStatus() 함수 추가
# - markSessionAsRead() 함수 추가
# - getSessionBadges() 함수 추가
# - CSS: .badge-unread, .badge-new 스타일 추가
#
# 나쁜 예시:
# feat: 세션 목록에 뱃지 추가 (어느 파일인지 불명확)
# fix: 버그 수정 (무엇을 고쳤는지 불명확)