//depot/… — 읽기 + 쓰기

디포 전체를,
브라우저 탭 하나에.

p4-web은 Perforce를 위한 가벼운 웹 UI입니다 — 개인과 소규모 팀 크기에 맞춘 P4V / Swarm 대안. 탐색, 블레임, 디프, 검색, 리뷰, 작업이 어디로 가는지 보는 통계에 편집 & 서브밋까지, p4 CLI를 호출하는 FastAPI 프로세스 하나로 모두 처리합니다. 데이터베이스 서버 없음, 빌드 단계 없음, 프레임워크 없음.

p4 diff2 //you/workflow#before //you/workflow#after
·@@ 당신의 Perforce 워크플로 @@
1-코드를 읽을 일이 있는 모든 머신에 P4V 설치
2-채팅에 체인지리스트 링크 하나 걸자고 Swarm 구축
1+./run.sh # 프로세스 하나, 설정은 거의 없음
2+open http://127.0.0.1:8080 # p4 계정으로 로그인
3 프로텍션은 그대로 — 모든 호출은 당신의 권한으로 실행
CL 69156
읽기 전용 코어

P4V 열 일, 전부 브라우저에서

카드마다 실제로 실행되는 p4 명령이 붙어 있습니다 — 앱은 얇고 정직한 래퍼라서 결과가 CLI와 정확히 일치합니다.

p4 dirs

디포 브라우저

브레드크럼, 정렬 가능한 목록, 딥링크와 동기화되는 P4V 스타일 지연 로딩 트리 사이드바. 경로에 별을 달면 홈 대시보드에 최근 변경과 함께 올라옵니다.

p4 print

파일 뷰어

신택스 하이라이팅(번들 포함, 오프라인 동작), 줄 번호 거터, 리비전 드롭다운, 줄 퍼머링크.

p4 filelog

히스토리 & 그래프

이름 변경·브랜치를 아우르는 전체 히스토리, 통합 이력을 담은 SVG 리비전 그래프.

p4 diff2

디프 도구

어디서나 unified / side-by-side: 임의 리비전 쌍, 폴더 디프, 셸브-대-베이스 비교.

p4 annotate

타임랩스 블레임

줄별 체인지리스트 + 작성자 거터, 히스토리의 어느 시점으로든 되감아 다시 블레임하는 슬라이더.

p4 changes

체인지리스트

사용자·경로·텍스트·날짜 필터 — 증분 로컬 인덱스 덕에 설명·파일명 검색이 빠르고, 목록은 스크롤을 따라 계속 이어집니다.

p4 grep

검색

디포 전역 파일명 검색과 범위 내 내용 검색; 결과를 클릭하면 하이라이트된 줄로 이동합니다.

p4 labels …

메타데이터 브라우저

레이블, 잡(픽스 포함), 브랜치 매핑, 스트림, 사용자 & 그룹 — “More” 메뉴 하나에.

app-side

리뷰

어느 줄에나 코멘트를 달 수 있고 diff 안에서도 바로 됩니다. @이름으로 부르면 상대에게 배지가 뜨고, 체인지리스트에 승인·보완요청 상태를 달 수 있습니다. 마크다운 렌더링·README 패널·이미지 미리보기도 그대로입니다.

app-side

통계

일·주·월·연 단위 서브밋, 드릴다운이 되는 경로별 서브밋, 계정별 서브밋 — 세 차트가 하나의 필터를 공유하고, 막대를 누르면 그 구간의 변경 목록으로 넘어갑니다.

app-side

필요 없으면 끄기

리뷰·코멘트·멘션·쓰기 작업·즐겨찾기·통계·빠른 인덱스는 각각 끌 수 있습니다 — 서버를 운영하는 쪽이 인스턴스 전체에 대해, 또는 설정에서 나만 끕니다. 꺼진 기능은 화면에서만 사라지는 게 아니라 응답도 하지 않습니다.

CL 65181
쓰기 작업

My Changes: 브라우저에서 편집하고 서브밋

사용자마다 서버 측 워크스페이스(p4web-<user>)가 스파스 싱크로 만들어집니다 — 파일은 작업하는 동안에만 나타납니다.

할 수 있는 일

  • 펜딩 체인지리스트 생성, 설명 수정, 또는 삭제
  • 웹 에디터에서 텍스트 파일 편집
  • 새 파일·교체 파일 업로드, 바이너리 안전
  • 삭제 마크, 리버트, 셸브 / 언셸브
  • 전체 파일 목록을 보여주는 확인 대화상자를 거쳐 서브밋

가드레일

  • 자신의 p4-web 펜딩 체인지리스트만 조작할 수 있습니다
  • 모든 쓰기는 data/audit.log에 기록됩니다
  • 계정·IP별 로그인 스로틀링, 세션별 API 요청 제한
  • Perforce 프로텍션 그대로 — 서버가 권한을 올려주지 않습니다
