Python · Textual · Perforce / Helix · 키보드 우선

끊겨도 이어지는 Perforce 클라이언트

p4v 의 일상 개발 흐름(get · edit · submit · revert · reconcile · resolve)을 터미널 안에서 전부 다룹니다. 그리고 느리거나 불안정한 링크에서 자동 재연결 · 청크/재개 동기화 · 논블로킹 명령으로 버팁니다. SSH 한 줄, 아이폰 Blink, 얇은 tmux 분할 어디서든.

p4v-tui 메인 화면 — 왼쪽 트리, 오른쪽 체인지리스트 표와 상세 패널, 하단 로그.
Why p4v-tui

GUI 를 그대로 옮긴 게 아니라, 약한 네트워크에서 버티도록 다시 지었습니다

p4v 는 긴 호출 하나를 붙잡고 있다가 링크가 끊기면 통째로 다시 시작하게 만듭니다. p4v-tui 는 모든 긴 작업을 작은 청크로 쪼개 진행 상태를 디스크에 남깁니다 — 동기화 중간에 꺼도, 다음 실행이 멈춘 지점부터 이어집니다.

🔌

연결 회복력

자동 재연결(1s→30s 백오프), 청크·재개 가능한 대량 작업, 락을 놓고 재시도해 다른 명령이 사이에 끼어들 수 있는 논블로킹 실행.

🗂️

p4v 일상 기능 전부

Pending/Submitted, 트리 파일 작업, 디프·히스토리·블레임, 리졸브·셸브, Get Revision, 파일 속성, 라벨 태그까지 하루치 워크플로를 덮습니다.

⌨️

키보드 우선 · 마우스도

단축키 한 글자로 대부분의 동작. 한글 IME 를 켜도 두벌식 자모 별칭으로 그대로 작동하고, 표·트리·메뉴는 클릭도 됩니다.

📱

좁은 화면 · 모바일

100 컬럼 아래로 내려가면 단일 페이지 내비게이터로 자동 전환. 폰에서 세로로 봐도 빵부스러기·푸터가 폭에 맞춰 접힙니다.

The primary value

링크가 흔들려도 작업이 살아남습니다

p4v-tui 의 존재 이유. 재연결·재개·논블로킹이 앱 전체에 배어 있습니다.

중간에 끊겨도 이어지는 동기화

Get Latest 같은 긴 작업은 파일 단위 청크로 쪼개 완료 지점을 ~/.p4v-tui/sync-state/ 에 기록합니다. 연결이 끊기면 지수 백오프로 조용히 재연결하고, 다음 실행 때 멈춘 지점부터 재개합니다.

  • 자동 재연결 — 매 호출마다 1s→30s 백오프, 재시도 대기 중 락 해제
  • 중단된 작업은 다음 실행의 재개/버리기 피커로 개별 복구
  • Lost-ack 서브밋 멱등성 — 서버는 커밋했는데 응답만 유실돼도 다음 시도가 "이미 서브밋됨"으로 인식
  • 청크 전략 설정 가능(개수/크기/서브디렉토리) — [chunking]
상태 바에 표시된 자동 재연결 배너 — 재시도 2/8, 백오프 4초.
20 · ConnectionBar 의 자동 재연결 배너

지금 무슨 일이 벌어지는지 다 보입니다

p4v 의 한 줄짜리 상태 바 대신, 모든 p4 호출·청크 작업·오류가 타임스탬프와 함께 쌓이는 로그 패널과, 부모/자식 명령이 어떻게 쪼개지는지 보여주는 커맨드 모니터(F2)를 둡니다.

  • 커맨드 모니터 — 명령별 ETA 와 청크 분해 트리
  • 예외는 크래시 대신 로그로 라우팅 + ~/.p4v-tui/last-error.log 기록
  • 150ms 이하 즉답은 스피너를 숨겨 깜빡임 없이, 1s·8s 넘으면 단계적으로 알림
커맨드 모니터 — 부모/자식 명령 트리와 진행 상태.
08 · 커맨드 모니터(F2) — 청크 분해가 보인다
Daily workflow

하루치 Perforce 를, 손을 키보드에서 떼지 않고

