Compare commits
3 Commits
d83517f67b
...
6622ea0e1c
Author | SHA1 | Date | |
---|---|---|---|
6622ea0e1c | |||
a492b3b668 | |||
280114a5d3 |
50
acid.go
50
acid.go
@ -30,7 +30,6 @@ import (
|
||||
"syscall"
|
||||
ttemplate "text/template"
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"github.com/pkg/sftp"
|
||||
@ -154,6 +153,14 @@ var shellFuncs = ttemplate.FuncMap{
|
||||
|
||||
// --- Utilities ---------------------------------------------------------------
|
||||
|
||||
func localShell() string {
|
||||
if shell := os.Getenv("SHELL"); shell != "" {
|
||||
return shell
|
||||
}
|
||||
// The os/user package doesn't store the parsed out shell field.
|
||||
return "/bin/sh"
|
||||
}
|
||||
|
||||
func giteaSign(b []byte) string {
|
||||
payloadHmac := hmac.New(sha256.New, []byte(getConfig().Secret))
|
||||
payloadHmac.Write(b)
|
||||
@ -306,9 +313,7 @@ function get(id) {
|
||||
return document.getElementById(id)
|
||||
}
|
||||
function getLog(id) {
|
||||
const header = document.getElementById(id)
|
||||
const log = document.getElementById(id + 'log')
|
||||
const text = log.textContent
|
||||
const header = get(id), log = get(id + 'log'), text = log.textContent
|
||||
// lines[-1] is an implementation detail of terminalWriter.Serialize,
|
||||
// lines[-2] is the actual last line.
|
||||
const last = Math.max(0, text.split('\n').length - 2)
|
||||
@ -326,8 +331,7 @@ function refreshLog(log, top, changed) {
|
||||
log.log.hidden = empty
|
||||
}
|
||||
let refresher = setInterval(() => {
|
||||
let run = getLog('run'), task = getLog('task'), deploy = getLog('deploy')
|
||||
|
||||
const run = getLog('run'), task = getLog('task'), deploy = getLog('deploy')
|
||||
const url = new URL(window.location.href)
|
||||
url.search = ''
|
||||
url.searchParams.set('json', '')
|
||||
@ -366,8 +370,8 @@ let refresher = setInterval(() => {
|
||||
if (!data.IsRunning)
|
||||
clearInterval(refresher)
|
||||
}).catch(error => {
|
||||
alert(error)
|
||||
clearInterval(refresher)
|
||||
alert(error)
|
||||
})
|
||||
}, 1000 /* For faster updates than this, we should use WebSockets. */)
|
||||
</script>
|
||||
@ -842,7 +846,7 @@ func notifierRunCommand(ctx context.Context, task Task) {
|
||||
return
|
||||
}
|
||||
|
||||
cmd := exec.CommandContext(ctx, "sh")
|
||||
cmd := exec.CommandContext(ctx, localShell())
|
||||
cmd.Stdin = script
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
@ -1166,14 +1170,6 @@ func executorDownload(client *ssh.Client, remoteRoot, localRoot string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func executorLocalShell() string {
|
||||
if shell := os.Getenv("SHELL"); shell != "" {
|
||||
return shell
|
||||
}
|
||||
// The os/user package doesn't store the parsed out shell field.
|
||||
return "/bin/sh"
|
||||
}
|
||||
|
||||
func executorTmpDir(fallback string) string {
|
||||
// See also: https://systemd.io/TEMPORARY_DIRECTORIES/
|
||||
if tmp := os.Getenv("TMPDIR"); tmp != "" {
|
||||
@ -1209,9 +1205,10 @@ func executorDeploy(
|
||||
return err
|
||||
}
|
||||
|
||||
cmd := exec.CommandContext(ctx, executorLocalShell(), "-c", script.String())
|
||||
cmd := exec.CommandContext(ctx, localShell())
|
||||
cmd.Env = rt.localEnv()
|
||||
cmd.Dir = dir
|
||||
cmd.Stdin = script
|
||||
cmd.Stdout = &rt.DeployLog
|
||||
cmd.Stderr = &rt.DeployLog
|
||||
return cmd.Run()
|
||||
@ -1605,18 +1602,15 @@ func (t *Task) CloneURL() string {
|
||||
}
|
||||
|
||||
func shortDurationString(d time.Duration) string {
|
||||
rs := []rune(d.Truncate(time.Second).String())
|
||||
for i, r := range rs {
|
||||
if !unicode.IsLetter(r) {
|
||||
continue
|
||||
}
|
||||
i++
|
||||
for i < len(rs) && unicode.IsLetter(rs[i]) {
|
||||
i++
|
||||
}
|
||||
return string(rs[:i])
|
||||
if d.Abs() >= 24*time.Hour {
|
||||
return strconv.FormatInt(int64(d/time.Hour/24), 10) + "d"
|
||||
} else if d.Abs() >= time.Hour {
|
||||
return strconv.FormatInt(int64(d/time.Hour), 10) + "h"
|
||||
} else if d.Abs() >= time.Minute {
|
||||
return strconv.FormatInt(int64(d/time.Minute), 10) + "m"
|
||||
} else {
|
||||
return strconv.FormatInt(int64(d/time.Second), 10) + "s"
|
||||
}
|
||||
return string(rs)
|
||||
}
|
||||
|
||||
func (t *Task) Created() *time.Time {
|
||||
|
17
acid_test.go
17
acid_test.go
@ -4,6 +4,7 @@ import (
|
||||
"bytes"
|
||||
"testing"
|
||||
ttemplate "text/template"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestTemplateQuote(t *testing.T) {
|
||||
@ -30,3 +31,19 @@ func TestTemplateQuote(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestShortDurationString(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
d time.Duration
|
||||
expect string
|
||||
}{
|
||||
{72 * time.Hour, "3d"},
|
||||
{-3 * time.Hour, "-3h"},
|
||||
{12 * time.Minute, "12m"},
|
||||
{time.Millisecond, "0s"},
|
||||
} {
|
||||
if sd := shortDurationString(test.d); sd != test.expect {
|
||||
t.Errorf("%s = %s; want %s\n", test.d, sd, test.expect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user