-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
main.go
133 lines (108 loc) · 2.89 KB
/
main.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
// Copyright 2016 Keybase Inc. All rights reserved.
// Use of this source code is governed by a BSD
// license that can be found in the LICENSE file.
package main
import (
"flag"
"fmt"
"os"
"golang.org/x/net/context"
"github.com/keybase/client/go/kbfs/env"
"github.com/keybase/client/go/kbfs/libkbfs"
"github.com/keybase/client/go/logger"
)
var version = flag.Bool("version", false, "Print version")
const usageFormatStr = `Usage:
kbfstool -version
To run against remote KBFS servers:
kbfstool
%s
<command> [<args>]
To run in a local testing environment:
kbfstool
%s
<command> [<args>]
Defaults:
%s
The possible commands are:
stat Display file status
ls List directory contents
mkdir Make directories
read Dump file to stdout
write Write stdin to file
md Operate on metadata objects
git Operate on git repositories
`
func getUsageString(ctx libkbfs.Context) string {
remoteUsageStr := libkbfs.GetRemoteUsageString()
localUsageStr := libkbfs.GetLocalUsageString()
defaultUsageStr := libkbfs.GetDefaultsUsageString(ctx)
return fmt.Sprintf(usageFormatStr, remoteUsageStr,
localUsageStr, defaultUsageStr)
}
// Define this so deferred functions get executed before exit.
func realMain() (exitStatus int) {
kbCtx := env.NewContext()
kbfsParams := libkbfs.AddFlags(flag.CommandLine, kbCtx)
flag.Parse()
if *version {
fmt.Printf("%s\n", libkbfs.VersionString())
return 0
}
if len(flag.Args()) < 1 {
fmt.Print(getUsageString(kbCtx))
return 1
}
log := logger.New("")
tempDir, err := os.MkdirTemp(kbCtx.GetDataDir(), "kbfstool")
if err != nil {
panic(err.Error())
}
defer func() {
rmErr := os.RemoveAll(tempDir)
if rmErr != nil {
fmt.Fprintf(os.Stderr,
"Error cleaning storage dir %s: %+v\n", tempDir, rmErr)
}
}()
// Turn these off, and use a temp dir for the storage root, to not
// interfere with a running kbfs daemon.
kbfsParams.EnableJournal = false
kbfsParams.DiskCacheMode = libkbfs.DiskCacheModeOff
kbfsParams.Mode = libkbfs.InitSingleOpString
kbfsParams.StorageRoot = tempDir
ctx := context.Background()
config, err := libkbfs.Init(ctx, kbCtx, *kbfsParams, nil, nil, log)
if err != nil {
printError("kbfs", err)
return 1
}
defer libkbfs.Shutdown()
// TODO: Make the logging level WARNING instead of INFO, or
// figure out some other way to log the full folder-branch
// name for kbfsfuse but not for kbfs.
cmd := flag.Arg(0)
args := flag.Args()[1:]
switch cmd {
case "stat":
return stat(ctx, config, args)
case "ls":
return ls(ctx, config, args)
case "mkdir":
return mkdir(ctx, config, args)
case "read":
return read(ctx, config, args)
case "write":
return write(ctx, config, args)
case "md":
return mdMain(ctx, config, args)
case "git":
return gitMain(ctx, config, args)
default:
printError("kbfs", fmt.Errorf("unknown command %q", cmd))
return 1
}
}
func main() {
os.Exit(realMain())
}