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かと。