mirror of
https://github.com/awalsh128/cache-apt-pkgs-action.git
synced 2026-07-06 09:04:38 +00:00
* Pull dev upstream to staging. (#112)
* Use awk to enclose filename in single quotes tar #99
* Add null field separator so filenames don't get broken up.
* Move upload logs up in the action sequence so it captures data before it gets deleted.
* Fix awk (#109)
---------
Co-authored-by: sn-o-w <cristian.silaghi@mozilla.ro>
* Fix awk delimiter.
Pull in fix by @sn-o-w in d0ee83b497 mentioned in issue #99
* Swap out Bash based APT query logic for Golang version. (#117)
* First version of a Golang version of command handling in general. (#118)
---------
Co-authored-by: sn-o-w <cristian.silaghi@mozilla.ro>
75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package exec
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"strings"
|
|
|
|
"awalsh128.com/cache-apt-pkgs-action/src/internal/logging"
|
|
)
|
|
|
|
// An executor that replays execution results from a recorded result.
|
|
type ReplayExecutor struct {
|
|
logFilepath string
|
|
cmdExecs map[string]*Execution
|
|
}
|
|
|
|
func NewReplayExecutor(logFilepath string) *ReplayExecutor {
|
|
file, err := os.Open(logFilepath)
|
|
if err != nil {
|
|
logging.Fatal(err)
|
|
}
|
|
defer file.Close()
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
|
|
cmdExecs := make(map[string]*Execution)
|
|
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
if strings.Contains(line, "EXECUTION-OBJ-START") {
|
|
payload := ""
|
|
for scanner.Scan() {
|
|
line = scanner.Text()
|
|
if strings.Contains(line, "EXECUTION-OBJ-END") {
|
|
execution := DeserializeExecution(payload)
|
|
cmdExecs[execution.Cmd] = execution
|
|
break
|
|
} else {
|
|
payload += line + "\n"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
logging.Fatal(err)
|
|
}
|
|
return &ReplayExecutor{logFilepath, cmdExecs}
|
|
}
|
|
|
|
func (e *ReplayExecutor) getCmds() []string {
|
|
cmds := []string{}
|
|
for cmd := range e.cmdExecs {
|
|
cmds = append(cmds, cmd)
|
|
}
|
|
return cmds
|
|
}
|
|
|
|
func (e *ReplayExecutor) Exec(name string, arg ...string) *Execution {
|
|
cmd := name + " " + strings.Join(arg, " ")
|
|
value, ok := e.cmdExecs[cmd]
|
|
if !ok {
|
|
var available string
|
|
if len(e.getCmds()) > 0 {
|
|
available = "\n" + strings.Join(e.getCmds(), "\n")
|
|
} else {
|
|
available = " NONE"
|
|
}
|
|
logging.Fatalf(
|
|
"Unable to replay command '%s'.\n"+
|
|
"No command found in the debug log; available commands:%s", cmd, available)
|
|
}
|
|
return value
|
|
}
|