Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
G
go-ipfs
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
jihao
go-ipfs
Commits
b1588c71
提交
b1588c71
authored
3月 06, 2017
作者:
Jeromy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
make raw leaves work with 'ipfs get'
License: MIT Signed-off-by:
Jeromy
<
jeromyj@gmail.com
>
上级
60b94a2c
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
72 行增加
和
43 行删除
+72
-43
get.go
core/commands/get.go
+14
-12
t0090-get.sh
test/sharness/t0090-get.sh
+14
-0
archive.go
unixfs/archive/archive.go
+4
-3
writer.go
unixfs/archive/tar/writer.go
+40
-28
没有找到文件。
core/commands/get.go
浏览文件 @
b1588c71
...
...
@@ -70,22 +70,24 @@ may also specify the level of compression by specifying '-l=<1-9>'.
return
}
pbnd
,
ok
:=
dn
.
(
*
dag
.
ProtoNode
)
if
!
ok
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
switch
dn
:=
dn
.
(
type
)
{
case
*
dag
.
ProtoNode
:
size
,
err
:=
dn
.
Size
()
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
}
res
.
SetLength
(
size
)
case
*
dag
.
RawNode
:
res
.
SetLength
(
uint64
(
len
(
dn
.
RawData
())))
default
:
res
.
SetError
(
fmt
.
Errorf
(
"'ipfs get' only supports unixfs nodes"
),
cmds
.
ErrNormal
)
return
}
size
,
err
:=
dn
.
Size
()
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
}
res
.
SetLength
(
size
)
archive
,
_
,
_
:=
req
.
Option
(
"archive"
)
.
Bool
()
reader
,
err
:=
uarchive
.
DagArchive
(
ctx
,
pbnd
,
p
.
String
(),
node
.
DAG
,
archive
,
cmplvl
)
reader
,
err
:=
uarchive
.
DagArchive
(
ctx
,
dn
,
p
.
String
(),
node
.
DAG
,
archive
,
cmplvl
)
if
err
!=
nil
{
res
.
SetError
(
err
,
cmds
.
ErrNormal
)
return
...
...
test/sharness/t0090-get.sh
浏览文件 @
b1588c71
...
...
@@ -64,6 +64,20 @@ test_get_cmd() {
rm "$HASH"
'
test_expect_success
"ipfs get works with raw leaves"
'
HASH2=$(ipfs add --raw-leaves -q data) &&
ipfs get "$HASH2" >actual2
'
test_expect_success
"ipfs get output looks good"
'
printf "%s\n\n" "Saving file(s) to $HASH2" >expected2 &&
test_cmp expected2 actual2
'
test_expect_success
"ipfs get file output looks good"
'
test_cmp "$HASH2" data
'
test_ipfs_get_flag
".tar"
"-xf"
-a
test_ipfs_get_flag
".tar.gz"
"-zxf"
-a
-C
...
...
unixfs/archive/archive.go
浏览文件 @
b1588c71
...
...
@@ -3,14 +3,15 @@ package archive
import
(
"bufio"
"compress/gzip"
"context"
"io"
"path"
cxt
"context"
mdag
"github.com/ipfs/go-ipfs/merkledag"
tar
"github.com/ipfs/go-ipfs/unixfs/archive/tar"
uio
"github.com/ipfs/go-ipfs/unixfs/io"
node
"gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node"
)
// DefaultBufSize is the buffer size for gets. for now, 1MB, which is ~4 blocks.
...
...
@@ -30,7 +31,7 @@ func (i *identityWriteCloser) Close() error {
}
// DagArchive is equivalent to `ipfs getdag $hash | maybe_tar | maybe_gzip`
func
DagArchive
(
ctx
c
xt
.
Context
,
nd
*
mdag
.
Proto
Node
,
name
string
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
)
(
io
.
Reader
,
error
)
{
func
DagArchive
(
ctx
c
ontext
.
Context
,
nd
node
.
Node
,
name
string
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
)
(
io
.
Reader
,
error
)
{
_
,
filename
:=
path
.
Split
(
name
)
...
...
unixfs/archive/tar/writer.go
浏览文件 @
b1588c71
...
...
@@ -2,17 +2,19 @@ package tar
import
(
"archive/tar"
"context"
"fmt"
"io"
"path"
"time"
cxt
"context"
proto
"gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
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"
node
"gx/ipfs/QmYDscK7dmdo2GZ9aumS8s5auUUAH5mR1jvj5pYhWusfK7/go-ipld-node"
proto
"gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
)
// Writer is a utility structure that helps to write
...
...
@@ -22,11 +24,11 @@ type Writer struct {
Dag
mdag
.
DAGService
TarW
*
tar
.
Writer
ctx
cxt
.
Context
ctx
c
onte
xt
.
Context
}
// NewWriter wraps given io.Writer.
func
NewWriter
(
ctx
cxt
.
Context
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
,
w
io
.
Writer
)
(
*
Writer
,
error
)
{
func
NewWriter
(
ctx
c
onte
xt
.
Context
,
dag
mdag
.
DAGService
,
archive
bool
,
compression
int
,
w
io
.
Writer
)
(
*
Writer
,
error
)
{
return
&
Writer
{
Dag
:
dag
,
TarW
:
tar
.
NewWriter
(
w
),
...
...
@@ -45,13 +47,8 @@ func (w *Writer) writeDir(nd *mdag.ProtoNode, fpath string) error {
return
err
}
childpb
,
ok
:=
child
.
(
*
mdag
.
ProtoNode
)
if
!
ok
{
return
mdag
.
ErrNotProtobuf
}
npath
:=
path
.
Join
(
fpath
,
nd
.
Links
()[
i
]
.
Name
)
if
err
:=
w
.
WriteNode
(
child
pb
,
npath
);
err
!=
nil
{
if
err
:=
w
.
WriteNode
(
child
,
npath
);
err
!=
nil
{
return
err
}
}
...
...
@@ -72,25 +69,40 @@ func (w *Writer) writeFile(nd *mdag.ProtoNode, pb *upb.Data, fpath string) error
return
nil
}
func
(
w
*
Writer
)
WriteNode
(
nd
*
mdag
.
ProtoNode
,
fpath
string
)
error
{
pb
:=
new
(
upb
.
Data
)
if
err
:=
proto
.
Unmarshal
(
nd
.
Data
(),
pb
);
err
!=
nil
{
return
err
}
func
(
w
*
Writer
)
WriteNode
(
nd
node
.
Node
,
fpath
string
)
error
{
switch
nd
:=
nd
.
(
type
)
{
case
*
mdag
.
ProtoNode
:
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
(
nd
,
fpath
)
case
upb
.
Data_Raw
:
fallthrough
case
upb
.
Data_File
:
return
w
.
writeFile
(
nd
,
pb
,
fpath
)
case
upb
.
Data_Symlink
:
return
writeSymlinkHeader
(
w
.
TarW
,
string
(
pb
.
GetData
()),
fpath
)
default
:
return
ft
.
ErrUnrecognizedType
}
case
*
mdag
.
RawNode
:
if
err
:=
writeFileHeader
(
w
.
TarW
,
fpath
,
uint64
(
len
(
nd
.
RawData
())));
err
!=
nil
{
return
err
}
switch
pb
.
GetType
()
{
case
upb
.
Data_Metadata
:
fallthrough
case
upb
.
Data_Directory
:
return
w
.
writeDir
(
nd
,
fpath
)
case
upb
.
Data_Raw
:
fallthrough
case
upb
.
Data_File
:
return
w
.
writeFile
(
nd
,
pb
,
fpath
)
case
upb
.
Data_Symlink
:
return
writeSymlinkHeader
(
w
.
TarW
,
string
(
pb
.
GetData
()),
fpath
)
if
_
,
err
:=
w
.
TarW
.
Write
(
nd
.
RawData
());
err
!=
nil
{
return
err
}
w
.
TarW
.
Flush
()
return
nil
default
:
return
f
t
.
ErrUnrecognizedType
return
f
mt
.
Errorf
(
"nodes of type %T are not supported in unixfs"
,
nd
)
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论