1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-07-03 04:37:30 +08:00

Add offset option to cat command

Allow an offset option to be passed to cat command

License: MIT
Signed-off-by: ForrestWeston <forrest@protocol.ai>
This commit is contained in:
ForrestWeston
2018-01-02 09:52:15 -08:00
parent 8bc97d6db0
commit f0c772a4f3

View File

@ -2,6 +2,7 @@ package commands
import ( import (
"context" "context"
"fmt"
"io" "io"
"os" "os"
@ -23,6 +24,9 @@ var CatCmd = &cmds.Command{
Arguments: []cmdkit.Argument{ Arguments: []cmdkit.Argument{
cmdkit.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to be outputted.").EnableStdin(), cmdkit.StringArg("ipfs-path", true, true, "The path to the IPFS object(s) to be outputted.").EnableStdin(),
}, },
Options: []cmdkit.Option{
cmdkit.IntOption("offset", "o", "Byte offset to begin reading from."),
},
Run: func(req cmds.Request, res cmds.ResponseEmitter) { Run: func(req cmds.Request, res cmds.ResponseEmitter) {
node, err := req.InvocContext().GetNode() node, err := req.InvocContext().GetNode()
if err != nil { if err != nil {
@ -36,8 +40,17 @@ var CatCmd = &cmds.Command{
return return
} }
} }
offset, _, err := req.Option("offset").Int()
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
if offset < 0 {
res.SetError(fmt.Errorf("Cannot specify negative offset."), cmdkit.ErrNormal)
return
}
readers, length, err := cat(req.Context(), node, req.Arguments()) readers, length, err := cat(req.Context(), node, req.Arguments(), int64(offset))
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) res.SetError(err, cmdkit.ErrNormal)
return return
@ -103,7 +116,7 @@ var CatCmd = &cmds.Command{
}, },
} }
func cat(ctx context.Context, node *core.IpfsNode, paths []string) ([]io.Reader, uint64, error) { func cat(ctx context.Context, node *core.IpfsNode, paths []string, offset int64) ([]io.Reader, uint64, error) {
readers := make([]io.Reader, 0, len(paths)) readers := make([]io.Reader, 0, len(paths))
length := uint64(0) length := uint64(0)
for _, fpath := range paths { for _, fpath := range paths {
@ -111,8 +124,18 @@ func cat(ctx context.Context, node *core.IpfsNode, paths []string) ([]io.Reader,
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err
} }
if offset > int64(read.Size()) {
offset = offset - int64(read.Size())
continue
}
count, err := read.Seek(offset, io.SeekStart)
if err != nil {
return nil, 0, err
}
offset = 0
readers = append(readers, read) readers = append(readers, read)
length += uint64(read.Size()) length += uint64(read.Size() - uint64(count))
} }
return readers, length, nil return readers, length, nil
} }