Chapter 4
Behind the scenes

くのシステムなりMercurial にしているなのでMercurial プログラムにどのようにするのかをするのはですそのような要無いかもしれませんがする 有用であるとえています

者自することでMercurial してされているというることができましたまたったソフトウェアがどのようにするのかをえておけるのであれば いにかされる機会というです

このでは Mercurial におけるについてしたにおけるするつかげようといます

4.1 Mercurial’s historical record

4.1.1 Tracking the history of a single file

ファイルするMercurial ファイルfilelog ばれるメタデタオブジェクトしますfilelogされる跡対ファイルとあるリビジョン再現するのにしています filelog .hg/store/data ディレクトリファイルとしてされておりMercurial リビジョンするインデックスしています

サイズきかったりファイルfilelog .dインデックス.iしてされますがそれほどさなファイルインデックス.iファイされますディレクトリファイルそのするためのリポジトリ filelog ファイル  4.1します



[Picture]

Figure 4.1: Relationships between files in working directory and filelogs in repository

4.1.2 Managing tracked files

跡対ファイルをまとめるためにMercurial manifest ばれる使していますmanifest される チェンジセットにおけるファイルファイルリビジョンつかのファイルメタデといった チェンジセットごとのファイルするしています

4.1.3 Recording changeset information

changelog チェンジセットコミットコミットログメッセそのチェンジセットするつかの manifest リビジョンといったチェンジセットするしています

4.1.4 Relationships between revisions

changelogmanifest ないし filelog におけるリビジョンリビジョンったリビジョン となったつのリビジョンへのしていますべたようににまたがったをもちそれらは っています

リポジトリてのチェンジセットしてchangelog にはつのリビジョンされますchangelog における ビジョンmanifest リビジョンへのしていますmanifest リビジョンチェンジセット生成された ファイルリビジョンする filelog リビジョンへのしていますこの 4.2しま



[Picture]

Figure 4.2: Metadata relationships

からもわかるようにchangelogmanifest および filelog するリビジョンずしも というわけではありませんつのチェンジセット manifest されていないそれらのチェンジセットする changelog manifest リビジョンしますつのチェンジセットMercurial するファイル されていないそれらのチェンジセットする manifest filelog リビジョンしま

4.2 Safe, efficient storage

changelogmanifest および filelog revlog ばれるによりされています

4.2.1 Efficient storage

revlog というみを使してリビジョンしていますではファイルリビ ジョンごとにするわりにリビジョンからリビジョンへのします くのファイルでのにおいてセント程度サイズになりま

システムではテキストファイルでしかできないものもありますそれらのシステムにおけるバイ ナリファイルスナップショットテキストへのによってわれますがこれらはです バイナリデファイルであってもMercurial うことができますのでテキストいするはあり ません1

4.2.2 Safe operation

Mercurial revlog するだけでまれたからファイルするようなことはいません とするみとしたこのです

それにえてMercurial ファイルにまたがったてのみをトランザクションとしていますトラ ンザクションなものとしてわれますのでトランザクション全体すればてが利用えるようになります トランザクションでもしたにはてのされますみを しをうようなつの Mercurial プロセスしたでもこの分保によ みをさせるような部分プロセスむことはありませ 2

Mercurial ファイルへのしかわないことがトランザクションにしていますトランザクショ であるそれがしくしていることをできるです

4.2.3 Fast retrieval

システムっていたとしMercurial していますどのシス テムスナップショットするとしてリビジョンしていましたこの ビジョン再構するにはスナップショットいてリビジョンとのてのがあ りますファイルなるほどまなければらないリビジョンリビジョン再構 となります



[Picture]

Figure 4.3: Snapshot of a revlog, with incremental deltas

Mercurial がこの使しているなものですがですスナップショットかられたえてされたにはではなくたなスナップショットいます というものですこのリビジョンにおけるファイル素早再構できますこのであるため つかのシステムにもまれています

 4.3すようにMercurial revlog インデックスファイルにおけるリビジョン再構 みがとされるタファイルします

Aside: the influence of video compression

しているかブルないしによるデジタルテレビしたことがあるならばたいていのにお いてフレするフレとのされていることをごかもしれませんえてそれらのでは させるために 縮手いていますのでフレじてエラされま

による ますしによりじる誤差するもあるた ではフレフレばれますしますこれは中断 れてもフレからのであることをしますエラフレクリア されます

4.2.4 Identification and strong integrity

ないしスナップショットしてrevlog いられるハッシュして していますこれによりリビジョンするにするとになりま

ハッシュ算出なるのものをもたらしますハッシュリビジョンとして使されます Mercurial エンドユとしてにするチェンジセットハッシュchangelog リビジョン由来する filelog manifest でもハッシュ使していますがMercurial ではこれらはのみで使されていま

リビジョンファイル再構するリポジトリからチェンジセットんだMercurial ハッシュ しいことをしますがあることがされたしたてのしま