CL 65217
run.sh

1분 안에 실행

스크립트 하나가 venv를 만들고 버전이 고정된 의존성 세 개를 설치한 뒤 서빙합니다.

$ git clone https://github.com/neoocean/p4-web.git && cd p4-web
$ export P4WEB_P4PORT=ssl:perforce.example.com:1666  # 또는 P4PORT 상속
$ ./run.sh
# 다음과 동일:
$ python3 -m venv .venv
$ .venv/bin/pip install -r requirements.txt
$ .venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8080
# 이후 http://127.0.0.1:8080 을 열고 Perforce 계정으로 로그인

필요: Python 3.10+ · PATH에 있는 p4 CLI · Perforce 서버 네트워크 접근

git이 없다면? 소스를 .zip으로 다운로드

CL 65319
보안 리뷰

보안은, 지루한 방식으로

코드 리뷰·보안 감사·실제 구동 인스턴스 대상 레드팀까지, 두 차례의 상시 검수로 끝에서 끝까지 점검했습니다. 핵심 경계는:

  • 당신의 티켓, 당신의 권한. 모든 API 호출은 세션 사용자의 티켓으로 p4를 실행합니다 — Perforce 프로텍션이 P4V에서와 똑같이 적용됩니다.
  • 티켓 유출 없음. 모든 서브프로세스의 P4TICKETS/dev/null을 가리킵니다 — 서버를 구동하는 OS 사용자의 티켓 파일로는 절대 인증되지 않습니다.
  • 비밀번호는 저장하지 않습니다. 자격 증명은 p4 login 티켓으로 교환되며, Swarm처럼 티켓 값을 직접 붙여넣을 수도 있습니다.
  • 명령 허용 목록. p4 래퍼는 알려진 명령만 허용합니다; 쓰기 작업은 자신의 p4-web 체인지리스트로 한정되고 감사 기록이 남습니다.
  • 강화된 엔드포인트. 스트리밍 raw 다운로드와 제한된 업로드 스풀링(100 MB 버퍼 없음), 세션별 요청 제한, Secure 쿠키, 로그인 스로틀링.
  • 지루한 배포. 컨테이너는 비루트 사용자로 실행되고, 번들된 p4 클라이언트는 공개된 SHA-256으로 검증하며, 모든 파이썬 의존성은 정확한 버전으로 고정합니다.
CL 65715
배포

셸이 있는 곳이면 어디든 배포

세션은 SQLite(data/sessions.db)에 보존되어 재시작해도 로그아웃되지 않으며, Perforce 티켓이 유효한 동안 그대로 유지됩니다. ssl: 서버의 지문은 컨테이너 엔트리포인트가 처리합니다 — P4WEB_P4FINGERPRINT로 고정하거나, 신뢰할 수 있는 망에서는 P4WEB_AUTO_TRUST=1로 첫 접속 시 수락. Docker가 아니라면 p4 trust를 한 번 직접 실행하세요.

Docker

이미지에 p4 CLI가 포함되어 있고, 세션과 SSL 신뢰 파일은 /data 볼륨에 저장됩니다.

docker compose up -d

macOS · launchd

상시 구동되는 로컬 서비스: deploy/com.p4web.launchd.plist의 경로를 수정해 ~/Library/LaunchAgents/로 복사 — 테일넷과 궁합이 좋습니다.

launchctl load ~/Library/LaunchAgents/com.p4web.plist

Linux · systemd

표준 유닛 파일; 경로를 수정하고 enable 하면 끝입니다.

systemctl enable --now p4web
CL 65220
앱 구조

읽을 수 있을 만큼 작게

app/
  main.py      FastAPI 라우트: 인증, 탐색, 파일, 디프, 어노테이트,
               체인지, 코멘트, 워크스페이스 쓰기 작업
  p4.py        p4 CLI 래퍼: -G 마샬 파싱, 경로 이스케이프,
               명령 허용 목록, 오류 → HTTP 매핑
  sessions.py  쿠키 sid → {user, ticket}, 즐겨찾기·코멘트
               스레드·리뷰 상태·멘션까지 — 모두 SQLite 저장
  index.py     사용자별 체인지리스트 검색 인덱스(프로텍션 준수)
  workspace.py 쓰기 작업을 뒷받침하는 사용자별 p4web-<user> 워크스페이스
static/
  index.html   로그인 화면 + 앱 셸
  app.js       해시 라우팅 SPA — 프레임워크 없음, 빌드 없음
  style.css    라이트 + 다크, 768px 미만 반응형
  vendor/      highlight.js, marked, DOMPurify (오프라인)

스택 전체가 파이썬 프로세스 하나와 정적 파일 디렉터리입니다. 뭔가 고장 나면, 고장 난 코드는 커피 한 잔 하는 동안 읽을 수 있을 만큼 짧습니다 — 그리고 모든 기능은 이미 알고 있는 p4 명령에 대응합니다.