Rich Enhanced Shell History - Contextual shell history for zsh and bash
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
resh/cmd/evaluate/main.go

152 lines
4.3 KiB

package main
import (
"flag"
"fmt"
"log"
"os"
"os/user"
"path/filepath"
"github.com/curusarn/resh/pkg/histanal"
"github.com/curusarn/resh/pkg/records"
"github.com/curusarn/resh/pkg/strat"
)
// Version from git set during build
var Version string
// Revision from git set during build
var Revision string
func main() {
const maxCandidates = 50
usr, _ := user.Current()
dir := usr.HomeDir
historyPath := filepath.Join(dir, ".resh_history.json")
historyPathBatchMode := filepath.Join(dir, "resh_history.json")
sanitizedHistoryPath := filepath.Join(dir, "resh_history_sanitized.json")
// tmpPath := "/tmp/resh-evaluate-tmp.json"
showVersion := flag.Bool("version", false, "Show version and exit")
showRevision := flag.Bool("revision", false, "Show git revision and exit")
input := flag.String("input", "",
"Input file (default: "+historyPath+"OR"+sanitizedHistoryPath+
" depending on --sanitized-input option)")
// outputDir := flag.String("output", "/tmp/resh-evaluate", "Output directory")
sanitizedInput := flag.Bool("sanitized-input", false,
"Handle input as sanitized (also changes default value for input argument)")
plottingScript := flag.String("plotting-script", "resh-evaluate-plot.py", "Script to use for plotting")
inputDataRoot := flag.String("input-data-root", "",
"Input data root, enables batch mode, looks for files matching --input option")
slow := flag.Bool("slow", false,
"Enables strategies that takes a long time (e.g. markov chain strategies).")
skipFailedCmds := flag.Bool("skip-failed-cmds", false,
"Skips records with non-zero exit status.")
debugRecords := flag.Float64("debug", 0, "Debug records - percentage of records that should be debugged.")
flag.Parse()
// handle show{Version,Revision} options
if *showVersion == true {
fmt.Println(Version)
os.Exit(0)
}
if *showRevision == true {
fmt.Println(Revision)
os.Exit(0)
}
// handle batch mode
batchMode := false
if *inputDataRoot != "" {
batchMode = true
}
// set default input
if *input == "" {
if *sanitizedInput {
*input = sanitizedHistoryPath
} else if batchMode {
*input = historyPathBatchMode
} else {
*input = historyPath
}
}
var evaluator histanal.HistEval
if batchMode {
evaluator = histanal.NewHistEvalBatchMode(*input, *inputDataRoot, maxCandidates, *skipFailedCmds, *debugRecords, *sanitizedInput)
} else {
evaluator = histanal.NewHistEval(*input, maxCandidates, *skipFailedCmds, *debugRecords, *sanitizedInput)
}
var simpleStrategies []strat.ISimpleStrategy
var strategies []strat.IStrategy
// dummy := strategyDummy{}
// simpleStrategies = append(simpleStrategies, &dummy)
simpleStrategies = append(simpleStrategies, &strat.Recent{})
// frequent := strategyFrequent{}
// frequent.init()
// simpleStrategies = append(simpleStrategies, &frequent)
// random := strategyRandom{candidatesSize: maxCandidates}
// random.init()
// simpleStrategies = append(simpleStrategies, &random)
directory := strat.DirectorySensitive{}
directory.Init()
simpleStrategies = append(simpleStrategies, &directory)
dynamicDistG := strat.DynamicRecordDistance{
MaxDepth: 3000,
DistParams: records.DistParams{Pwd: 10, RealPwd: 10, SessionID: 1, Time: 1, Git: 10},
Label: "10*pwd,10*realpwd,session,time,10*git",
}
dynamicDistG.Init()
strategies = append(strategies, &dynamicDistG)
distanceStaticBest := strat.RecordDistance{
MaxDepth: 3000,
DistParams: records.DistParams{Pwd: 10, RealPwd: 10, SessionID: 1, Time: 1},
Label: "10*pwd,10*realpwd,session,time",
}
strategies = append(strategies, &distanceStaticBest)
recentBash := strat.RecentBash{}
recentBash.Init()
strategies = append(strategies, &recentBash)
if *slow {
markovCmd := strat.MarkovChainCmd{Order: 1}
markovCmd.Init()
markovCmd2 := strat.MarkovChainCmd{Order: 2}
markovCmd2.Init()
markov := strat.MarkovChain{Order: 1}
markov.Init()
markov2 := strat.MarkovChain{Order: 2}
markov2.Init()
simpleStrategies = append(simpleStrategies, &markovCmd2, &markovCmd, &markov2, &markov)
}
for _, strategy := range simpleStrategies {
strategies = append(strategies, strat.NewSimpleStrategyWrapper(strategy))
}
for _, strat := range strategies {
err := evaluator.Evaluate(strat)
if err != nil {
log.Println("Evaluator evaluate() error:", err)
}
}
evaluator.CalculateStatsAndPlot(*plottingScript)
}