mirror of
https://github.com/jimeh/build-emacs-for-macos.git
synced 2026-02-19 13:06:38 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
efddb9ef92
|
|||
| f7f4c0433a | |||
|
cbd8cb27b6
|
|||
|
656b96510a
|
|||
|
084776db6b
|
|||
|
1e6d6cc6cf
|
|||
|
68ef4c066c
|
|||
|
d476fd33ec
|
|||
| baa5930467 | |||
|
743b10c751
|
1
Brewfile
1
Brewfile
@@ -3,6 +3,7 @@
|
|||||||
brew 'autoconf'
|
brew 'autoconf'
|
||||||
brew 'coreutils'
|
brew 'coreutils'
|
||||||
brew 'curl'
|
brew 'curl'
|
||||||
|
brew 'dbus'
|
||||||
brew 'expat'
|
brew 'expat'
|
||||||
brew 'gcc'
|
brew 'gcc'
|
||||||
brew 'gmp'
|
brew 'gmp'
|
||||||
|
|||||||
28
CHANGELOG.md
28
CHANGELOG.md
@@ -2,6 +2,34 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
### [0.6.30](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.29...v0.6.30) (2022-02-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **site-lisp:** add Homebrew's site-lisp directory to locallisppath ([cbd8cb2](https://github.com/jimeh/build-emacs-for-macos/commit/cbd8cb27b6ceff2e128c38cd1cc8f8380b9b4bfb))
|
||||||
|
|
||||||
|
### [0.6.29](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.28...v0.6.29) (2022-02-07)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **cask:** add support for pretest builds ([084776d](https://github.com/jimeh/build-emacs-for-macos/commit/084776db6b7e61958088d7b2a2588e9889e60c21))
|
||||||
|
|
||||||
|
### [0.6.28](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.27...v0.6.28) (2022-01-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **build:** add dbus dependency to enable support in Emacs builds ([68ef4c0](https://github.com/jimeh/build-emacs-for-macos/commit/68ef4c066c3fd1a7337198e8f773866088b4f481))
|
||||||
|
|
||||||
|
### [0.6.27](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.26...v0.6.27) (2021-12-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **plan:** add support for pretest and release candidate builds ([743b10c](https://github.com/jimeh/build-emacs-for-macos/commit/743b10c751e146ec7569f39a475c20a0489955f4))
|
||||||
|
|
||||||
### [0.6.26](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.25...v0.6.26) (2021-11-27)
|
### [0.6.26](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.25...v0.6.26) (2021-11-27)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -359,7 +359,8 @@ class Build
|
|||||||
'--with-modules',
|
'--with-modules',
|
||||||
'--enable-locallisppath=' \
|
'--enable-locallisppath=' \
|
||||||
'/Library/Application Support/Emacs/${version}/site-lisp:' \
|
'/Library/Application Support/Emacs/${version}/site-lisp:' \
|
||||||
'/Library/Application Support/Emacs/site-lisp'
|
'/Library/Application Support/Emacs/site-lisp:' \
|
||||||
|
'/usr/local/share/emacs/site-lisp'
|
||||||
]
|
]
|
||||||
if options[:xwidgets] && supports_xwidgets?
|
if options[:xwidgets] && supports_xwidgets?
|
||||||
configure_flags << '--with-xwidgets'
|
configure_flags << '--with-xwidgets'
|
||||||
|
|||||||
@@ -393,9 +393,7 @@ func (s *Updater) renderCask(
|
|||||||
filename := asset.GetName()
|
filename := asset.GetName()
|
||||||
s.logger.Debug("processing asset", "filename", filename)
|
s.logger.Debug("processing asset", "filename", filename)
|
||||||
|
|
||||||
if strings.HasSuffix(filename, ".sha256") {
|
filename = strings.TrimSuffix(filename, ".sha256")
|
||||||
filename = strings.TrimSuffix(filename, ".sha256")
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := info.Assets[filename]; !ok {
|
if _, ok := info.Assets[filename]; !ok {
|
||||||
info.Assets[filename] = &ReleaseAsset{
|
info.Assets[filename] = &ReleaseAsset{
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
@@ -13,10 +14,13 @@ import (
|
|||||||
"github.com/jimeh/build-emacs-for-macos/pkg/osinfo"
|
"github.com/jimeh/build-emacs-for-macos/pkg/osinfo"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/release"
|
"github.com/jimeh/build-emacs-for-macos/pkg/release"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/repository"
|
"github.com/jimeh/build-emacs-for-macos/pkg/repository"
|
||||||
|
"github.com/jimeh/build-emacs-for-macos/pkg/sanitize"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/source"
|
"github.com/jimeh/build-emacs-for-macos/pkg/source"
|
||||||
)
|
)
|
||||||
|
|
||||||
var nonAlphaNum = regexp.MustCompile(`[^\w_-]+`)
|
var gitTagMatcher = regexp.MustCompile(
|
||||||
|
`^emacs(-.*)?-((\d+\.\d+)(?:\.(\d+))?(-rc\d+)?(.+)?)$`,
|
||||||
|
)
|
||||||
|
|
||||||
type TestBuildType string
|
type TestBuildType string
|
||||||
|
|
||||||
@@ -37,7 +41,7 @@ type Options struct {
|
|||||||
Output io.Writer
|
Output io.Writer
|
||||||
}
|
}
|
||||||
|
|
||||||
func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
func Create(ctx context.Context, opts *Options) (*Plan, error) { //nolint:funlen
|
||||||
logger := hclog.FromContext(ctx).Named("plan")
|
logger := hclog.FromContext(ctx).Named("plan")
|
||||||
|
|
||||||
repo, err := repository.NewGitHub(opts.EmacsRepo)
|
repo, err := repository.NewGitHub(opts.EmacsRepo)
|
||||||
@@ -66,19 +70,36 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
version := fmt.Sprintf(
|
absoluteVersion := fmt.Sprintf(
|
||||||
"%s.%s.%s",
|
"%s.%s.%s",
|
||||||
commitInfo.DateString(),
|
commitInfo.DateString(),
|
||||||
commitInfo.ShortSHA(),
|
commitInfo.ShortSHA(),
|
||||||
sanitizeString(opts.Ref),
|
sanitize.String(opts.Ref),
|
||||||
)
|
)
|
||||||
|
|
||||||
releaseName := fmt.Sprintf("Emacs.%s", version)
|
version, channel, err := parseGitRef(opts.Ref)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var releaseName string
|
||||||
|
switch channel {
|
||||||
|
case release.Stable, release.RC:
|
||||||
|
releaseName = "Emacs-" + version
|
||||||
|
case release.Pretest:
|
||||||
|
version += "-pretest"
|
||||||
|
absoluteVersion += "-pretest"
|
||||||
|
releaseName = "Emacs-" + version
|
||||||
|
default:
|
||||||
|
version = absoluteVersion
|
||||||
|
releaseName = "Emacs." + version
|
||||||
|
}
|
||||||
|
|
||||||
buildName := fmt.Sprintf(
|
buildName := fmt.Sprintf(
|
||||||
"Emacs.%s.%s.%s",
|
"Emacs.%s.%s.%s",
|
||||||
version,
|
absoluteVersion,
|
||||||
sanitizeString(osInfo.Name+"-"+osInfo.DistinctVersion()),
|
sanitize.String(osInfo.Name+"-"+osInfo.DistinctVersion()),
|
||||||
sanitizeString(osInfo.Arch),
|
sanitize.String(osInfo.Arch),
|
||||||
)
|
)
|
||||||
diskImage := buildName + ".dmg"
|
diskImage := buildName + ".dmg"
|
||||||
|
|
||||||
@@ -97,7 +118,8 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
OS: osInfo,
|
OS: osInfo,
|
||||||
Release: &Release{
|
Release: &Release{
|
||||||
Name: releaseName,
|
Name: releaseName,
|
||||||
Prerelease: true,
|
Prerelease: channel != release.Stable,
|
||||||
|
Channel: channel,
|
||||||
},
|
},
|
||||||
Output: &Output{
|
Output: &Output{
|
||||||
Directory: opts.OutputDir,
|
Directory: opts.OutputDir,
|
||||||
@@ -105,28 +127,18 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// If given git ref is a stable release tag (emacs-23.2b, emacs-27.2, etc.)
|
|
||||||
// we modify release properties accordingly.
|
|
||||||
if v, err := release.GitRefToStableVersion(opts.Ref); err == nil {
|
|
||||||
plan.Release.Prerelease = false
|
|
||||||
plan.Release.Name, err = release.VersionToName(v)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if opts.TestBuild != "" {
|
if opts.TestBuild != "" {
|
||||||
testName := sanitizeString(opts.TestBuild)
|
testName := sanitize.String(opts.TestBuild)
|
||||||
|
|
||||||
plan.Build.Name += ".test." + testName
|
plan.Build.Name += ".test." + testName
|
||||||
plan.Release.Title = "Test Builds"
|
plan.Release.Title = "Test Builds (" + testName + ")"
|
||||||
plan.Release.Name = "test-builds"
|
plan.Release.Name = "test-builds"
|
||||||
|
|
||||||
plan.Release.Prerelease = true
|
plan.Release.Prerelease = false
|
||||||
plan.Release.Draft = false
|
plan.Release.Draft = true
|
||||||
if opts.TestBuildType == Draft {
|
if opts.TestBuildType == Prerelease {
|
||||||
plan.Release.Prerelease = false
|
plan.Release.Prerelease = true
|
||||||
plan.Release.Draft = true
|
plan.Release.Draft = false
|
||||||
}
|
}
|
||||||
|
|
||||||
index := strings.LastIndex(diskImage, ".")
|
index := strings.LastIndex(diskImage, ".")
|
||||||
@@ -137,6 +149,35 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
return plan, nil
|
return plan, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func sanitizeString(s string) string {
|
func parseGitRef(ref string) (string, release.Channel, error) {
|
||||||
return nonAlphaNum.ReplaceAllString(s, "-")
|
m := gitTagMatcher.FindStringSubmatch(ref)
|
||||||
|
|
||||||
|
if len(m) == 0 {
|
||||||
|
return "", release.Nightly, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.Contains(m[1], "pretest") {
|
||||||
|
return m[2], release.Pretest, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if m[4] != "" {
|
||||||
|
n, err := strconv.Atoi(m[4])
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if n >= 90 {
|
||||||
|
return m[2], release.Pretest, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(m[5], "-rc") {
|
||||||
|
return m[2], release.RC, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if m[2] == m[3] {
|
||||||
|
return m[2], release.Stable, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", "", nil
|
||||||
}
|
}
|
||||||
|
|||||||
421
pkg/plan/create_test.go
Normal file
421
pkg/plan/create_test.go
Normal file
@@ -0,0 +1,421 @@
|
|||||||
|
package plan
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/jimeh/build-emacs-for-macos/pkg/release"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_parseGitRef(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
type args struct {
|
||||||
|
ref string
|
||||||
|
}
|
||||||
|
type want struct {
|
||||||
|
version string
|
||||||
|
channel release.Channel
|
||||||
|
err string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want want
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "master",
|
||||||
|
args: args{ref: "master"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-28",
|
||||||
|
args: args{ref: "emacs-28"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27",
|
||||||
|
args: args{ref: "emacs-27"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26",
|
||||||
|
args: args{ref: "emacs-26"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24",
|
||||||
|
args: args{ref: "emacs-24"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "feature/native-comp",
|
||||||
|
args: args{ref: "feature/native-comp"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "feature/pgtk",
|
||||||
|
args: args{ref: "feature/pgtk"},
|
||||||
|
want: want{version: "", channel: release.Nightly, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-19.34",
|
||||||
|
args: args{ref: "emacs-19.34"},
|
||||||
|
want: want{version: "19.34", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-20.4",
|
||||||
|
args: args{ref: "emacs-20.4"},
|
||||||
|
want: want{version: "20.4", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-22.3",
|
||||||
|
args: args{ref: "emacs-22.3"},
|
||||||
|
want: want{version: "22.3", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-23.4",
|
||||||
|
args: args{ref: "emacs-23.4"},
|
||||||
|
want: want{version: "23.4", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.0.97",
|
||||||
|
args: args{ref: "emacs-24.0.97"},
|
||||||
|
want: want{version: "24.0.97", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.2",
|
||||||
|
args: args{ref: "emacs-24.2"},
|
||||||
|
want: want{version: "24.2", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.2.90",
|
||||||
|
args: args{ref: "emacs-24.2.90"},
|
||||||
|
want: want{version: "24.2.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.2.93",
|
||||||
|
args: args{ref: "emacs-24.2.93"},
|
||||||
|
want: want{version: "24.2.93", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.3",
|
||||||
|
args: args{ref: "emacs-24.3"},
|
||||||
|
want: want{version: "24.3", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.3-rc1",
|
||||||
|
args: args{ref: "emacs-24.3-rc1"},
|
||||||
|
want: want{version: "24.3-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.3.90",
|
||||||
|
args: args{ref: "emacs-24.3.90"},
|
||||||
|
want: want{version: "24.3.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.3.94",
|
||||||
|
args: args{ref: "emacs-24.3.94"},
|
||||||
|
want: want{version: "24.3.94", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.4",
|
||||||
|
args: args{ref: "emacs-24.4"},
|
||||||
|
want: want{version: "24.4", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.4-rc1",
|
||||||
|
args: args{ref: "emacs-24.4-rc1"},
|
||||||
|
want: want{version: "24.4-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.4.90",
|
||||||
|
args: args{ref: "emacs-24.4.90"},
|
||||||
|
want: want{version: "24.4.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.4.91",
|
||||||
|
args: args{ref: "emacs-24.4.91"},
|
||||||
|
want: want{version: "24.4.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.5",
|
||||||
|
args: args{ref: "emacs-24.5"},
|
||||||
|
want: want{version: "24.5", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.5-rc1",
|
||||||
|
args: args{ref: "emacs-24.5-rc1"},
|
||||||
|
want: want{version: "24.5-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.5-rc3",
|
||||||
|
args: args{ref: "emacs-24.5-rc3"},
|
||||||
|
want: want{version: "24.5-rc3", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-24.5-rc3-fixed",
|
||||||
|
args: args{ref: "emacs-24.5-rc3-fixed"},
|
||||||
|
want: want{version: "24.5-rc3-fixed", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.0.90",
|
||||||
|
args: args{ref: "emacs-25.0.90"},
|
||||||
|
want: want{version: "25.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.0.95",
|
||||||
|
args: args{ref: "emacs-25.0.95"},
|
||||||
|
want: want{version: "25.0.95", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.1",
|
||||||
|
args: args{ref: "emacs-25.1"},
|
||||||
|
want: want{version: "25.1", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.1-rc1",
|
||||||
|
args: args{ref: "emacs-25.1-rc1"},
|
||||||
|
want: want{version: "25.1-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.1-rc2",
|
||||||
|
args: args{ref: "emacs-25.1-rc2"},
|
||||||
|
want: want{version: "25.1-rc2", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.1.90",
|
||||||
|
args: args{ref: "emacs-25.1.90"},
|
||||||
|
want: want{version: "25.1.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.1.91",
|
||||||
|
args: args{ref: "emacs-25.1.91"},
|
||||||
|
want: want{version: "25.1.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.2",
|
||||||
|
args: args{ref: "emacs-25.2"},
|
||||||
|
want: want{version: "25.2", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.2-rc1",
|
||||||
|
args: args{ref: "emacs-25.2-rc1"},
|
||||||
|
want: want{version: "25.2-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-25.2-rc2",
|
||||||
|
args: args{ref: "emacs-25.2-rc2"},
|
||||||
|
want: want{version: "25.2-rc2", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.0.90",
|
||||||
|
args: args{ref: "emacs-26.0.90"},
|
||||||
|
want: want{version: "26.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.0.91",
|
||||||
|
args: args{ref: "emacs-26.0.91"},
|
||||||
|
want: want{version: "26.0.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.1",
|
||||||
|
args: args{ref: "emacs-26.1"},
|
||||||
|
want: want{version: "26.1", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.1-rc1",
|
||||||
|
args: args{ref: "emacs-26.1-rc1"},
|
||||||
|
want: want{version: "26.1-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.1.90",
|
||||||
|
args: args{ref: "emacs-26.1.90"},
|
||||||
|
want: want{version: "26.1.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.1.92",
|
||||||
|
args: args{ref: "emacs-26.1.92"},
|
||||||
|
want: want{version: "26.1.92", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.2",
|
||||||
|
args: args{ref: "emacs-26.2"},
|
||||||
|
want: want{version: "26.2", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.2.90",
|
||||||
|
args: args{ref: "emacs-26.2.90"},
|
||||||
|
want: want{version: "26.2.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.3",
|
||||||
|
args: args{ref: "emacs-26.3"},
|
||||||
|
want: want{version: "26.3", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-26.3-rc1",
|
||||||
|
args: args{ref: "emacs-26.3-rc1"},
|
||||||
|
want: want{version: "26.3-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.0.90",
|
||||||
|
args: args{ref: "emacs-27.0.90"},
|
||||||
|
want: want{version: "27.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.0.91",
|
||||||
|
args: args{ref: "emacs-27.0.91"},
|
||||||
|
want: want{version: "27.0.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.1",
|
||||||
|
args: args{ref: "emacs-27.1"},
|
||||||
|
want: want{version: "27.1", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.1-rc1",
|
||||||
|
args: args{ref: "emacs-27.1-rc1"},
|
||||||
|
want: want{version: "27.1-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.1-rc2",
|
||||||
|
args: args{ref: "emacs-27.1-rc2"},
|
||||||
|
want: want{version: "27.1-rc2", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.1.90",
|
||||||
|
args: args{ref: "emacs-27.1.90"},
|
||||||
|
want: want{version: "27.1.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.1.91",
|
||||||
|
args: args{ref: "emacs-27.1.91"},
|
||||||
|
want: want{version: "27.1.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.2",
|
||||||
|
args: args{ref: "emacs-27.2"},
|
||||||
|
want: want{version: "27.2", channel: release.Stable, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.2-rc1",
|
||||||
|
args: args{ref: "emacs-27.2-rc1"},
|
||||||
|
want: want{version: "27.2-rc1", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-27.2-rc2",
|
||||||
|
args: args{ref: "emacs-27.2-rc2"},
|
||||||
|
want: want{version: "27.2-rc2", channel: release.RC, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-28.0.90",
|
||||||
|
args: args{ref: "emacs-28.0.90"},
|
||||||
|
want: want{version: "28.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-21.0.100",
|
||||||
|
args: args{ref: "emacs-pretest-21.0.100"},
|
||||||
|
want: want{version: "21.0.100", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-21.0.106",
|
||||||
|
args: args{ref: "emacs-pretest-21.0.106"},
|
||||||
|
want: want{version: "21.0.106", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-21.0.90",
|
||||||
|
args: args{ref: "emacs-pretest-21.0.90"},
|
||||||
|
want: want{version: "21.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-21.0.99",
|
||||||
|
args: args{ref: "emacs-pretest-21.0.99"},
|
||||||
|
want: want{version: "21.0.99", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-22.0.90",
|
||||||
|
args: args{ref: "emacs-pretest-22.0.90"},
|
||||||
|
want: want{version: "22.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-22.0.99",
|
||||||
|
args: args{ref: "emacs-pretest-22.0.99"},
|
||||||
|
want: want{version: "22.0.99", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-22.0.990",
|
||||||
|
args: args{ref: "emacs-pretest-22.0.990"},
|
||||||
|
want: want{version: "22.0.990", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-22.1.90",
|
||||||
|
args: args{ref: "emacs-pretest-22.1.90"},
|
||||||
|
want: want{version: "22.1.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-22.2.90",
|
||||||
|
args: args{ref: "emacs-pretest-22.2.90"},
|
||||||
|
want: want{version: "22.2.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.0.90",
|
||||||
|
args: args{ref: "emacs-pretest-23.0.90"},
|
||||||
|
want: want{version: "23.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.1.90",
|
||||||
|
args: args{ref: "emacs-pretest-23.1.90"},
|
||||||
|
want: want{version: "23.1.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.2.90",
|
||||||
|
args: args{ref: "emacs-pretest-23.2.90"},
|
||||||
|
want: want{version: "23.2.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.2.91",
|
||||||
|
args: args{ref: "emacs-pretest-23.2.91"},
|
||||||
|
want: want{version: "23.2.91", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.2.93",
|
||||||
|
args: args{ref: "emacs-pretest-23.2.93"},
|
||||||
|
want: want{version: "23.2.93", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.2.93.1",
|
||||||
|
args: args{ref: "emacs-pretest-23.2.93.1"},
|
||||||
|
want: want{version: "23.2.93.1", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-23.3.90",
|
||||||
|
args: args{ref: "emacs-pretest-23.3.90"},
|
||||||
|
want: want{version: "23.3.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-24.0.05",
|
||||||
|
args: args{ref: "emacs-pretest-24.0.05"},
|
||||||
|
want: want{version: "24.0.05", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "emacs-pretest-24.0.90",
|
||||||
|
args: args{ref: "emacs-pretest-24.0.90"},
|
||||||
|
want: want{version: "24.0.90", channel: release.Pretest, err: ""},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, gotChannel, err := parseGitRef(tt.args.ref)
|
||||||
|
|
||||||
|
assert.Equal(t, tt.want.version, got)
|
||||||
|
assert.Equal(t, tt.want.channel, gotChannel)
|
||||||
|
|
||||||
|
if tt.want.err == "" {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
} else {
|
||||||
|
assert.EqualError(t, err, tt.want.err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/osinfo"
|
"github.com/jimeh/build-emacs-for-macos/pkg/osinfo"
|
||||||
|
"github.com/jimeh/build-emacs-for-macos/pkg/release"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/source"
|
"github.com/jimeh/build-emacs-for-macos/pkg/source"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
@@ -78,10 +79,11 @@ type Build struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Release struct {
|
type Release struct {
|
||||||
Name string `yaml:"name" json:"name"`
|
Name string `yaml:"name" json:"name"`
|
||||||
Title string `yaml:"title,omitempty" json:"title,omitempty"`
|
Title string `yaml:"title,omitempty" json:"title,omitempty"`
|
||||||
Draft bool `yaml:"draft,omitempty" json:"draft,omitempty"`
|
Draft bool `yaml:"draft,omitempty" json:"draft,omitempty"`
|
||||||
Prerelease bool `yaml:"prerelease,omitempty" json:"prerelease,omitempty"`
|
Prerelease bool `yaml:"prerelease,omitempty" json:"prerelease,omitempty"`
|
||||||
|
Channel release.Channel `yaml:"channel,omitempty" json:"channel,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Output struct {
|
type Output struct {
|
||||||
|
|||||||
11
pkg/release/channel.go
Normal file
11
pkg/release/channel.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package release
|
||||||
|
|
||||||
|
type Channel string
|
||||||
|
|
||||||
|
// Release channels
|
||||||
|
const (
|
||||||
|
Stable Channel = "stable"
|
||||||
|
RC Channel = "release-candidate"
|
||||||
|
Pretest Channel = "pretest"
|
||||||
|
Nightly Channel = "nightly"
|
||||||
|
)
|
||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Errors
|
// Errors
|
||||||
@@ -18,7 +19,7 @@ var (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
stableVersion = regexp.MustCompile(`^\d+\.\d+(?:[a-z]+)?$`)
|
stableVersion = regexp.MustCompile(`^\d+\.\d+(?:[a-z]+)?$`)
|
||||||
stableGetRef = regexp.MustCompile(`^emacs-(\d+\.\d+(?:[a-z]+)?)$`)
|
stableGitRef = regexp.MustCompile(`^emacs-(\d+\.\d+(?:[a-z]+)?)$`)
|
||||||
)
|
)
|
||||||
|
|
||||||
func VersionToName(version string) (string, error) {
|
func VersionToName(version string) (string, error) {
|
||||||
@@ -26,7 +27,8 @@ func VersionToName(version string) (string, error) {
|
|||||||
return "", ErrEmptyVersion
|
return "", ErrEmptyVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
if stableVersion.MatchString(version) {
|
if stableVersion.MatchString(version) ||
|
||||||
|
strings.HasSuffix(version, "-pretest") {
|
||||||
return "Emacs-" + version, nil
|
return "Emacs-" + version, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +36,7 @@ func VersionToName(version string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GitRefToStableVersion(ref string) (string, error) {
|
func GitRefToStableVersion(ref string) (string, error) {
|
||||||
if m := stableGetRef.FindStringSubmatch(ref); len(m) > 1 {
|
if m := stableGitRef.FindStringSubmatch(ref); len(m) > 1 {
|
||||||
return m[1], nil
|
return m[1], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -128,3 +128,15 @@ func (s *Repository) ActionRunURL(runID string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Repository) ReleaseURL(releaseName string) string {
|
||||||
|
if releaseName == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
switch s.Type {
|
||||||
|
case GitHub:
|
||||||
|
return GitHubBaseURL + s.Source + "/releases/tag/" + releaseName
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
54
pkg/repository/repository_test.go
Normal file
54
pkg/repository/repository_test.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRepository_ReleaseURL(t *testing.T) {
|
||||||
|
type fields struct {
|
||||||
|
Type Type
|
||||||
|
Source string
|
||||||
|
}
|
||||||
|
type args struct {
|
||||||
|
releaseName string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
fields fields
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty name",
|
||||||
|
fields: fields{Type: GitHub, Source: "foo/bar"},
|
||||||
|
args: args{releaseName: ""},
|
||||||
|
want: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "GitHub, foo/bar, v1.0.0",
|
||||||
|
fields: fields{Type: GitHub, Source: "foo/bar"},
|
||||||
|
args: args{releaseName: "v1.0.0"},
|
||||||
|
want: "https://github.com/foo/bar/releases/tag/v1.0.0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Not GitHub, foo/bar, v1.0.0",
|
||||||
|
fields: fields{Type: Type("oops"), Source: "foo/bar"},
|
||||||
|
args: args{releaseName: "v1.0.0"},
|
||||||
|
want: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
repo := &Repository{
|
||||||
|
Type: tt.fields.Type,
|
||||||
|
Source: tt.fields.Source,
|
||||||
|
}
|
||||||
|
|
||||||
|
got := repo.ReleaseURL(tt.args.releaseName)
|
||||||
|
|
||||||
|
assert.Equal(t, tt.want, got)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
9
pkg/sanitize/string.go
Normal file
9
pkg/sanitize/string.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package sanitize
|
||||||
|
|
||||||
|
import "regexp"
|
||||||
|
|
||||||
|
var nonAlphaNum = regexp.MustCompile(`[^\w_-]+`)
|
||||||
|
|
||||||
|
func String(s string) string {
|
||||||
|
return nonAlphaNum.ReplaceAllString(s, "-")
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user