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

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

このコミットは、Go言語の標準ライブラリ path パッケージ内の Dir 関数のドキュメンテーションを改善することを目的としています。具体的には、Dir 関数がパスを処理する際の Clean および末尾のスラッシュの除去のタイミングに関する記述をより正確に修正しています。また、その変更を反映するためのテストケースが追加されています。

コミット

commit b7627d3d1f238e484d08bb8abb770cbe91482bc4
Author: Rob Pike <r@golang.org>
Date:   Thu Aug 30 11:16:41 2012 -0700

    path: improve documentation for Dir
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/6495059

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

https://github.com/golang/go/commit/b7627d3d1f238e484d08bb8abb770cbe91482bc4

元コミット内容

path: improve documentation for Dir

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6495059

変更の背景

path.Dir 関数の既存のドキュメンテーションは、「パスは処理の前に Clean され、末尾のスラッシュが除去される」と記述していました。しかし、実際の Dir 関数の内部動作は、パスの最後の要素を Split で分離した「後」に Clean 処理と末尾のスラッシュ除去が行われるというものでした。この記述の不正確さが、開発者にとって Dir 関数の挙動を誤解させる可能性がありました。

このコミットは、この誤解を解消し、Dir 関数の実際の動作を正確に反映するようにドキュメンテーションを修正することを目的としています。これにより、開発者が path パッケージをより正確に理解し、適切に使用できるようになります。

前提知識の解説

このコミットを理解するためには、Go言語の path パッケージにおける以下の関数についての基本的な知識が必要です。

  • path.Dir(path string) string: Dir 関数は、パスの最後の要素を除いた部分(通常はディレクトリ)を返します。例えば、path.Dir("a/b/c")"a/b" を返します。特殊なケースとして、パスが空の場合は "." を返し、スラッシュのみで構成される場合は単一のスラッシュを返します。

  • path.Clean(path string) string: Clean 関数は、パスを簡潔な形式に変換します。具体的には、以下の処理を行います。

    • // のような重複するスラッシュを単一のスラッシュに置き換えます。
    • . (カレントディレクトリ)を削除します。
    • .. (親ディレクトリ)を解決します。
    • 末尾のスラッシュを削除します(ルートディレクトリ / を除く)。 例えば、path.Clean("a/b/../c")"a/c" を返します。
  • path.Split(path string) (dir, file string): Split 関数は、パスをディレクトリ部分とファイル部分に分割します。最後のスラッシュとその後のすべての文字がファイル部分と見なされます。 例えば、path.Split("a/b/c.txt")("a/b/", "c.txt") を返します。path.Split("a/b/")("a/b/", "") を返します。

このコミットの核心は、Dir 関数が Clean 処理と末尾のスラッシュ除去を、パスを Split して最後の要素を削除した「後」に行うという点にあります。

技術的詳細

path.Dir 関数のドキュメンテーションの変更は、その内部処理の正確な順序を反映しています。

変更前のドキュメンテーションの記述: The path is Cleaned and trailing slashes are removed before processing. (パスは処理の前に Clean され、末尾のスラッシュが除去される。)

この記述は、Dir 関数がパス全体に対してまず Clean 処理を行い、その後でディレクトリ部分を抽出するかのような印象を与えます。

変更後のドキュメンテーションの記述: After dropping the final element using Split, the path is Cleaned and trailing slashes are removed.Split を使用して最後の要素を削除した後、パスは Clean され、末尾のスラッシュが除去される。)

この修正は、Dir 関数の実際の動作を正確に記述しています。Dir 関数は、まず path.Split を使用してパスをディレクトリ部分とファイル部分に分割し、ファイル部分を「削除」します。その後、残ったディレクトリ部分に対して path.Clean 処理を適用し、末尾のスラッシュを除去します。

この違いは、例えば abc////def のようなパスで顕著になります。

  • もし「処理の前に Clean される」のであれば、abc////def はまず abc/defClean され、その Dirabc となるでしょう。
  • しかし、実際の動作は「Split で最後の要素を削除した後 Clean される」です。
    1. Split("abc////def")("abc////", "def") を返します。
    2. ファイル要素 def を削除すると、残りは abc//// です。
    3. Clean("abc////")abc を返します。

このコミットでは、この挙動を明確にするために path_test.go{"abc////def", "abc"} という新しいテストケースが追加されています。これは、Dir 関数が abc////def に対して abc を返すことを確認するものです。このテストケースは、ドキュメンテーションの修正が単なる文言の変更ではなく、関数の実際の動作と整合していることを保証します。

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

このコミットで変更された主要なコードは、src/pkg/path/path.goDir 関数のドキュメンテーションコメントと、src/pkg/path/path_test.go のテストケースです。

src/pkg/path/path.go の変更:

--- a/src/pkg/path/path.go
+++ b/src/pkg/path/path.go
@@ -198,7 +198,8 @@ func IsAbs(path string) bool {
 }

 // Dir returns all but the last element of path, typically the path's directory.
-// The path is Cleaned and trailing slashes are removed before processing.
+// After dropping the final element using Split, the path is Cleaned and trailing
+// slashes are removed.
 // If the path is empty, Dir returns ".".
 // If the path consists entirely of slashes followed by non-slash bytes, Dir
 // returns a single slash. In any other case, the returned path does not end in a

src/pkg/path/path_test.go の変更:

--- a/src/pkg/path/path_test.go
+++ b/src/pkg/path/path_test.go
@@ -200,6 +200,7 @@ var dirtests = []PathTest{
 	{"x/", "x"},
 	{"abc", "."},
 	{"abc/def", "abc"},
+	{"abc////def", "abc"},
 	{"a/b/.x", "a/b"},
 	{"a/b/c.", "a/b"},
 	{"a/b/c.x", "a/b"},

コアとなるコードの解説

src/pkg/path/path.go の変更は、Dir 関数のドキュメンテーションコメントの1行を修正しています。

  • 変更前: // The path is Cleaned and trailing slashes are removed before processing.
  • 変更後: // After dropping the final element using Split, the path is Cleaned and trailing // slashes are removed.

この変更は、Dir 関数の内部的な処理順序をより正確に反映しています。Dir 関数は、まず path.Split を使ってパスをディレクトリとファイルに分割し、ファイル部分を捨てた後、残ったディレクトリ部分に対して path.Clean を適用し、末尾のスラッシュを除去します。この修正により、ドキュメンテーションが実際の関数の挙動と一致するようになりました。

src/pkg/path/path_test.go の変更は、dirtests というテストスライスに新しいテストケースを追加しています。

  • 追加されたテストケース: {"abc////def", "abc"}

このテストケースは、入力パス abc////def に対して Dir 関数が abc を返すことを検証します。これは、Dir 関数が Split で最後の要素 (def) を削除した後に残る abc////Clean して abc にするという、ドキュメンテーションで修正された挙動を具体的に確認するものです。このテストの追加により、ドキュメンテーションの正確性がコードレベルで保証されます。

関連リンク

参考にした情報源リンク