BitVisorの初期バージョン0.2がリリースされたのは2008年頃です。果たしてその頃のコードはどれくらい残っているのでしょうか。
対象バージョン
初期バージョンのchangesetはこれです:
$ hg log -r 0 --template compact
0[0.2] 00749db7b0e2 2008-03-18 11:51 +0900 hdk
version 0.2
今回調べる最新のchangesetはこれです:
$ hg tip --template compact
293[tip] b1880507d624 2019-11-27 10:32 +0900 hdk
msr_pass: workaround for processor stall during microcode update
調べる
コマンドをちょろちょろと叩いて調べます。
$ hg annotate -fn .|awk '{a++;if($1==0)b++}END{print b,a,b/a*100}'
28743 927135 3.1002
右端の数字が百分率です。バージョン0.2のコードは全体の約3%と出ました。多いのか少ないのか、よくわかりません。
ディレクトリごとに見てみる
全体だとわかりにくいので、主要なディレクトリ別で見てみます。まずは最初のバージョンにどんなディレクトリがあったのか、出してみます。
$ hg files -r 0|sed -n '/\/[^/]*$/s///p'|sort|uniq
config
core
core/builtin
core/logget-linux
documents
drivers
idman
include
include/common
include/core
lib
vpn
今見ると何だろうというようなディレクトリもありますが、core, drivers, idman, includeとvpnは今でもありますね。core/builtinは今はprocessになっているものです。それでは先程のコマンドをこれらのディレクトリに対して実行してみます。
$ for i in core drivers idman include vpn process;do hg annotate -fn $i|awk '{a++;if($1==0)b++}END{b=b+0;print "'$i'",b,a,b/a*100}';done
core 22702 51917 43.7275
drivers 492 76661 0.641787
idman 0 29020 0
include 1505 4139 36.3614
vpn 0 27602 0
process 2610 4895 53.3197
coreが約44%, includeが約36%、processが約53%です。あとはdriversにわずかに残っている他は、0%のようです。あれ? おかしいな? と思ったら、初期バージョンにはまだvpnやidmanの中身が入っていなかったのでした。
$ hg files -r 0 idman/ vpn/
idman/README
vpn/README
これらが導入されたのはバージョン0.7からです。
$ hg log -r 0.7 --template compact
4[0.7] 049e52fdb74e 2008-12-09 03:18 +0900 hdk
version 0.7
ディレクトリごとに見てみる - バージョン0.7編
それではバージョン0.7にたいして同じようにディレクトリ一覧を見てみます。
$ hg files -r 4|sed -n '/\/[^/]*$/s///p'|sort|uniqcore
core/builtin
crypto
crypto/openssl
drivers
drivers/ata
drivers/crypto
drivers/crypto/aes-gladman
idman/ccid
idman/iccard
idman/idman_pkcs11
idman/pcsc
idman/pkcs11
idman/standardio
include
include/common
include/core
include/ve
maketestfs
vpn
vpn/Se
vpn_config
だいぶ豪華な感じになりました。ディレクトリ別も、0.7以前かどうかで見てみます。
$ for i in core drivers idman include vpn process;do hg annotate -fn $i|awk '{a++;if($1<=4)b++}END{b=b+0;print "'$i'",b,a,b/a*100}';done
core 31031 51917 59.7704
drivers 7516 76661 9.8042
idman 27370 29020 94.3143
include 1937 4139 46.7987
vpn 25290 27602 91.6238
process 2969 4895 60.6537
デデーン。なんとcoreとprocessは半分以上、idmanとvpnは9割以上がバージョン0.7以前のコードということになるようです。
coreの中だけ見てみる
coreの中でバージョン0.2と同じコードが8割以上のファイルはどれだけあるのか、気になりますね。またしてもawkにがんばってもらいます。
$ hg annotate -fn core/ |awk '{a[$2]++;if($1==0)b[$2]++}END{for(i in a){if(b[i]/a[i]>=0.8)printf "%s\t%d\t%d\t%d\n",i,b[i],a[i],b[i]/a[i]*100}}'|sort|expand -32,40,48
core/ap.h: 37 46 80
core/arith.h: 34 35 97
core/assert.c: 38 38 100
core/assert.h: 35 35 100
core/beep.c: 97 97 100
core/beep.h: 37 37 100
core/bootdata.h: 32 32 100
core/comphappy.h: 35 36 97
core/convert.h: 61 74 82
core/cpu.c: 37 37 100
core/cpu.h: 35 35 100
core/cpu_emul.c: 140 171 81
core/cpu_emul.h: 42 45 93
core/cpu_interpreter.h: 47 48 97
core/cpu_seg.h: 97 113 85
core/cpu_stack.c: 134 134 100
core/cpu_stack.h: 47 47 100
core/cpuid.c: 53 53 100
core/cpuid.h: 41 42 97
core/cpuid_pass.h: 33 33 100
core/current.c: 30 30 100
core/current.h: 37 37 100
core/debug.h: 44 46 95
core/desc.h: 228 230 99
core/elf.h: 180 180 100
core/entry.h: 49 56 87
core/exint_pass.h: 34 37 91
core/gmm.h: 39 43 90
core/gmm_access.h: 82 82 100
core/gmm_pass.h: 37 37 100
core/i386-stub.c: 1025 1025 100
core/i386-stub.h: 36 36 100
core/initfunc.c: 84 103 81
core/initfunc.h: 37 37 100
core/int.c: 317 379 83
core/int.h: 39 41 95
core/io_io.c: 88 98 89
core/io_io.h: 46 47 97
core/io_iohook.h: 33 33 100
core/io_iopass.c: 81 84 96
core/io_iopass.h: 35 35 100
core/keyboard.h: 40 41 97
core/linkage.h: 34 35 97
core/list.h: 34 35 97
core/longmode.h: 43 43 100
core/main.h: 34 35 97
core/mm.h: 109 128 85
core/mmio.h: 55 66 83
core/msg.c: 158 158 100
core/msg.h: 52 52 100
core/msr.c: 65 65 100
core/msr.h: 44 44 100
core/msr_pass.h: 33 35 94
core/multiboot.h: 90 90 100
core/osloader.c: 156 168 92
core/osloader.h: 37 40 92
core/printf.c: 598 602 99
core/printf.h: 35 35 100
core/process.h: 53 56 94
core/process_builtin.h: 42 45 93
core/process_sysenter.h: 43 45 95
core/putchar.c: 44 54 81
core/putchar.h: 35 38 92
core/reboot.h: 35 36 97
core/regs.h: 61 62 98
core/replace.sh: 27 27 100
core/seg.c: 303 359 84
core/serial.c: 185 185 100
core/serial.h: 38 38 100
core/sleep.c: 114 142 80
core/sleep.h: 39 39 100
core/spinlock.h: 35 35 100
core/stdarg.h: 35 35 100
core/string.h: 35 35 100
core/thread.h: 34 39 87
core/thread_switch.h: 43 43 100
core/thread_switch.s: 95 95 100
core/time.h: 35 37 94
core/timer.c: 162 174 93
core/timer.h: 35 35 100
core/tty.h: 37 41 90
core/types.h: 35 35 100
core/vcpu.c: 80 81 98
core/vmctl.h: 71 82 86
core/vmmcall.c: 111 113 98
core/vmmcall.h: 39 39 100
core/vmmcall_boot.h: 36 38 94
core/vmmcall_status.c: 104 118 88
core/vmmcall_status.h: 43 45 95
core/vmmerr.h: 58 61 95
core/vramwrite.h: 44 44 100
core/vt_addip.h: 48 48 100
core/vt_exitreason.h: 36 36 100
core/vt_init.h: 39 41 95
core/vt_io.c: 125 142 88
core/vt_io.h: 45 45 100
core/vt_main.h: 36 37 97
core/vt_msr.h: 52 63 82
core/vt_panic.h: 34 35 97
core/vt_vmcs.h: 121 135 89
なんか想像していたよりだいぶ多かったです。しかも100%のものが結構あります。
補足
BitVisorはこれまでにファイル名を変更したりファイルの中身を別のファイルにコピーしたりといった操作をしたファイルが多数あります。Mercurialはそのあたりを管理してくれていて、上の結果はそれも追跡の上での結果になります。
Changesetを参照する時や差分を調べる時に、--gitオプションをつけておくことで、ファイル名変更は以下のように見えます:
$ hg diff --git -c 18 vpn/lib/Se/SeVpn.h
diff --git a/vpn/Se/SeVpn.h b/vpn/lib/Se/SeVpn.h
copy from vpn/Se/SeVpn.h
copy to vpn/lib/Se/SeVpn.h
ファイルコピーは以下のように見えます:
$ hg diff --git -c 18 tools/dbgsh/dbgsh.c|head -5
diff --git a/core/vmmcall_dbgsh.c b/tools/dbgsh/dbgsh.c
copy from core/vmmcall_dbgsh.c
copy to tools/dbgsh/dbgsh.c
--- a/core/vmmcall_dbgsh.c
+++ b/tools/dbgsh/dbgsh.c