master
main.go
1package main
2
3import (
4 "fmt"
5 "git.sr.ht/~chld/dgr/cmd"
6 "git.sr.ht/~chld/dgr/extra"
7 "git.sr.ht/~chld/dgr/pkg"
8 "os"
9 "path/filepath"
10 "strings"
11)
12
13func help() {
14 fmt.Printf("usage:\t%s [cmd] <pkgs>\n",
15 filepath.Base(os.Args[0]))
16 // ports management
17 fmt.Printf("\t")
18 fmt.Printf("\033[m\033[1m%s \033[m\033[32m", filepath.Base(os.Args[0]))
19 fmt.Printf("[s|us]")
20 fmt.Printf("\033[m update and upgrade\n")
21 // package management
22 fmt.Printf("\t")
23 fmt.Printf("\033[m\033[1m%s \033[m\033[32m", filepath.Base(os.Args[0]))
24 fmt.Printf("[M|m|mi|mic] [i|c|r]")
25 fmt.Printf("\033[m manage ports\n")
26
27 // package management without compiling
28 fmt.Printf("\t")
29 fmt.Printf("\033[m\033[1m%s \033[m\033[32m", filepath.Base(os.Args[0]))
30 fmt.Printf("[sp|ld|li|mn]")
31 fmt.Printf("\033[m manage ports tree\n")
32
33 // misc
34 fmt.Printf("\t")
35 fmt.Printf("\033[m\033[1m%s \033[m\033[32m", filepath.Base(os.Args[0]))
36 fmt.Printf("[h]")
37 fmt.Printf("\033[m about %s",
38 filepath.Base(os.Args[0]))
39
40 fmt.Println()
41}
42
43func cr(a string, b string) {
44 if x := os.Getenv(a); x == "" {
45 os.Setenv(a, b)
46 }
47}
48
49/*
50 we gotta functionize (case "m")
51
52 due to compatibility to the bare minimum
53 o_o
54*/
55
56func dobuild(pkg string) {
57 // get first level deps of pkg
58 deps := dgrb.DepRes(pkg)
59
60 for i := range len(deps) {
61 // second level deps
62 sd := dgrb.DepRes(deps[i])
63 for n := range len(sd) {
64 dgrb.Build(sd[n], "make")
65 dgrb.Inst(sd[n])
66 }
67
68 dgrb.Build(deps[i], "make")
69 dgrb.Inst(deps[i])
70 }
71
72 // finally build the package itself
73 dgrb.Build(pkg, "make")
74 //dgrb.Inst(pkg)
75}
76
77func main() {
78 if len(os.Args) < 2 {
79 help()
80 return
81 }
82
83 // set unset vars
84 cr("DTR_DIR", "/ports")
85 cr("DTR_ROOT", "/")
86 cr("DTR_DB", "/var/db/dtr")
87 cr("DTR_TMP", "/var/tmp/dtr")
88 cr("DTR_CH", "/var/cache/dtr")
89 cr("DTR_RSF", "/var/cache/dtr/distfiles")
90 // create resource files
91 if _, err := os.Stat(filepath.Join(os.Getenv("DTR_DB"), "installed")); err != nil {
92 os.Create(filepath.Join(os.Getenv("DTR_DB"), "installed"))
93 }
94 pki := filepath.Join(os.Getenv("DTR_DB"), "installed")
95 // create resource dirs
96 if _, err := os.Stat(os.Getenv("DTR_DB")); err != nil {
97 err := os.MkdirAll(os.Getenv("DTR_DB"), 0755)
98 if err != nil {
99 dgr.Die("could not create package manager resource dir", os.Getenv("DTR_DB"), 1)
100 }
101 }
102 if _, err := os.Stat(os.Getenv("DTR_CH")); err != nil {
103 err := os.MkdirAll(os.Getenv("DTR_CH"), 0755)
104 if err != nil {
105 dgr.Die("could not create package manager resource dir", os.Getenv("DTR_CH"), 1)
106 }
107 }
108 if _, err := os.Stat(os.Getenv("DTR_TMP")); err != nil {
109 err := os.MkdirAll(os.Getenv("DTR_TMP"), 0755)
110 if err != nil {
111 dgr.Die("could not create package manager resource dir", os.Getenv("DTR_TMP"), 1)
112 }
113 }
114 if _, err := os.Stat(os.Getenv("DTR_RSF")); err != nil {
115 err := os.Mkdir(os.Getenv("DTR_RSF"), 0755)
116 if err != nil {
117 dgr.Die("could not create package manager resource dir", os.Getenv("DTR_RSF"), 1)
118 }
119 }
120
121 act := os.Args[1]
122 pkgs := os.Args[2:]
123
124 switch act {
125 case "ld":
126 dgre.VC("DTR_DIR")
127 if len(pkgs) < 1 {
128 help()
129 os.Exit(1)
130 }
131
132 for i := range len(pkgs) {
133 x, b := dgr.FindPkg(pkgs[i])
134 if !b {
135 dgr.Warn("could not find package", pkgs[i])
136 continue
137 }
138 dgr.Msg("dependencies of package \033[m\033[33m", pkgs[i], "\033[m:")
139 file, _ := os.ReadFile(filepath.Join(x, "deps"))
140
141 f := strings.Fields(string(file))
142 var a int
143 for a < len(f) {
144 if strings.Contains(f[a], ".") {
145 fmt.Printf("\t\033[1m%s \033[m[%s]\n", strings.ReplaceAll(f[a], ".", ""), "build time")
146 } else if strings.Contains(f[a], "/") {
147 fmt.Printf("\t\033[1m%s \033[m[%s]\n", strings.ReplaceAll(f[a], "/", ""), "link time")
148 } else if strings.Contains(f[a], ">") {
149 fmt.Printf("\t\033[1m%s \033[m[%s]\n", strings.ReplaceAll(f[a], ">", ""), "runtime")
150 }
151 a++
152 continue
153 }
154 }
155 case "li":
156 f, err := os.ReadFile(pki)
157 if err != nil {
158 dgr.Die("could not read from file", pki, 1)
159 } else if string(f) == "" {
160 dgr.Die("file is empty", pki, 1)
161 }
162 dgr.Msg("installed ", filepath.Base(os.Args[0]), " packages:")
163 fx := strings.Fields(string(f))
164
165 for i := range len(fx) {
166 fmt.Printf("\t%s\n", string(fx[i]))
167 }
168
169 case "s":
170 dgr.Msg("cloning ", "codeberg.org/derivelinux/ports")
171 os.RemoveAll(os.Getenv("DTR_DIR"))
172
173 err := dgr.Run("git", "clone", "--depth", "1", "https://codeberg.org/derivelinux/ports", "/ports")
174 if err != nil {
175 dgr.Die("failed to clone", "codeberg.org/derivelinux/ports", 1)
176 }
177 case "us":
178 os.Chdir(os.Getenv("DTR_DIR"))
179
180 err := dgr.Run("git", "pull")
181 if err != nil {
182 wd, _ := os.Getwd()
183 dgr.Die("failed to git pull in", wd, 1)
184 }
185 case "c":
186 dgre.VC("DTR_DIR")
187 if len(pkgs) < 1 {
188 os.RemoveAll("/var/tmp/dtr") // clean entire dtr
189 os.RemoveAll("/var/cache/dtr")
190 }
191 for i := range len(pkgs) {
192 dgrb.Build(pkgs[i], "clean")
193 }
194 case "M":
195 /* just build, dont handle dependencies
196 * unsure how i will handle [Mi|Mic], i will do it later...
197 */
198 if len(pkgs) < 1 {
199 help()
200 os.Exit(1)
201 }
202
203 dgre.VC("DTR_DIR")
204
205 for i := range pkgs {
206 dgrb.Build(pkgs[i], "make")
207 }
208 case "m":
209 if len(pkgs) < 1 {
210 help()
211 os.Exit(1)
212 }
213
214 dgre.VC("DTR_DIR")
215
216 for i := range pkgs {
217 dobuild(pkgs[i])
218 }
219 case "mi":
220 if len(pkgs) < 1 {
221 help()
222 os.Exit(1)
223 }
224
225 dgre.VC("DTR_DIR")
226
227 for i := range pkgs {
228 dobuild(pkgs[i])
229 dgrb.Inst(pkgs[i])
230 }
231 case "mic":
232 if len(pkgs) < 1 {
233 help()
234 os.Exit(1)
235 }
236
237 dgre.VC("DTR_DIR")
238
239 for i := range pkgs {
240 dobuild(pkgs[i])
241 dgrb.Inst(pkgs[i])
242 dgrb.Build(pkgs[i], "clean")
243 }
244 case "i":
245 if len(pkgs) < 1 {
246 help()
247 os.Exit(1)
248 }
249 for i := range len(pkgs) {
250 dgrb.Inst(pkgs[i])
251 }
252 case "r":
253 if len(pkgs) < 1 {
254 help()
255 os.Exit(1)
256 }
257 for i := range len(pkgs) {
258 dgrb.Del(pkgs[i])
259 }
260 case "sp":
261 if len(pkgs) < 1 {
262 help()
263 os.Exit(1)
264 }
265 dgre.VC("DTR_DIR")
266 for i := range len(pkgs) {
267 pkg, b := dgr.FindPkg(pkgs[i])
268 if !b {
269 dgr.Warn("could not find package", pkgs[i])
270 } else {
271 fmt.Println(pkg)
272 }
273 }
274 case "mn":
275 if len(pkgs) < 1 {
276 help()
277 os.Exit(1)
278 }
279 for i := range len(pkgs) {
280 f, err := os.ReadFile(filepath.Join(os.Getenv("DTR_DB"), pkgs[i], "manifest"))
281 if err != nil {
282 dgr.Die("could not read manifest", filepath.Join(os.Getenv("DTR_DB"), pkgs[i], "manifest"), 1)
283 }
284 dgr.Msg("manifest of \033[33m", pkgs[i], "\033[m")
285
286 mn := strings.Fields(string(f))
287 for n := range len(mn) {
288 fmt.Printf("\t%s\n", mn[n])
289 }
290 }
291 case "h", "help":
292 help()
293 default:
294 dgr.Die("unknown command", act, 0)
295 help()
296 }
297}