Mercurial んでいるスナップショットリビジョン再構えて部分 するをもたらしてますドウェアエラシステムバグによってrevlog 部分 したれた revlog からしたあるいはどのリビジョン することがですのみをするモデルするシステムではこのようなことはできませ

4.3 Revision history, branching, and merging

ての Mercurial revlog われるリビジョンしていますにはrevlog つで はなくつのできますMercurial null IDばれるハッシュ使って します3 このハッシュ0 したです

revlog  4.4ることができますfilelog manifestchangelog てがっており しているスナップショットといったなるだけです

revlog におけるリビジョンにおけるリビジョンつのリビジョンして いますリビジョンではにはリビジョンにはされ ビジョンつしかないことをしますリビジョンとしてするリビジョンいにブランチとなり ますブランチしたリビジョンされたリビジョンリビジョンとしてしま



[Picture]

Figure 4.4:

4.4 The working directory

Mercurial リポジトリされているファイルリビジョンにおけるスナップショットディレクトリ します

ディレクトリどのリビジョンスナップショットしているのかを っていますディレクトリ リビジョンしようとしたMercurial (1) しいリビジョンmanifest (2) リビジョンコミット でのファイル(3) ディレクトリファイルすべきしますその チェンジセットコミットつようにディレクトリファイル生成しま

dirstate にはディレクトリがどのチェンジセットされているかとかMercurial によ されているファイルなどディレクトリする Mercurial されていま

リビジョンする revlog つのリビジョンするっていますのでリビジョン つのリビジョンだけをつのリビジョンするリビジョンですがdirstate つのリビジョン するっていますhg updateコマンドしたにはしたチェンジセットfirst parentとしてされしますチェンジセットとのhg mergeった dirstate するしませんがhg mergeコマンドされたチェンジセッ されますhg parentsコマンドによりdirstate するリビジョンできま

4.4.1 What happens when you commit

dirstate リビジョンするのはきのためだけではありませんMercurial dirstate リビ ジョンコミットチェンジセットチェンジセットとして使します



[Picture]

Figure 4.5: The working directory can have two parents

 4.5つのチェンジセットのみをディレクトリしていますにおけるディレクトリチェンジセットリポジトリにおけるたないチェンジセットですので tip ばれま



[Picture]

Figure 4.6: The working directory gains new parents after a commit

ディレクトリそのものをコミットしようとしているチェンジセットえるとわかりやすいでしょうMercurial してないし指示したファイル Mercurial によりされているファイルへのチェンジセットされますそのたなチェンジセットにはディレクトリチェンジセットされま

コミットしたならMercurial ディレクトリチェンジセットしますにはコミットにより たに生成されたチェンジセットされにはされますコミット 4.6しま Mercurial コミットディレクトリファイルにはれずdirstate チェンジセット えるだけです

4.4.2 Creating a new head

での tip チェンジセットでのディレクトリくあることですえばでのプロジェク 調べたりどのチェンジセットバグんだのかを調べるといったですこのようなでの ディレクトリチェンジセットチェンジセットコミットしたでのファイル ディレクトリファイルしてするというものでしょうこのによる 4.7しま



[Picture]

Figure 4.7: The working directory, updated to an older changeset

ディレクトリチェンジセットしたらかのってコミットしたならMercurial はどのようにうのでしょうか Mercurial はこれまでにしてきたじようにいますディレクトリチェンジセットされるチェンジセットになりますされるチェンジセットたずよってたな tip チェンジセット となりますコミットリポジトリにはたないチェンジセットこれらは head ばれますこの  4.8 します



[Picture]

Figure 4.8: After a commit made while synced to an older changeset

: Mercurial みのしでhg pullコマンドしたくあるめていてくださいhg pullコマンドディレクトリいませんのでリポジトリへのチェンジセッ みはわれてもディレクトリhg pullコマンドのままですディレクトリでの tip していないためhg pull行後らかのコミットしたとしてたな head 生成する ことになります

きでべたのはこのするのになことがhg mergeしてからhg commitすればいだけだからですえるならこのよ うな全然ではないということですMercurial れていない ビックリするかもしれませんが…。このようなする方法初心 とってじるこのようないを Mercurial がとるについてほど したいといます

4.4.3 Merging heads

hg mergeコマンドMercurial ディレクトリせずにとしてした チェンジセットしますこの 4.9します



[Picture]

Figure 4.9: Merging two heads

つのチェンジセットにおいてされるファイルするためMercurial ディレクトリします便してするとチェンジセット manifest まれるてのファイルして以下のように実施されま

にもかいしてはかいあります がありますがするいのはこ 程度ですどのされますしでもどののための しにします

コミットされるえるにもべましたがディレクトリコミットしようとして いるチェンジセットえるとわかりやすいでしょうhg mergeコマンドしたディレクトリ チェンジセットコミットによって生成されるたなチェンジセットこれらをチェンジセットとしま

