// ListTrace implements l command (list trace). func ListTrace(argument string, env *environments.Environment) { number, err := strconv.Atoi(argument) if err != nil || number < 0 { utils.Logger.Panicf("Cannot convert argument to a command number: %s", argument) } commands, err := historyentries.GetCommands(historyentries.GetCommandsPrecise, nil, env, number) if err != nil { utils.Logger.Panic(err) } command := commands.Result().(historyentries.HistoryEntry) hashFilename := command.GetTraceName() filename := env.GetTraceFileName(hashFilename) if _, err := os.Stat(filename); os.IsNotExist(err) { utils.Logger.Panicf("Output for %s is not exist", argument) } file := utils.Open(filename) defer file.Close() ungzippedFile, err := gzip.NewReader(file) if err != nil { utils.Logger.Panic(err) } defer ungzippedFile.Close() scanner := bufio.NewScanner(ungzippedFile) for scanner.Scan() { os.Stdout.WriteString(scanner.Text()) os.Stdout.WriteString("\n") } if err := scanner.Err(); err != nil { utils.Logger.Panic(err) } }
// GetCommands returns a keeper for the commands based on given mode and regular expression. // varargs is the auxiliary list of numbers which makes sense in the context of GetCommandsMode setting // only. func GetCommands(mode GetCommandsMode, filter *utils.Regexp, env *environments.Environment, varargs ...int) (commands Keeper, err error) { keeper := getKeeper(mode, varargs...) resultChan, consumeChan := processHistories(env) parser := getParser(env) histFileName, err := env.GetHistFileName() if err != nil { return } file := utils.Open(histFileName) defer file.Close() scanner := bufio.NewScanner(file) commands, err = parser(keeper, scanner, filter, consumeChan) if err == nil { <-resultChan return commands, nil } return }