* Remove non-deterministic stuff from unit tests, like the tracker UDP and fuse fs stuff.
* Expose a public Torrent type bound to a given client or similar to work with common per-torrent operations.
* Split scraping and announcing on DHT into separate routines.
- * Ping nodes that stop being good.
\ No newline at end of file
+ * Ping nodes that stop being good.
+ * Merge duplicate magnet data.
\ No newline at end of file
"bazil.org/fuse"
fusefs "bazil.org/fuse/fs"
"bitbucket.org/anacrolix/go.torrent"
- "github.com/anacrolix/libtorgo/metainfo"
)
const (
type node struct {
path []string
- metadata *metainfo.Info
+ metadata *torrent.MetaInfo
FS *torrentFS
InfoHash torrent.InfoHash
}
return
}
-func isSingleFileTorrent(md *metainfo.Info) bool {
- return len(md.Files) == 0
-}
-
func (me rootNode) Lookup(name string, intr fusefs.Intr) (_node fusefs.Node, err fuse.Error) {
for _, t := range me.fs.Client.Torrents() {
if t.Name() != name || t.Info == nil {
FS: me.fs,
InfoHash: t.InfoHash,
}
- if isSingleFileTorrent(t.Info) {
+ if t.Info.SingleFile() {
_node = fileNode{__node, uint64(t.Info.Length), 0}
} else {
_node = dirNode{__node}
}
func (me rootNode) ReadDir(intr fusefs.Intr) (dirents []fuse.Dirent, err fuse.Error) {
- for _, _torrent := range me.fs.Client.Torrents() {
- metaInfo := _torrent.Info
- if metaInfo == nil {
+ for _, t := range me.fs.Client.Torrents() {
+ if t.Info == nil {
continue
}
dirents = append(dirents, fuse.Dirent{
- Name: metaInfo.Name,
+ Name: t.Info.Name,
Type: func() fuse.DirentType {
- if isSingleFileTorrent(metaInfo) {
+ if t.Info.SingleFile() {
return fuse.DT_File
} else {
return fuse.DT_Dir
--- /dev/null
+package torrent
+
+import "github.com/anacrolix/libtorgo/metainfo"
+
+type MetaInfo struct {
+ *metainfo.Info
+}
+
+func newMetaInfo(info *metainfo.Info) *MetaInfo {
+ return &MetaInfo{
+ Info: info,
+ }
+}
+
+func (me *MetaInfo) SingleFile() bool {
+ return len(me.Info.Files) == 0
+}
dataLock sync.RWMutex
Data mmap_span.MMapSpan
- Info *metainfo.Info
+ Info *MetaInfo
// Active peer connections.
Conns []*connection
// Set of addrs to which we're attempting to connect.
// Called when metadata for a torrent becomes available.
func (t *torrent) setMetadata(md metainfo.Info, dataDir string, infoBytes []byte) (err error) {
- t.Info = &md
+ t.Info = newMetaInfo(&md)
t.MetaData = infoBytes
t.metadataHave = nil
t.Data, err = mmapTorrentData(&md, dataDir)