Mercurial ではすることがですがMercurial はりビジョンおよびディレクトリして つのリビジョンしかできないため都度コミットするがありますチェンジセット にはでしょうがしたりひどくわれるであろうことはえていま

4.5 Other interesting design features

これまでのMercurial っていることをするためににおける かにててきましたしかしへのこれだけにまりませんMercurial において をそそるありますこれまでの “big ticket” とはいくつかをんでしようといま すのでこれらにがあればシステム有用よりることができるでしょ

4.5.1 Clever compression

Mercurial スナップショットのそれぞれにしてであるにはしますMercurial スナッ プショットないししますがよりもサイズさいでのいま

このことはえば zip カイブJPEG のようにファイルMercurial うことしますこれらのファイルMercurial によるにはサイズよりもきくなるのがですので Mercurial zip JPEG ファイルをそのままします

ファイルリビジョンにはスナップショットよりもきくなりますのでこのでも Mercurial いますファイルスナップショットそのものをするサイズえることが したMercurial スナップショットしますのでしになりますがのみをするモデルよりもディスク できます

Network recompression

Mercurial ディスクへのするがそこそこバランスれている 収縮deflateアルゴ リズムzip カイブ同等のものを使しています使していますしかしネットワしの にはMercurial しません

ネットワ接続HTTP Mercurial 全体よりられるアルゴリズム bzip2 として使されている Burrows-Wheeler アルゴリズムしますリビジョンではな bzip2 アルゴリズム全体というわせにすることですることができますので てのネットワにおいてできます

ssh での接続ssh うことができるのでMercurial 接続いません 4

4.5.2 Read/write ordering and atomicity

利用されることのないようにするではファイルへのみだけがてではありません  4.2ていただければわかるようにchangelog リビジョンmanifest リビジョン manifest リビジョンfilelog リビジョンしていますこのなものなので

みのにはfilelog および manifest へのみでトランザクションされこれらへのみがするま では changelog へのみはわれませんみのにはchangelog として manifestfilelog 順序みを います

changelog へのみにってfilelog および manifest へのみがしているのでchangelog からの manifest へのむこともmanifest からのfilelog へのむこともありませ

4.5.3 Concurrent access

によりみのみがわれるとしてもMercurial みにおけるリポジトリ としませんこのがありますMercurial プロセスプロセス 有無わらずリポジトリしてしをうことができます

しにおけるザシステムリポジトリしているhg clone hg pullのためにあなたのリポジトリへのみをする 5 ことをしますしをにはのみのみますこのシステム はありませんのでなものだとはわないでくださいくのシステムではであっても しのためにはリポジトリするでありそのためにはでもつのディレクトリするなため となります。)。

Mercurial うのはつのプロセスのみがリポジトリむのを証場だけですさないとわれる NFS のよう ファイルシステム6 あってもできるみをいています)。リポジトリプロセスによりされているみをプロセス リポジトリされるまでってしますがってされたままのれとみな されますそのためえばれずシステムしたとしてもされたしたままになったりしない がったりすることはありません

Safe dirstate access

dirstate ファイルからのリビジョンしにしてMercurial ファイルするったりはせずみの にのみいますみを dirstate ファイルからしてしまうことをするためMercurial dirstate ファイルディレクトリファイルこのファイルdirstateファイルへと しますそのためdirstate というファイルみをたないであることがされま

4.5.4 Avoiding seeks

してすらディスクヘッドコストくつくためMercurial ディスクヘッドすることにあります

えば dirstate のようなファイルされるがここにありますMercurial によりされる ディレクトリごとにdirstate ファイルするディレクトリごとにディスクヘッドますその ようなディスクヘッドするためにMercurial dirstate ファイル全体みま 7

カルストレにおけるリポジトリにはMercurial みも使しますリポジト からrevlog ファイルするわりにドリンク使することでつのファイルファ イルすることをしますrevlog ファイルみをにはMercurial ファイルドリン しますファイルリポジトリからされいているMercurial リポジトリrevlog たな します

かのによりこの方法 リポジトリのものとしてファイルする ディスク使削減にそれほどでないとのけていますそれは事実ではありますがディスク 安価でありOS へのすることによりることができますみをいる ソフトウェアさがしますので利用における ぼしま 8

4.5.5 Other contents of the dirstate

ファイルMercurial への通知ないことからファイル有無するために dirstate ファイル使しますディレクトリてのファイルしてMercurial ファイル そのでのサイズdirstate ファイルしています

hg addhg removehg renameないしhg copy使したMercurial はこのしますので コミットいをできます

Mercurial ディレクトリファイルするファイルしますならば ファイルされていないですファイルサイズなっているならばファイルされているですなっているの ファイルサイズにのみファイルなっているかかをするために Mercurial ファイル みます9 このようにかなすることでMercurial とするらすことができ ステムしてされています