From: Matt Joiner Date: Thu, 7 Jul 2016 09:40:26 +0000 (+1000) Subject: metainfo.Info.BuildFromFilePath: Ensure stable file ordering X-Git-Tag: v1.0.0~655 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=2490c96f2f122c8d0a8365f06dfdebc0a875b788;p=btrtrc.git metainfo.Info.BuildFromFilePath: Ensure stable file ordering Spotted by @axet, with precedent in Transmission. --- diff --git a/metainfo/metainfo.go b/metainfo/metainfo.go index 8ecd7c5d..8d9f6e30 100644 --- a/metainfo/metainfo.go +++ b/metainfo/metainfo.go @@ -11,6 +11,8 @@ import ( "strings" "time" + "github.com/anacrolix/missinggo" + "github.com/anacrolix/torrent/bencode" ) @@ -83,6 +85,9 @@ func (info *Info) BuildFromFilePath(root string) (err error) { if err != nil { return } + missinggo.SortSlice(info.Files, func(l, r FileInfo) bool { + return strings.Join(l.Path, "/") < strings.Join(r.Path, "/") + }) err = info.GeneratePieces(func(fi FileInfo) (io.ReadCloser, error) { return os.Open(filepath.Join(root, strings.Join(fi.Path, string(filepath.Separator)))) }) diff --git a/metainfo/metainfo_test.go b/metainfo/metainfo_test.go index b2845fa9..a119f313 100644 --- a/metainfo/metainfo_test.go +++ b/metainfo/metainfo_test.go @@ -3,7 +3,9 @@ package metainfo import ( "io" "io/ioutil" + "os" "path" + "path/filepath" "testing" "github.com/anacrolix/missinggo" @@ -68,3 +70,29 @@ func TestNumPieces(t *testing.T) { assert.EqualValues(t, _case.NumPieces, info.NumPieces()) } } + +func touchFile(path string) (err error) { + f, err := os.Create(path) + if err != nil { + return + } + err = f.Close() + return +} + +func TestBuildFromFilePathOrder(t *testing.T) { + td, err := ioutil.TempDir("", "anacrolix") + require.NoError(t, err) + defer os.RemoveAll(td) + require.NoError(t, touchFile(filepath.Join(td, "b"))) + require.NoError(t, touchFile(filepath.Join(td, "a"))) + info := Info{ + PieceLength: 1, + } + require.NoError(t, info.BuildFromFilePath(td)) + assert.EqualValues(t, []FileInfo{{ + Path: []string{"a"}, + }, { + Path: []string{"b"}, + }}, info.Files) +}