Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
dfa0351d
提交
dfa0351d
authored
8月 10, 2015
作者:
rht
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refactor ipfs get
License: MIT Signed-off-by:
rht
<
rhtbot@gmail.com
>
上级
3dfe02aa
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
70 行增加
和
103 行删除
+70
-103
get.go
core/commands/get.go
+8
-49
readonly_unix.go
fuse/readonly/readonly_unix.go
+1
-1
dagreader.go
unixfs/io/dagreader.go
+6
-7
writer.go
unixfs/tar/writer.go
+55
-46
没有找到文件。
core/commands/get.go
浏览文件 @
dfa0351d
package
commands
import
(
"bufio"
"compress/gzip"
"errors"
"fmt"
...
...
@@ -11,13 +10,11 @@ import (
"strings"
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/cheggaaa/pb"
context
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
cmds
"github.com/ipfs/go-ipfs/commands"
core
"github.com/ipfs/go-ipfs/core"
path
"github.com/ipfs/go-ipfs/path"
tar
"github.com/ipfs/go-ipfs/thirdparty/tar"
uio
"github.com/ipfs/go-ipfs/unixfs/io"
utar
"github.com/ipfs/go-ipfs/unixfs/tar"
)
...
...
@@ -64,15 +61,16 @@ may also specify the level of compression by specifying '-l=<1-9>'.
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
}
p
:=
path
.
Path
(
req
.
Arguments
()[
0
])
var
reader
io
.
Reader
if
archive
,
_
,
_
:=
req
.
Option
(
"archive"
)
.
Bool
();
!
archive
&&
cmplvl
!=
gzip
.
NoCompression
{
// only use this when the flag is '-C' without '-a'
reader
,
err
=
getZip
(
req
.
Context
(),
node
,
p
,
cmplvl
)
}
else
{
reader
,
err
=
get
(
req
.
Context
(),
node
,
p
,
cmplvl
)
ctx
:=
req
.
Context
()
dn
,
err
:=
core
.
Resolve
(
ctx
,
node
,
p
)
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
}
archive
,
_
,
_
:=
req
.
Option
(
"archive"
)
.
Bool
()
reader
,
err
:=
utar
.
DagArchive
(
ctx
,
dn
,
p
.
String
(),
node
.
DAG
,
archive
,
cmplvl
)
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
...
...
@@ -192,42 +190,3 @@ func getCompressOptions(req cmds.Request) (int, error) {
}
return
gzip
.
NoCompression
,
nil
}
func
get
(
ctx
context
.
Context
,
node
*
core
.
IpfsNode
,
p
path
.
Path
,
compression
int
)
(
io
.
Reader
,
error
)
{
dn
,
err
:=
core
.
Resolve
(
ctx
,
node
,
p
)
if
err
!=
nil
{
return
nil
,
err
}
return
utar
.
DagArchive
(
ctx
,
dn
,
p
.
String
(),
node
.
DAG
,
compression
)
}
// getZip is equivalent to `ipfs getdag $hash | gzip`
func
getZip
(
ctx
context
.
Context
,
node
*
core
.
IpfsNode
,
p
path
.
Path
,
compression
int
)
(
io
.
Reader
,
error
)
{
dagnode
,
err
:=
core
.
Resolve
(
ctx
,
node
,
p
)
if
err
!=
nil
{
return
nil
,
err
}
reader
,
err
:=
uio
.
NewDagReader
(
ctx
,
dagnode
,
node
.
DAG
)
if
err
!=
nil
{
return
nil
,
err
}
pr
,
pw
:=
io
.
Pipe
()
gw
,
err
:=
gzip
.
NewWriterLevel
(
pw
,
compression
)
if
err
!=
nil
{
return
nil
,
err
}
bufin
:=
bufio
.
NewReader
(
reader
)
go
func
()
{
_
,
err
:=
bufin
.
WriteTo
(
gw
)
if
err
!=
nil
{
log
.
Error
(
"Fail to compress the stream"
)
}
gw
.
Close
()
pw
.
Close
()
}()
return
pr
,
nil
}
fuse/readonly/readonly_unix.go
浏览文件 @
dfa0351d
...
...
@@ -180,7 +180,7 @@ func (s *Node) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadR
return
err
}
buf
:=
resp
.
Data
[
:
min
(
req
.
Size
,
int
(
r
.
Size
(
)
-
req
.
Offset
))]
buf
:=
resp
.
Data
[
:
min
(
req
.
Size
,
int
(
int64
(
r
.
Size
()
)
-
req
.
Offset
))]
n
,
err
:=
io
.
ReadFull
(
r
,
buf
)
if
err
!=
nil
&&
err
!=
io
.
EOF
{
return
err
...
...
unixfs/io/dagreader.go
浏览文件 @
dfa0351d
...
...
@@ -58,8 +58,7 @@ type ReadSeekCloser interface {
// node, using the passed in DAGService for data retreival
func
NewDagReader
(
ctx
context
.
Context
,
n
*
mdag
.
Node
,
serv
mdag
.
DAGService
)
(
*
DagReader
,
error
)
{
pb
:=
new
(
ftpb
.
Data
)
err
:=
proto
.
Unmarshal
(
n
.
Data
,
pb
)
if
err
!=
nil
{
if
err
:=
proto
.
Unmarshal
(
n
.
Data
,
pb
);
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -70,7 +69,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag
case
ftpb
.
Data_Raw
:
fallthrough
case
ftpb
.
Data_File
:
return
n
ewDataFileReader
(
ctx
,
n
,
pb
,
serv
),
nil
return
N
ewDataFileReader
(
ctx
,
n
,
pb
,
serv
),
nil
case
ftpb
.
Data_Metadata
:
if
len
(
n
.
Links
)
==
0
{
return
nil
,
errors
.
New
(
"incorrectly formatted metadata object"
)
...
...
@@ -85,7 +84,7 @@ func NewDagReader(ctx context.Context, n *mdag.Node, serv mdag.DAGService) (*Dag
}
}
func
n
ewDataFileReader
(
ctx
context
.
Context
,
n
*
mdag
.
Node
,
pb
*
ftpb
.
Data
,
serv
mdag
.
DAGService
)
*
DagReader
{
func
N
ewDataFileReader
(
ctx
context
.
Context
,
n
*
mdag
.
Node
,
pb
*
ftpb
.
Data
,
serv
mdag
.
DAGService
)
*
DagReader
{
fctx
,
cancel
:=
context
.
WithCancel
(
ctx
)
promises
:=
serv
.
GetDAG
(
fctx
,
n
)
return
&
DagReader
{
...
...
@@ -124,7 +123,7 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error {
// A directory should not exist within a file
return
ft
.
ErrInvalidDirLocation
case
ftpb
.
Data_File
:
dr
.
buf
=
n
ewDataFileReader
(
dr
.
ctx
,
nxt
,
pb
,
dr
.
serv
)
dr
.
buf
=
N
ewDataFileReader
(
dr
.
ctx
,
nxt
,
pb
,
dr
.
serv
)
return
nil
case
ftpb
.
Data_Raw
:
dr
.
buf
=
NewRSNCFromBytes
(
pb
.
GetData
())
...
...
@@ -137,8 +136,8 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error {
}
// Size return the total length of the data from the DAG structured file.
func
(
dr
*
DagReader
)
Size
()
int64
{
return
int64
(
dr
.
pbdata
.
GetFilesize
()
)
func
(
dr
*
DagReader
)
Size
()
u
int64
{
return
dr
.
pbdata
.
GetFilesize
(
)
}
// Read reads data from the DAG structured file
...
...
unixfs/tar/writer.go
浏览文件 @
dfa0351d
...
...
@@ -4,7 +4,6 @@ import (
"archive/tar"
"bufio"
"compress/gzip"
"fmt"
"io"
"path"
"time"
...
...
@@ -13,6 +12,7 @@ import (
cxt
"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
mdag
"github.com/ipfs/go-ipfs/merkledag"
ft
"github.com/ipfs/go-ipfs/unixfs"
uio
"github.com/ipfs/go-ipfs/unixfs/io"
upb
"github.com/ipfs/go-ipfs/unixfs/pb"
)
...
...
@@ -21,7 +21,8 @@ import (
// TODO: does this need to be configurable?
var
DefaultBufSize
=
1048576
func
DagArchive
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
name
string
,
dag
mdag
.
DAGService
,
compression
int
)
(
io
.
Reader
,
error
)
{
// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip`
func
DagArchive
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
name
string
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
)
(
io
.
Reader
,
error
)
{
_
,
filename
:=
path
.
Split
(
name
)
...
...
@@ -31,17 +32,44 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService
// use a buffered writer to parallelize task
bufw
:=
bufio
.
NewWriterSize
(
pipew
,
DefaultBufSize
)
// compression determines whether to use gzip compression.
var
maybeGzw
io
.
Writer
if
compression
!=
gzip
.
NoCompression
{
var
err
error
maybeGzw
,
err
=
gzip
.
NewWriterLevel
(
bufw
,
compression
)
if
err
!=
nil
{
return
nil
,
err
}
}
else
{
maybeGzw
=
bufw
}
// construct the tar writer
w
,
err
:=
NewWriter
(
bufw
,
dag
,
compression
)
w
,
err
:=
NewWriter
(
ctx
,
dag
,
archive
,
compression
,
maybeGzw
)
if
err
!=
nil
{
return
nil
,
err
}
// write all the nodes recursively
go
func
()
{
if
err
:=
w
.
WriteNode
(
ctx
,
nd
,
filename
);
err
!=
nil
{
pipew
.
CloseWithError
(
err
)
return
if
!
archive
&&
compression
!=
gzip
.
NoCompression
{
// the case when the node is a file
dagr
,
err
:=
uio
.
NewDagReader
(
w
.
ctx
,
nd
,
w
.
Dag
)
if
err
!=
nil
{
pipew
.
CloseWithError
(
err
)
return
}
if
_
,
err
:=
dagr
.
WriteTo
(
maybeGzw
);
err
!=
nil
{
pipew
.
CloseWithError
(
err
)
return
}
}
else
{
// the case for 1. archive, and 2. not archived and not compressed, in which tar is used anyway as a transport format
if
err
:=
w
.
WriteNode
(
nd
,
filename
);
err
!=
nil
{
pipew
.
CloseWithError
(
err
)
return
}
}
if
err
:=
bufw
.
Flush
();
err
!=
nil
{
...
...
@@ -49,6 +77,7 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService
return
}
w
.
Close
()
pipew
.
Close
()
// everything seems to be ok.
}()
...
...
@@ -61,39 +90,32 @@ func DagArchive(ctx cxt.Context, nd *mdag.Node, name string, dag mdag.DAGService
type
Writer
struct
{
Dag
mdag
.
DAGService
TarW
*
tar
.
Writer
ctx
cxt
.
Context
}
// NewWriter wraps given io.Writer.
// compression determines whether to use gzip compression.
func
NewWriter
(
w
io
.
Writer
,
dag
mdag
.
DAGService
,
compression
int
)
(
*
Writer
,
error
)
{
if
compression
!=
gzip
.
NoCompression
{
var
err
error
w
,
err
=
gzip
.
NewWriterLevel
(
w
,
compression
)
if
err
!=
nil
{
return
nil
,
err
}
}
func
NewWriter
(
ctx
cxt
.
Context
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
,
w
io
.
Writer
)
(
*
Writer
,
error
)
{
return
&
Writer
{
Dag
:
dag
,
TarW
:
tar
.
NewWriter
(
w
),
ctx
:
ctx
,
},
nil
}
func
(
w
*
Writer
)
WriteDir
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
fpath
string
)
error
{
func
(
w
*
Writer
)
writeDir
(
nd
*
mdag
.
Node
,
fpath
string
)
error
{
if
err
:=
writeDirHeader
(
w
.
TarW
,
fpath
);
err
!=
nil
{
return
err
}
for
i
,
ng
:=
range
w
.
Dag
.
GetDAG
(
ctx
,
nd
)
{
child
,
err
:=
ng
.
Get
(
ctx
)
for
i
,
ng
:=
range
w
.
Dag
.
GetDAG
(
w
.
ctx
,
nd
)
{
child
,
err
:=
ng
.
Get
(
w
.
ctx
)
if
err
!=
nil
{
return
err
}
npath
:=
path
.
Join
(
fpath
,
nd
.
Links
[
i
]
.
Name
)
if
err
:=
w
.
WriteNode
(
c
tx
,
c
hild
,
npath
);
err
!=
nil
{
if
err
:=
w
.
WriteNode
(
child
,
npath
);
err
!=
nil
{
return
err
}
}
...
...
@@ -101,46 +123,33 @@ func (w *Writer) WriteDir(ctx cxt.Context, nd *mdag.Node, fpath string) error {
return
nil
}
func
(
w
*
Writer
)
WriteFile
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
fpath
string
)
error
{
pb
:=
new
(
upb
.
Data
)
if
err
:=
proto
.
Unmarshal
(
nd
.
Data
,
pb
);
err
!=
nil
{
return
err
}
return
w
.
writeFile
(
ctx
,
nd
,
pb
,
fpath
)
}
func
(
w
*
Writer
)
writeFile
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
pb
*
upb
.
Data
,
fpath
string
)
error
{
func
(
w
*
Writer
)
writeFile
(
nd
*
mdag
.
Node
,
pb
*
upb
.
Data
,
fpath
string
)
error
{
if
err
:=
writeFileHeader
(
w
.
TarW
,
fpath
,
pb
.
GetFilesize
());
err
!=
nil
{
return
err
}
dagr
,
err
:=
uio
.
NewDagReader
(
ctx
,
nd
,
w
.
Dag
)
if
err
!=
nil
{
return
err
}
_
,
err
=
io
.
Copy
(
w
.
TarW
,
dagr
)
if
err
!=
nil
&&
err
!=
io
.
EOF
{
return
err
}
return
nil
dagr
:=
uio
.
NewDataFileReader
(
w
.
ctx
,
nd
,
pb
,
w
.
Dag
)
_
,
err
:=
dagr
.
WriteTo
(
w
.
TarW
)
return
err
}
func
(
w
*
Writer
)
WriteNode
(
ctx
cxt
.
Context
,
nd
*
mdag
.
Node
,
fpath
string
)
error
{
func
(
w
*
Writer
)
WriteNode
(
nd
*
mdag
.
Node
,
fpath
string
)
error
{
pb
:=
new
(
upb
.
Data
)
if
err
:=
proto
.
Unmarshal
(
nd
.
Data
,
pb
);
err
!=
nil
{
return
err
}
switch
pb
.
GetType
()
{
case
upb
.
Data_Metadata
:
fallthrough
case
upb
.
Data_Directory
:
return
w
.
WriteDir
(
ctx
,
nd
,
fpath
)
return
w
.
writeDir
(
nd
,
fpath
)
case
upb
.
Data_Raw
:
fallthrough
case
upb
.
Data_File
:
return
w
.
writeFile
(
ctx
,
nd
,
pb
,
fpath
)
return
w
.
writeFile
(
nd
,
pb
,
fpath
)
default
:
return
f
mt
.
Errorf
(
"unixfs type not supported: %s"
,
pb
.
GetType
())
return
f
t
.
ErrUnrecognizedType
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论