-
Notifications
You must be signed in to change notification settings - Fork 3
Source Code Map
simple_rcs/
simple_rcs.py ํต์ฌ ํด๋์ค (2344์ค) โ ์ฌ๊ธฐ๊ฐ ์ฌ์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด
codec.py ํฌ๋งท ํ๋ฆฌ๋ฏธํฐ๋ธ (๋ฐ์ด๋๋ฆฌ ์ธ์ฝ๋ฉ, ํด์, ์ด์ค์ผ์ดํ)
matchers.py diff ๋ฐฑ์๋ ๋ ์ง์คํธ๋ฆฌ (import ์์ ์ ํด์, ํด๋ฐฑ ํฌํจ)
gitpatch.py git ํธํ ๋ฐ์ด๋๋ฆฌ ํจ์น ์ถ๋ ฅ (๋ด๋ณด๋ด๊ธฐ ์ ์ฉ)
pydifflib.py ํ๋ก๋์
diff ์์ง (StreamSequenceMatcher)
pybsdiff.py ๋ฐ์ด๋๋ฆฌ ๋ธํ (BSDIFF40 ํธํ)
myersdiff.py ์์ ํ์ด์ฌ Myers ์๊ณ ๋ฆฌ์ฆ (์ฐธ๊ณ /๋ฒค์น๋งํฌ์ฉ)
myersdiff_ses.py Myers SES ๋ณํ
myersdiff_dmp.py Myers, diff-match-patch ์คํ์ผ offset ๋ฒ์
_myersdiff_ses.pyx ์ SES๋ฅผ Cython์ผ๋ก ํฌํ
_myersdiff_dmp.pyx ์ DMP๋ฅผ Cython์ผ๋ก ํฌํ
simple_rcs_gpg.py GPG ์๋ช
/๊ฒ์ฆ ์ฝ๋ฐฑ
adapters.py psycopg2 large object์ฉ ์คํธ๋ฆผ ์ด๋ํฐ
tools/
srcs_commit.py ํ์ผ์ ์ปค๋ฐํ๋ CLI
srcs_log.py ํ์คํ ๋ฆฌ/์๋ช
๋ชฉ๋ก ์ถ๋ ฅ
srcs_diff.py ๋ฒ์ ๊ฐ, ํน์ ์์ง ๊ฐ unified diff
srcs_blame.py ๋ผ์ธ๋ณ ์ ์/๋ฒ์ ๊ท์
srcs_verify.py ํด์์ฒด์ธ + GPG ์๋ช
๊ฒ์ฆ
srcs_sign_head.py ํ์ฌ HEAD์ GPG ์๋ช
์ถ๊ฐ
bench_diff.py diff ์์ง ๋ฒค์น๋งํฌ (์๊ฐ + ๋ฉ๋ชจ๋ฆฌ)
compare_memory_usage.py ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋น๊ต ์ ํธ
tests/unit_tests/ pytest ์ค์ํธ (186๊ฐ ํ
์คํธ)
docs/ ์ค๊ณ/๋ฒค์น๋งํฌ ๋ฉ๋ชจ
scripts/ ์ผํ์ฑ ์คํ์ฉ ๋ฒค์น๋งํฌ ์คํฌ๋ฆฝํธ (์ํค ๋ฐฑ์๋ ๋ฑ)
SimpleRCS ํด๋์ค ํ๋๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ค์ ์ ๋ถ๋ค. ๊ณต๊ฐ ๋ฉ์๋๋
์ด ์ ๋๋ค:
| ๋ฉ์๋ | ์ญํ |
|---|---|
commit(content, author, log, ...) |
์ ๋ฒ์ ์ ์ฅ (ํ ์คํธ/๋ฐ์ด๋๋ฆฌ, ์ค๋ ์ท ์ต์ ) |
checkout(ver_num=None) |
ํน์ ๋ฒ์ ๋ณต์ (๊ธฐ๋ณธ์ HEAD) |
log(limit=None, reverse=False) |
ํ์คํ ๋ฆฌ ๋ฉํ๋ฐ์ดํฐ ๋ชฉ๋ก |
diff(ver_a, ver_b) |
๋ ๋ฒ์ ๊ฐ unified diff |
blame(depth=None) |
HEAD์ ๊ฐ ๋ผ์ธ์ด ์ด๋ ๋ฒ์ /์ ์ ๊ฒ์ธ์ง |
sign_head(signer_callbacks) |
HEAD์ GPG ์๋ช ์ถ๊ฐ |
verify(verifier_callbacks=None) |
ํด์์ฒด์ธ + ์๋ช ์ ์ฒด ๊ฒ์ฆ |
verify_block_signature(...) |
๋ธ๋ก ํ๋์ ์๋ช ๋ง ๊ฒ์ฆ |
get_content() |
์คํธ๋ฆผ ์ ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ |
get_bytes() |
์คํธ๋ฆผ ์ ์ฒด๋ฅผ ๋ฐ์ดํธ ๊ทธ๋๋ก ๋ฐํ (raw/base85 ๋ธ๋ก์ด ์์ฌ ์์ผ๋ฉด ์ด์ชฝ) |
์์ฑ์๋ durable(๊ธฐ๋ณธ True)์ ๋ฐ๋๋ค โ ํ์ผ ๊ฒฝ๋ก ๋ฐฑ์๋์์ ์ปค๋ฐ์
fsyncํ ์ง ์ฌ๋ถ๋ค.
๋ด๋ถ์ ์ผ๋ก๋ ์คํธ๋ฆผ์ ๋์์๋ถํฐ ์ญ๋ฐฉํฅ์ผ๋ก ์ค์บํ๋ ๋ก์ง
(_load_head, _get_prev_block)์ด ์ ์ผ ์ค์ํ ๋ถ๋ถ์ด๋ค. ํ์ผ ์ ์ฒด๋ฅผ
๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ ํ์ํ ๋ธ๋ก๋ง ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ํ์คํ ๋ฆฌ๊ฐ ๊ธธ์ด์ ธ๋
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ง ์๋๋ค. ๋ธ๋ก ๊ฒฝ๊ณ๋ ver @ ๋ง์ปค๋ฅผ ์ฐพ์ ๋ค @
ํจ๋ฆฌํฐ๋ก ํ์ ํ๋ค (Storage Format).
์ฐ๊ธฐ ์ชฝ์ _rewrite_head๊ฐ ๊ฐ๋ฆผ๊ธธ์ด๋ค. ํ์ผ ๊ฒฝ๋ก ๋ฐฑ์๋๋
_atomic_rewrite_head(prefix ๋ณต์ฌ โ ์์ ํ์ผ โ os.replace)๋ก ๊ฐ๊ณ ,
๋ฉ๋ชจ๋ฆฌยทํธ์ถ์ ์คํธ๋ฆผ์ _rewrite_head_in_place๋ก ๊ฐ๋ค. ํ๊ดด์ ์ฐ๊ธฐ๊ฐ
์ฝ๋๋ฒ ์ด์ค์ ํ ๊ณณ๋ง ์๋๋ก ๋ ์ปค๋ฐ ๊ฒฝ๋ก(commit/sign_head)๊ฐ ๋ชจ๋
์ฌ๊ธฐ๋ฅผ ์ง๋๋ค.
์ฐ๋ฆฌ ์ ์ฅ ํฌ๋งท(BSDIFF + ๋ธ๋ก)์ ๋ค๋ฅธ ๋๊ตฌ๊ฐ ์ฝ์ง ๋ชปํ๋ค. ์ด ๋ชจ๋์ ๋ด๋ณด๋ด๊ธฐ
๊ฒฝ๋ก๋ค โ ๋ ๋ฆฌ๋น์ ์ ๋ณต์ํ ๋ค git diff --binary๊ฐ ์ฐ๋ ํํ
(GIT binary patch + literal ๋ธ๋ก, zlib + git์ base85 ์ค ํ๋ ์ด๋ฐ)๋ก
๊ฐ์ธ์ git apply๊ฐ ์๋นํ ์ ์๊ฒ ํ๋ค. tools/srcs_diff.py --binary๊ฐ
์ ์ผํ ํธ์ถ์๋ค.
SimpleRCS ์ธ์คํด์ค์ ๋ฌด๊ดํ๊ฒ ๋
๋ฆฝ์ ์ผ๋ก ํ
์คํธ ๊ฐ๋ฅํ ์์ ํจ์๋ค.
๋ฐ์ด๋๋ฆฌ ํ์ด๋ก๋ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ(encode_binary/decode_binary,
base64/base85/raw ์ง์), @...@ ๊ฐ ์์ @ ์ด์ค์ผ์ดํ, v2 ๋ธ๋ก ํด์
๊ณ์ฐ์ด ์ฌ๊ธฐ ์๋ค. SimpleRCS๋ ์๊ธฐ ์ค์ (hash_algo, encoding)์
์ธ์๋ก ๋๊ฒจ์ ์ด ํจ์๋ค์ ํธ์ถํ๋ค.
-
pydifflib.py์StreamSequenceMatcherโ ์ค์ ๋ก ์ปค๋ฐ ๊ฒฝ๋ก์์ ์ฐ์ด๋ ์ ์ผํ ์์ง. ํด์ ๊ธฐ๋ฐ ๊ทธ๋ฆฌ๋ ๋งค์นญ + ๊ต์ฒด ๊ตฌ๊ฐ๋ง ํ์ค difflib์ผ๋ก ๋ค๋ฌ๋ ํ์ด๋ธ๋ฆฌ๋. ์ต๋จ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฅํ์ง ์์ง๋ง ๋น ๋ฅด๋ค. -
myersdiff*.pyโ ์ ํต Myers O(ND) ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ์ด์ฌ ๊ตฌํ. SES(์ต๋จ ํธ์ง ์คํฌ๋ฆฝํธ) ๋ณํ๊ณผ diff-match-patch ์คํ์ผ offset ๊ธฐ๋ฐ ๋ณํ ๋ ๊ฐ์ง๊ฐ ์๋ค. ๋ ๋ค ์ต๋จ ํธ์ง ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฅํ์ง๋ง, ์๋ก ๋ค๋ฅธ ์ ๋ ฅ ํน์ฑ์์ ์ฑ๋ฅ์ด ๊ฐ๋ฆฐ๋ค. -
_myersdiff_{ses,dmp}.pyxโ ์ ๋ ๊ฐ๋ฅผ Cython์ผ๋ก ํฌํ ํ ๊ฒ. ๋น๋๋ผ ์์ผ๋ฉด ์ด๊ฒ ๊ธฐ๋ณธ ๋ฐฑ์๋๋ค (matchers.py๊ฐ import ์์ ์dmp_cythonโses_cythonโstream์์ผ๋ก ํด์). ์ค์ธก์ผ๋ก ํด๋ฐฑ์ธStreamSequenceMatcher๋ณด๋ค ~14๋ฐฐ, ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ์ด์ฌ ๊ตฌํ๋ณด๋ค ~300๋ฐฐ ๋น ๋ฅด๋ค. ์์ ํ์ด์ฌ ์๋ฅ์ด๋ ํด๋ฐฑ ๋์์ด ์๋๋ผ ์ด๋ฆ์ผ๋ก๋ง ์ ํ๋๋ค.
์ ์ด๋ ๊ฒ ์ฌ๋ฌ ๋ฒ์ด ์กด์ฌํ๋์ง, ์ค์ ๋ก ๋ญ ์จ์ผ ํ๋์ง๋ Diff Engines์์ ๋ ๊น๊ฒ ๋ค๋ฃฌ๋ค.
ํ
์คํธ๊ฐ ์๋ ์ฝํ
์ธ (bytes)๋ฅผ ์ปค๋ฐํ ๋ ์ฐ์ธ๋ค. BSDIFF40 ํฌ๋งท๊ณผ
ํธํ๋๋๋ก ๋ง๋ค์ด์ ธ ์์ด์, ์์คํ
์ ์ค์น๋ ๋ค์ดํฐ๋ธ bsdiff/bspatch
๋๊ตฌ๋ก๋ ํจ์น๋ฅผ ๋ง๋ค๊ณ ์ ์ฉํ ์ ์๋ค.
gpg ๋ฐ์ด๋๋ฆฌ๋ฅผ ์๋ธํ๋ก์ธ์ค๋ก ํธ์ถํด์ ์๋ช
์ ๋ง๋ค๊ณ ๊ฒ์ฆํ๋ค.
SRCS_GPGSIGN_PATH ํ๊ฒฝ๋ณ์๋ก gpg ์คํ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
SimpleRCS.sign_head()/verify()๊ฐ ์ฝ๋ฐฑ ํํ๋ก ์ด ๋ชจ๋์ ํจ์๋ค์
๋ฐ์์ ์ฐ๋ ๊ตฌ์กฐ๋ผ, GPG๊ฐ ์๋ ๋ค๋ฅธ ์๋ช
๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ณ ์ถ์ผ๋ฉด ๊ฐ์
์ฝ๋ฐฑ ์๊ทธ๋์ฒ๋ก ์๋ก ๋ง๋ค์ด ๋ผ์ฐ๋ฉด ๋๋ค.
SimpleRCS๊ฐ ๊ธฐ๋ํ๋ ๊ฑด BinaryIO๋ฟ์ด๋ผ, psycopg2์ large object์ฒ๋ผ
BinaryIO๋ฅผ ์์ํ์ง ์๋ ํ์ผ ๋น์ทํ ๊ฐ์ฒด๋ ๊ทธ๋๋ก ๋ชป ๋๊ธด๋ค.
PsycopgLargeObjectAdapter๊ฐ ๊ทธ ํ์ ๋ฉ์์, PostgreSQL large object๋ฅผ
.srcs ํ์ผ ๋์ ๊ทธ๋๋ก ๋ฐฑ์๋๋ก ์ธ ์ ์๊ฒ ํด์ค๋ค. ์ด ์ด๋ํฐ๊ฐ
์ ํน๋ณํ ์ ๋ง๋์ง๋ Wiki Backend Design์์ ๋ค๋ฃฌ๋ค.
๊ฐ ์คํฌ๋ฆฝํธ๋ SimpleRCS๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ ธ๋ค ์ฐ๋ ์์ CLI ๋ํผ๋ค.
uv run tools/<์ด๋ฆ>.py๋ก ์ ์ฅ์ ๋ฃจํธ์์ ๋ฐ๋ก ์คํํ๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฝ๋๋ logging๋ง ์ฐ๊ณ ์ ๋ printํ์ง ์๋ ๊ฒ ์์น์ด์ง๋ง, tools/
์๋ ์คํฌ๋ฆฝํธ๋ค์ CLI ์ถ๋ ฅ์ด ๋ณธ์
์ด๋ผ ์ด ๊ท์น์์ ์์ธ๋ค. ๊ฐ ๋๊ตฌ๊ฐ
์ ํํ ๋ญ ํ๋์ง๋ CLI Tools ์ฐธ๊ณ .
pyproject.toml์ [build-system]์ด setuptools + Cython์ ์ฐ๋๋ก
์ค์ ๋ผ ์๊ณ , ext-modules์ _myersdiff_ses/_myersdiff_dmp ๋
Cython ํ์ฅ์ด ๋ฑ๋ก๋ผ ์๋ค. uv syncํ ๋ ๊ฐ์ด ๋น๋๋๋ค. .pyx ํ์ผ์
๊ณ ์น๋ฉด ๋ค์ ๋น๋ํด์ผ ๋ฐ์๋๋ค.