localrelease.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "path/filepath"
  8. "regexp"
  9. "strings"
  10. "time"
  11. "github.com/pkg/errors"
  12. )
  13. type releaseLocalSources struct {
  14. path string
  15. artifactConfigurations []buildArtifact
  16. }
  17. func (r releaseLocalSources) prepareRelease(baseArchiveURL, whatsNewURL string, releaseNotesURL string, nightly bool) (*release, error) {
  18. if !nightly {
  19. return nil, errors.New("Local releases only supported for nightly builds")
  20. }
  21. buildData := r.findBuilds(baseArchiveURL)
  22. rel := release{
  23. Version: buildData.version,
  24. ReleaseDate: time.Now().UTC(),
  25. Stable: false,
  26. Beta: false,
  27. Nightly: nightly,
  28. WhatsNewURL: whatsNewURL,
  29. ReleaseNotesURL: releaseNotesURL,
  30. Builds: buildData.builds,
  31. }
  32. return &rel, nil
  33. }
  34. type buildData struct {
  35. version string
  36. builds []build
  37. }
  38. func (r releaseLocalSources) findBuilds(baseArchiveURL string) buildData {
  39. data := buildData{}
  40. filepath.Walk(r.path, createBuildWalker(r.path, &data, r.artifactConfigurations, baseArchiveURL))
  41. return data
  42. }
  43. func createBuildWalker(path string, data *buildData, archiveTypes []buildArtifact, baseArchiveURL string) func(path string, f os.FileInfo, err error) error {
  44. return func(path string, f os.FileInfo, err error) error {
  45. if err != nil {
  46. log.Printf("error: %v", err)
  47. }
  48. if f.Name() == path || strings.HasSuffix(f.Name(), ".sha256") {
  49. return nil
  50. }
  51. for _, archive := range archiveTypes {
  52. if strings.HasSuffix(f.Name(), archive.urlPostfix) {
  53. shaBytes, err := ioutil.ReadFile(path + ".sha256")
  54. if err != nil {
  55. log.Fatalf("Failed to read sha256 file %v", err)
  56. }
  57. version, err := grabVersion(f.Name(), archive.urlPostfix)
  58. if err != nil {
  59. log.Println(err)
  60. continue
  61. }
  62. data.version = version
  63. data.builds = append(data.builds, build{
  64. Os: archive.os,
  65. URL: archive.getURL(baseArchiveURL, version, NIGHTLY),
  66. Sha256: string(shaBytes),
  67. Arch: archive.arch,
  68. })
  69. return nil
  70. }
  71. }
  72. return nil
  73. }
  74. }
  75. func grabVersion(name string, suffix string) (string, error) {
  76. match := regexp.MustCompile(fmt.Sprintf(`grafana(-enterprise)?[-_](.*)%s`, suffix)).FindSubmatch([]byte(name))
  77. if len(match) > 0 {
  78. return string(match[2]), nil
  79. }
  80. return "", errors.New("No version found")
  81. }