yaml ファイルで書かれた設定ファイルとかの差分を調べるために diff を取ろうとすると 以下 diff -u file1.yaml file2.yaml のようにどのキーの値が違うのかがわかりにくい。
-- file1.yaml 2005-10-18 00:22:33.000000000 +0900 +++ file2.yaml 2005-10-18 00:22:53.000000000 +0900 @@ -1,9 +1,11 @@ -template: - path: /home/sekimura/templates database: host: localhost port: 5432 - passwd: dbpasswd user: dbuser + passwd: dbpassword app: name: Sandbox +template: + path: /home/sekimura/templates +author: + name: Masayoshi Sekimura
そんなわけで簡単なYAMLをキー単位で差分を取る ydiff というツールを作ってみた。 ydiff file1.yaml file2.yaml を実行した結果が以下。
--- file1.yaml database +++ file2.yaml database @@ -1,5 +1,5 @@ --- host: localhost -passwd: dbpasswd +passwd: dbpassword port: 5432 user: dbuser --- file1.yaml author +++ file2.yaml author @@ -1 +1,2 @@ ---- ~ +--- +name: Masayoshi Sekimura
この diff でそのまま patch を当てるってことはできないけども、 databaseキー の passwd にスペルミスっぽいのがあるのと、 file1.yaml にauthorキーが無いのがわかる。十分便利。
ちなみにこんなスクリプトです。
#!/usr/bin/perl
use strict;
use warnings;
use YAML qw(LoadFile);
use Text::Diff;
my ($file1, $file2) = @ARGV;
my $yaml1 = LoadFile($file1, NULL);
my $yaml2 = LoadFile($file2, NULL);
my %all_keys = map { $_ => 1 } (keys(%$yaml1), keys(%$yaml2));
for my $key (keys %all_keys) {
print diff(\YAML::Dump($yaml1->{$key}), \YAML::Dump($yaml2->{$key}),
{
FILENAME_A => $file1." ".$key,
FILENAME_B => $file2." ".$key,
});
}
YAMLがハッシュでないと動かないけど、たいていの設定ファイルはこんな感じなのでOKかと。

Comments