/
redis-repo.go
91 lines (83 loc) · 2.52 KB
/
redis-repo.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
91
package redisrepo
import (
// "container/list"
"context"
"errors"
"fmt"
"github.com/go-redis/redis/v8"
)
var redisclient *redis.Client
const REPO_KEY string = "GIT_REPO"
func Test() {
println("Hello World!")
redisclient.Get(context.Background(), "a")
}
func LsRefs(repoName string) ([]string, error) {
var repoExistsCmd = redisclient.SIsMember(context.Background(), fmt.Sprintf("%s:repos", REPO_KEY), repoName)
if repoExistsCmd.Err() != nil && repoExistsCmd.Err() != redis.Nil {
return nil, repoExistsCmd.Err()
} else if repoExistsCmd.Err() == redis.Nil || !repoExistsCmd.Val() {
return nil, errors.New("repo does not exist")
}
var refnamesCmd = redisclient.Keys(context.Background(), fmt.Sprintf("%s:repo:%s:ref:*", REPO_KEY, repoName))
if refnamesCmd.Err() != nil {
return nil, refnamesCmd.Err()
}
var refNames = refnamesCmd.Val()
var refObjs map[string]map[string]string
refNames = refNames
for _, refName := range refNames {
var refCmd = redisclient.HGetAll(context.Background(), fmt.Sprintf("%s:repo:%s:ref:%s", REPO_KEY, repoName, refName))
if refCmd.Err() != nil {
return nil, refCmd.Err()
}
refObjs[refName] = refCmd.Val()
}
for _, refObj := range refObjs {
if obj_id, error := resolveObjId(refObjs, refObj); error != nil {
return nil, error
} else {
refObj["obj-id"] = obj_id
}
}
var refs = make([]string, len(refObjs))
var i = 0
for refName, refObj := range refObjs {
var ref = refObj["obj-id"] + " " + refName
if symrefTarget, ok := refObj["symref-target"]; ok {
ref += " symref-target:" + symrefTarget
}
refs[i] = ref
i++
}
return refs, nil
}
func resolveObjId(refObjs map[string]map[string]string, refObj map[string]string) (string, error) {
if refType, ok := refObj["type"]; ok {
switch refType {
case "commit":
if objId, ok := refObj["obj-id"]; ok {
return objId, nil
} else {
return "", errors.New("missing key 'obj-id' in reference of type 'commit'")
}
case "symref":
if objId, ok := refObj["obj-id"]; ok {
return objId, nil
}
if symrefTarget, ok := refObj["symref-target"]; ok {
if symrefTargetObj, ok := refObjs[symrefTarget]; ok {
return resolveObjId(refObjs, symrefTargetObj)
} else {
return "", errors.New(fmt.Sprintf("invalid 'symref-target': '%s'", symrefTarget))
}
} else {
return "", errors.New("missing key 'symref-target' in reference of type 'symref'")
}
default:
return "", errors.New(fmt.Sprintf("unsupported type '%s'", refType))
}
} else {
return "", errors.New("missing key 'type'")
}
}