Gradleでjava-diff-utilsを使ってテキストDiff

概要

ビルドタスクの中でDiffとるのに何かないかなと探していたところ、以下のJavaライブラリを見つけました。

Apache2.0ライセンスのJavaライブラリなので、Gradleスクリプト内でそのまま使えます。
Googleさまさまです。早速試してみます。

比較するテキスト

今回は以下の2つのpropertiesファイルを比較してみます。

original.properties

# Databse Setting
dbhost = localhost
dbuser = admin

# Window Setting
window.width = 100
window.height = 200
colors.background = #FFFFFF
colors.foreground = #000080

revised.properties

# Databse Setting
dbhost = 127.0.0.1
dbuser = admin
dbpass = password

# Window Setting
window.name = APPNAME
window.width = 100
window.height = 200
colors.foreground = #000080

見ての通りですが、以下の4点の差分があります。

  • 変更 dbhost -> 127.0.0.1
  • 追加 dbpass
  • 追加 window.name
  • 削除 colors.background

 

Gradleタスクでやってみる

ライブラリの使い方は、プロジェクトページにJavaのサンプルがあるので、これを参考にしました。

依存ライブラリは以下リポジトリから。現状の最新版1.3.0を使って、

build.gradleはこんな感じです。

import difflib.DiffUtils
buildscript {
    repositories{
        mavenCentral()
    }
    dependencies{
        classpath group:'com.googlecode.java-diff-utils', name: 'diffutils', version: '1.3.0'
    }
}

task computeDiff << {
    List original = new File("original.properties").readLines()
    List revised  = new File("revised.properties").readLines()
    DiffUtils.diff(original, revised).deltas.each {
        println it
    }
}

buildscriptメソッドで、スクリプト内利用するjava-diff-utilsの依存性を宣言しています。
依存性の書き方はこちらを参考に。

早速computeDiffタスクを実行してoriginal.propertiesとrevised.propertiesの差分を見てみます。

> gradle computeDiff
computeDiff
[ChangeDelta, position: 1, lines: [dbhost = localhost] to [dbhost = 127.0.0.1]]
[InsertDelta, position: 3, lines: [dbpass = password]]
[InsertDelta, position: 5, lines: [window.name = APPNAME]]
[DeleteDelta, position: 7, lines: [colors.background = #FFFFFF]]

BUILD SUCCESSFUL

おおすごい!!
先ほどの4点の差分がしっかり検出されています。

今回はgroovyの暗黙の引数itで済ませていますが、itの実体はdifflib.Patchオブジェクトです。
このオブジェクトが差分のタイプや差分のポジション情報などを保持しています。

もう少し細かい情報

返ってくるオブジェクトなどの情報は、こちらのページが参考になりました。
(こちらのサイトには、いつもお世話になっておりますm()m)

今回試した環境情報はこちらです。

  • Windows10
  • JVM 1.8.0_92
  • Grooovy 2.4.4
  • Gradle 3.1

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA