/
api_rev.go
90 lines (81 loc) · 2 KB
/
api_rev.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package session
import (
"context"
"net/http"
"sync"
"time"
"get.pme.sh/pmesh/revision"
)
type RepoInfo struct {
Sys string `json:"sys"` // Repository system
Ref revision.Reference `json:"ref"` // Repository reference
Remote revision.Reference `json:"remote"` // Remote repository reference
URL string `json:"url"` // Remote repository URL
}
type PullResult struct {
From revision.Reference `json:"from"` // From reference
To revision.Reference `json:"to"` // To reference
}
type UpdateParams struct {
Invalidate bool `json:"invalidate"` // True if the session should be invalidated
}
var repoLock sync.Mutex
var lastFetch time.Time
func getRepoState(session *Session, ctx context.Context, fetch bool) (res revision.Repo, err error) {
repoLock.Lock()
defer repoLock.Unlock()
res, err = revision.Open(session.Manifest().Root)
if err != nil {
return
}
if fetch {
if time.Since(lastFetch) < 5*time.Second {
return
}
lastFetch = time.Now()
res.Fetch(ctx)
}
return
}
func init() {
Match("/repo", func(session *Session, r *http.Request, p struct{}) (info RepoInfo, err error) {
repo, err := getRepoState(session, r.Context(), false)
if err != nil {
return
}
info.Sys = repo.System()
info.Ref, _ = repo.Head()
info.Remote, _ = repo.RemoteHead()
info.URL, _ = repo.RemoteURL()
return
})
Match("/repo/update", func(session *Session, r *http.Request, p UpdateParams) (res PullResult, err error) {
repo, err := getRepoState(session, r.Context(), true)
if err != nil {
return
}
head, err := repo.Head()
if err != nil {
return
}
res.From = head
remote, _ := repo.RemoteHead()
res.To = remote
if remote.Hash == "" {
res.To = head
return
}
if res.From.Hash == res.To.Hash {
return
}
err = repo.Update()
if err == nil {
go session.Reload(p.Invalidate)
}
return
})
Match("/version", func(session *Session, r *http.Request, p struct{}) (res string, _ error) {
res = revision.GetVersion()
return
})
}