localrelease.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/pkg/errors"
  5. "io/ioutil"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. "regexp"
  10. "strings"
  11. "time"
  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. }