//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 65134
읽기 전용 코어

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

리뷰 기능

README 패널이 있는 마크다운 렌더링, 스레드형 파일/줄 인라인 코멘트, 이미지 미리보기, raw 다운로드.

CL 65170
쓰기 작업

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

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

할 수 있는 일

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

가드레일

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

1분 안에 실행

스크립트 하나가 venv를 만들고 의존성 두 개를 설치한 뒤 서빙합니다.

$ git clone https://github.com/neoocean/p4-web.git && cd p4-web
$ ./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 65207
보안 리뷰

보안은, 지루한 방식으로

코드 리뷰·보안 감사·레드팀까지 끝에서 끝까지 검토했고, 결과 문서는 저장소에 있습니다. 핵심 경계는:

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

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

세션은 SQLite(data/sessions.db)에 보존되어 재시작해도 로그아웃되지 않습니다. ssl: 서버는 P4WEB_AUTO_TRUST=1로 첫 접속 시 지문을 수락합니다.

Docker

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

docker compose up -d

macOS · launchd

LaunchAgent plist로 상시 구동되는 로컬 서비스 — 테일넷과 궁합이 좋습니다.

launchctl load com.p4web.plist

Linux · systemd

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

systemctl enable --now p4web
CL 65141
handoff

읽을 수 있을 만큼 작게

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

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