ydiff: インチキ YAML Diff

| コメント(0)

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

コメントする