Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 13878] ファイルの概要

このコミットは、Go言語の公式フォーマッタである gofmt に、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルに対するテストケースを追加するものです。これにより、gofmt がCRLFの行末をLF (Line Feed) に適切に変換することを確認し、異なるOS環境間でのコードの一貫性を保証します。

コミット

commit 83601807af568eb0131ebe300965cd6418da1dc5
Author: Robert Griesemer <gri@golang.org>
Date:   Wed Sep 19 14:14:21 2012 -0700

    gofmt: added testcase for files containing \r\n line endings
    (see also issue 3961).
    
    hexdump -c testdata/crlf.input
    0000000   /   *  \r  \n  \t   S   o   u   r   c   e       c   o   n   t
    0000010   a   i   n   i   n   g       C   R   /   L   F       l   i   n
    0000020   e       e   n   d   i   n   g   s   .  \r  \n  \t   T   h   e
    0000030       g   o   f   m   t   '   e   d       o   u   t   p   u   t
    0000040       m   u   s   t       o   n   l   y       h   a   v   e
    0000050   L   F  \r  \n  \t   l   i   n   e       e   n   d   i   n   g
    0000060   s   .  \r  \n   *   /  \r  \n   p   a   c   k   a   g   e
    0000070   m   a   i   n  \r  \n  \r  \n   f   u   n   c       m   a   i
    0000080   n   (   )       {  \r  \n  \t   /   /       l   i   n   e
    0000090   c   o   m   m   e   n   t  \r  \n  \t   p   r   i   n   t   l
    00000a0   n   (   "   h   e   l   l   o   ,       w   o   r   l   d   !
    00000b0   "   )       /   /       a   n   o   t   h   e   r       l   i
    00000c0   n   e       c   o   m   m   e   n   t  \r  \n  \t   p   r   i
    00000d0   n   t   l   n   (   )  \r  \n   }  \r  \n

    00000db
    
    hexdump -c testdata/crlf.golden
    0000000   /   *  \n  \t   S   o   u   r   c   e       c   o   n   t   a
    0000010   i   n   i   n   g       C   R   /   L   F       l   i   n   e
    0000020       e   n   d   i   n   g   s   .  \n  \t   T   h   e       g
    0000030   o   f   m   t   '   e   d       o   u   t   p   u   t       m
    0000040   u   s   t       o   n   l   y       h   a   v   e       L   F
    0000050  \n  \t   l   i   n   e       e   n   d   i   n   g   s   .  \n
    0000060   *   /  \n   p   a   c   k   a   g   e       m   a   i   n  \n
    0000070  \n   f   u   n   c       m   a   i   n   (   )       {  \n  \t
    0000080   /   /       l   i   n   e       c   o   m   m   e   n   t  \n
    0000090  \t   p   r   i   n   t   l   n   (   "   h   e   l   l   o   ,
    00000a0       w   o   r   l   d   !   "   )       /   /       a   n   o
    00000b0   t   h   e   r       l   i   n   e       c   o   m   m   e   n
    00000c0   t  \n  \t   p   r   i   n   t   l   n   (   )  \n   }  \n

    00000cf
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/6526052

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/83601807af568eb0131ebe300965cd6418da1dc5

元コミット内容

このコミットの元々の内容は、gofmt ツールに対して、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルが入力された場合のテストケースを追加することです。具体的には、testdata/crlf.input というファイルにCRLFの行末を持つGoのソースコードを配置し、gofmt がこれを処理した際に、すべての行末がLF (Line Feed) に変換された testdata/crlf.golden と一致するかどうかを検証するテスト TestCRLF が追加されています。これは、gofmt が異なるオペレーティングシステム(特にWindowsとUnix/Linux)間でコードのフォーマットの一貫性を保つ上で重要な機能です。

変更の背景

この変更の背景には、Go言語のIssue 3961が存在します。このIssueは、gofmt がCRLFの行末を持つファイルを適切に処理しない、または処理結果が期待通りにならないという問題提起がなされたものと推測されます。Windows環境で開発されたGoのソースコードは、デフォルトでCRLFの行末を持つことが一般的です。しかし、Unix/Linux環境ではLFの行末が標準です。gofmt の目的は、Goのコードベース全体で一貫したフォーマットを強制することであり、行末コードの不一致は、異なるOSで作業する開発者間で不必要な差分を生み出し、バージョン管理システム上での混乱を招く可能性があります。

このコミットは、gofmt がCRLFの入力に対しても、常にLFの出力を行うようにすることで、この問題を解決し、クロスプラットフォームでの開発体験を向上させることを目指しています。これにより、どのOSでコードが編集されても、gofmt を通せば常に同じフォーマット(LFの行末)になることが保証されます。

前提知識の解説

1. gofmt

gofmt は、Go言語のソースコードを自動的にフォーマットするためのツールです。Go言語の設計思想の一つに「意見の統一」があり、gofmt はその思想を具現化する中心的なツールです。開発者がコードのスタイルについて議論する時間を削減し、すべてのGoコードが同じ見た目になるように強制することで、可読性と保守性を高めます。gofmt は、インデント、スペース、改行、括弧の位置など、多くのフォーマット規則を自動的に適用します。

2. 行末コード (Line Endings)

テキストファイルにおける行の終わりを示す特殊な文字の組み合わせです。主なものとして以下の3種類があります。

  • LF (Line Feed, \n, ASCII 10): Unix、Linux、macOS (OS X以降) で標準的に使用されます。単に「改行」を意味します。
  • CRLF (Carriage Return + Line Feed, \r\n, ASCII 13 + ASCII 10): Windowsで標準的に使用されます。タイプライターの「キャリッジリターン(行頭に戻る)」と「ラインフィード(次の行に進む)」に由来します。
  • CR (Carriage Return, \r, ASCII 13): 古いMac OS (OS 9以前) で使用されていました。

これらの違いは、特に異なるOS間でファイルを共有したり、バージョン管理システムを使用したりする際に問題を引き起こすことがあります。例えば、Windowsで編集されたファイルがCRLF行末を持ち、Unixで編集されたファイルがLF行末を持つ場合、同じ内容のファイルでも行末の違いによってバージョン管理システムが「変更があった」と誤認識し、不必要な差分(diff)が発生することがあります。

3. テスト駆動開発 (TDD) と回帰テスト (Regression Testing)

このコミットは、特定のバグ(Issue 3961)に対するテストケースを追加するものです。これは、テスト駆動開発(TDD)の原則や、回帰テストの重要性を示しています。

  • テスト駆動開発 (TDD): ソフトウェア開発手法の一つで、機能の実装よりも先にテストコードを書くことを推奨します。これにより、要件の明確化、設計の改善、バグの早期発見に繋がります。
  • 回帰テスト (Regression Testing): ソフトウェアに変更を加えた際に、既存の機能が意図せず壊れていないことを確認するためのテストです。このコミットのように、特定のバグが修正された後、そのバグが将来の変更によって再発しないことを保証するために、バグを再現するテストケースを追加することは、回帰テストの重要な側面です。

技術的詳細

このコミットは、gofmt の行末処理に関する堅牢性を高めるためのテストインフラストラクチャの追加に焦点を当てています。

  1. テストデータの準備:

    • src/cmd/gofmt/testdata/crlf.input: このファイルは、意図的にCRLF (\r\n) の行末を持つGoのソースコードを含んでいます。hexdump -c の出力からもわかるように、各行の終わりに \r\n の両方が存在します。
    • src/cmd/gofmt/testdata/crlf.golden: このファイルは、crlf.inputgofmt で処理した際に期待される出力です。すべての行末がLF (\n) のみになっていることが hexdump -c の出力から確認できます。これは、gofmt がCRLFをLFに正規化するという挙動を期待していることを示しています。
  2. テストケースの追加 (gofmt_test.go):

    • var tests スライスに {"testdata/crlf.input", ""} というエントリが追加されています。これは、既存の TestRewrite 関数が crlf.input を処理し、その結果が crlf.golden と一致するかを自動的に検証するためのものです。
    • TestCRLF という新しいテスト関数が追加されています。この関数は、より詳細な検証を行います。
      • まず、crlf.input を読み込み、実際にCRLF (\r\n) が含まれていることを確認します。もし含まれていなければ、テストの前提が崩れるためエラーを報告します。
      • 次に、crlf.golden を読み込み、CR (\r) が一切含まれていないことを確認します。これは、gofmt の出力がLFのみであることを保証するための重要なチェックです。もしCRが含まれていれば、gofmt がCRLFをLFに適切に変換できていないことを意味します。

この二重のテストメカニズムにより、gofmt がCRLFの入力に対して正しくLFの出力を生成するという挙動が、より確実に保証されます。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更は、主にテストファイルの追加と既存のテストスイートへの組み込みです。

  1. src/cmd/gofmt/gofmt_test.go:

    • var tests スライスに新しいテストケースが追加されました。
      --- a/src/cmd/gofmt/gofmt_test.go
      +++ b/src/cmd/gofmt/gofmt_test.go
      @@ -81,6 +81,7 @@ var tests = []struct {
       	{"testdata/stdin*.input", "-stdin"},
       	{"testdata/comments.input", ""},
       	{"testdata/import.input", ""},
      +\t{"testdata/crlf.input", ""}, // test case for issue 3961; see also TestCRLF
       }
      
    • TestCRLF という新しいテスト関数が追加されました。
      --- a/src/cmd/gofmt/gofmt_test.go
      +++ b/src/cmd/gofmt/gofmt_test.go
      @@ -103,3 +104,24 @@ func TestRewrite(t *testing.T) {
       		}
       	}
       }
      +\n+func TestCRLF(t *testing.T) {
      +\tconst input = "testdata/crlf.input"   // must contain CR/LF's
      +\tconst golden = "testdata/crlf.golden" // must not contain any CR's
      +\n+\tdata, err := ioutil.ReadFile(input)
      +\tif err != nil {
      +\t\tt.Error(err)
      +\t}
      +\tif bytes.Index(data, []byte("\r\n")) < 0 {
      +\t\tt.Errorf("%s contains no CR/LF's", input)
      +\t}
      +\n+\tdata, err = ioutil.ReadFile(golden)
      +\tif err != nil {
      +\t\tt.Error(err)
      +\t}
      +\tif bytes.Index(data, []byte("\r")) >= 0 {
      +\t\tt.Errorf("%s contains CR's", golden)
      +\t}
      +}\n
      
  2. src/cmd/gofmt/testdata/crlf.golden:

    • 新しいファイルとして追加されました。このファイルは、crlf.inputgofmt で処理した後の期待される出力(LF行末)を含みます。
      --- /dev/null
      +++ b/src/cmd/gofmt/testdata/crlf.golden
      @@ -0,0 +1,12 @@
      +/*
      +\tSource containing CR/LF line endings.
      +\tThe gofmt'ed output must only have LF
      +\tline endings.
      +*/
      +package main
      +
      +func main() {
      +\t// line comment
      +\tprintln("hello, world!") // another line comment
      +\tprintln()\
      +}\
      
  3. src/cmd/gofmt/testdata/crlf.input:

    • 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
      --- /dev/null
      +++ b/src/cmd/gofmt/testdata/crlf.input
      @@ -0,0 +1,12 @@
      +/*\r
      +\tSource containing CR/LF line endings.\r
      +\tThe gofmt'ed output must only have LF\r
      +\tline endings.\r
      +*/\r
      +package main\r
      +\r
      +func main() {\r
      +\t// line comment\r
      +\tprintln("hello, world!") // another line comment\r
      +\tprintln()\r
      +}\r
      

