cron.go RawHistoryFolder

1package domain
2
3import (
4	"fmt"
5	"strconv"
6	"strings"
7	"time"
8)
9
10// CronSchedule represents a recurring schedule: a preset, an optional time
11// of day, and the timezone that time is read in.
12//
13// When At is nil the preset keeps its built-in time (daily 02:00, weekly
14// Sunday 03:00, monthly day 1 04:00, hourly on the hour). When Location is
15// nil times are read in UTC.
16type CronSchedule struct {
17	Preset   BackupSchedule
18	At       *TimeOfDay
19	Location *time.Location
20}
21
22// TimeOfDay is a wall-clock time. Hourly schedules use only Minute.
23type TimeOfDay struct {
24	Hour   int
25	Minute int
26}
27
28// String formats the time as HH:MM.
29func (t TimeOfDay) String() string {
30	return fmt.Sprintf("%02d:%02d", t.Hour, t.Minute)
31}
32
33// ParseTimeOfDay parses a 24-hour "HH:MM" wall-clock time.
34func ParseTimeOfDay(raw string) (TimeOfDay, error) {
35	hh, mm, ok := strings.Cut(strings.TrimSpace(raw), ":")
36	if !ok || len(hh) == 0 || len(hh) > 2 || len(mm) != 2 {
37		return TimeOfDay{}, fmt.Errorf("time must use 24-hour HH:MM format, got %q", raw)
38	}
39	hour, errH := strconv.Atoi(hh)
40	minute, errM := strconv.Atoi(mm)
41	if errH != nil || errM != nil || hour < 0 || hour > 23 || minute < 0 || minute > 59 {
42		return TimeOfDay{}, fmt.Errorf("time must use 24-hour HH:MM format, got %q", raw)
43	}
44	return TimeOfDay{Hour: hour, Minute: minute}, nil
45}
46
47// CronEntry represents a registered cron job.
48type CronEntry struct {
49	ID       string
50	Name     string
51	Schedule CronSchedule
52	LastRun  time.Time
53	NextRun  time.Time
54	Running  bool
55}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close