체인지리스트부터 디프·리졸브·검색까지 — 모든 화면은 실제 앱이 그린 그대로의 스크린샷입니다.

크로스 워크스페이스 Pending + 서브밋 가드

현재 사용자의 모든 워크스페이스에 걸친 미제출 CL 을 한 표에 모읍니다. 다른 워크스페이스의 것은 흐리게 + 노란 마커로 구분하죠. Ctrl+S 서브밋 전에는 미해결·초대형 파일·빈 CL 경고를 먼저 띄워 되돌아갈 틈을 줍니다.

  • 회복형 서브밋 — 드롭에도 투명 재시도, lost-ack 인식
  • 기본 CL 격리 — 파일을 여는 모든 동작이 새 번호 CL 로 들어감
  • Jira 키 감지 — CL 설명의 이슈 키로 브라우즈 URL 제안([jira])
Pending 체인지리스트 — 크로스 워크스페이스 ↗ 마커. 서브밋 확인 — 미해결 파일 경고와 회복형 재시도 설명.
02 · 크로스 워크스페이스 Pending  /  13 · 서브밋 가드

트리에서 바로 파일 작업 + 상태 마커

워크스페이스/디팟 트리에서 파일마다 p4 fstat 기반 한 글자 마커(e 편집 · + 추가 · * 오래됨 · · 미동기화)를 보여줍니다. 커서에서 m 으로 맥락 메뉴 — Get Latest, Check Out, Revert, Reconcile, Annotate, Time-lapse 까지.

  • Space 다중 선택 → 한 번의 호출로 여러 파일을 한 CL 에
  • 대화형 Reconcile / Clean — -n 미리보기 후 파일별 체크
  • 트리 클립보드 — Ctrl+C/X/V 로 copy/move 후 자동 서브밋
워크스페이스 트리 — 파일 상태 마커. 워크스페이스 트리 파일 맥락 메뉴 — Get Latest, Check Out, Revert 등.
06 · 상태 마커  /  26 · 파일 맥락 메뉴

디프 · 히스토리 · 블레임

제출된 CL 은 Ctrl+D 로 통합 디프, 메뉴로 나란히 보기. 임의의 두 경로·리비전·CL 은 Ctrl+Shift+D 로 비교합니다. 파일마다 라인별 블레임, 텍스트 모드 리비전 그래프, 리비전을 걸어보는 타임랩스까지.

  • 나란히 보기(side-by-side) 디프 — 모든 임의 디프 결과에 재사용
  • Annotate — 각 라인을 마지막으로 바꾼 CL·사용자·날짜
  • Revision Graph — 통합(filelog -i) 히스토리를 텍스트로
나란히 보기 디프 뷰어. Annotate / 블레임 — 라인별 체인지리스트.
17 · 나란히 디프  /  22 · Annotate 블레임

리졸브 · 인앱 3-way 머지

충돌 파일은 Auto / Yours / Theirs / Skip 을 파일별로 고르는 리졸브 피커로. 그 자리에서 Ctrl+E 를 누르면 인앱 3-way 머지 에디터가 열려 헝크마다 Yours/Theirs/Base/Both 를 고를 수 있고, Ctrl+T 로 외부 머지 툴(P4Merge 등)도 띄웁니다.

  • 전체/부분 셸브 사이클 — 서브밋 전 파일 선택 피커
  • 이미 리졸브한 파일 재리졸브 — -f -c 스코프
리졸브 피커 — 파일별 Auto/Yours/Theirs/Skip.
21 · 리졸브 피커(Ctrl+E 로 3-way 에디터)

빠른 검색과 어디로든 이동

로컬 SQLite 인덱스로 타이핑하는 즉시 파일명을 찾는 Fast Search(Ctrl+F) — 미리보기와 매치 하이라이트, 느슨한 매칭 사다리(부분→토큰 AND→Levenshtein "이거 찾으셨나요"). ?쿼리 내용 grep, cl: 설명 검색, @user:·type: 필터까지.

  • Go-to-path(Ctrl+G) — 디팟/로컬/퍼머링크 붙여넣기로 트리 점프
  • 불변 퍼머링크(Alt+C) — 이동/이름변경을 따라가는 안정 주소
  • 퍼머링크 기반 북마크(Ctrl+B) — 경로가 옮겨져도 살아남음
