差分で移動した行を無視する方法


11

私は現在、ソースコード生成ツールに取り組んでいます。変更によって新しいバグが発生しないことを確認するには、変更diff前と変更後のプログラムの出力の間に理論的に価値のあるツールがあります。

ただし、このツールは、順序が重要ではない行(importステートメント、関数宣言など)を半ランダムに並べられた方法で出力するため、予想よりも難しいことがわかります。このため、の出力diffは、実際には同じファイル内の別の位置に移動された行だけである多くの変更で乱雑になっています。

diffがこれらの動きを無視して、実際に追加または削除された行のみを出力する方法はありますか?


たぶん、ツールを変更して関数を生成し、宣言を特定の(たとえば、使用可能な言語では辞書式の)順序でインポートする方が簡単でしょうか?
ダニエルベック

@Daniel Beck:以下のGillesの回答に対する私のコメントを参照してください。
dnadlinger、2010

古い主題ですが、以下のコメントをまとめると、diffコード内の命令の順序重要であるため、このツールが有効な移動と無効な移動をどのように分離できるでしょうか。これが当てはまらない場合は制限されます(インポート、関数とクラスの宣言、など)?
ジョエル

@ジョエル:答えは、私がテストしなければならないジェネレーターの変更では、行の順序の変更に関連するバグが発生しないことを知っていたということです。もちろん、一般的なケースで誤検知を回避するために、ターゲット言語のパーサーに基づくツール(または単にジェネレーターの包括的なテストスイート)が必要ですが、これは、追加の迅速な1回限りのチェックであるはずでした。コードレビューへ。
dnadlinger 2014

回答:


2

単純なdiffを実行し、(別のdiffを回避するために)結果をどこかに保存し、どちらかのバージョンの行をループしてから、それらを反対側から削除することができます。

これにより、作業コード用の個別のプロジェクトが生成されました。コード。


それが何をすべきか正確にはわかりませんが、それは望んだ結果を生み出していないようです。私が質問を理解しているように、コード内の2つの例から、移動された行だけがあるため、diff結果は必要/tmp/oldあり/tmp/newません。ただし、このコードは結果を生成します。
Ilari Kajaste、2011年

コードを修正しました。
l0b0 2011

私がずっと前に上記のマージプロセスを終えたので、答えをテストしていませんが、コードを一見すると、それはうまくいくように見えます。
dnadlinger 2014

4

最初にソートしてみてください。何かのようなもの:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash(およびzsh)は、プロセス置換を使用してこれを1行で実行できます

diff <(sort file-a) <(sort file-b)

これはオプションかもしれませんが、生成されたdiffは、行番号とコンテキスト情報をすべて失うため、あまり役に立ちません…
dnadlinger

私はまだより良い解決策を望んでいるとしても、私が取り組んできた一連の変更を検証するためにこのアプローチを採用しました。
dnadlinger 2010

2
これがいくつかの変更を見逃すであろう場所を予測することができます。順序が重要な場合とそうでない場合があります。すべてのコンテキストを破棄します。
Rich Homolka

私が存在していたすべてがまだ機能することを確認したかった注文リファクタリングの場合、これはまさに私が必要としたものでした。
ntrrobng 2017

0

ツールを制御できるようです。次に、出力を予測可能にします。宣言をセミランダムな順序で出力する代わりに、(たとえば)アルファベット順を最後の手段として使用します。これには、差分から不要な残骸を取り除くだけでなく、ツールの出力を読みやすくして人間が確認できるという利点もあります。


申し訳ありませんが、この回答はまったく役に立ちません。簡単だったら、すぐに変更します。さらに、私は現在、ジェネレーターが最初に分岐されたプロジェクトからの変更をマージしています。そのため、このようなかなり
広範囲にわたる

0

ファイルがセクションに構造化されている場合、順序が正しくないのはセクションだけであり、セクションヘッダーを認識するために使用できる正規表現が存在する場合は、ファイルをセクションに分割して、セクションをペアで比較できます。

たとえば、データベース名の一部の大文字と小文字が変わった後、それらを比較するために2つのMySQLダンプでこれを実行しました(したがって、ダンプはそれらを異なる順序でリストしました)。

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.