コアとなるコードの解説

このコミットの「コアとなるコード」は、gofmt 自体のロジック変更ではなく、その挙動を検証するためのテストコードとテストデータです。

  • gofmt_test.govar tests への追加: gofmt のテストスイートは、通常、入力ファイルと期待される出力ファイル(.golden ファイル)のペアを使用して、gofmt が正しくフォーマットを行うかを検証します。{"testdata/crlf.input", ""} の追加は、crlf.inputgofmt によって処理され、その結果が crlf.golden と比較されることを意味します。これにより、gofmt がCRLF行末をLF行末に変換する機能が、既存のテストフレームワークに組み込まれ、自動的に検証されるようになります。

  • TestCRLF 関数の実装: この関数は、gofmt の行末処理に関する特定の側面を深く掘り下げて検証します。

    • ioutil.ReadFile(input)bytes.Index(data, []byte("\r\n")) < 0 のチェックは、テストの前提条件(入力ファイルがCRLFを含んでいること)が満たされていることを保証します。もし入力ファイルがCRLFを含んでいなければ、このテストは意味をなさなくなります。
    • ioutil.ReadFile(golden)bytes.Index(data, []byte("\r")) >= 0 のチェックは、gofmt の出力がCRを含まない(つまりLFのみである)ことを厳密に検証します。これは、gofmt がCRLFをLFに正規化するという、このコミットが対処しようとしている核心的な挙動を直接テストするものです。

