web-dev-qa-db-ja.com

差分出力の統一された形式をどのように理解すればよいですか?

diffutilsのマニュアルから

次に、1つまたは複数の差分の塊があります。各ハンクは、ファイルが異なる1つの領域を示しています。統一形式のハンクは次のようになります。

@@ from-file-line-numbers to-file-line-numbers @@
line-from-either-file
line-from-either-file...

ハンクに1行しか含まれていない場合、その開始行番号のみが表示されます。 それ以外の場合その行番号は「start、count」のようになります。空のハンクは、ハンクに続く行から始まると見なされます。

ハンクとそのコンテキストに2行以上が含まれている場合、その行番号は「start、count」のようになります。 それ以外の場合終了行番号のみが表示されます。空のハンクは、ハンクの前の行で終了すると見なされます。

彼らはどういう意味ですか?また、それらの意味を示すためにいくつかの例を挙げていただけますか?

特に、最後の2つの段落のケースの違いはわかりませんでした。彼らは同じケースについて話しているようですが、私はそうではないと思います。

  • 最初の段落の "if"ケースと2番目の段落の "otherwise"ケースの違いは何ですか?

  • 最初の段落の「そうでない」ケースと2番目の段落の「if」ケースの違いは何ですか?

3
Tim

(強調した2つの)最初の段落がfrom-file-line-numbersを説明しようとしているのに対し、2番目の段落はto-file-line-numbersを説明しようとしていると思います。

あいまいなテキストは無視し、GNU diffが統一されたdiffsを実装する方法(質問のタイトルに対応))について説明します。

diff -u <(printf "a\nb\nc\n") <(printf "a\n")

以下を生成します:

--- /proc/self/fd/11    2018-11-08 11:16:09.183611033 +0100
+++ /proc/self/fd/12    2018-11-08 11:16:09.184611029 +0100
@@ -1,3 +1 @@
 a
-b
-c

(以降の例では、説明の必要がないため、最初の2行は省略します。)

これは、2つの「ファイル」が異なり、1セットの違い(「塊」)があることを示しています。統合パッチでは、各ファイル比較は---(「from」ファイル)と+++(「to」ファイル)で始まる1組の行によって導入されます。各ファイル比較内では、各ハンクは@@で始まり、末尾が1行の行で始まります。この行は、fromファイルとtoファイルでの変更の場所を識別します。 fromの場所は-で始まります(これは後続の番号の一部ではありません)。toの場所は+で始まります。ロケーションは、開始線と長さ(1の場合は省略されます)の2つの数字のペアです。したがって、上記のパッチでは、fromファイルの1行目から始まる3行をtoファイルの1行目から始まる1行に変換する変更があります。

ハンクにはコンテキストを含めることができますが、これは上記の場合です。デフォルトでは、diffには、可能な場合は3行のコンテキストが含まれます。また、コンテキストが重複するハンクもマージします。変更の前後に3行のコンテキストがない場合、コンテキストは削減されます。したがって、上記では変更前のコンテキストは1行のみで、変更後はありません。このコンテキストは、ハンクで指定された変更の一部としてカウントされるため、開始行と長さに影響します。

diff -u0 <(printf "a\nb\nc\n") <(printf "a\n")

これを示します:

@@ -2,2 +1,0 @@
-b
-c

これは同じ変更ですが、コンテキストはありません。したがって、2行目から始まる2行を1行目から始まる行に変換する変更に削減されます。

最も単純な場所は、コンテキストなしで1行を変更するパッチに対応します。

$ diff -u0 <(printf "a\nb\nc\n") <(printf "a\nb\nd\n")
@@ -3 +3 @@
-c
+d

コンテキストでは、これは

@@ -1,3 +1,3 @@
 a
 b
-c
+d

(コンテキストの有用性は、元のファイルと完全に一致しない「from」ファイルでパッチを引き続き有効にできるようにすることです。patchは、行番号が完全に一致しない「ファジー」パッチを適用します。元の場所から特定の距離内でコンテキストを見つけます。)

11
Stephen Kitt