Fast Search — 즉시 결과와 미리보기. Go to path — 경로 붙여넣기로 트리 점프.
09 · Fast Search  /  10 · Go-to-path

인앱 파일 뷰어 · 설정 GUI

텍스트 리프에서 Enter — 외부 뷰어로 새지 않고 문법 하이라이트된 파일을 바로 봅니다(이미지는 반블록 ANSI, 바이너리는 헥스). 연결 정보·프로파일·청크 전략은 Ctrl+, 설정 화면에서 TOML 을 직접 편집·저장합니다.

  • 파일 뷰어 — 5MB 상한, 1000줄 청크 렌더, 라인번호 토글(n)
  • 여러 서버 프로파일 — 시작 시 피커, 설정에서 추가/편집/삭제
  • 워크스페이스가 자기를 기억 — 창 크기·활성 탭·포커스·정렬 영속
인앱 파일 뷰어 — 문법 하이라이트. 설정 화면 — 인앱 TOML 편집기 / 프로파일.
07 · 파일 뷰어  /  15 · 설정 GUI

폰에서도, 얇은 분할에서도

같은 느린 링크는 대개 작은 원격 화면이기도 합니다. 100 컬럼 아래에서 단일 페이지 내비게이터로 자동 전환 — Tab/Shift+Tab 으로 트리→pending→history→submitted→log 를 넘깁니다(Blink 이 Tab 은 보내도 Ctrl+화살표는 안 보내므로 폰에서 신뢰성 있게).

  • 숫자 19 페이지 점프, Backspace
  • 폭 적응형 표 — 좁으면 CL 표를 Change · Description
  • 한글 IME 두벌식 자모 별칭 · CJK 셀폭 인식 자름
좁은 화면 페이지 내비게이터(48 컬럼).
12 · 좁은 모드 페이지 내비게이터(48 컬럼)
2
백엔드 — P4Python & p4 CLI 자동 선택
1s→30s
재연결 지수 백오프
0
데몬 · 플러그인 — 단일 진입점
100
컬럼 아래 자동 좁은 모드
Install

설치하고 실행하기

Python 3.12+ 와 Perforce 백엔드 하나(P4Python 또는 p4 CLI)면 됩니다.

1 · 클론 후 실행

가상환경을 만들고 의존성을 설치한 뒤 바로 띄웁니다. Perforce 접속은 P4 환경변수 / P4CONFIG / p4v-tui.toml 중 아무거나 잡히는 것을 씁니다.

인증(login/ticket/SSO)은 일부러 앱 밖에 둡니다 — 보안 경계는 p4 CLI 에 그대로 남깁니다.

# 1) 소스 받기
$ git clone https://github.com/neoocean/p4v-tui
$ cd p4v-tui

# 2) 가상환경 + 의존성
$ python3 -m venv .venv && source .venv/bin/activate
$ pip install -r requirements.txt

# 3) 실행
$ python p4v.py

2 · p4v 래퍼로 어디서든

번들된 p4v 래퍼를 PATH 에 심어두면 어느 디렉토리에서든 실행됩니다. .venv 가 없으면 알아서 만들고 의존성을 설치한 뒤 띄웁니다.

  • 백엔드는 P4V_BACKEND=python|cli 로 강제 가능
  • 자동 부트스트랩 끄기 — P4V_NO_AUTO_SETUP=1
  • 테스트 — python -m pytest tests/ -q
# PATH 에 래퍼 심기
$ ln -sf "$PWD/p4v" ~/.local/bin/p4v

# 이제 어디서든
$ p4v

# 백엔드 고르기(선택)
$ P4V_BACKEND=python p4v   # P4Python
$ P4V_BACKEND=cli    p4v   # p4 CLI
⚠️ 보안[[macro]] 와 Open With… 항목은 로컬 명령을 실행합니다. 신뢰할 수 없는 p4v-tui.toml 을 실행하지 마세요.
Get it

내려받기 · 더 알아보기

공개 저장소는 GitHub 에, 상세 사용법은 가이드에 있습니다.

버그 제보 · 기능 제안 · 무엇이든 환영합니다.