BitVisorの初期バージョンのコードはどれくらい残っているか

BitVisorの初期バージョン0.2がリリースされたのは2008年頃です。果たしてその頃のコードはどれくらい残っているのでしょうか。

# 対象バージョン

初期バージョンのchangesetはこれです:

```shell

$ hg log -r 0 --template compact
0[0.2]   00749db7b0e2   2008-03-18 11:51 +0900   hdk
  version 0.2
```

今回調べる最新のchangesetはこれです:

```shell

$ hg tip --template compact
293[tip]   b1880507d624   2019-11-27 10:32 +0900   hdk
  msr_pass: workaround for processor stall during microcode update
```

# 調べる

コマンドをちょろちょろと叩いて調べます。

```shell

$ hg annotate -fn .|awk '{a++;if($1==0)b++}END{print b,a,b/a*100}'
28743 927135 3.1002
```

右端の数字が百分率です。バージョン0.2のコードは全体の約3%と出ました。多いのか少ないのか、よくわかりません。

## ディレクトリごとに見てみる

全体だとわかりにくいので、主要なディレクトリ別で見てみます。まずは最初のバージョンにどんなディレクトリがあったのか、出してみます。

```shell

$ 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になっているものです。それでは先程のコマンドをこれらのディレクトリに対して実行してみます。

```shell

$ 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の中身が入っていなかったのでした。

```shell

$ hg files -r 0 idman/ vpn/
idman/README
vpn/README
```

これらが導入されたのはバージョン0.7からです。

```shell

$ 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にたいして同じようにディレクトリ一覧を見てみます。

```shell

$ 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以前かどうかで見てみます。

```shell

$ 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にがんばってもらいます。

```shell

$ 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オプションをつけておくことで、ファイル名変更は以下のように見えます:

```shell

$ 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
```

ファイルコピーは以下のように見えます:

```shell

$ 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
```