github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/kbfstool/stat.go (about) 1 // Copyright 2016 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "flag" 9 "fmt" 10 "time" 11 12 "github.com/keybase/client/go/kbfs/data" 13 "github.com/keybase/client/go/kbfs/fsrpc" 14 "github.com/keybase/client/go/kbfs/libkbfs" 15 "golang.org/x/net/context" 16 ) 17 18 func statNode(ctx context.Context, config libkbfs.Config, nodePathStr string) error { 19 p, err := fsrpc.NewPath(nodePathStr) 20 if err != nil { 21 return err 22 } 23 24 n, ei, err := p.GetNode(ctx, config) 25 if err != nil { 26 return err 27 } 28 29 // If n is non-nil, ignore the EntryInfo returned by 30 // p.getNode() so we can exercise the Stat() codepath. We 31 // can't compare the two, since they might legitimately differ 32 // due to races. 33 if n != nil { 34 ei, err = config.KBFSOps().Stat(ctx, n) 35 if err != nil { 36 return err 37 } 38 } 39 40 var symPathStr string 41 if ei.Type == data.Sym { 42 symPathStr = fmt.Sprintf("SymPath: %s, ", ei.SymPath) 43 } 44 45 mtimeStr := time.Unix(0, ei.Mtime).String() 46 ctimeStr := time.Unix(0, ei.Ctime).String() 47 48 fmt.Printf("{Type: %s, Size: %d, %sMtime: %s, Ctime: %s}\n", ei.Type, ei.Size, symPathStr, mtimeStr, ctimeStr) 49 50 return nil 51 } 52 53 func stat(ctx context.Context, config libkbfs.Config, args []string) (exitStatus int) { 54 flags := flag.NewFlagSet("kbfs stat", flag.ContinueOnError) 55 err := flags.Parse(args) 56 if err != nil { 57 printError("stat", err) 58 return 1 59 } 60 61 nodePaths := flags.Args() 62 if len(nodePaths) == 0 { 63 printError("stat", errAtLeastOnePath) 64 return 1 65 } 66 67 for _, nodePath := range nodePaths { 68 err := statNode(ctx, config, nodePath) 69 if err != nil { 70 printError("stat", err) 71 return 1 72 } 73 } 74 75 return 0 76 }