diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/c_defs.go | 3 | ||||
-rw-r--r-- | src/c_fuzz.go | 26 | ||||
-rw-r--r-- | src/c_hardflip.go | 7 | ||||
-rw-r--r-- | src/c_init.go | 67 | ||||
-rw-r--r-- | src/c_utils.go | 14 | ||||
-rw-r--r-- | src/e_events.go | 12 | ||||
-rw-r--r-- | src/e_keys.go | 9 | ||||
-rw-r--r-- | src/i_ui.go | 111 |
9 files changed, 110 insertions, 141 deletions
@@ -27,7 +27,7 @@ DEST := /usr .DEFAULT_GOAL := ${TARGET} run: ${SRC} - go run ${SRC_DIR} -n + go run ${SRC_DIR} -s ${TARGET}: ${SRC} go build -o ${TARGET} ${SRC_DIR} diff --git a/src/c_defs.go b/src/c_defs.go index 09b81f6..480cf66 100644 --- a/src/c_defs.go +++ b/src/c_defs.go @@ -56,7 +56,7 @@ const ( STYLE_FILE_NAME = "colors.yml" CONF_DIR_NAME = "hf" DATA_DIR_NAME = "hf" - VERSION = "v1.0.2" + VERSION = "v1.0.3" VERSION_NAME = "wheelbite" ) @@ -76,7 +76,6 @@ up: k` const ( NORMAL_MODE = iota DELETE_MODE - LOAD_MODE ERROR_MODE WELCOME_MODE MKDIR_MODE diff --git a/src/c_fuzz.go b/src/c_fuzz.go index e183a85..68976bd 100644 --- a/src/c_fuzz.go +++ b/src/c_fuzz.go @@ -84,7 +84,7 @@ func c_fuzz_find_item(str_out string, litems *ItemsList) (*ItemsNode) { if ptr.is_dir() == true { continue } - if strings.Compare(name, ptr.Host.Name) == 0 && strings.Compare(path, ptr.path()) == 0 { + if name == ptr.Host.Name && path == ptr.path() { return ptr } } @@ -92,9 +92,11 @@ func c_fuzz_find_item(str_out string, litems *ItemsList) (*ItemsNode) { } func c_fuzz(data *HardData, ui *HardUI) { - if err := ui.s.Suspend(); err != nil { - c_error_mode("screen", err, ui) - return + if ui.s != nil { + if err := ui.s.Suspend(); err != nil { + c_error_mode("screen", err, ui) + return + } } search := exec.Command("fzf") stdin, stdout := c_fuzz_init_pipes(ui, search) @@ -103,7 +105,9 @@ func c_fuzz(data *HardData, ui *HardUI) { } if err := search.Start(); err != nil { c_error_mode("fzf", err, ui) - c_resume_or_die(ui) + if ui.s != nil { + c_resume_or_die(ui) + } return } go func() { @@ -117,15 +121,21 @@ func c_fuzz(data *HardData, ui *HardUI) { }() output, err := io.ReadAll(stdout) if err != nil { - ui.s.Fini() + if ui.s != nil { + ui.s.Fini() + } c_die("search stdout", err) } str_out := strings.TrimSuffix(string(output), "\n") - c_resume_or_die(ui) + if ui.s != nil { + c_resume_or_die(ui) + } if len(str_out) > 0 { item := c_fuzz_find_item(str_out, data.litems) if item == nil { - c_error_mode("item not found", nil, ui) + if ui.s != nil { + c_error_mode("item not found", nil, ui) + } return } data.litems.curr = item diff --git a/src/c_hardflip.go b/src/c_hardflip.go index b09a150..a50a9ae 100644 --- a/src/c_hardflip.go +++ b/src/c_hardflip.go @@ -79,5 +79,10 @@ func main() { n_arg, s_arg = c_cli_opts() } data_dir := c_get_data_dir(nil) - i_ui(data_dir, n_arg, s_arg) + data := c_init_hard(data_dir, n_arg, s_arg) + if s_arg == true { + c_fuzz(data, &data.ui) + // TODO: exec instantly here + } + i_ui(data) } diff --git a/src/c_init.go b/src/c_init.go index 130ca96..c2c7779 100644 --- a/src/c_init.go +++ b/src/c_init.go @@ -52,6 +52,7 @@ package main import ( + "fmt" "os" "path/filepath" @@ -85,7 +86,7 @@ type HardStyle struct { func c_recurse_data_dir(dir, root string, opts HardOpts, ldirs *DirsList, name string, parent *DirsNode, depth uint16, - ui *HardUI, load_err *[]error) { + load_err *[]error) { files, err := os.ReadDir(root + dir) if err != nil { *load_err = append(*load_err, err) @@ -99,12 +100,11 @@ func c_recurse_data_dir(dir, root string, opts HardOpts, nil, } ldirs.add_back(&dir_node) - i_draw_load_ui(ui) for _, file := range files { filename := file.Name() if file.IsDir() == true { c_recurse_data_dir(dir + filename + "/", root, opts, ldirs, - file.Name(), &dir_node, depth + 1, ui, load_err) + file.Name(), &dir_node, depth + 1, load_err) } else if filepath.Ext(filename) == ".yml" { host_node, err := c_read_yaml_file(root + dir + filename) if err != nil { @@ -117,16 +117,14 @@ func c_recurse_data_dir(dir, root string, opts HardOpts, } dir_node.lhost.add_back(host_node) } - i_draw_load_ui(ui) } } } -func c_load_data_dir(dir string, opts HardOpts, - ui *HardUI, load_err *[]error) (*DirsList) { +func c_load_data_dir(dir string, opts HardOpts, load_err *[]error) (*DirsList) { ldirs := DirsList{} - c_recurse_data_dir("", dir + "/", opts, &ldirs, "", nil, 1, ui, load_err) + c_recurse_data_dir("", dir + "/", opts, &ldirs, "", nil, 1, load_err) return &ldirs } @@ -211,3 +209,58 @@ func c_get_styles(dir string, load_err *[]error) HardStyle { } return styles } + +func i_load_data(data_dir string, + opts HardOpts, + load_err *[]error) (*DirsList, *ItemsList, []error) { + ldirs := c_load_data_dir(data_dir, opts, load_err) + litems := c_load_litems(ldirs) + if len(*load_err) == 0 { + *load_err = nil + } + return ldirs, litems, *load_err +} + +func c_init_hard(data_dir string, no_loop, search_mode bool) (*HardData) { + ui := HardUI{} + var load_err []error + + fmt.Println("loading config...") + home_dir, _ := os.UserHomeDir() + opts := HardOpts{} + conf_dir := c_get_conf_dir(&load_err) + if len(conf_dir) == 0 { + opts = DEFAULT_OPTS + } else { + opts = c_get_options(conf_dir, &load_err) + } + if no_loop == true { + opts.Loop = false + } + styles := c_get_styles(conf_dir, &load_err) + i_init_styles(&ui, styles) + fmt.Println("loading data...") + ldirs, litems, load_err := i_load_data(data_dir, opts, &load_err) + data := HardData{ + litems, + ldirs, + ui, + opts, + styles, + make(map[*DirsNode]*ItemsList), + data_dir, + home_dir, + load_err, + nil, + [][2]string{}, + nil, + nil, + no_loop, + search_mode, + } + if data.opts.GPG == DEFAULT_OPTS.GPG && data.litems.head == nil { + data.ui.mode = WELCOME_MODE + data.keys = c_get_secret_gpg_keyring() + } + return &data +} diff --git a/src/c_utils.go b/src/c_utils.go index 839d6c8..76ac248 100644 --- a/src/c_utils.go +++ b/src/c_utils.go @@ -252,24 +252,18 @@ func c_print_version() { // prints the help and exits func c_print_help() { - fmt.Println(`Usage: + fmt.Println(`usage: hf [options] -Options:`) +options:`) flag.PrintDefaults() fmt.Println(` -Report bugs to <rbo@gmx.us>`) +report bugs to <rbo@gmx.us>`) os.Exit(0) } -// wrong argument and exit -func c_not_an_arg(arg string) { - fmt.Println("hf: Unknown argument " + arg) - os.Exit(1) -} - func c_cli_opts() (bool, bool) { - h := flag.Bool("h", false, "print this help") + h := flag.Bool("h", false, "show usage") n := flag.Bool("n", false, "disable loop mode") s := flag.Bool("s", false, "search-only mode (implies -n)") v := flag.Bool("v", false, "print the version number and name") diff --git a/src/e_events.go b/src/e_events.go index 914756a..35e8faa 100644 --- a/src/e_events.go +++ b/src/e_events.go @@ -52,6 +52,7 @@ package main import ( + "fmt" "maps" "os" @@ -178,8 +179,9 @@ func e_reload_data(data *HardData) { tmp_parent_path = data.litems.curr.Host.parent.path() } } + fmt.Println("reloading config...") conf_dir := c_get_conf_dir(&data.load_err) - if conf_dir == "" { + if len(conf_dir) == 0 { data.opts = DEFAULT_OPTS } else { data.opts = c_get_options(conf_dir, &data.load_err) @@ -187,19 +189,19 @@ func e_reload_data(data *HardData) { data.opts.Loop = false } } - if conf_dir == "" { + if len(conf_dir) == 0 { data.colors = DEFAULT_STYLE } else { data.colors = c_get_styles(conf_dir, &data.load_err) } i_init_styles(&data.ui, data.colors) + fmt.Println("reloading data...") data.data_dir = c_get_data_dir(&data.ui) if len(data.data_dir) == 0 { return } - g_load_count = -1 - data.ldirs, data.litems, data.load_err = i_load_ui(data.data_dir, data.opts, - &data.ui, &data.load_err) + data.ldirs, data.litems, data.load_err = i_load_data(data.data_dir, data.opts, + &data.load_err) data.folds = make(map[*DirsNode]*ItemsList) if tmp_name == "" { data.litems.curr = data.litems.head diff --git a/src/e_keys.go b/src/e_keys.go index 40e8bde..1e598b5 100644 --- a/src/e_keys.go +++ b/src/e_keys.go @@ -187,7 +187,12 @@ func e_normal_events(data *HardData, ui *HardUI, event tcell.EventKey) bool { ui.insert_sel_ok = false ui.insert_scroll = 0 } else if event.Key() == tcell.KeyCtrlR { + if err := ui.s.Suspend(); err != nil { + c_error_mode("screen", err, ui) + return true + } e_reload_data(data) + c_resume_or_die(ui) } else if event.Rune() == 'm' || event.Key() == tcell.KeyF7 { ui.mode = MKDIR_MODE @@ -275,10 +280,6 @@ func e_delete_events(data *HardData, ui *HardUI, event tcell.EventKey) bool { return false } -func e_load_events(data *HardData, ui *HardUI, event tcell.EventKey) bool { - return true -} - func e_error_events(data *HardData, ui *HardUI, event tcell.EventKey) bool { if event.Rune() != 0 || event.Key() == tcell.KeyEscape || diff --git a/src/i_ui.go b/src/i_ui.go index 4c87c76..b404cd3 100644 --- a/src/i_ui.go +++ b/src/i_ui.go @@ -210,10 +210,9 @@ func i_set_box_style(ui *HardUI) { switch ui.mode { case NORMAL_MODE, - LOAD_MODE, WELCOME_MODE, HELP_MODE: - // FIX: with custom config for default ayayaya + // TODO: with custom config for default ayayaya ui.style[BOX_STYLE] = tmp.Foreground(tcell.ColorReset) ui.style[HEAD_STYLE] = tmp.Foreground(tcell.ColorReset) case DELETE_MODE, @@ -239,8 +238,6 @@ func i_draw_bottom_text(ui HardUI, insert *HostNode, insert_err []error) { text = NORMAL_KEYS_HINTS case DELETE_MODE: text = CONFIRM_KEYS_HINTS - case LOAD_MODE: - text = "Loading..." case ERROR_MODE: text = ERROR_KEYS_HINTS case WELCOME_MODE: @@ -656,60 +653,6 @@ func i_draw_match_buff(ui HardUI) { ui.style[DEF_STYLE], ui.match_buff) } -var g_load_count int = -1 - -func i_draw_load_ui(ui *HardUI) { - g_load_count += 1 - if g_load_count % 1000 != 0 { - return - } - i_draw_host_panel(*ui, false, nil, nil) - i_draw_info_panel(*ui, false, nil) - text := "" - for i := 0; i < ui.dim[W] - 1; i++ { - text += " " - } - i_draw_text(ui.s, 1, ui.dim[H] - 1, ui.dim[W], ui.dim[H] - 1, - ui.style[BOT_STYLE], text) - i_draw_bottom_text(*ui, nil, nil) - i_draw_msg(ui.s, 1, ui.style[BOX_STYLE], ui.dim, " Loading ") - text = "Loading " + strconv.Itoa(g_load_count) + " hosts" - left, right := i_left_right(len(text), *ui) - i_draw_text(ui.s, - left, ui.dim[H] - 2 - 1, right, ui.dim[H] - 2 - 1, - ui.style[DEF_STYLE], text) - ui.s.Show() - ui.s.PostEvent(nil) - event := ui.s.PollEvent() - switch event := event.(type) { - case *tcell.EventResize: - ui.dim[W], ui.dim[H], _ = term.GetSize(0) - ui.s.Sync() - case *tcell.EventKey: - if event.Key() == tcell.KeyCtrlC || - event.Rune() == 'q' { - ui.s.Fini() - os.Exit(0) - } - } -} - -func i_load_ui(data_dir string, - opts HardOpts, - ui *HardUI, - load_err *[]error) (*DirsList, *ItemsList, []error) { - ui.mode = LOAD_MODE - ldirs := c_load_data_dir(data_dir, opts, ui, load_err) - litems := c_load_litems(ldirs) - if ui.mode != ERROR_MODE { - ui.mode = NORMAL_MODE - } - if len(*load_err) == 0 { - *load_err = nil - } - return ldirs, litems, *load_err -} - func i_init_styles(ui *HardUI, styles HardStyle) { for i := range STYLE_MAX + 1 { tmp := tcell.StyleDefault.Background(tcell.ColorReset) @@ -783,59 +726,21 @@ func i_init_styles(ui *HardUI, styles HardStyle) { type key_event_mode_func func(*HardData, *HardUI, tcell.EventKey) bool -func i_ui(data_dir string, no_loop, search_mode bool) { - home_dir, _ := os.UserHomeDir() - ui := HardUI{} - opts := HardOpts{} +func i_ui(data *HardData) { var err error - ui.s, err = tcell.NewScreen() + data.ui.s, err = tcell.NewScreen() if err != nil { c_die("view", err) } - if err := ui.s.Init(); err != nil { + if err := data.ui.s.Init(); err != nil { c_die("view", err) } - ui.dim[W], ui.dim[H], _ = term.GetSize(0) - var load_err []error - conf_dir := c_get_conf_dir(&load_err) - if len(conf_dir) == 0 { - opts = DEFAULT_OPTS - } else { - opts = c_get_options(conf_dir, &load_err) - } - if no_loop == true { - opts.Loop = false - } - styles := c_get_styles(conf_dir, &load_err) - i_init_styles(&ui, styles) - ui.s.SetStyle(ui.style[DEF_STYLE]) - ldirs, litems, load_err := i_load_ui(data_dir, opts, &ui, &load_err) - data := HardData{ - litems, - ldirs, - ui, - opts, - styles, - make(map[*DirsNode]*ItemsList), - data_dir, - home_dir, - load_err, - nil, - [][2]string{}, - nil, - nil, - no_loop, - search_mode, - } - if data.opts.GPG == DEFAULT_OPTS.GPG && data.litems.head == nil { - data.ui.mode = WELCOME_MODE - data.keys = c_get_secret_gpg_keyring() - } + data.ui.dim[W], data.ui.dim[H], _ = term.GetSize(0) + data.ui.s.SetStyle(data.ui.style[DEF_STYLE]) fp := [MODE_MAX + 1]key_event_mode_func{ NORMAL_MODE: e_normal_events, DELETE_MODE: e_delete_events, - LOAD_MODE: e_load_events, ERROR_MODE: e_error_events, WELCOME_MODE: e_welcome_events, MKDIR_MODE: e_mkdir_events, @@ -847,7 +752,7 @@ func i_ui(data_dir string, no_loop, search_mode bool) { data.ui.s.Clear() i_set_box_style(&data.ui) i_draw_bottom_text(data.ui, data.insert, data.insert_err) - i_draw_host_panel(data.ui, data.opts.Icon, data.litems, &data) + i_draw_host_panel(data.ui, data.opts.Icon, data.litems, data) i_draw_info_panel(data.ui, data.opts.Perc, data.litems) i_draw_scrollhint(data.ui, data.litems) if len(data.load_err) > 0 { @@ -893,6 +798,6 @@ func i_ui(data_dir string, no_loop, search_mode bool) { data.ui.match_buff = "" } data.ui.s.Show() - e_events(&data, fp) + e_events(data, fp) } } |