diff --git a/weed/command/shell.go b/weed/command/shell.go index 3216d5d48..95b62f0b5 100644 --- a/weed/command/shell.go +++ b/weed/command/shell.go @@ -33,7 +33,7 @@ func runShell(command *Command, args []string) bool { shellOptions.FilerHost = "localhost" shellOptions.FilerPort = 8888 - shellOptions.Directory = "" + shellOptions.Directory = "/" shell.RunShell(shellOptions) diff --git a/weed/shell/command_fs_cd.go b/weed/shell/command_fs_cd.go index 13208a3f8..f14350f02 100644 --- a/weed/shell/command_fs_cd.go +++ b/weed/shell/command_fs_cd.go @@ -2,11 +2,7 @@ package shell import ( "context" - "fmt" - "github.com/chrislusf/seaweedfs/weed/filer2" - "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "io" - "strings" ) func init() { @@ -35,59 +31,23 @@ func (c *commandFsCd) Help() string { func (c *commandFsCd) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { - input := "" - if len(args) > 0 { - input = args[len(args)-1] - } + input := findInputDirectory(args) filerServer, filerPort, path, err := commandEnv.parseUrl(input) if err != nil { return err } - dir, name := filer2.FullPath(path).DirAndName() - if strings.HasSuffix(path, "/") { - if path == "/" { - dir, name = "/", "" - } else { - dir, name = filer2.FullPath(path[0:len(path)-1]).DirAndName() - } + if path == "/" { + commandEnv.option.FilerHost = filerServer + commandEnv.option.FilerPort = filerPort + commandEnv.option.Directory = "/" + return nil } ctx := context.Background() - err = commandEnv.withFilerClient(ctx, filerServer, filerPort, func(client filer_pb.SeaweedFilerClient) error { - - resp, listErr := client.ListEntries(ctx, &filer_pb.ListEntriesRequest{ - Directory: dir, - Prefix: name, - StartFromFileName: name, - InclusiveStartFrom: true, - Limit: 1, - }) - if listErr != nil { - return listErr - } - - if path == "" || path == "/" { - return nil - } - - if len(resp.Entries) == 0 { - return fmt.Errorf("entry not found") - } - - if resp.Entries[0].Name != name { - println("path", path, "dir", dir, "name", name, "found", resp.Entries[0].Name) - return fmt.Errorf("not a valid directory, found %s", resp.Entries[0].Name) - } - - if !resp.Entries[0].IsDirectory { - return fmt.Errorf("not a directory") - } - - return nil - }) + err = commandEnv.checkDirectory(ctx, filerServer, filerPort, path) if err == nil { commandEnv.option.FilerHost = filerServer diff --git a/weed/shell/command_fs_du.go b/weed/shell/command_fs_du.go index 98e2eebd1..f305cabdc 100644 --- a/weed/shell/command_fs_du.go +++ b/weed/shell/command_fs_du.go @@ -8,7 +8,6 @@ import ( "github.com/chrislusf/seaweedfs/weed/util" "google.golang.org/grpc" "io" - "strings" ) func init() { @@ -33,21 +32,18 @@ func (c *commandFsDu) Help() string { func (c *commandFsDu) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { - filerServer, filerPort, path, err := commandEnv.parseUrl(args[0]) + filerServer, filerPort, path, err := commandEnv.parseUrl(findInputDirectory(args)) if err != nil { return err } - dir, name := filer2.FullPath(path).DirAndName() - if strings.HasSuffix(path, "/") { - if path == "/" { - dir, name = "/", "" - } else { - dir, name = path[0 : len(path)-1], "" - } + ctx := context.Background() + + if commandEnv.isDirectory(ctx, filerServer, filerPort, path) { + path = path + "/" } - ctx := context.Background() + dir, name := filer2.FullPath(path).DirAndName() return commandEnv.withFilerClient(ctx, filerServer, filerPort, func(client filer_pb.SeaweedFilerClient) error { diff --git a/weed/shell/command_fs_ls.go b/weed/shell/command_fs_ls.go index 7b8d1d0cc..93b86fa9f 100644 --- a/weed/shell/command_fs_ls.go +++ b/weed/shell/command_fs_ls.go @@ -36,41 +36,33 @@ func (c *commandFsLs) Do(args []string, commandEnv *commandEnv, writer io.Writer var isLongFormat, showHidden bool for _, arg := range args { - switch arg { - case "-a": - showHidden = true - case "-l": - isLongFormat = true + if !strings.HasPrefix(arg, "-") { + break } - } - - input := "" - if len(args) > 0 { - input = args[len(args)-1] - if strings.HasPrefix(input, "-") { - input = "" + for _, t := range arg { + switch t { + case 'a': + showHidden = true + case 'l': + isLongFormat = true + } } } + input := findInputDirectory(args) + filerServer, filerPort, path, err := commandEnv.parseUrl(input) if err != nil { return err } - if input == "" && !strings.HasSuffix(path, "/") { + + ctx := context.Background() + + if commandEnv.isDirectory(ctx, filerServer, filerPort, path) { path = path + "/" } dir, name := filer2.FullPath(path).DirAndName() - // println("path", path, "dir", dir, "name", name) - if strings.HasSuffix(path, "/") { - if path == "/" { - dir, name = "/", "" - } else { - dir, name = path[0 : len(path)-1], "" - } - } - - ctx := context.Background() return commandEnv.withFilerClient(ctx, filerServer, filerPort, func(client filer_pb.SeaweedFilerClient) error { diff --git a/weed/shell/command_fs_tree.go b/weed/shell/command_fs_tree.go index 805b17d2a..5bc3c57b4 100644 --- a/weed/shell/command_fs_tree.go +++ b/weed/shell/command_fs_tree.go @@ -29,19 +29,12 @@ func (c *commandFsTree) Help() string { func (c *commandFsTree) Do(args []string, commandEnv *commandEnv, writer io.Writer) (err error) { - filerServer, filerPort, path, err := parseFilerUrl(args[len(args)-1]) + filerServer, filerPort, path, err := commandEnv.parseUrl(findInputDirectory(args)) if err != nil { return err } dir, name := filer2.FullPath(path).DirAndName() - if strings.HasSuffix(path, "/") { - if path == "/" { - dir, name = "/", "" - } else { - dir, name = path[0:len(path)-1], "" - } - } ctx := context.Background() diff --git a/weed/shell/commands.go b/weed/shell/commands.go index 2a262d913..50b70498d 100644 --- a/weed/shell/commands.go +++ b/weed/shell/commands.go @@ -1,7 +1,10 @@ package shell import ( + "context" "fmt" + "github.com/chrislusf/seaweedfs/weed/filer2" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/wdclient" "google.golang.org/grpc" "io" @@ -46,6 +49,46 @@ func (ce *commandEnv) parseUrl(input string) (filerServer string, filerPort int6 return ce.option.FilerHost, ce.option.FilerPort, input, err } +func (ce *commandEnv) isDirectory(ctx context.Context, filerServer string, filerPort int64, path string) bool { + + return ce.checkDirectory(ctx,filerServer,filerPort,path) == nil + +} + +func (ce *commandEnv) checkDirectory(ctx context.Context, filerServer string, filerPort int64, path string) error { + + dir, name := filer2.FullPath(path).DirAndName() + + return ce.withFilerClient(ctx, filerServer, filerPort, func(client filer_pb.SeaweedFilerClient) error { + + resp, listErr := client.ListEntries(ctx, &filer_pb.ListEntriesRequest{ + Directory: dir, + Prefix: name, + StartFromFileName: name, + InclusiveStartFrom: true, + Limit: 1, + }) + if listErr != nil { + return listErr + } + + if len(resp.Entries) == 0 { + return fmt.Errorf("entry not found") + } + + if resp.Entries[0].Name != name { + return fmt.Errorf("not a valid directory, found %s", resp.Entries[0].Name) + } + + if !resp.Entries[0].IsDirectory { + return fmt.Errorf("not a directory") + } + + return nil + }) + +} + func parseFilerUrl(entryPath string) (filerServer string, filerPort int64, path string, err error) { if strings.HasPrefix(entryPath, "http") { var u *url.URL @@ -64,3 +107,14 @@ func parseFilerUrl(entryPath string) (filerServer string, filerPort int64, path } return } + +func findInputDirectory(args []string) (input string) { + input = "." + if len(args) > 0 { + input = args[len(args)-1] + if strings.HasPrefix(input, "-") { + input = "." + } + } + return input +}