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:
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user