Revlog
ตั้งแต่ Mercurial 0.9 มีการแก้ไขและเปลี่ยนไปใช้รูปแบบ revlog ใหม่: ดู [:ThaiRevlogNG]
revlog เป็นโครงสร้างข้อมูลที่สำคัญที่สุดในเมอร์คิวเรียล เพราะมันเก็บประวัติทุกอย่างของแต่ละไฟล์ใน [:ThaiRepository:repository] เมอร์คิวเรียลจะทำการบีบอัดไฟล์ฉบับเต็มแต่ละเวอร์ชั่นและเก็บไว้หรืออาจจะเก็บเฉพาะความต่างระหว่างเวอร์ชั่นปัจจุบันกับเวอร์ชั่นก่อนหน้า (compressed delta) ใน revlog ก็ได้ โดยเมอร์คิวเรียลจะตัดสินใจว่าจะเก็บข้อมูลแบบไหนโดยดูขนาดของข้อมูลที่จะต้องใช้เพื่อสร้างไฟล์แต่ละเวอร์ชั่นขึ้นมา วิธีนี้ทำให้เมอร์คิวเรียลไม่ต้องดึงข้อมูลประวัติจำนวนมากเพื่อสร้างไฟล์เวอร์ชั่นใดเวอร์ชั่นหนึ่งขึ้นมา ไม่ว่าจะมีประวัติมากน้อยเท่าไรก็ตาม
การสร้างไฟล์แต่ละเวอร์ชั่นจะใช้การอ่านแค่ครั้งเดียวเท่านั้นถ้าเมอร์คิวเรียลรู้ว่าจะต้องอ่านที่ไหนและเมื่อไร เพราะฉะนั้น revlog แต่ละอันจะมีดัชนี เช่น .hg/store/data/somefile.i ซึ่งเก็บ record ขนาดคงที่สำหรับแต่ละเวอร์ชั่น โดย record ดังกล่าวนี้มีข้อมูล:
[:ThaiNodeid:nodeid] ของเวอร์ชั่น
- nodeids ของบรรพบุรุษ
- ขนาดของข้อมูลในเวอร์ชั่น
- ตำแหน่งเริ่มต้นของข้อมูลใน revlog ที่จะบอกว่าควรเริ่มอ่านจากจุดไหน
- เวอร์ชั่นฐานของ delta chain กรณีที่ต้องสร้างเวอร์ชั่นจากประวัติเก่า
linkrev ที่ชี้ไปหา[:ThaiChangeSet:เซ็ตของการแก้ไข]ที่เกี่ยวข้อง
นี่เป็นตัวอย่างคร่าวๆ:
$ hg debugindex .hg/store/data/README.i rev offset length base linkrev nodeid p1 p2 0 0 1125 0 0 80b6e76643dc 000000000000 000000000000 1 1125 268 0 1 d6f755337615 80b6e76643dc 000000000000 2 1393 49 0 27 96d3ee574f69 d6f755337615 000000000000 3 1442 349 0 63 8e5de3bb5d58 96d3ee574f69 000000000000 4 1791 55 0 67 ed9a629889be 8e5de3bb5d58 000000000000 5 1846 100 0 81 b7ac2f914f9b ed9a629889be 000000000000 6 1946 405 0 160 1d528b9318aa b7ac2f914f9b 000000000000 7 2351 39 0 176 2a612f851a95 1d528b9318aa 000000000000 8 2390 0 0 178 95fdb2f5e08c 2a612f851a95 2a612f851a95 9 2390 127 0 179 fc5dc12f851b 95fdb2f5e08c 000000000000 10 2517 0 0 182 24104c3ccac4 fc5dc12f851b fc5dc12f851b 11 2517 470 0 204 cc286a25cf37 24104c3ccac4 000000000000 12 2987 346 0 205 ffe871632da6 cc286a25cf37 000000000000 ...
ด้วยการอ่านไฟล์ดัชนีหนึ่งครั้งและการอ่าน revlog อีกหนึ่งครั้ง เมอร์คิวเรียลสามารถสร้างไฟล์เวอร์ชั่นใดๆก็ได้ใน repository โดยใช้เวลาที่ได้สัดส่วนกับขนาดของไฟล์นั้นๆ
เพราะฉะนั้นการเพิ่มเวอร์ชั่นใหม่จะต้องใช้การอ่านแค่ O(1) และข้อมูลใน revlogs และดัชนีจะมีแต่เพิ่มขึ้นเท่านั้น (จะไม่มีการลบข้อมูลจาก revlog และดัชนี)
นอกจากนั้น Revlog ยังถูกใช้เพื่อเก็บ[:ThaiManifest:มานิเฟสต์]และ[:ThaiChangeSet:เซ็ตของการแก้ไข]อีกด้วย
ข้อมูลที่เกี่ยวข้อง
The [http://www.selenic.com/hg/index.cgi/file/tip/contrib/ contrib directory] in the sources contains python scripts [http://www.selenic.com/hg/index.cgi/file/tip/contrib/dumprevlog dumprevlog] and [http://www.selenic.com/hg/index.cgi/file/tip/contrib/undumprevlog undumprevlog] (see changeset [http://www.selenic.com/hg/rev/ec5d77eb3431 ec5d77eb3431]).
แหล่งอ้างอิง
"Towards a Better SCM: Revlog and Mercurial", Matt Mackall ([attachment:Presentations/ols-mercurial-paper.pdf PDF])
[http://hgbook.red-bean.com/hgbookch4.html#x8-640004 "Behind the scenes"] in [http://hgbook.red-bean.com/hgbook.html "Distributed revision control with Mercurial"], Bryan O’Sullivan
ลองดู: ["Presentations"]