From 2490c96f2f122c8d0a8365f06dfdebc0a875b788 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 7 Jul 2016 19:40:26 +1000 Subject: [PATCH] metainfo.Info.BuildFromFilePath: Ensure stable file ordering Spotted by @axet, with precedent in Transmission. --- metainfo/metainfo.go | 5 +++++ metainfo/metainfo_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) 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) +} -- 2.44.0