forked from src-d/borges
/
delete.go
106 lines (85 loc) · 2.26 KB
/
delete.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package main
import (
"context"
"database/sql"
"io"
"os"
"runtime"
"sort"
bcli "github.com/src-d/borges/cli"
"github.com/src-d/borges/tool"
billy "gopkg.in/src-d/go-billy.v4"
"gopkg.in/src-d/go-cli.v0"
_ "gopkg.in/src-d/go-queue.v1/amqp"
)
func init() {
app.AddCommand(&deleteCmd{})
}
type deleteCmd struct {
cli.Command `name:"delete" short-description:"delete siva files and references"`
bcli.DatabaseOpts
fs billy.Basic
db *tool.Database
siva *tool.Siva
list []string
out io.WriteCloser
FSString string `long:"fs" description:"filesystem connection string, ex: file:///mnt/rooted-repos, gluster://host/volume/rooted-repos"`
Bucket int `long:"bucket" description:"bucket level"`
Dry bool `long:"dry" description:"do not perform modifications in database or filesystem"`
SkipErrors bool `long:"skip-errors" description:"do not stop on errors"`
Workers int `long:"workers" description:"specify the number of threads to use, 0 means all cores" default:"1"`
Output string `long:"output" short:"o" description:"file where to save repositories to queue, if not specified the list will be output to stdout"`
deleteArgs `positional-args:"true" required:"yes"`
}
type deleteArgs struct {
SivaList string `positional-arg-name:"list" description:"file with the list of sivas to change bucketing" required:"yes"`
}
func (d *deleteCmd) init() error {
var err error
if d.Database != "" {
var db *sql.DB
db, err = d.OpenDatabase()
if err != nil {
return err
}
d.db = tool.NewDatabase(db)
}
if d.FSString != "" {
d.fs, err = tool.OpenFS(d.FSString)
if err != nil {
return err
}
}
if d.Workers == 0 {
d.Workers = runtime.NumCPU()
}
d.out = os.Stdout
if d.Output != "" {
d.out, err = os.Create(d.Output)
if err != nil {
return err
}
}
s := tool.NewSiva(d.db, d.fs)
s.Bucket(d.Bucket)
s.Dry(d.Dry)
s.Workers(d.Workers)
s.WriteQueue(d.out)
s.DefaultErrors("error deleting siva", d.SkipErrors)
d.siva = s
d.list, err = tool.LoadHashes(d.SivaList)
return err
}
func (d *deleteCmd) Execute(args []string) error {
err := d.init()
if err != nil {
return err
}
defer d.out.Close()
sort.Strings(d.list)
err = d.siva.Delete(context.Background(), d.list)
if err != nil {
return err
}
return nil
}