master chld/dgr / pkg / remove.go
 1package dgrb
 2
 3import (
 4	"fmt"
 5	"git.sr.ht/~chld/dgr/cmd"
 6	"os"
 7	"path/filepath"
 8	"strings"
 9)
10
11func Del(pkg string) {
12	dgr.Msg("removing package \033[33m", pkg, "\033[m")
13	f, err := os.ReadFile(filepath.Join(os.Getenv("DTR_DB"), pkg, "manifest"))
14	if err != nil {
15		dgr.Die("could not read manifest", filepath.Join(os.Getenv("DTR_DB"), pkg, "manifest"), 1)
16	}
17
18	l := strings.Fields(string(f))
19	var symlinks []string
20
21	for i := range len(l) {
22		fmt.Printf("\tdeleting %s\t", l[i])
23		path := strings.TrimSpace(strings.TrimSuffix(l[i], "/"))
24		if path == "" {
25			fmt.Printf("SKIP\n")
26			continue
27		}
28
29		info, err := os.Lstat(path)
30		if err != nil {
31			fmt.Printf("SKIP\n")
32			continue
33		}
34
35		if info.Mode()&os.ModeSymlink != 0 {
36			if st, err := os.Stat(path); err == nil && st.IsDir() {
37				symlinks = append(symlinks, path)
38			}
39			fmt.Printf("SKIP\n")
40			continue
41		}
42
43		err = os.Remove(path)
44		if err != nil {
45			fmt.Printf("\033[31mNO\033[m\n")
46		} else {
47			fmt.Printf("\033[32mOK\033[m\n")
48		}
49	}
50
51	for _, s := range symlinks {
52		if _, err := os.Stat(s); os.IsNotExist(err) {
53			_ = os.Remove(s)
54		}
55	}
56
57	// remove pkg entry in installed file
58	inst, err := os.ReadFile(filepath.Join(os.Getenv("DTR_DB"), "installed"))
59	if err != nil {
60		dgr.Die("error reading file", filepath.Join(os.Getenv("DTR_DB"), "installed"), 1)
61	}
62
63	ninst := strings.ReplaceAll(string(inst), pkg, "")
64
65	err = os.WriteFile(filepath.Join(os.Getenv("DTR_DB"), "installed"), []byte(ninst), 0755)
66	if err != nil {
67		dgr.Die("could not write to file", filepath.Join(os.Getenv("DTR_DB"), "installed"), 1)
68	} else {
69		dgr.Msg("removed entry \033[33m", pkg, "\033[m from installed file")
70	}
71
72	dgr.Msg("removed \033[1;31m", pkg, "\033[m successfully")
73}