notebook

都内でWEB系エンジニアやってます。

git管理外のファイル間やコマンド実行結果間でdiffを見やすくする

Git管理外のファイル間もしくはコマンド実行結果(標準入力)間での差分表示

Git管理のファイルであればデフォルトでもそれなりのdiff表示をしてくれるけどdiffコマンドで比較した場合どうするのが良いのかと思って調べた

Gitでのdiff表示に慣れてしまったためlinuxのdiffコマンドで出力した結果には違和感というか見にくい感が…

ということでGit管理外のdiffを見やすくしてみます

  • file1
line1
line2
line3
ho ge
FuGa
piyo
line7
line8
Line9
line10
  • file2
line1
line2
line3
hoge
fuga
piyo
line7
line8
line9
line10
  • diff
$ diff file1 file2
4,5c4,5
< ho ge
< FuGa
---
> hoge
> fuga
9c9
< Line9
---
> line9

これはとりあえず見にくい…と思うのでオプションを付けます

  • diff -u
$ diff -u file1 file2
--- file1       2019-11-17 23:59:55.787346336 +0900
+++ file2       2019-11-18 00:00:20.963514542 +0900
@@ -1,10 +1,10 @@
 line1
 line2
 line3
-ho ge
-FuGa
+hoge
+fuga
 piyo
 line7
 line8
-Line9
+line9
 line10

diff -uでgit diffと似た感じの出力になります

これだけでも大分わかりやすくできた気がします

ここまでの手順で十分であればcolordiffコマンドを入れて同様のオプションを渡してあげれば解決です

f:id:swfz:20191121033713p:plain

diff部分にハイライトをつける

diff-so-fancyというコマンドに投げるとさらに見た目が変わります

diff -u file1 file2 | diff-so-fancy

f:id:swfz:20191121033717p:plain

so-fancy/diff-so-fancy: Good-lookin' diffs. Actually… nah… The best-lookin' diffs.

github.com

個人的にはこちらのほうが好みなのでここまでやりました

標準入力どうしのdiff

diff -u <(curl -XGET https://jsonplaceholder.typicode.com/todos/2) <(curl -XGET https://jsonplaceholder.typicode.com/todos/1) | diff-so-fancy

ちょっと例としては微妙ですがAPIのリクエスト結果を標準入力に入れてそれを比較に使うということもできます

f:id:swfz:20191121033723p:plain

  • 参考

標準入力同士の diff - Qiita

qiita.com

まとめ

なんでこんなこと調べたかと言うと「APIたたいた結果で差分取りたい」ということがあったからです

単にファイルどうしの比較であればvimdiffや各種エディタで差分を見ればよいのですが

「APIたたいて環境違いのソースコードを取得してきて差分がないか確認する」というのをサクッとやりたくて見てみたもののこの方法であれば色々応用できそうだなといまさらながら思いました

実際にはglueジョブのコードの差分を取れるように簡単なシェルスクリプトを書きました

  • gluediff
#!/bin/bash

get_glue_code(){
  aws --profile=$1 s3 cp `aws --profile=$1 glue get-job --job-name $2 | jq -r '.Job.Command.ScriptLocation'` -
}

diff -u -w <(get_glue_code $1 $2) <(get_glue_code $1 $3) | diff-so-fancy

同じような要領でLambdaや他のマネージドサービスのコードを比較するみたいなこともできそうですね

まぁ…そもそもこんなことをしなくて良くなる環境にしていきたいところですが…