これらのテストコードとテストデータは、gofmt が異なる行末コードを持つファイルを一貫して処理し、Goコミュニティ全体でコードのフォーマット標準を維持するための重要な保証を提供します。

関連リンク

参考にした情報源リンク

  • Go Issue 3961 (上記に同じ)
  • Gitのコミットメッセージと差分情報
  • hexdump コマンドの出力解析に関する一般的な知識
  • 行末コード (CR, LF, CRLF) に関する一般的なコンピュータサイエンスの知識
  • Go言語のテストフレームワーク (testing パッケージ) に関する知識
  • gofmt ツールの目的と機能に関する一般的な知識

[インデックス 13878] ファイルの概要

このコミットは、Go言語の公式フォーマッタである gofmt に、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルに対するテストケースを追加するものです。これにより、gofmt がCRLFの行末をLF (Line Feed) に適切に変換することを確認し、異なるOS環境間でのコードの一貫性を保証します。

コミット

commit 83601807af568eb0131ebe300965cd6418da1dc5
Author: Robert Griesemer <gri@golang.org>
Date:   Wed Sep 19 14:14:21 2012 -0700

    gofmt: added testcase for files containing \r\n line endings
    (see also issue 3961).
    
    hexdump -c testdata/crlf.input
    0000000   /   *  \r  \n  \t   S   o   u   r   c   e       c   o   n   t
    0000010   a   i   n   i   n   g       C   R   /   L   F       l   i   n
    0000020   e       e   n   d   i   n   g   s   .  \r  \n  \t   T   h   e
    0000030       g   o   f   m   t   '   e   d       o   u   t   p   u   t
    0000040       m   u   s   t       o   n   l   y       h   a   v   e
    0000050   L   F  \r  \n  \t   l   i   n   e       e   n   d   i   n   g
    0000060   s   .  \r  \n   *   /  \r  \n   p   a   c   k   a   g   e
    0000070   m   a   i   n  \r  \n  \r  \n   f   u   n   c       m   a   i
    0000080   n   (   )       {  \r  \n  \t   /   /       l   i   n   e
    0000090   c   o   m   m   e   n   t  \r  \n  \t   p   r   i   n   t   l
    00000a0   n   (   "   h   e   l   l   o   ,       w   o   r   l   d   !
    00000b0   "   )       /   /       a   n   o   t   h   e   r       l   i
    00000c0   n   e       c   o   m   m   e   n   t  \r  \n  \t   p   r   i
    00000d0   n   t   l   n   (   )  \r  \n   }  \r  \n

    00000db
    
    hexdump -c testdata/crlf.golden
    0000000   /   *  \n  \t   S   o   u   r   c   e       c   o   n   t   a
    0000010   i   n   i   n   g       C   R   /   L   F       l   i   n   e
    0000020       e   n   d   i   n   g   s   .  \n  \t   T   h   e       g
    0000030   o   f   m   t   '   e   d       o   u   t   p   u   t       m
    0000040   u   s   t       o   n   l   y       h   a   v   e       L   F
    0000050  \n  \t   l   i   n   e       e   n   d   i   n   g   s   .  \n
    0000060   *   /  \n   p   a   c   k   a   g   e       m   a   i   n  \n
    0000070  \n   f   u   n   c       m   a   i   n   (   )       {  \n  \t
    0000080   /   /       l   i   n   e       c   o   m   m   e   n   t  \n
    0000090  \t   p   r   i   n   t   l   n   (   "   h   e   l   l   o   ,
    00000a0       w   o   r   l   d   !   "   )       /   /       a   n   o
    00000b0   t   h   e   r       l   i   n   e       c   o   m   m   e   n
    00000c0   t  \n  \t   p   r   i   n   t   l   n   (   )  \n   }  \n

    00000cf
    
    R=rsc
    CC=golang-dev
    https://golang.org/cl/6526052

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/83601807af568eb0131ebe300965cd6418da1dc5

元コミット内容

このコミットの元々の内容は、gofmt ツールに対して、CRLF (Carriage Return + Line Feed) の行末コードを含むファイルが入力された場合のテストケースを追加することです。具体的には、testdata/crlf.input というファイルにCRLFの行末を持つGoのソースコードを配置し、gofmt がこれを処理した際に、すべての行末がLF (Line Feed) に変換された testdata/crlf.golden と一致するかどうかを検証するテスト TestCRLF が追加されています。これは、gofmt が異なるオペレーティングシステム(特にWindowsとUnix/Linux)間でコードのフォーマットの一貫性を保つ上で重要な機能です。

変更の背景

この変更の背景には、Go言語のIssue 3961(コミットメッセージに記載)に関連する、gofmt がCRLFの行末を持つファイルを適切に処理しない、または処理結果が期待通りにならないという問題提起があります。Web検索の結果によると、「Issue 3961」は具体的なGitHub Issue番号ではなく、gofmt とCRLF行末に関する一般的な問題提起を指している可能性があり、最も関連性の高い議論はGitHub Issue #16355「cmd/gofmt: doesn't honor line endings of Windows \r\n terminated source files」であると示唆されています。

Windows環境で開発されたGoのソースコードは、デフォルトでCRLFの行末を持つことが一般的です。しかし、Unix/Linux環境ではLFの行末が標準です。gofmt の目的は、Goのコードベース全体で一貫したフォーマットを強制することであり、行末コードの不一致は、異なるOSで作業する開発者間で不必要な差分を生み出し、バージョン管理システム上での混乱を招く可能性があります。

このコミットは、gofmt がCRLFの入力に対しても、常にLFの出力を行うようにすることで、この問題を解決し、クロスプラットフォームでの開発体験を向上させることを目指しています。これにより、どのOSでコードが編集されても、gofmt を通せば常に同じフォーマット(LFの行末)になることが保証されます。

前提知識の解説

1. gofmt

gofmt は、Go言語のソースコードを自動的にフォーマットするためのツールです。Go言語の設計思想の一つに「意見の統一」があり、gofmt はその思想を具現化する中心的なツールです。開発者がコードのスタイルについて議論する時間を削減し、すべてのGoコードが同じ見た目になるように強制することで、可読性と保守性を高めます。gofmt は、インデント、スペース、改行、括弧の位置など、多くのフォーマット規則を自動的に適用します。

2. 行末コード (Line Endings)

テキストファイルにおける行の終わりを示す特殊な文字の組み合わせです。主なものとして以下の3種類があります。

  • LF (Line Feed, \n, ASCII 10): Unix、Linux、macOS (OS X以降) で標準的に使用されます。単に「改行」を意味します。
  • CRLF (Carriage Return + Line Feed, \r\n, ASCII 13 + ASCII 10): Windowsで標準的に使用されます。タイプライターの「キャリッジリターン(行頭に戻る)」と「ラインフィード(次の行に進む)」に由来します。
  • CR (Carriage Return, \r, ASCII 13): 古いMac OS (OS 9以前) で使用されていました。

これらの違いは、特に異なるOS間でファイルを共有したり、バージョン管理システムを使用したりする際に問題を引き起こすことがあります。例えば、Windowsで編集されたファイルがCRLF行末を持ち、Unixで編集されたファイルがLF行末を持つ場合、同じ内容のファイルでも行末の違いによってバージョン管理システムが「変更があった」と誤認識し、不必要な差分(diff)が発生することがあります。

3. テスト駆動開発 (TDD) と回帰テスト (Regression Testing)

このコミットは、特定のバグ(Issue 3961)に対するテストケースを追加するものです。これは、テスト駆動開発(TDD)の原則や、回帰テストの重要性を示しています。

  • テスト駆動開発 (TDD): ソフトウェア開発手法の一つで、機能の実装よりも先にテストコードを書くことを推奨します。これにより、要件の明確化、設計の改善、バグの早期発見に繋がります。
  • 回帰テスト (Regression Testing): ソフトウェアに変更を加えた際に、既存の機能が意図せず壊れていないことを確認するためのテストです。このコミットのように、特定のバグが修正された後、そのバグが将来の変更によって再発しないことを保証するために、バグを再現するテストケースを追加することは、回帰テストの重要な側面です。

技術的詳細

このコミットは、gofmt の行末処理に関する堅牢性を高めるためのテストインフラストラクチャの追加に焦点を当てています。

  1. テストデータの準備:

    • src/cmd/gofmt/testdata/crlf.input: このファイルは、意図的にCRLF (\r\n) の行末を持つGoのソースコードを含んでいます。hexdump -c の出力からもわかるように、各行の終わりに \r\n の両方が存在します。
    • src/cmd/gofmt/testdata/crlf.golden: このファイルは、crlf.inputgofmt で処理した際に期待される出力です。すべての行末がLF (\n) のみになっていることが hexdump -c の出力から確認できます。これは、gofmt がCRLFをLFに正規化するという挙動を期待していることを示しています。
  2. テストケースの追加 (gofmt_test.go):

    • var tests スライスに {"testdata/crlf.input", ""} というエントリが追加されています。これは、既存の TestRewrite 関数が crlf.input を処理し、その結果が crlf.golden と一致するかを自動的に検証するためのものです。
    • TestCRLF という新しいテスト関数が追加されています。この関数は、より詳細な検証を行います。
      • まず、crlf.input を読み込み、実際にCRLF (\r\n) が含まれていることを確認します。もし含まれていなければ、テストの前提が崩れるためエラーを報告します。
      • 次に、crlf.golden を読み込み、CR (\r) が一切含まれていないことを確認します。これは、gofmt の出力がLFのみであることを保証するための重要なチェックです。もしCRが含まれていれば、gofmt がCRLFをLFに適切に変換できていないことを意味します。

この二重のテストメカニズムにより、gofmt がCRLFの入力に対して正しくLFの出力を生成するという挙動が、より確実に保証されます。

コアとなるコードの変更箇所

このコミットにおけるコアとなるコードの変更は、主にテストファイルの追加と既存のテストスイートへの組み込みです。

  1. src/cmd/gofmt/gofmt_test.go:

    • var tests スライスに新しいテストケースが追加されました。
      --- a/src/cmd/gofmt/gofmt_test.go
      +++ b/src/cmd/gofmt/gofmt_test.go
      @@ -81,6 +81,7 @@ var tests = []struct {
       	{"testdata/stdin*.input", "-stdin"},
       	{"testdata/comments.input", ""},
       	{"testdata/import.input", ""},
      +\t{"testdata/crlf.input", ""}, // test case for issue 3961; see also TestCRLF
       }
      
    • TestCRLF という新しいテスト関数が追加されました。
      --- a/src/cmd/gofmt/gofmt_test.go
      +++ b/src/cmd/gofmt/gofmt_test.go
      @@ -103,3 +104,24 @@ func TestRewrite(t *testing.T) {
       		}
       	}
       }
      +\n+func TestCRLF(t *testing.T) {
      +\tconst input = "testdata/crlf.input"   // must contain CR/LF's
      +\tconst golden = "testdata/crlf.golden" // must not contain any CR's
      +\n+\tdata, err := ioutil.ReadFile(input)
      +\tif err != nil {
      +\t\tt.Error(err)
      +\t}
      +\tif bytes.Index(data, []byte("\r\n")) < 0 {
      +\t\tt.Errorf("%s contains no CR/LF's", input)
      +\t}
      +\n+\tdata, err = ioutil.ReadFile(golden)
      +\tif err != nil {
      +\t\tt.Error(err)
      +\t}
      +\tif bytes.Index(data, []byte("\r")) >= 0 {
      +\t\tt.Errorf("%s contains CR's", golden)
      +\t}
      +}\n
      
  2. src/cmd/gofmt/testdata/crlf.golden:

    • 新しいファイルとして追加されました。このファイルは、crlf.inputgofmt で処理した後の期待される出力(LF行末)を含みます。
      --- /dev/null
      +++ b/src/cmd/gofmt/testdata/crlf.golden
      @@ -0,0 +1,12 @@
      +/*
      +\tSource containing CR/LF line endings.
      +\tThe gofmt'ed output must only have LF
      +\tline endings.
      +*/
      +package main
      +
      +func main() {
      +\t// line comment
      +\tprintln("hello, world!") // another line comment
      +\tprintln()\
      +}\
      
  3. src/cmd/gofmt/testdata/crlf.input:

    • 新しいファイルとして追加されました。このファイルは、CRLF行末を持つGoのソースコードを含みます。
      --- /dev/null
      +++ b/src/cmd/gofmt/testdata/crlf.input
      @@ -0,0 +1,12 @@
      +/*\r
      +\tSource containing CR/LF line endings.\r
      +\tThe gofmt'ed output must only have LF\r
      +\tline endings.\r
      +*/\r
      +package main\r
      +\r
      +func main() {\r
      +\t// line comment\r
      +\tprintln("hello, world!") // another line comment\r
      +\tprintln()\r
      +}\r
      

