💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Gemigit › files › 1e38baeb9d9b1502370a0065c3… captured on 2022-07-16 at 17:09:39. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
0 package repo
1
2 import (
3 "errors"
4 "gemigit/db"
5 "io"
6 "os"
7
8 "github.com/go-git/go-git/v5"
9 "github.com/go-git/go-git/v5/plumbing"
10 "github.com/go-git/go-git/v5/plumbing/object"
11 )
12
13 var rootPath string
14
15 func Init(path string) error {
16 rootPath = path
17 return os.MkdirAll(path, 0700)
18 }
19
20 func InitRepo(name string, username string) error {
21 _, err := git.PlainInit(rootPath+"/"+username+"/"+name, true)
22 return err
23 }
24
25 func RemoveRepo(name string, username string) error {
26 return os.RemoveAll(rootPath + "/" + username + "/" + name)
27 }
28
29 func GetCommits(name string, username string) (object.CommitIter, error) {
30 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)
31 if err != nil {
32 return nil, err
33 }
34 ref, err := repo.Head()
35 if err != nil {
36 return nil, nil // Empty repo
37 }
38 cIter, err := repo.Log(&git.LogOptions{From: ref.Hash()})
39 if err != nil {
40 return nil, err
41 }
42 return cIter, nil
43 }
44
45 func getTree(name string, username string) (*object.Tree, error) {
46 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)
47 if err != nil {
48 return nil, err
49 }
50 ref, err := repo.Head()
51 if err != nil {
52 return nil, nil // Empty repo
53 }
54 last, err := repo.CommitObject(ref.Hash())
55 if err != nil {
56 return nil, err
57 }
58 tree, err := repo.TreeObject(last.TreeHash)
59 if err != nil {
60 return nil, err
61 }
62 return tree, nil
63 }
64
65 func GetFiles(name string, username string) (*object.FileIter, error) {
66 tree, err := getTree(name, username)
67 if err != nil {
68 return nil, err
69 }
70 if tree == nil {
71 return nil, nil
72 }
73 return tree.Files(), nil
74 }
75
76 func GetFile(name string, username string, file string) (*object.File, error) {
77 tree, err := getTree(name, username)
78 if err != nil {
79 return nil, err
80 }
81 if tree == nil {
82 return nil, nil
83 }
84 out, err := tree.File(file)
85 if err != nil {
86 return nil, err
87 }
88 return out, nil
89 }
90
91 func GetPublicFile(name string, username string, hash string) (string, error) {
92 public, err := db.IsRepoPublic(name, username)
93 if err != nil {
94 return "", err
95 }
96 if !public {
97 return "", errors.New("repository is private")
98 }
99 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)
100 if err != nil {
101 return "", err
102 }
103 file, err := repo.BlobObject(plumbing.NewHash(hash))
104 if err != nil {
105 return "", err
106 }
107 reader, err := file.Reader()
108 if err != nil {
109 return "", err
110 }
111 buf, err := io.ReadAll(reader)
112 if err != nil {
113 return "", err
114 }
115 return string(buf), nil
116 }
117
118 func GetPrivateFile(name string, username string, hash string, sig string) (string, error) {
119 user, b := db.GetUser(sig)
120 if !b || username != user.Name {
121 return "", errors.New("invalid signature")
122 }
123 repo, err := git.PlainOpen(rootPath + "/" + username + "/" + name)
124 if err != nil {
125 return "", err
126 }
127 file, err := repo.BlobObject(plumbing.NewHash(hash))
128 if err != nil {
129 return "", err
130 }
131 reader, err := file.Reader()
132 if err != nil {
133 return "", err
134 }
135 buf, err := io.ReadAll(reader)
136 if err != nil {
137 return "", err
138 }
139 return string(buf), nil
140 }
141
142 func ChangeRepoDir(name string, username string, newname string) error {
143 return os.Rename(rootPath+"/"+username+"/"+name, rootPath+"/"+username+"/"+newname)
144 }
145