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}