2015年3月10日火曜日

c9save

僕はCloud9のヘビーユーザーだったりするわけなんですが、半年ほど前に某プロジェクトのリポジトリを某所のhgから某所のgitに移行した際、未commitなテスト用データを手違いで削除してしまいました。で、なんとなくディレクトリを眺めていると

workplace/.c9revisions

ってディレクトリがあって、ここにworkplace以下に置かれているファイルに関して.c9saveという拡張子のついた編集履歴ファイルがあったりします。内容としては、1編集履歴がjson形式で改行なしの1行に詰め込まれてて、それが編集履歴の数だけ行で並んでいるだけ。

各編集履歴は
ts: 更新時刻(JSならnew Date(ts)すれば戻せるUNIX時間)
length: 編集後のファイルサイズ
patch: 編集情報のArray(だけど、必ずサイズは1。バグでうっかり余分にネスト?)

編集情報はさらにパッチ情報のArrayになってて、パッチ情報は
start1: 編集開始位置
start2: 編集終了位置だと思うけど、基本的にstart1と同値
length1: 編集によって削除される文字数
length2: 編集によって追加される文字数
diffs: 差分情報のArray

差分情報はサイズ2のArray(いわゆるpair)になってて、最初の要素が差分モード、2つ目の要素が差分データ。差分モードは-1が削除で1が追加。0がイマイチわからないのだけど、たぶんスキップか置換。length1とlength2がモード0のサイズを両方に加味しないと辻褄が合わなくなるので、たぶん置換?

まぁ、そんなわけで、ざっくりコードを書くとそこそこデータの復元はできるんだけど。どうにも途中で落ちてるトランザクションとかあるような気がする。存在しないデータを削除しようとする編集データとかが出てきて、フォーマットの解釈が間違ってるとしてもこうはならないだろ、みたいな。まぁ、復元したかったデータはおおよそ復元できたので良いけど。

ちなみにこの辺の履歴システムは最近になって実装が変わったみたいで、最近のファイルは.c9revisions使ってません。ちょろっと試した限り、うっかりファイルを消しても同じファイル名で作り直すと、昔のデータも含めて履歴(File > Show File Revision History)から辿れるみたい。ただ履歴データはわかりやすいところには置いてなくて、どっかのdbにバイナリで突っ込まれてるような雰囲気。

と言うことで、どうでも良いメモでした。誰かのお役に立てばラッキー、くらいな。