mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-09 18:28:08 +08:00
Merge pull request #2706 from ipfs/feature/MFSStatsHashOnly
Add --format option to mfs stat command
This commit is contained in:
commit
6f716463d2
@ -53,6 +53,8 @@ on the files in question, then data may be lost. This also applies to running
|
||||
},
|
||||
}
|
||||
|
||||
var formatError = errors.New("Format was set by multiple options. Only one format option is allowed")
|
||||
|
||||
var FilesStatCmd = &cmds.Command{
|
||||
Helptext: cmds.HelpText{
|
||||
Tagline: "Display file status.",
|
||||
@ -61,7 +63,24 @@ var FilesStatCmd = &cmds.Command{
|
||||
Arguments: []cmds.Argument{
|
||||
cmds.StringArg("path", true, false, "Path to node to stat."),
|
||||
},
|
||||
Options: []cmds.Option{
|
||||
cmds.StringOption("format", "Print statistics in given format. Allowed tokens: "+
|
||||
"<hash> <size> <cumulsize> <type> <childs>. Conflicts with other format options.").Default(
|
||||
`<hash>
|
||||
Size: <size>
|
||||
CumulativeSize: <cumulsize>
|
||||
ChildBlocks: <childs>
|
||||
Type: <type>`),
|
||||
cmds.BoolOption("hash", "Print only hash. Implies '--format=<hash>. Conflicts with other format options.").Default(false),
|
||||
cmds.BoolOption("size", "Print only size. Implies '--format=<cumulsize>. Conflicts with other format options.").Default(false),
|
||||
},
|
||||
Run: func(req cmds.Request, res cmds.Response) {
|
||||
|
||||
_, err := statGetFormatOptions(req)
|
||||
if err != nil {
|
||||
res.SetError(err, cmds.ErrClient)
|
||||
}
|
||||
|
||||
node, err := req.InvocContext().GetNode()
|
||||
if err != nil {
|
||||
res.SetError(err, cmds.ErrNormal)
|
||||
@ -90,19 +109,47 @@ var FilesStatCmd = &cmds.Command{
|
||||
},
|
||||
Marshalers: cmds.MarshalerMap{
|
||||
cmds.Text: func(res cmds.Response) (io.Reader, error) {
|
||||
|
||||
out := res.Output().(*Object)
|
||||
buf := new(bytes.Buffer)
|
||||
fmt.Fprintln(buf, out.Hash)
|
||||
fmt.Fprintf(buf, "Size: %d\n", out.Size)
|
||||
fmt.Fprintf(buf, "CumulativeSize: %d\n", out.CumulativeSize)
|
||||
fmt.Fprintf(buf, "ChildBlocks: %d\n", out.Blocks)
|
||||
fmt.Fprintf(buf, "Type: %s\n", out.Type)
|
||||
|
||||
s, _ := statGetFormatOptions(res.Request())
|
||||
s = strings.Replace(s, "<hash>", out.Hash, -1)
|
||||
s = strings.Replace(s, "<size>", fmt.Sprintf("%d", out.Size), -1)
|
||||
s = strings.Replace(s, "<cumulsize>", fmt.Sprintf("%d", out.CumulativeSize), -1)
|
||||
s = strings.Replace(s, "<childs>", fmt.Sprintf("%d", out.Blocks), -1)
|
||||
s = strings.Replace(s, "<type>", out.Type, -1)
|
||||
|
||||
fmt.Fprintln(buf, s)
|
||||
return buf, nil
|
||||
},
|
||||
},
|
||||
Type: Object{},
|
||||
}
|
||||
|
||||
func moreThanOne(a, b, c bool) bool {
|
||||
return a && b || b && c || a && c
|
||||
}
|
||||
|
||||
func statGetFormatOptions(req cmds.Request) (string, error) {
|
||||
|
||||
hash, _, _ := req.Option("hash").Bool()
|
||||
size, _, _ := req.Option("size").Bool()
|
||||
format, found, _ := req.Option("format").String()
|
||||
|
||||
if moreThanOne(hash, size, found) {
|
||||
return "", formatError
|
||||
}
|
||||
|
||||
if hash {
|
||||
return "<hash>", nil
|
||||
} else if size {
|
||||
return "<cumulsize>", nil
|
||||
} else {
|
||||
return format, nil
|
||||
}
|
||||
}
|
||||
|
||||
func statNode(ds dag.DAGService, fsn mfs.FSNode) (*Object, error) {
|
||||
nd, err := fsn.GetNode()
|
||||
if err != nil {
|
||||
|
||||
@ -64,9 +64,39 @@ test_files_api() {
|
||||
test_expect_success "directory is empty" '
|
||||
verify_dir_contents /cats
|
||||
'
|
||||
# we do verification of stat formatting now as we depend on it
|
||||
|
||||
test_expect_success "stat works" '
|
||||
ipfs files stat / >stat
|
||||
'
|
||||
|
||||
test_expect_success "hash is first line of stat" '
|
||||
ipfs ls $(head -1 stat) | grep "cats"
|
||||
'
|
||||
|
||||
test_expect_success "stat --hash gives only hash" '
|
||||
ipfs files stat --hash / >actual &&
|
||||
head -n1 stat >expected &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success "stat with multiple format options should fail" '
|
||||
test_must_fail ipfs files stat --hash --size /
|
||||
'
|
||||
|
||||
test_expect_success "compare hash option with format" '
|
||||
ipfs files stat --hash / >expected &&
|
||||
ipfs files stat --format='"'"'<hash>'"'"' / >actual &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
test_expect_success "compare size option with format" '
|
||||
ipfs files stat --size / >expected &&
|
||||
ipfs files stat --format='"'"'<cumulsize>'"'"' / >actual &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success "check root hash" '
|
||||
ipfs files stat / | head -n1 > roothash
|
||||
ipfs files stat --hash / > roothash
|
||||
'
|
||||
|
||||
test_expect_success "cannot mkdir /" '
|
||||
@ -74,7 +104,7 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "check root hash was not changed" '
|
||||
ipfs files stat / | head -n1 > roothashafter &&
|
||||
ipfs files stat --hash / > roothashafter &&
|
||||
test_cmp roothash roothashafter
|
||||
'
|
||||
|
||||
@ -167,7 +197,7 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "check root hash" '
|
||||
ipfs files stat / | head -n1 > roothash
|
||||
ipfs files stat --hash / > roothash
|
||||
'
|
||||
|
||||
test_expect_success "cannot remove root" '
|
||||
@ -175,7 +205,7 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "check root hash was not changed" '
|
||||
ipfs files stat / | head -n1 > roothashafter &&
|
||||
ipfs files stat --hash / > roothashafter &&
|
||||
test_cmp roothash roothashafter
|
||||
'
|
||||
|
||||
@ -273,12 +303,12 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "cant write to negative offset" '
|
||||
ipfs files stat /cats/ipfs | head -n1 > filehash &&
|
||||
ipfs files stat --hash /cats/ipfs > filehash &&
|
||||
test_expect_code 1 ipfs files write --offset -1 /cats/ipfs < output
|
||||
'
|
||||
|
||||
test_expect_success "verify file was not changed" '
|
||||
ipfs files stat /cats/ipfs | head -n1 > afterhash &&
|
||||
ipfs files stat --hash /cats/ipfs > afterhash &&
|
||||
test_cmp filehash afterhash
|
||||
'
|
||||
|
||||
@ -305,12 +335,12 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "cannot write to directory" '
|
||||
ipfs files stat /cats | head -n1 > dirhash &&
|
||||
ipfs files stat --hash /cats > dirhash &&
|
||||
test_expect_code 1 ipfs files write /cats < output
|
||||
'
|
||||
|
||||
test_expect_success "verify dir was not changed" '
|
||||
ipfs files stat /cats | head -n1 > afterdirhash &&
|
||||
ipfs files stat --hash /cats > afterdirhash &&
|
||||
test_cmp dirhash afterdirhash
|
||||
'
|
||||
|
||||
@ -333,7 +363,7 @@ test_files_api() {
|
||||
'
|
||||
|
||||
test_expect_success "changes bubbled up to root on inspection" '
|
||||
ipfs files stat / | head -n1 > root_hash
|
||||
ipfs files stat --hash / > root_hash
|
||||
'
|
||||
|
||||
test_expect_success "root hash looks good" '
|
||||
|
||||
Loading…
Reference in New Issue
Block a user