読者です 読者をやめる 読者になる 読者になる

日付で管理する最悪なバージョン管理システムを作った

授業の課題をCで書いて提出しないといけなかったので、最悪なバージョン管理システムを作りました。

日付ベースのバージョン管理であれば、誰でもファイルを覗くことができるでしょう。上司がバージョン管理システムなんて使いたくないと言っているような職場でも安心して使えますね。

Date version control で dvn です。QWERTY配列では s と d は隣同士にあり svn と打とうとするとタイプミスを誘発しやすいため、それを狙ったコマンド名にしています。

流れ

% dvn
dvn - Date version control

Usage:
        dvn init
        dvn commit [message] [file]
        dvn log
  • dvn init でカレントディレクトリに .dvn ディレクトリを作る
  • dvn commit でコミットしたいファイルとメッセージを指定してコミット
  • dvn log でコミットログを参照

コミット間の差分は、diff を使って頑張るという感じです。ディレクトリ同士で diff を取ればそれっぽくなります。

まとめ

作ってみてわかったのが、日付によるバージョン管理は人類を破滅させるのことにつながりかねないのでやめたほうがいいですねということです。

% dvn init   
Initialized dvn repository.
Recommend: Initial commit `dvn commit 'Initial' *`
% ls -a
./    ../   .dvn/
% echo "foo" > a
% dvn commit 'Add a' a  
Commit 2016-01-16T16:16:58+0900: Add a
% tree -a .dvn        
.dvn
└── 2016-01-16T16:16:58+0900
    ├── .dvn.metadata
    └── a

1 directory, 2 files
% echo "bar" >> a
% dvn commit 'Update a' a
Commit 2016-01-16T16:17:20+0900: Update a
% dvn log
2016-01-16T16:16:58+0900: Add a
2016-01-16T16:17:20+0900: Update a
% tree -a .dvn           
.dvn
├── 2016-01-16T16:16:58+0900
│   ├── .dvn.metadata
│   └── a
└── 2016-01-16T16:17:20+0900
    ├── .dvn.metadata
    └── a

2 directories, 4 files
% colordiff -r -u .dvn/2016-01-16T16:16:58+0900 .dvn/2016-01-16T16:17:20+0900 
diff -r -u .dvn/2016-01-16T16:16:58+0900/.dvn.metadata .dvn/2016-01-16T16:17:20+0900/.dvn.metadata
--- .dvn/2016-01-16T16:16:58+0900/.dvn.metadata 2016-01-16 16:16:58.000000000 +0900
+++ .dvn/2016-01-16T16:17:20+0900/.dvn.metadata 2016-01-16 16:17:20.000000000 +0900
@@ -1 +1 @@
-Add a
\ No newline at end of file
+Update a
\ No newline at end of file
diff -r -u .dvn/2016-01-16T16:16:58+0900/a .dvn/2016-01-16T16:17:20+0900/a
--- .dvn/2016-01-16T16:16:58+0900/a     2016-01-16 16:16:58.000000000 +0900
+++ .dvn/2016-01-16T16:17:20+0900/a     2016-01-16 16:17:20.000000000 +0900
@@ -1 +1,2 @@
 foo
+bar