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