From af72e66f8b257956db30c60293029ca1dba41bfc Mon Sep 17 00:00:00 2001 From: Ian Adam Naval Date: Tue, 14 Oct 2014 16:33:01 -0400 Subject: [PATCH] Modify ls to use our internal structure --- Makefile | 114 ++++++++++++++++++++++++++--------------------------- files.go | 14 +++++++ ls/main.go | 98 ++++++++++++++++++++------------------------- 3 files changed, 113 insertions(+), 113 deletions(-) create mode 100644 files.go diff --git a/Makefile b/Makefile index 1669773..1ca74f0 100644 --- a/Makefile +++ b/Makefile @@ -1,57 +1,57 @@ -# Go parameters -GOCMD=go -GOBUILD=$(GOCMD) build -GOCLEAN=$(GOCMD) clean -GOINSTALL=$(GOCMD) install -GOTEST=$(GOCMD) test -GODEP=$(GOTEST) -i -GOFMT=gofmt -w -GOCOVER=$(GOCMD) tool cover -COVER_DIR=cover - -# Package lists -TOPLEVEL_PKG := jsh -CMD_LIST := jsh/ps jsh/free jsh/ls - -# List building -ALL_LIST = $(TOPLEVEL_PKG) $(CMD_LIST) - -BUILD_LIST = $(foreach int, $(ALL_LIST), $(int)_build) -CLEAN_LIST = $(foreach int, $(ALL_LIST), $(int)_clean) -INSTALL_LIST = $(foreach int, $(ALL_LIST), $(int)_install) -IREF_LIST = $(foreach int, $(ALL_LIST), $(int)_iref) -TEST_LIST = $(foreach int, $(ALL_LIST), $(int)_test) -COVER_LIST = $(foreach int, $(ALL_LIST), $(int)_cover) -FMT_TEST = $(foreach int, $(ALL_LIST), $(int)_fmt) - -# All are .PHONY for now because dependencyness is hard -.PHONY: $(CLEAN_LIST) $(TEST_LIST) $(FMT_LIST) $(INSTALL_LIST) $(BUILD_LIST) $(IREF_LIST) - -all: install -build: $(BUILD_LIST) -clean: $(CLEAN_LIST) - rm -rf $(COVER_DIR) -install: $(INSTALL_LIST) -test: $(TEST_LIST) -cover: $(COVER_LIST) - echo "Output in directory: $(COVER_DIR)" -iref: $(IREF_LIST) -fmt: $(FMT_TEST) - -$(BUILD_LIST): %_build: %_fmt %_iref - $(GOBUILD) $* -$(CLEAN_LIST): %_clean: - $(GOCLEAN) $* -$(INSTALL_LIST): %_install: %_fmt %_iref - $(GOINSTALL) $* -$(IREF_LIST): %_iref: - $(GODEP) $* -$(TEST_LIST): %_test: - $(GOTEST) $* -$(COVER_LIST): %_cover: - mkdir -p $(COVER_DIR)/$* - $(GOTEST) -coverprofile=$(COVER_DIR)/$*/c.out $* - $(GOCOVER) -html=$(COVER_DIR)/$*/c.out -o $(COVER_DIR)/$*/index.html - rm -f $(COVER_DIR)/$*/c.out -$(FMT_TEST): %_fmt: - [ -d ./$* ] && $(GOFMT) ./$* || $(GOFMT) . +# Go parameters +GOCMD=go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOINSTALL=$(GOCMD) install +GOTEST=$(GOCMD) test +GODEP=$(GOTEST) -i +GOFMT=gofmt -w +GOCOVER=$(GOCMD) tool cover +COVER_DIR=cover + +# Package lists +TOPLEVEL_PKG := jsh +CMD_LIST := jsh/ps jsh/free jsh/ls jsh/cat jsh/df + +# List building +ALL_LIST = $(TOPLEVEL_PKG) $(CMD_LIST) + +BUILD_LIST = $(foreach int, $(ALL_LIST), $(int)_build) +CLEAN_LIST = $(foreach int, $(ALL_LIST), $(int)_clean) +INSTALL_LIST = $(foreach int, $(ALL_LIST), $(int)_install) +IREF_LIST = $(foreach int, $(ALL_LIST), $(int)_iref) +TEST_LIST = $(foreach int, $(ALL_LIST), $(int)_test) +COVER_LIST = $(foreach int, $(ALL_LIST), $(int)_cover) +FMT_TEST = $(foreach int, $(ALL_LIST), $(int)_fmt) + +# All are .PHONY for now because dependencyness is hard +.PHONY: $(CLEAN_LIST) $(TEST_LIST) $(FMT_LIST) $(INSTALL_LIST) $(BUILD_LIST) $(IREF_LIST) + +all: install +build: $(BUILD_LIST) +clean: $(CLEAN_LIST) + rm -rf $(COVER_DIR) +install: $(INSTALL_LIST) +test: $(TEST_LIST) +cover: $(COVER_LIST) + echo "Output in directory: $(COVER_DIR)" +iref: $(IREF_LIST) +fmt: $(FMT_TEST) + +$(BUILD_LIST): %_build: %_fmt %_iref + $(GOBUILD) $* +$(CLEAN_LIST): %_clean: + $(GOCLEAN) $* +$(INSTALL_LIST): %_install: %_fmt %_iref + $(GOINSTALL) $* +$(IREF_LIST): %_iref: + $(GODEP) $* +$(TEST_LIST): %_test: + $(GOTEST) $* +$(COVER_LIST): %_cover: + mkdir -p $(COVER_DIR)/$* + $(GOTEST) -coverprofile=$(COVER_DIR)/$*/c.out $* + $(GOCOVER) -html=$(COVER_DIR)/$*/c.out -o $(COVER_DIR)/$*/index.html + rm -f $(COVER_DIR)/$*/c.out +$(FMT_TEST): %_fmt: + [ -d ./$* ] && $(GOFMT) ./$* || $(GOFMT) . diff --git a/files.go b/files.go new file mode 100644 index 0000000..7ffc59e --- /dev/null +++ b/files.go @@ -0,0 +1,14 @@ +package jsh + +type File struct { + Name string + Size int + Mode int + Inode uint64 +} + +type Permission struct { + Read bool + Write bool + Execute bool +} diff --git a/ls/main.go b/ls/main.go index 954bd0e..e596067 100644 --- a/ls/main.go +++ b/ls/main.go @@ -4,72 +4,58 @@ import ( "flag" "fmt" "io/ioutil" + "jsh" "log" - "strconv" "syscall" ) -func get_fileinfo(f string, size bool, mode bool, inode bool) string { - var stat syscall.Stat_t - var ret string - ret = "{\"files\": [{\"name\":\"" + f + "\"" - if err := syscall.Stat(f, &stat); err != nil { - log.Fatal(err) - } - if size { - ret = ret + ", \"size\":" + strconv.FormatInt(stat.Size, 10) - } - if mode { - ret = ret + ", \"mode\":" + strconv.Itoa(int(stat.Mode)) - } - if inode { - ret = ret + ", \"inode\":" + strconv.FormatUint(stat.Ino, 10) - } - ret = ret + "}]}" - return ret -} +// func get_fileinfo(f string) string { -func main() { - // here be the ls flags - - var a_flag bool // all files, even ones starting with . - var mode_flag bool // flags - var inode_flag bool // inode - var size_flag bool // size - var first = true - - flag.BoolVar(&a_flag, "a", false, "lists all files in directory, even hidden ones") - flag.BoolVar(&mode_flag, "f", false, "include flags for file") - flag.BoolVar(&inode_flag, "i", false, "include flags for file") - flag.BoolVar(&size_flag, "s", false, "include flags for file") - // end ls flag +// ret = ret + ", \"size\":" + strconv.FormatInt(stat.Size, 10) +// ret = ret + ", \"mode\":" + strconv.Itoa(int(stat.Mode)) +// ret = ret + ", \"inode\":" + strconv.FormatUint(stat.Ino, 10) +// ret = ret + "}]}" +// return ret +// } +func listFiles(queue chan *jsh.JshFrame) { flag.Parse() root := "." //flag.Arg(0) dir, _ := ioutil.ReadDir(root) - - fmt.Printf("[{\"StdOut\": [\n") - - if !a_flag { - for _, entry := range dir { - if entry.Name()[0] != '.' { - if !first { - fmt.Printf(",") - } else { - first = false - } - fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) - } + for _, entry := range dir { + var stat syscall.Stat_t + if err := syscall.Stat(entry.Name(), &stat); err != nil { + log.Fatal(err) } - } else { - for _, entry := range dir { - if !first { - fmt.Printf(",") - } else { - first = false - } - fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) + if entry.Name()[0] != '.' { + output := jsh.File{} + output.Name = entry.Name() + output.Size = int(stat.Size) + output.Mode = int(stat.Mode) + output.Inode = stat.Ino + frame := jsh.JshFrame{output, ""} + queue <- &frame } } - fmt.Printf("], \"StdErr\": []}]\n") +} + +func runJsonMode() { + queue := make(chan *jsh.JshFrame) + done := make(chan bool) + go jsh.OutputFrames(queue, done) + listFiles(queue) + close(queue) + <-done +} + +func main() { + // TODO: Support more flags + jsonModePtr := flag.Bool("json", false, "whether to use json mode for input and output") + flag.Parse() + + if !*jsonModePtr { + fmt.Printf("%s", jsh.FallbackWithArgs("ls", flag.Args())) + } else { + runJsonMode() + } }