]> Sergey Matveev's repositories - btrtrc.git/commitdiff
metainfo.Info.BuildFromFilePath: Ensure stable file ordering
authorMatt Joiner <anacrolix@gmail.com>
Thu, 7 Jul 2016 09:40:26 +0000 (19:40 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 7 Jul 2016 09:40:26 +0000 (19:40 +1000)
Spotted by @axet, with precedent in Transmission.

metainfo/metainfo.go
metainfo/metainfo_test.go

index 8ecd7c5d7123ab93396b84e725aabe941424b21a..8d9f6e3093c0dc94db9feaf15354207a7e197016 100644 (file)
@@ -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))))
        })
index b2845fa9d87f6ad11ef8a7d3a7ce66cf1806ef71..a119f31381eab3e0733401b88f15ddb8d700345f 100644 (file)
@@ -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)
+}