mirror of
				https://github.com/ipfs/kubo.git
				synced 2025-11-04 06:00:01 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package commands
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
 | 
						|
	cmds "github.com/ipfs/go-ipfs/commands"
 | 
						|
	corerepo "github.com/ipfs/go-ipfs/core/corerepo"
 | 
						|
	u "github.com/ipfs/go-ipfs/util"
 | 
						|
)
 | 
						|
 | 
						|
var RepoCmd = &cmds.Command{
 | 
						|
	Helptext: cmds.HelpText{
 | 
						|
		Tagline: "Manipulate the IPFS repo",
 | 
						|
		ShortDescription: `
 | 
						|
'ipfs repo' is a plumbing command used to manipulate the repo.
 | 
						|
`,
 | 
						|
	},
 | 
						|
 | 
						|
	Subcommands: map[string]*cmds.Command{
 | 
						|
		"gc": repoGcCmd,
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
var repoGcCmd = &cmds.Command{
 | 
						|
	Helptext: cmds.HelpText{
 | 
						|
		Tagline: "Perform a garbage collection sweep on the repo",
 | 
						|
		ShortDescription: `
 | 
						|
'ipfs repo gc' is a plumbing command that will sweep the local
 | 
						|
set of stored objects and remove ones that are not pinned in
 | 
						|
order to reclaim hard disk space.
 | 
						|
`,
 | 
						|
	},
 | 
						|
 | 
						|
	Options: []cmds.Option{
 | 
						|
		cmds.BoolOption("quiet", "q", "Write minimal output"),
 | 
						|
	},
 | 
						|
	Run: func(req cmds.Request, res cmds.Response) {
 | 
						|
		n, err := req.Context().GetNode()
 | 
						|
		if err != nil {
 | 
						|
			res.SetError(err, cmds.ErrNormal)
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		gcOutChan, err := corerepo.GarbageCollectAsync(n, req.Context().Context)
 | 
						|
		if err != nil {
 | 
						|
			res.SetError(err, cmds.ErrNormal)
 | 
						|
			return
 | 
						|
		}
 | 
						|
 | 
						|
		outChan := make(chan interface{})
 | 
						|
		res.SetOutput((<-chan interface{})(outChan))
 | 
						|
 | 
						|
		go func() {
 | 
						|
			defer close(outChan)
 | 
						|
			for k := range gcOutChan {
 | 
						|
				outChan <- k
 | 
						|
			}
 | 
						|
		}()
 | 
						|
	},
 | 
						|
	Type: corerepo.KeyRemoved{},
 | 
						|
	Marshalers: cmds.MarshalerMap{
 | 
						|
		cmds.Text: func(res cmds.Response) (io.Reader, error) {
 | 
						|
			outChan, ok := res.Output().(<-chan interface{})
 | 
						|
			if !ok {
 | 
						|
				return nil, u.ErrCast()
 | 
						|
			}
 | 
						|
 | 
						|
			quiet, _, err := res.Request().Option("quiet").Bool()
 | 
						|
			if err != nil {
 | 
						|
				return nil, err
 | 
						|
			}
 | 
						|
 | 
						|
			marshal := func(v interface{}) (io.Reader, error) {
 | 
						|
				obj, ok := v.(*corerepo.KeyRemoved)
 | 
						|
				if !ok {
 | 
						|
					return nil, u.ErrCast()
 | 
						|
				}
 | 
						|
 | 
						|
				buf := new(bytes.Buffer)
 | 
						|
				if quiet {
 | 
						|
					buf = bytes.NewBufferString(string(obj.Key) + "\n")
 | 
						|
				} else {
 | 
						|
					buf = bytes.NewBufferString(fmt.Sprintf("removed %s\n", obj.Key))
 | 
						|
				}
 | 
						|
				return buf, nil
 | 
						|
			}
 | 
						|
 | 
						|
			return &cmds.ChannelMarshaler{
 | 
						|
				Channel:   outChan,
 | 
						|
				Marshaler: marshal,
 | 
						|
			}, nil
 | 
						|
		},
 | 
						|
	},
 | 
						|
}
 |