mirror of
https://github.com/jimeh/build-emacs-for-macos.git
synced 2026-02-19 13:06:38 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
2a9707ec89
|
|||
|
1fc7faac1f
|
|||
|
786d253df6
|
|||
|
228ae0939c
|
|||
|
ac943c430c
|
|||
|
bc3923c9ca
|
|||
|
e6b1e5a554
|
|||
|
94625fce38
|
|||
|
b03343f506
|
|||
|
b1896d4a4f
|
|||
|
9d32509c61
|
|||
|
1c2745cd36
|
|||
|
80a0d55b24
|
|||
|
fd0ec4d772
|
|||
|
c0c809a86a
|
|||
|
cb63806262
|
|||
|
6d7ab95ca2
|
|||
|
f4d6e3a56d
|
54
CHANGELOG.md
54
CHANGELOG.md
@@ -2,6 +2,60 @@
|
|||||||
|
|
||||||
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.14](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.13...v0.6.14) (2021-08-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **build:** silly typo ([1fc7faa](https://github.com/jimeh/build-emacs-for-macos/commit/1fc7faac1f040466fa4474a873d2290273780ee2))
|
||||||
|
|
||||||
|
### [0.6.13](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.12...v0.6.13) (2021-08-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **native_comp:** add option to enable/disable relinking *.eln files ([ac943c4](https://github.com/jimeh/build-emacs-for-macos/commit/ac943c430c58e0761ac44e8d25d4d55a461d01a2))
|
||||||
|
|
||||||
|
### [0.6.12](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.11...v0.6.12) (2021-08-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **sign:** resolve signing issue caused by re-linking shared lib in *.eln files ([e6b1e5a](https://github.com/jimeh/build-emacs-for-macos/commit/e6b1e5a554fd0f776bd01c17cfb1ebbbdf7a7831))
|
||||||
|
|
||||||
|
### [0.6.11](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.10...v0.6.11) (2021-07-17)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **native-comp:** fix re-linking and signing issue with *.eln files ([b03343f](https://github.com/jimeh/build-emacs-for-macos/commit/b03343f506aa3ceabdfa03f8a2916b2db4873f3f))
|
||||||
|
|
||||||
|
### [0.6.10](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.9...v0.6.10) (2021-07-16)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **native-comp:** *.eln files were not being found during shared lib embedding ([9d32509](https://github.com/jimeh/build-emacs-for-macos/commit/9d32509c615076618957cc47c82f6e9d8f972fe7))
|
||||||
|
|
||||||
|
### [0.6.9](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.8...v0.6.9) (2021-07-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **release:** add bulk edit command to quickly change multiple GitHub releases ([cb63806](https://github.com/jimeh/build-emacs-for-macos/commit/cb638062625d9bc3eee12515067fb09e05a08414))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **plan:** correctly parse --test-release-type flag ([fd0ec4d](https://github.com/jimeh/build-emacs-for-macos/commit/fd0ec4d772dd3da93afc234fb3024220b2099c88))
|
||||||
|
|
||||||
|
### [0.6.8](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.7...v0.6.8) (2021-07-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **builds:** add support for stable builds ([f4d6e3a](https://github.com/jimeh/build-emacs-for-macos/commit/f4d6e3a56d2c15b0c86af18e8d16bebbeb92a8ab))
|
||||||
|
|
||||||
### [0.6.7](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.6...v0.6.7) (2021-07-02)
|
### [0.6.7](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.6...v0.6.7) (2021-07-02)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ The build produced does have some limitations:
|
|||||||
that built the application will yield warnings. If you want to make a signed
|
that built the application will yield warnings. If you want to make a signed
|
||||||
Emacs.app, google is you friend for finding signing instructions.
|
Emacs.app, google is you friend for finding signing instructions.
|
||||||
|
|
||||||
|
## Binary Builds
|
||||||
|
|
||||||
|
Nightly and stable binary builds produced with this build script are available
|
||||||
|
from [jimeh/emacs-builds](https://github.com/jimeh/emacs-builds).
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [Xcode](https://apps.apple.com/gb/app/xcode/id497799835?mt=12)
|
- [Xcode](https://apps.apple.com/gb/app/xcode/id497799835?mt=12)
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ class Build
|
|||||||
handle_native_lisp(app)
|
handle_native_lisp(app)
|
||||||
add_cli_helper(app)
|
add_cli_helper(app)
|
||||||
|
|
||||||
LibEmbedder.new(app, brew_dir, extra_libs).embed
|
LibEmbedder.new(app, brew_dir, extra_libs, options[:relink_eln]).embed
|
||||||
GccLibEmbedder.new(app, gcc_info).embed if options[:native_comp]
|
GccLibEmbedder.new(app, gcc_info).embed if options[:native_comp]
|
||||||
|
|
||||||
archive_build(build_dir) if options[:archive]
|
archive_build(build_dir) if options[:archive]
|
||||||
@@ -133,10 +133,6 @@ class Build
|
|||||||
@archive_filename = plan.dig('output', 'archive')
|
@archive_filename = plan.dig('output', 'archive')
|
||||||
end
|
end
|
||||||
|
|
||||||
if plan.dig('output', 'disk_image') || !plan.dig('output', 'archive')
|
|
||||||
options[:archive] = false
|
|
||||||
end
|
|
||||||
|
|
||||||
@build_name = plan.dig('build', 'name') if plan.dig('build', 'name')
|
@build_name = plan.dig('build', 'name') if plan.dig('build', 'name')
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -157,11 +153,22 @@ class Build
|
|||||||
end
|
end
|
||||||
|
|
||||||
def extra_libs
|
def extra_libs
|
||||||
@extra_libs ||= [
|
return @extra_libs if @extra_libs
|
||||||
|
|
||||||
|
libs = [
|
||||||
File.join(brew_dir, 'opt/expat/lib/libexpat.1.dylib'),
|
File.join(brew_dir, 'opt/expat/lib/libexpat.1.dylib'),
|
||||||
File.join(brew_dir, 'opt/libiconv/lib/libiconv.2.dylib'),
|
File.join(brew_dir, 'opt/libiconv/lib/libiconv.2.dylib'),
|
||||||
File.join(brew_dir, 'opt/zlib/lib/libz.1.dylib')
|
File.join(brew_dir, 'opt/zlib/lib/libz.1.dylib')
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if options[:native_comp]
|
||||||
|
libgcc_s = File.join(
|
||||||
|
brew_dir, 'lib', 'gcc', gcc_info.major_version, 'libgcc_s.1.dylib'
|
||||||
|
)
|
||||||
|
libs << libgcc_s if File.exist?(libgcc_s)
|
||||||
|
end
|
||||||
|
|
||||||
|
@extra_libs = libs
|
||||||
end
|
end
|
||||||
|
|
||||||
def download_tarball(sha)
|
def download_tarball(sha)
|
||||||
@@ -294,6 +301,8 @@ class Build
|
|||||||
"-L#{gcc_info.libgccjit_lib_dir}",
|
"-L#{gcc_info.libgccjit_lib_dir}",
|
||||||
"-I#{File.join(gcc_info.root_dir, 'include')}",
|
"-I#{File.join(gcc_info.root_dir, 'include')}",
|
||||||
"-I#{File.join(gcc_info.libgccjit_root_dir, 'include')}",
|
"-I#{File.join(gcc_info.libgccjit_root_dir, 'include')}",
|
||||||
|
# Ensure library re-linking and code signing will work after building.
|
||||||
|
'-Wl,-headerpad_max_install_names',
|
||||||
ENV['LDFLAGS']
|
ENV['LDFLAGS']
|
||||||
].compact.join(' ')
|
].compact.join(' ')
|
||||||
|
|
||||||
@@ -745,7 +754,7 @@ class AbstractEmbedder
|
|||||||
end
|
end
|
||||||
|
|
||||||
def lib_dir
|
def lib_dir
|
||||||
File.join(app, 'Contents', 'Frameworks')
|
File.join(invocation_dir, 'lib')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -753,7 +762,7 @@ class LibEmbedder < AbstractEmbedder
|
|||||||
attr_reader :lib_source
|
attr_reader :lib_source
|
||||||
attr_reader :extra_libs
|
attr_reader :extra_libs
|
||||||
|
|
||||||
def initialize(app, lib_source, extra_libs = [])
|
def initialize(app, lib_source, extra_libs = [], embed_eln_files = true)
|
||||||
super(app)
|
super(app)
|
||||||
|
|
||||||
@lib_source = lib_source
|
@lib_source = lib_source
|
||||||
@@ -775,7 +784,7 @@ class LibEmbedder < AbstractEmbedder
|
|||||||
rel_path = Pathname.new(lib_dir).relative_path_from(
|
rel_path = Pathname.new(lib_dir).relative_path_from(
|
||||||
Pathname.new(File.dirname(binary))
|
Pathname.new(File.dirname(binary))
|
||||||
).to_s
|
).to_s
|
||||||
eln_files.each { |f| copy_libs(f, rel_path) }
|
eln_files.each { |f| copy_libs(f, rel_path) } if embed_eln_files
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -783,19 +792,7 @@ class LibEmbedder < AbstractEmbedder
|
|||||||
private
|
private
|
||||||
|
|
||||||
def eln_files
|
def eln_files
|
||||||
@eln_files ||= Dir[
|
@eln_files ||= Dir[File.join(app, 'Contents', '**', '*.eln')]
|
||||||
File.join(
|
|
||||||
app, 'Contents', 'Resources', 'native-lisp', '**', '*.eln'
|
|
||||||
),
|
|
||||||
File.join(
|
|
||||||
app, 'Contents', 'MacOS', 'lib', 'emacs', '**',
|
|
||||||
'native-lisp', '**', '*.eln'
|
|
||||||
),
|
|
||||||
File.join(
|
|
||||||
app, 'Contents', 'MacOS', 'libexec', 'emacs', '**',
|
|
||||||
'eln-cache', '**', '*.eln'
|
|
||||||
)
|
|
||||||
]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def copy_libs(exe, rel_path = nil)
|
def copy_libs(exe, rel_path = nil)
|
||||||
@@ -1096,6 +1093,12 @@ if __FILE__ == $PROGRAM_NAME
|
|||||||
cli_options[:native_full_aot] = v
|
cli_options[:native_full_aot] = v
|
||||||
end
|
end
|
||||||
|
|
||||||
|
opts.on('--[no-]relink-eln-files',
|
||||||
|
'Enable/disable re-linking shared libraries in bundled *.eln ' \
|
||||||
|
'files (default: enabled)') do |v|
|
||||||
|
cli_options[:relink_eln] = v
|
||||||
|
end
|
||||||
|
|
||||||
opts.on('--[no-]rsvg',
|
opts.on('--[no-]rsvg',
|
||||||
'Enable/disable SVG image support via librsvg ' \
|
'Enable/disable SVG image support via librsvg ' \
|
||||||
'(default: enabled)') do |v|
|
'(default: enabled)') do |v|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/hexops/gotextdiff/myers"
|
"github.com/hexops/gotextdiff/myers"
|
||||||
"github.com/hexops/gotextdiff/span"
|
"github.com/hexops/gotextdiff/span"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/gh"
|
"github.com/jimeh/build-emacs-for-macos/pkg/gh"
|
||||||
|
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -363,9 +364,14 @@ func (s *Updater) renderCask(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
chk *LiveCheck,
|
chk *LiveCheck,
|
||||||
) ([]byte, error) {
|
) ([]byte, error) {
|
||||||
releaseName := "Emacs." + chk.Version.Latest
|
releaseName, err := release.VersionToName(chk.Version.Latest)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
s.logger.Info("fetching release details", "release", releaseName)
|
s.logger.Info("fetching release details",
|
||||||
|
"release", releaseName, "repo", s.BuildsRepo.URL(),
|
||||||
|
)
|
||||||
release, resp, err := s.gh.Repositories.GetReleaseByTag(
|
release, resp, err := s.gh.Repositories.GetReleaseByTag(
|
||||||
ctx, s.BuildsRepo.Owner(), s.BuildsRepo.Name(), releaseName,
|
ctx, s.BuildsRepo.Owner(), s.BuildsRepo.Name(), releaseName,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ func planAction(c *cli2.Context, opts *Options) error {
|
|||||||
GithubToken: c.String("github-token"),
|
GithubToken: c.String("github-token"),
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.String("test-build-type") == "draft" {
|
if c.String("test-release-type") == "draft" {
|
||||||
planOpts.TestBuildType = plan.Draft
|
planOpts.TestBuildType = plan.Draft
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package cli
|
package cli
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -60,6 +61,7 @@ func releaseCmd() *cli2.Command {
|
|||||||
Subcommands: []*cli2.Command{
|
Subcommands: []*cli2.Command{
|
||||||
releaseCheckCmd(),
|
releaseCheckCmd(),
|
||||||
releasePublishCmd(),
|
releasePublishCmd(),
|
||||||
|
releaseBulkCmd(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -206,3 +208,56 @@ func releasePublishAction(
|
|||||||
|
|
||||||
return release.Publish(c.Context, rlsOpts)
|
return release.Publish(c.Context, rlsOpts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func releaseBulkCmd() *cli2.Command {
|
||||||
|
return &cli2.Command{
|
||||||
|
Name: "bulk",
|
||||||
|
Usage: "bulk modify GitHub releases",
|
||||||
|
ArgsUsage: "",
|
||||||
|
Flags: []cli2.Flag{
|
||||||
|
&cli2.StringFlag{
|
||||||
|
Name: "name",
|
||||||
|
Usage: "regexp pattern matching release names to modify",
|
||||||
|
},
|
||||||
|
&cli2.StringFlag{
|
||||||
|
Name: "prerelease",
|
||||||
|
Usage: "change prerelease flag, must be \"true\" or " +
|
||||||
|
"\"false\", otherwise prerelease value is not changed",
|
||||||
|
},
|
||||||
|
&cli2.BoolFlag{
|
||||||
|
Name: "dry-run",
|
||||||
|
Usage: "do not perform any changes",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: releaseActionWrapper(releaseBulkAction),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func releaseBulkAction(
|
||||||
|
c *cli2.Context,
|
||||||
|
opts *Options,
|
||||||
|
rOpts *releaseOptions,
|
||||||
|
) error {
|
||||||
|
bulkOpts := &release.BulkOptions{
|
||||||
|
Repository: rOpts.Repository,
|
||||||
|
NamePattern: c.String("name"),
|
||||||
|
DryRun: c.Bool("dry-run"),
|
||||||
|
GithubToken: rOpts.GithubToken,
|
||||||
|
}
|
||||||
|
|
||||||
|
switch c.String("prerelease") {
|
||||||
|
case "true":
|
||||||
|
v := true
|
||||||
|
bulkOpts.Prerelease = &v
|
||||||
|
case "false":
|
||||||
|
v := false
|
||||||
|
bulkOpts.Prerelease = &v
|
||||||
|
case "":
|
||||||
|
default:
|
||||||
|
return errors.New(
|
||||||
|
"--prerelease by me \"true\" or \"false\" when specified",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return release.Bulk(c.Context, bulkOpts)
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/jimeh/build-emacs-for-macos/pkg/commit"
|
"github.com/jimeh/build-emacs-for-macos/pkg/commit"
|
||||||
"github.com/jimeh/build-emacs-for-macos/pkg/gh"
|
"github.com/jimeh/build-emacs-for-macos/pkg/gh"
|
||||||
"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/repository"
|
"github.com/jimeh/build-emacs-for-macos/pkg/repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -64,15 +65,17 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
releaseName := fmt.Sprintf(
|
version := fmt.Sprintf(
|
||||||
"Emacs.%s.%s.%s",
|
"%s.%s.%s",
|
||||||
commitInfo.DateString(),
|
commitInfo.DateString(),
|
||||||
commitInfo.ShortSHA(),
|
commitInfo.ShortSHA(),
|
||||||
sanitizeString(opts.Ref),
|
sanitizeString(opts.Ref),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
releaseName := fmt.Sprintf("Emacs.%s", version)
|
||||||
buildName := fmt.Sprintf(
|
buildName := fmt.Sprintf(
|
||||||
"%s.%s.%s",
|
"Emacs.%s.%s.%s",
|
||||||
releaseName,
|
version,
|
||||||
sanitizeString(osInfo.Name+"-"+osInfo.MajorMinor()),
|
sanitizeString(osInfo.Name+"-"+osInfo.MajorMinor()),
|
||||||
sanitizeString(osInfo.Arch),
|
sanitizeString(osInfo.Arch),
|
||||||
)
|
)
|
||||||
@@ -92,7 +95,8 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
|
|||||||
},
|
},
|
||||||
OS: osInfo,
|
OS: osInfo,
|
||||||
Release: &Release{
|
Release: &Release{
|
||||||
Name: releaseName,
|
Name: releaseName,
|
||||||
|
Prerelease: true,
|
||||||
},
|
},
|
||||||
Output: &Output{
|
Output: &Output{
|
||||||
Directory: opts.OutputDir,
|
Directory: opts.OutputDir,
|
||||||
@@ -100,16 +104,28 @@ 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 := sanitizeString(opts.TestBuild)
|
||||||
|
|
||||||
plan.Build.Name += ".test." + testName
|
plan.Build.Name += ".test." + testName
|
||||||
plan.Release.Title = "Test Builds"
|
plan.Release.Title = "Test Builds"
|
||||||
plan.Release.Name = "test-builds"
|
plan.Release.Name = "test-builds"
|
||||||
|
|
||||||
|
plan.Release.Prerelease = true
|
||||||
|
plan.Release.Draft = false
|
||||||
if opts.TestBuildType == Draft {
|
if opts.TestBuildType == Draft {
|
||||||
|
plan.Release.Prerelease = false
|
||||||
plan.Release.Draft = true
|
plan.Release.Draft = true
|
||||||
} else {
|
|
||||||
plan.Release.Prerelease = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
index := strings.LastIndex(diskImage, ".")
|
index := strings.LastIndex(diskImage, ".")
|
||||||
|
|||||||
84
pkg/release/bulk.go
Normal file
84
pkg/release/bulk.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package release
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"github.com/google/go-github/v35/github"
|
||||||
|
"github.com/hashicorp/go-hclog"
|
||||||
|
"github.com/jimeh/build-emacs-for-macos/pkg/gh"
|
||||||
|
"github.com/jimeh/build-emacs-for-macos/pkg/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BulkOptions struct {
|
||||||
|
Repository *repository.Repository
|
||||||
|
NamePattern string
|
||||||
|
Prerelease *bool
|
||||||
|
DryRun bool
|
||||||
|
GithubToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Bulk(ctx context.Context, opts *BulkOptions) error {
|
||||||
|
logger := hclog.FromContext(ctx).Named("release")
|
||||||
|
gh := gh.New(ctx, opts.GithubToken)
|
||||||
|
|
||||||
|
nameMatcher, err := regexp.Compile(opts.NamePattern)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
nextPage := 1
|
||||||
|
lastPage := 1
|
||||||
|
|
||||||
|
for nextPage <= lastPage {
|
||||||
|
releases, resp, err := gh.Repositories.ListReleases(
|
||||||
|
ctx, opts.Repository.Owner(), opts.Repository.Name(),
|
||||||
|
&github.ListOptions{
|
||||||
|
Page: nextPage,
|
||||||
|
PerPage: 100,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
nextPage = resp.NextPage
|
||||||
|
lastPage = resp.LastPage
|
||||||
|
|
||||||
|
for _, r := range releases {
|
||||||
|
if !nameMatcher.MatchString(r.GetName()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.Info("match found", "release", r.GetName())
|
||||||
|
|
||||||
|
var changes []interface{}
|
||||||
|
if opts.Prerelease != nil && r.GetPrerelease() != *opts.Prerelease {
|
||||||
|
changes = append(changes, "prerelease", *opts.Prerelease)
|
||||||
|
r.Prerelease = opts.Prerelease
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(changes) > 0 {
|
||||||
|
changes = append(
|
||||||
|
[]interface{}{"release", r.GetName()}, changes...,
|
||||||
|
)
|
||||||
|
logger.Info("modifying", changes...)
|
||||||
|
if !opts.DryRun {
|
||||||
|
_, _, err = gh.Repositories.EditRelease(
|
||||||
|
ctx, opts.Repository.Owner(), opts.Repository.Name(),
|
||||||
|
r.GetID(), r,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if nextPage == 0 || lastPage == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
42
pkg/release/version.go
Normal file
42
pkg/release/version.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package release
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Errors
|
||||||
|
var (
|
||||||
|
Err = errors.New("release")
|
||||||
|
ErrInvalidName = fmt.Errorf("%w: invalid name", Err)
|
||||||
|
ErrEmptyVersion = fmt.Errorf("%w: empty version", Err)
|
||||||
|
ErrNotStableRef = fmt.Errorf(
|
||||||
|
"%w: git ref is not stable tagged release", Err,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
stableVersion = regexp.MustCompile(`^\d+\.\d+(?:[a-z]+)?$`)
|
||||||
|
stableGetRef = regexp.MustCompile(`^emacs-(\d+\.\d+(?:[a-z]+)?)$`)
|
||||||
|
)
|
||||||
|
|
||||||
|
func VersionToName(version string) (string, error) {
|
||||||
|
if version == "" {
|
||||||
|
return "", ErrEmptyVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
if stableVersion.MatchString(version) {
|
||||||
|
return "Emacs-" + version, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Emacs." + version, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GitRefToStableVersion(ref string) (string, error) {
|
||||||
|
if m := stableGetRef.FindStringSubmatch(ref); len(m) > 1 {
|
||||||
|
return m[1], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("%w: \"%s\"", ErrNotStableRef, ref)
|
||||||
|
}
|
||||||
138
pkg/release/version_test.go
Normal file
138
pkg/release/version_test.go
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
package release
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestVersionToName(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
version string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
wantErr string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty",
|
||||||
|
args: args{
|
||||||
|
version: "",
|
||||||
|
},
|
||||||
|
wantErr: "release: empty version",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nightly",
|
||||||
|
args: args{
|
||||||
|
version: "2021-07-01.1b88404.master",
|
||||||
|
},
|
||||||
|
want: "Emacs.2021-07-01.1b88404.master",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "stable",
|
||||||
|
args: args{
|
||||||
|
version: "27.2",
|
||||||
|
},
|
||||||
|
want: "Emacs-27.2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "stable with letter",
|
||||||
|
args: args{
|
||||||
|
version: "23.3b",
|
||||||
|
},
|
||||||
|
want: "Emacs-23.3b",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := VersionToName(tt.args.version)
|
||||||
|
|
||||||
|
assert.Equal(t, tt.want, got)
|
||||||
|
|
||||||
|
if tt.wantErr != "" {
|
||||||
|
assert.EqualError(t, err, tt.wantErr)
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGitRefToStableVersion(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
version string
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
want string
|
||||||
|
wantErr string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "empty",
|
||||||
|
args: args{
|
||||||
|
version: "",
|
||||||
|
},
|
||||||
|
wantErr: "release: git ref is not stable tagged release: \"\"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "master",
|
||||||
|
args: args{
|
||||||
|
version: "master",
|
||||||
|
},
|
||||||
|
wantErr: "release: git ref is not stable tagged release: " +
|
||||||
|
"\"master\"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "feature",
|
||||||
|
args: args{
|
||||||
|
version: "feature/native-comp",
|
||||||
|
},
|
||||||
|
wantErr: "release: git ref is not stable tagged release: " +
|
||||||
|
"\"feature/native-comp\"",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "stable",
|
||||||
|
args: args{
|
||||||
|
version: "emacs-27.2",
|
||||||
|
},
|
||||||
|
want: "27.2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "stable with letter",
|
||||||
|
args: args{
|
||||||
|
version: "emacs-23.3b",
|
||||||
|
},
|
||||||
|
want: "23.3b",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "future stable",
|
||||||
|
args: args{
|
||||||
|
version: "emacs-239.33",
|
||||||
|
},
|
||||||
|
want: "239.33",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "future stable with letter",
|
||||||
|
args: args{
|
||||||
|
version: "emacs-239.33c",
|
||||||
|
},
|
||||||
|
want: "239.33c",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := GitRefToStableVersion(tt.args.version)
|
||||||
|
|
||||||
|
assert.Equal(t, tt.want, got)
|
||||||
|
|
||||||
|
if tt.wantErr != "" {
|
||||||
|
assert.EqualError(t, err, tt.wantErr)
|
||||||
|
} else {
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user