Skip to content

Commit 45a29b2

Browse files
committed
update backup command
1 parent da86d47 commit 45a29b2

File tree

22 files changed

+564
-111
lines changed

22 files changed

+564
-111
lines changed

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,9 @@ Usage:
114114
leetcode [command]
115115

116116
Available Commands:
117-
base clear & replace all question use you specified
118-
clear set questions to default
117+
backup backup you complete questions to solutions
118+
base clear & replace all question use you specified (backup all unbanked)
119+
clear set questions to default (backup all unbanked)
119120
get get leet question from leetcode-cn.com
120121
help Help about any command
121122
info print leet question info
@@ -177,6 +178,6 @@ A: 首先感谢你对项目的支持。
177178
```
178179

179180
## TODO
180-
- [ ] leetcode backup 命令
181+
- [x] leetcode backup 命令
181182
- [ ] leetcode login
182183
- [ ] leetcode publish

cmd/command/backup.go

Lines changed: 44 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ package command
33
import (
44
"fmt"
55
"os"
6+
"strings"
67

78
"github.com/spf13/cobra"
9+
10+
"github.com/gladmo/leetcode/leet"
811
)
912

1013
var backupCmd = &cobra.Command{
1114
Use: "backup [question_id|leetcode_url]",
1215
Short: "backup you complete questions to solutions",
13-
Long: "恢复所有问题为默认状态,并将 serial 目录的所有问题覆盖到 tag 目录下",
16+
Long: "将你实现的算法备份到 solutions 目录,贡献代码者此命令很有用",
1417
Run: func(cmd *cobra.Command, args []string) {
1518
if len(args) > 1 {
1619
cmd.Println("参数异常")
@@ -19,67 +22,51 @@ var backupCmd = &cobra.Command{
1922
return
2023
}
2124

22-
fmt.Println("功能开发中...")
25+
override, err := cmd.PersistentFlags().GetBool("override-backup")
26+
if err != nil {
27+
fmt.Println(err.Error())
28+
}
29+
30+
if len(args) == 1 {
31+
param := leet.Parse(strings.TrimSpace(args[0]))
32+
33+
withDetail, err := cmd.PersistentFlags().GetBool("with-detail")
34+
if err != nil {
35+
fmt.Println(err.Error())
36+
}
2337

24-
// if len(args) == 1 {
25-
// param := leet.Parse(strings.TrimSpace(args[0]))
26-
//
27-
// withDetail, err := cmd.PersistentFlags().GetBool("with-detail")
28-
// if err != nil {
29-
// fmt.Println(err.Error())
30-
// }
31-
//
32-
// info := leet.GetQuestionInfo(param)
33-
// info.Print(withDetail)
34-
//
35-
// for idx, dir := range info.SaveDir {
36-
// for _, language := range info.Languages {
37-
// err = leet.ToBeClear{
38-
// Dir: dir,
39-
// Language: language,
40-
// }.Clear()
41-
// if err != nil {
42-
// fmt.Println(err.Error())
43-
// }
44-
// }
45-
//
46-
// if idx > 0 {
47-
// err = leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
48-
// if err != nil {
49-
// fmt.Println(err.Error())
50-
// }
51-
// }
52-
// }
53-
//
54-
// } else {
55-
// titles := leet.GetAllQuestionTitleSlug()
56-
//
57-
// for _, title := range titles {
58-
// info := leet.GetQuestionInfo(title)
59-
// for idx, dir := range info.SaveDir {
60-
// for _, language := range info.Languages {
61-
// err := leet.ToBeClear{
62-
// Dir: dir,
63-
// Language: language,
64-
// }.Clear()
65-
// if err != nil {
66-
// fmt.Println(err.Error())
67-
// }
68-
// }
69-
//
70-
// if idx > 0 {
71-
// err := leet.CopyDirectory(info.SaveDir[0], info.SaveDir[idx])
72-
// if err != nil {
73-
// fmt.Println(err.Error())
74-
// }
75-
// }
76-
// }
77-
// }
78-
// }
38+
info := leet.GetQuestionInfo(param)
39+
info.Print(withDetail)
40+
41+
for _, dir := range info.SaveDir {
42+
err = leet.BackupClear{
43+
Dir: dir,
44+
}.Backup(override)
45+
if err != nil {
46+
fmt.Println(err.Error())
47+
}
48+
}
49+
50+
} else {
51+
titles := leet.GetAllQuestionTitleSlug()
52+
53+
for _, title := range titles {
54+
info := leet.GetQuestionInfo(title)
55+
for _, dir := range info.SaveDir {
56+
err = leet.BackupClear{
57+
Dir: dir,
58+
}.Backup(override)
59+
if err != nil {
60+
fmt.Println(err.Error())
61+
}
62+
}
63+
}
64+
}
7965

8066
},
8167
}
8268

8369
func init() {
70+
backupCmd.PersistentFlags().Bool("override-backup", false, "override-backup")
8471
backupCmd.PersistentFlags().Bool("with-detail", false, "with-detail")
8572
}

cmd/command/base.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
var baseCmd = &cobra.Command{
1414
Use: "base [question_id|leetcode_url]",
15-
Short: "clear & replace all question use you specified",
15+
Short: "clear & replace all question use you specified (backup all unbanked)",
1616
Long: "恢复所有问题为默认状态,并将 serial 目录的所有问题覆盖到 tag 目录下",
1717
Run: func(cmd *cobra.Command, args []string) {
1818
if len(args) > 1 {
@@ -22,6 +22,11 @@ var baseCmd = &cobra.Command{
2222
return
2323
}
2424

25+
override, err := cmd.PersistentFlags().GetBool("override-backup")
26+
if err != nil {
27+
fmt.Println(err.Error())
28+
}
29+
2530
if len(args) == 1 {
2631
param := leet.Parse(strings.TrimSpace(args[0]))
2732

@@ -35,7 +40,7 @@ var baseCmd = &cobra.Command{
3540

3641
for idx, dir := range info.SaveDir {
3742
for _, language := range info.Languages {
38-
err = leet.ToBeClear{
43+
err = leet.BackupClear{
3944
Dir: dir,
4045
Language: language,
4146
}.Clear()
@@ -50,6 +55,13 @@ var baseCmd = &cobra.Command{
5055
fmt.Println(err.Error())
5156
}
5257
}
58+
59+
err = leet.BackupClear{
60+
Dir: dir,
61+
}.Backup(override)
62+
if err != nil {
63+
fmt.Println(err.Error())
64+
}
5365
}
5466

5567
} else {
@@ -59,7 +71,7 @@ var baseCmd = &cobra.Command{
5971
info := leet.GetQuestionInfo(title)
6072
for idx, dir := range info.SaveDir {
6173
for _, language := range info.Languages {
62-
err := leet.ToBeClear{
74+
err := leet.BackupClear{
6375
Dir: dir,
6476
Language: language,
6577
}.Clear()
@@ -74,12 +86,20 @@ var baseCmd = &cobra.Command{
7486
fmt.Println(err.Error())
7587
}
7688
}
89+
90+
err = leet.BackupClear{
91+
Dir: dir,
92+
}.Backup(override)
93+
if err != nil {
94+
fmt.Println(err.Error())
95+
}
7796
}
7897
}
7998
}
8099
},
81100
}
82101

83102
func init() {
103+
baseCmd.PersistentFlags().Bool("override-backup", false, "override-backup")
84104
baseCmd.PersistentFlags().Bool("with-detail", false, "with-detail")
85105
}

cmd/command/clear.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
var clearCmd = &cobra.Command{
1414
Use: "clear [question_id|leetcode_url]",
15-
Short: "set questions to default",
15+
Short: "set questions to default (backup all unbanked)",
1616
Long: "将本地问题恢复为初始状态",
1717
Run: func(cmd *cobra.Command, args []string) {
1818
if len(args) > 1 {
@@ -22,6 +22,15 @@ var clearCmd = &cobra.Command{
2222
return
2323
}
2424

25+
override, err := cmd.PersistentFlags().GetBool("override-backup")
26+
if err != nil {
27+
fmt.Println(err.Error())
28+
}
29+
backup, err := cmd.PersistentFlags().GetBool("backup")
30+
if err != nil {
31+
fmt.Println(err.Error())
32+
}
33+
2534
if len(args) == 1 {
2635
param := leet.Parse(strings.TrimSpace(args[0]))
2736

@@ -35,7 +44,7 @@ var clearCmd = &cobra.Command{
3544

3645
for _, dir := range info.SaveDir {
3746
for _, language := range info.Languages {
38-
err = leet.ToBeClear{
47+
err = leet.BackupClear{
3948
Dir: dir,
4049
Language: language,
4150
}.Clear()
@@ -52,20 +61,31 @@ var clearCmd = &cobra.Command{
5261
info := leet.GetQuestionInfo(title)
5362
for _, dir := range info.SaveDir {
5463
for _, language := range info.Languages {
55-
err := leet.ToBeClear{
64+
err := leet.BackupClear{
5665
Dir: dir,
5766
Language: language,
5867
}.Clear()
5968
if err != nil {
6069
fmt.Println(err.Error())
6170
}
6271
}
72+
73+
if backup {
74+
err = leet.BackupClear{
75+
Dir: dir,
76+
}.Backup(override)
77+
if err != nil {
78+
fmt.Println(err.Error())
79+
}
80+
}
6381
}
6482
}
6583
}
6684
},
6785
}
6886

6987
func init() {
88+
clearCmd.PersistentFlags().Bool("backup", false, "backup")
89+
clearCmd.PersistentFlags().Bool("override-backup", false, "override-backup")
7090
clearCmd.PersistentFlags().Bool("with-detail", false, "with-detail")
7191
}

cmd/command/command.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ var cmd = &cobra.Command{
1717
}
1818

1919
func init() {
20-
cmd.AddCommand(versionCmd, getCmd, clearCmd, infoCmd, testCmd, baseCmd)
20+
cmd.AddCommand(versionCmd, getCmd, clearCmd, infoCmd, testCmd, baseCmd, backupCmd)
2121
}
2222

2323
var versionCmd = &cobra.Command{

leet/clear.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,27 @@ import (
77
"io/ioutil"
88
"os"
99
"path/filepath"
10+
"strings"
1011
"syscall"
1112
)
1213

13-
type ToBeClear struct {
14+
type BackupClear struct {
1415
Dir string `json:"dir"`
1516
Language string `json:"language"`
1617
}
1718

18-
func (th ToBeClear) Clear() (err error) {
19+
func (th BackupClear) Backup(override bool) error {
20+
solutionsDir := strings.Replace(th.Dir, "questions", "solutions", 1)
21+
22+
if f, err := os.Stat(solutionsDir); err == nil && f.IsDir() && !override {
23+
err = fmt.Errorf("%s 已经备份, 使用 `--override-backup` 强制备份", solutionsDir)
24+
return err
25+
}
26+
27+
return CopyDirectory(th.Dir, solutionsDir)
28+
}
29+
30+
func (th BackupClear) Clear() (err error) {
1931
switch th.Language {
2032
case "golang":
2133
return GolangClear(th.Dir)

leet/golang.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func Export() {
5555
5656
import (
5757
"github.com/gladmo/leetcode/%s"
58+
"github.com/gladmo/leetcode/leet"
5859
)
5960
6061
func main() {
@@ -64,7 +65,58 @@ func main() {
6465
6566
*/
6667
67-
solution.Export()
68+
tests := []struct {
69+
name string
70+
input [][]int
71+
want bool
72+
}{
73+
{
74+
name: "test-[[1],[2],[3],[]]",
75+
input: [][]int{
76+
{1},
77+
{2},
78+
{3},
79+
{},
80+
},
81+
want: true,
82+
},
83+
{
84+
name: "test-[[1,3],[3,0,1],[2],[0]]",
85+
input: [][]int{
86+
{1, 3},
87+
{3, 0, 1},
88+
{2},
89+
{0},
90+
},
91+
want: false,
92+
},
93+
}
94+
95+
testLog := leet.NewTestLog(len(tests))
96+
defer testLog.Render()
97+
98+
timeoutDuration := time.Second * 2
99+
100+
for idx, test := range tests {
101+
// 超时检测
102+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
103+
solution.Export(test.input)
104+
cancel()
105+
})
106+
107+
if timeout {
108+
testLog.Fail(idx+1, test.name, "timeout")
109+
continue
110+
}
111+
112+
got := solution.Export(test.input)
113+
if !reflect.DeepEqual(test.want, got) {
114+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
115+
continue
116+
}
117+
118+
testLog.Pass(idx+1, test.name)
119+
}
68120
}
69121
`, solutionDir, th.SampleTestCase)
70122

questions/serial/question.md

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)