コアとなるコードの解説

このコミットの「コアとなるコード」は、gofmt 自体のロジック変更ではなく、その挙動を検証するためのテストコードとテストデータです。

  • gofmt_test.govar tests への追加: gofmt のテストスイートは、通常、入力ファイルと期待される出力ファイル(.golden ファイル)のペアを使用して、gofmt が正しくフォーマットを行うかを検証します。{"testdata/crlf.input", ""} の追加は、crlf.inputgofmt によって処理され、その結果が crlf.golden と比較されることを意味します。これにより、gofmt がCRLF行末をLF行末に変換する機能が、既存のテストフレームワークに組み込まれ、自動的に検証されるようになります。

  • TestCRLF 関数の実装: この関数は、gofmt の行末処理に関する特定の側面を深く掘り下げて検証します。

    • ioutil.ReadFile(input)bytes.Index(data, []byte("\r\n")) < 0 のチェックは、テストの前提条件(入力ファイルがCRLFを含んでいること)が満たされていることを保証します。もし入力ファイルがCRLFを含んでいなければ、このテストは意味をなさなくなります。
    • ioutil.ReadFile(golden)bytes.Index(data, []byte("\r")) >= 0 のチェックは、gofmt の出力がCRを含まない(つまりLFのみである)ことを厳密に検証します。これは、gofmt がCRLFをLFに正規化するという、このコミットが対処しようとしている核心的な挙動を直接テストするものです。

これらのテストコードとテストデータは、gofmt が異なる行末コードを持つファイルを一貫して処理し、Goコミュニティ全体でコードのフォーマット標準を維持するための重要な保証を提供します。

関連リンク

参考にした情報源リンク

  • Go Issue 3961 (上記に同じ)
  • Gitのコミットメッセージと差分情報
  • hexdump コマンドの出力解析に関する一般的な知識
  • 行末コード (CR, LF, CRLF) に関する一般的なコンピュータサイエンスの知識
  • Go言語のテストフレームワーク (testing パッケージ) に関する知識
  • gofmt ツールの目的と機能に関する一般的な知識
  • Web検索結果: "Go issue 3961 gofmt CRLF"