1package main
2
3import (
4	"io/ioutil"
5	"os"
6	"path/filepath"
7	"strings"
8
9	"github.com/urfave/cli/v2"
10	"github.com/xyproto/guessica"
11	"github.com/xyproto/textoutput"
12)
13
14func main() {
15	o := textoutput.New()
16	if appErr := (&cli.App{
17		Name:  "guessica",
18		Usage: "Update a PKGBUILD by guessing the new pkgbuild and source array",
19		Flags: []cli.Flag{
20			&cli.BoolFlag{Name: "version", Aliases: []string{"V"}, Usage: "verbose"},
21			&cli.BoolFlag{Name: "i", Usage: "write changes"},
22		},
23		Action: func(c *cli.Context) error {
24			if c.Bool("version") {
25				o.Println(guessica.VersionString)
26				os.Exit(0)
27			}
28			pkgbuildFilenames := []string{"PKGBUILD"}
29
30			// Check if any arguments are given
31			if c.NArg() > 0 {
32				pkgbuildFilenames = c.Args().Slice()
33			} else {
34				o.Printf("<lightblue>%s</lightblue> <white>%s</white> <lightblue>%s</lightblue>\n", "Please provide one or more", "PKGBUILD", "filenames")
35				os.Exit(1)
36			}
37
38			// Treat all arguments as PKGBUILD files that are to be updated
39			var err error
40			for _, pkgbuildFilename := range pkgbuildFilenames {
41				if c.Bool("i") { // Write changes
42					o.Printf("<darkgray>[<white>%s<darkgray>] <lightblue>Updating to version</lightblue>... ", filepath.Base(pkgbuildFilename))
43				}
44
45				data, err := ioutil.ReadFile(pkgbuildFilename)
46				if err != nil {
47					o.Printf("<darkred>%s</darkred>\n", err)
48					continue
49				}
50				var (
51					pkgbuildContents = string(data)
52					ver              string
53					sourceLine       string
54				)
55				for _, site := range guessica.SpecificSites {
56					if strings.Contains(pkgbuildContents, site) {
57						ver, sourceLine, err = guessica.GuessSourceString(pkgbuildContents, site)
58						if err == nil {
59							break
60						}
61					}
62				}
63				if err != nil {
64					o.Printf("<darkred>%s</darkred>\n", err)
65					continue
66				}
67				var sb strings.Builder
68				for _, line := range strings.Split(pkgbuildContents, "\n") {
69					if strings.HasPrefix(line, "pkgver=") {
70						sb.WriteString("pkgver=" + ver + "\n")
71					} else if strings.HasPrefix(line, "source=") {
72						sb.WriteString(sourceLine + "\n")
73					} else {
74						sb.WriteString(line + "\n")
75					}
76				}
77				if c.Bool("i") {
78					// Write changes
79					err = ioutil.WriteFile(pkgbuildFilename, []byte(strings.TrimSpace(sb.String())), 0664)
80					if err != nil {
81						o.Printf("<darkred>%s</darkred>\n", err)
82						continue
83					}
84					o.Printf("<cyan>%s</cyan>\n", ver)
85				} else {
86					// Just output the version number, if found
87					o.Printf("<white>Found version: <lightblue>%s</lightblue>\n", ver)
88				}
89			}
90			return err
91		},
92	}).Run(os.Args); appErr != nil {
93		o.ErrExit(appErr.Error())
94	}
95}
96