Compare commits

..

58 Commits

Author SHA1 Message Date
d2548191f1 chore(release): 0.6.41 2023-01-16 23:52:25 +00:00
8ed16b27c0 ci(builds): add python to CI dependencies 2023-01-16 23:23:43 +00:00
14f7aa13d9 chore(release): 0.6.40 2023-01-08 22:39:03 +00:00
59ebbdaa2b Merge pull request #79 from jimeh/fix-nightly-builds 2023-01-08 22:38:16 +00:00
d98c14dde5 chore(deps): remove python CI dependency
Instead use default python version install on macOS to install dmgbuild.
2023-01-08 21:21:54 +00:00
590b0ac21a chore(deps): remove curl from Brewfile
Curl is part of macOS, and the curl homebrew formula is keg-only.
Meaning there's no reason to install it for our purposes.
2023-01-08 20:39:17 +00:00
8c84ef128f chore(release): 0.6.39 2022-12-04 20:33:32 +00:00
8b447b6237 feat(version): correctly handle Emacs 30.x builds 2022-12-04 20:32:55 +00:00
c3d19694e7 feat(deprecate): posix-spawn patch is no longer supported
Nor is it needed, as it was only an issue in master for a short period
of time.
2022-12-04 20:30:20 +00:00
cff89684c6 chore(release): 0.6.38 2022-12-01 22:35:08 +00:00
48a512fbce feat(patch): add round-undecorated-frame from emacs-plus for 29.x 2022-12-01 22:30:48 +00:00
a3530c02e8 feat(patch): add support for experimental poll patch from emacs-plus for 29.x 2022-12-01 22:30:42 +00:00
138ac74ba5 chore(release): 0.6.37 2022-12-01 22:09:38 +00:00
0ba971ef61 feat(tree-sitter): support new --with-tree-sitter configure flag 2022-12-01 22:08:29 +00:00
1ae8771b2c chore(release): 0.6.36 2022-10-08 14:41:30 +01:00
1f2868d4b3 fix(native-comp): support new configure flag format
Commit e245c4f226979ccb717cccc8f82b2b0a0f96bdac on Emacs' master branch
added support for optional flags to the --with-native-compilation
configure flag.

This change to output of ./configure --help broke the native comp
detection present in our build script.

This change adds support for the new configure flag format, while also
using it to specify AOT when enabled.

It is still backwards compatible with the configure script in older
commits.

Fixes #76
2022-10-08 14:38:37 +01:00
bfa5bcf79b chore(release): 0.6.35 2022-08-10 16:48:24 +01:00
02d85f899f Merge pull request #75 from jimeh/fix-libgccjit12-compatibility
fix(native-comp): compatibility with libgccjit 12 homebrew formula
2022-08-10 16:46:45 +01:00
aeb3a75e5c chore(patch): minor simplification to libgccjit patches
By matching more targeted sets of strings, it should hopefully make
these patches more future-proof.
2022-08-10 16:31:51 +01:00
Alice Rum
e0fd2b16eb fix(native-comp): compatibility with libgccjit 12 homebrew formula
Since the latest update of `libgccjit` in brew to version 12, emacs does
not build again. Problem is that now dylib exists in multiple locations,
and `MAC_CFLAGS` environment variable is not filled correctly in
`configure.ac`. This commit fixes the issue.
2022-08-10 16:30:10 +01:00
d24ac084b7 chore(release): 0.6.34 2022-07-27 23:25:28 +01:00
159a7333de Merge pull request #73 from jimeh/fix-emacs-28
fix(emacs-28): patch configure.ac to support latest libgccjit
2022-07-27 23:23:39 +01:00
b582523642 fix(emacs-28): patch configure.ac to support latest libgccjit
When building Emacs 28.x the build script will attempt to patch
configure.ac if needed to support the latest version of libgccjit which
renamed libgccjit.so to libgccjit.dylib.

Fixes #72
2022-07-27 23:18:58 +01:00
4f1e748df2 chore(release): 0.6.33 2022-04-30 19:37:01 +01:00
d984633991 chore(deps): update gon package to 0.2.5 2022-04-30 19:35:21 +01:00
616f74d624 chore(release): 0.6.32 2022-04-30 17:46:51 +01:00
d7963b7664 chore(helper): minor tweak to emacs helper launch script 2022-04-30 17:46:06 +01:00
a20a8456ab feat(deps): add sqlite brew dependency for Emacs 29.x 2022-04-30 17:45:21 +01:00
8ad3ff4f53 feat(dbus): add flag to explicitly disable dbus support
Fixes #69
2022-04-30 17:27:41 +01:00
e31f5aaf93 fix(native-comp): support libgccjit 11.3.0
The libgccjit shared library file was renamed from libgccjit.so to
libgccjit.0.dylib in 11.3.0.

Fixes #71
2022-04-30 17:13:50 +01:00
c2fb07fdb8 chore(release): 0.6.31 2022-02-25 10:33:12 +00:00
07e0e3dacd fix: set source-directory correctly
Fixes #68
2022-02-25 10:32:03 +00:00
efddb9ef92 chore(release): 0.6.30 2022-02-08 03:07:18 +00:00
f7f4c0433a Merge pull request #66 from jimeh/add-homebrew-site-lisp-path 2022-02-08 03:05:31 +00:00
cbd8cb27b6 fix(site-lisp): add Homebrew's site-lisp directory to locallisppath
This should allow mu4e to be loaded from the mu homebrew package, among
other homebrew packages that provides emacs site-lisp files.

Ref: https://github.com/jimeh/emacs-builds/issues/19
2022-02-08 00:44:09 +00:00
656b96510a chore(release): 0.6.29 2022-02-07 21:07:10 +00:00
084776db6b feat(cask): add support for pretest builds 2022-02-07 21:04:59 +00:00
1e6d6cc6cf chore(release): 0.6.28 2022-01-15 23:19:07 +00:00
68ef4c066c feat(build): add dbus dependency to enable support in Emacs builds
Dbus support is automatically enabled if available on the system.
2022-01-15 23:17:25 +00:00
d476fd33ec chore(release): 0.6.27 2021-12-05 12:57:03 +00:00
baa5930467 Merge pull request #63 from jimeh/add-pretest-build-support
feat(plan): add support for pretest and release candidate builds
2021-12-05 12:54:33 +00:00
743b10c751 feat(plan): add support for pretest and release candidate builds
Add support for naming release and builds accordingly when given a git
ref for a pretest (90 or above patch number) or release
candidate ("-rcX" at the end of the tag).
2021-12-05 12:52:08 +00:00
59f1bcd3e8 chore(release): 0.6.26 2021-11-27 05:01:57 +00:00
e767e284b7 Merge pull request #62 from jimeh/improve-shared-library-embedding 2021-11-27 05:01:16 +00:00
8129a2e93b docs(readme): update Status section, and minor tweaks 2021-11-27 04:58:54 +00:00
4ae288cae3 feat(build): re-link eln files by default again
This reverts commit d338c136db.

Thanks to using relinking with @rpath, paths are shorting leaving enough
room in all *.eln files to be signed.
2021-11-27 04:25:03 +00:00
3bd78d130a feat(native-comp): no longer require gcc homebrew formula
This finally makes Emacs.app with native-comp fully self-contained, no
longer requiring the GCC Homebrew formula to be installed when
loading *.eln files that link against
/usr/local/lib/gcc/11/libgcc_s.1.dylib.

By adding the signing entitlement
com.apple.security.cs.allow-dyld-environment-variables, which allows
dynamic library loading to be controlled via DYLD_* environment
variables. It seems the lack of this was preventing Emacs from loading
the bundled libgcc_s.1.dylib file from Contents/Frameworks.

Fixes #53
2021-11-27 04:01:23 +00:00
fb5362ce18 fix(embed): relink shared libraries with @rpath instead of @executable_path
This allows much shorter shared library link paths within *.eln files
compared to when using @executable_path, which leaves enough space in
them to sign all *.eln files, while directly having them linked against
the embedded copy of GCC shared libraries.
2021-11-27 03:47:43 +00:00
1a34a9504a chore(release): 0.6.25 2021-11-25 23:38:52 +00:00
8513521d29 Merge pull request #61 from jimeh/refactor-file-operations 2021-11-25 23:36:55 +00:00
88bbefadc6 refactor(embed): use cp, mv, and chmod shell commands instead of FileUtils
It seems like Ruby's FileUtils.cp_r method especially was messing with
some file attributes, causing Emacs to print details about loading
various elisp files on startup. While when Emacs.app is copied into the
output build directory using "cp -a" instead of FileUtils.cp_r it does
not exhibit this behavior.
2021-11-25 20:14:16 +00:00
f1bf1d93b8 chore(release): 0.6.24 2021-11-24 21:42:52 +00:00
8a467b0d43 fix(embedding): embedding GCC fails when paths do not require sanitizing
It seems homebrew bottle of GCC for macOS Monterey (12.0) have changed their
directory structure slightly, which caused an issue were we were trying
to rename a specific directory to the same name it already had.

This behavior is still required as it looks like GCC on macOS
Catalina (10.15), the GCC homebrew bottle still uses the old directory
structure.
2021-11-24 21:39:03 +00:00
9c29f721b4 chore(release): 0.6.23 2021-11-10 22:19:28 +00:00
4ac71ddf39 docs(readme): update usage section with latest help text 2021-11-10 22:19:06 +00:00
d338c136db fix(build): do not re-link eln files by default
Relinking is currently failing for some of the *.eln files. See #60 for
details of the error.

Long-term plan is to investigate native-comp's compilation options to
hopefully resolve this issue.
2021-11-10 22:11:13 +00:00
d054a17fc7 chore(release): 0.6.22 2021-11-10 01:56:19 +00:00
4030ceb9ca feat(patch): add support for posix-spawn patch from emacs-plus 2021-11-10 01:55:38 +00:00
18 changed files with 973 additions and 143 deletions

View File

@@ -2,7 +2,7 @@
brew 'autoconf'
brew 'coreutils'
brew 'curl'
brew 'dbus'
brew 'expat'
brew 'gcc'
brew 'gmp'
@@ -22,5 +22,7 @@ brew 'make'
brew 'ncurses'
brew 'nettle'
brew 'pkg-config'
brew 'sqlite'
brew 'texinfo'
brew 'tree-sitter'
brew 'zlib'

View File

@@ -2,6 +2,140 @@
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.41](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.40...v0.6.41) (2023-01-16)
### [0.6.40](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.39...v0.6.40) (2023-01-08)
### [0.6.39](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.38...v0.6.39) (2022-12-04)
### Features
* **deprecate:** posix-spawn patch is no longer supported ([c3d1969](https://github.com/jimeh/build-emacs-for-macos/commit/c3d19694e7e4d33d462c9917683c2d63f69002f5))
* **version:** correctly handle Emacs 30.x builds ([8b447b6](https://github.com/jimeh/build-emacs-for-macos/commit/8b447b6237fbbd94c4e72af8ee79969c7cfc9363))
### [0.6.38](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.37...v0.6.38) (2022-12-01)
### Features
* **patch:** add round-undecorated-frame from emacs-plus for 29.x ([48a512f](https://github.com/jimeh/build-emacs-for-macos/commit/48a512fbce79759caa987e2880585bd0bc937977))
* **patch:** add support for experimental poll patch from emacs-plus for 29.x ([a3530c0](https://github.com/jimeh/build-emacs-for-macos/commit/a3530c02e8260106f87d464e5cb398dcb2819460))
### [0.6.37](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.36...v0.6.37) (2022-12-01)
### Features
* **tree-sitter:** support new --with-tree-sitter configure flag ([0ba971e](https://github.com/jimeh/build-emacs-for-macos/commit/0ba971ef61a195c91e87aa381d5d3b044461b4f6))
### [0.6.36](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.35...v0.6.36) (2022-10-08)
### Bug Fixes
* **native-comp:** support new configure flag format ([1f2868d](https://github.com/jimeh/build-emacs-for-macos/commit/1f2868d4b3784e906665e9f3b6b9bba8fd72292f)), closes [#76](https://github.com/jimeh/build-emacs-for-macos/issues/76)
### [0.6.35](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.34...v0.6.35) (2022-08-10)
### Bug Fixes
* **native-comp:** compatibility with libgccjit 12 homebrew formula ([e0fd2b1](https://github.com/jimeh/build-emacs-for-macos/commit/e0fd2b16eb91ac5a98ed4ec31f4773ab22cbd470))
### [0.6.34](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.33...v0.6.34) (2022-07-27)
### Bug Fixes
* **emacs-28:** patch configure.ac to support latest libgccjit ([b582523](https://github.com/jimeh/build-emacs-for-macos/commit/b582523642ad4c5298f5a7890edd9b48c0433684)), closes [#72](https://github.com/jimeh/build-emacs-for-macos/issues/72)
### [0.6.33](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.32...v0.6.33) (2022-04-30)
### [0.6.32](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.31...v0.6.32) (2022-04-30)
### Features
* **dbus:** add flag to explicitly disable dbus support ([8ad3ff4](https://github.com/jimeh/build-emacs-for-macos/commit/8ad3ff4f53505408aa097527177032a1fd6008e0)), closes [#69](https://github.com/jimeh/build-emacs-for-macos/issues/69)
* **deps:** add sqlite brew dependency for Emacs 29.x ([a20a845](https://github.com/jimeh/build-emacs-for-macos/commit/a20a8456ab1e8de6357d5d121b9565ba65a6dd71))
### Bug Fixes
* **native-comp:** support libgccjit 11.3.0 ([e31f5aa](https://github.com/jimeh/build-emacs-for-macos/commit/e31f5aaf9355b674c2a86b8eda35f6513f344b72)), closes [#71](https://github.com/jimeh/build-emacs-for-macos/issues/71)
### [0.6.31](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.30...v0.6.31) (2022-02-25)
### Bug Fixes
* set source-directory correctly ([07e0e3d](https://github.com/jimeh/build-emacs-for-macos/commit/07e0e3dacddfbdb7a59aceaa2dc9cdf503ac2bcc)), closes [#68](https://github.com/jimeh/build-emacs-for-macos/issues/68)
### [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)
### Features
* **build:** re-link eln files by default again ([4ae288c](https://github.com/jimeh/build-emacs-for-macos/commit/4ae288cae34c5e1d291dad7b6b654fe37c4a221f))
* **native-comp:** no longer require gcc homebrew formula ([3bd78d1](https://github.com/jimeh/build-emacs-for-macos/commit/3bd78d130a5419a6530a7d30e271569e501870fb)), closes [#53](https://github.com/jimeh/build-emacs-for-macos/issues/53)
### Bug Fixes
* **embed:** relink shared libraries with [@rpath](https://github.com/rpath) instead of [@executable](https://github.com/executable)_path ([fb5362c](https://github.com/jimeh/build-emacs-for-macos/commit/fb5362ce183ce43e52afcc0fc721cf2145f9c85b))
### [0.6.25](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.24...v0.6.25) (2021-11-25)
### [0.6.24](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.23...v0.6.24) (2021-11-24)
### Bug Fixes
* **embedding:** embedding GCC fails when paths do not require sanitizing ([8a467b0](https://github.com/jimeh/build-emacs-for-macos/commit/8a467b0d43140f6956d53c27e2319ae1b572868c))
### [0.6.23](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.22...v0.6.23) (2021-11-10)
### Bug Fixes
* **build:** do not re-link eln files by default ([d338c13](https://github.com/jimeh/build-emacs-for-macos/commit/d338c136db8acc4378154cf66ed7db5462787602)), closes [#60](https://github.com/jimeh/build-emacs-for-macos/issues/60)
### [0.6.22](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.21...v0.6.22) (2021-11-10)
### Features
* **patch:** add support for posix-spawn patch from emacs-plus ([4030ceb](https://github.com/jimeh/build-emacs-for-macos/commit/4030ceb9cab6749af3c28161ac97caec90a8aed0))
### [0.6.21](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.20...v0.6.21) (2021-10-27)
### [0.6.20](https://github.com/jimeh/build-emacs-for-macos/compare/v0.6.19...v0.6.20) (2021-10-23)

View File

@@ -17,21 +17,10 @@ Use this script at your own risk.
built from the `master` branch. This script allows you to choose any branch,
tag, or git ref you want.
## Status
## Binary Builds
As of writing (2021-04-25) it works for me on my machine. Your luck may vary.
I have successfully built:
- `emacs-27.1` release git tag
- `master` branch (Emacs 28.x)
- `feature/native-comp` branch (Emacs 28.x)
For reference, my machine is:
- 13-inch MacBook Pro (2020), 10th-gen 2.3 GHz Quad-Core Intel Core i7 (4c/8t)
- macOS Big Sur 11.2.3 (20D91)
- Xcode 12.4 (12D4e)
Nightly and stable binary builds produced with this build script are available
from [jimeh/emacs-builds](https://github.com/jimeh/emacs-builds).
## Limitations
@@ -41,14 +30,9 @@ The build produced does have some limitations:
application will be that of the machine it was built on.
- The minimum required macOS version of the built application will be the same
as that of the machine it was built on.
- The application is not signed, so running it on machines other than the one
that built the application will yield warnings. If you want to make a signed
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).
- The application is not signed automatically, but the CLI tool used to sign the
nightly builds is available. Run `go run ./cmd/emacs-builder package --help`
for details. More detailed instructions will come soon.
## Requirements
@@ -66,6 +50,26 @@ from [jimeh/emacs-builds](https://github.com/jimeh/emacs-builds).
brew install ruby
```
## Status
As of writing (2021-11-27) it works for me on my machine and for the nightly
builds in [jimeh/emacs-builds](https://github.com/jimeh/emacs-builds). Your luck
may vary.
I have successfully built:
- `emacs-28` release branch
- `master` branch (Emacs 29.x)
For reference, my machine is:
- 13-inch MacBook Pro (2020), 10th-gen 2.3 GHz Quad-Core Intel Core i7 (4c/8t)
- macOS Monterey 12.0.1 (21A559)
- Xcode 13.1 (13A1030d)
Nightly builds are built with GitHub Actions on GitHub-hosted runners, using
`macos-10.15`.
## Usage
```
@@ -81,8 +85,10 @@ Options:
--[no-]native-comp Enable/disable native-comp (default: enabled if supported)
--[no-]native-march Enable/disable -march=native CFLAG(default: disabled)
--[no-]native-full-aot Enable/disable NATIVE_FULL_AOT / Ahead of Time compilation (default: disabled)
--[no-]relink-eln-files Enable/disable re-linking shared libraries in bundled *.eln files (default: enabled)
--[no-]rsvg Enable/disable SVG image support via librsvg (default: enabled)
--no-titlebar Apply no-titlebar patch (default: disabled)
--posix-spawn Apply posix-spawn patch (default: disabled)
--no-frame-refocus Apply no-frame-refocus patch (default: disabled)
--[no-]github-auth Make authenticated GitHub API requests if GITHUB_TOKEN environment variable is set.(default: enabled)
--work-dir DIR Specify a working directory where tarballs, sources, and builds will be stored and worked with
@@ -90,7 +96,8 @@ Options:
--build-name NAME Override generated build name
--dist-include x,y,z List of extra files to copy from Emacs source into build folder/archive (default: COPYING)
--[no-]archive Enable/disable creating *.tbz archive (default: enabled)
--[no-]archive-keep Enable/disable keeping source folder for archive (default: disabled)
--[no-]archive-keep-build-dir
Enable/disable keeping source folder for archive (default: disabled)
--plan FILE Follow given plan file, instead of using given git ref/sha
```

View File

@@ -26,7 +26,7 @@ module Output
if newline
warn "==> #{msg}"
else
STDERR.print "==> #{msg}"
$stderr.print "==> #{msg}"
end
end
@@ -35,6 +35,19 @@ module Output
end
end
module System
include Output
def run_cmd(*args)
out("CMD: #{args.join(' ')}")
cmd(*args)
end
def cmd(*args)
system(*args) || err("Exit code: #{$CHILD_STATUS.exitstatus}")
end
end
class OS
def self.version
@version ||= OSVersion.new
@@ -71,6 +84,7 @@ end
class Build
include Output
include System
EMACS_MIRROR_REPO = 'emacs-mirror/emacs'
DOWNLOAD_URL = 'https://github.com/emacs-mirror/emacs/tarball/%s'
@@ -199,7 +213,7 @@ class Build
end
out "CMD: #{log_args.join(' ')}"
system(*args) || err("Exit code: #{$CHILD_STATUS.exitstatus}")
cmd(*args)
target
end
@@ -236,14 +250,40 @@ class Build
@supports_xwidgets ||= !!configure_help.match(/\s+--with-xwidgets\s+/)
end
def supports_tree_sitter?
@supports_tree_sitter ||= !!configure_help.match(
/\s+--with-tree-sitter(\s|=).+/
)
end
def supports_native_comp?
@supports_native_comp ||= !native_comp_configure_flag.nil?
end
def native_comp_configure_match
@native_comp_configure_match ||= configure_help.match(
/\s+?(--with-native(?:comp|-compilation))(.+)?\s+?/
)
end
def native_comp_configure_flag
@native_comp_configure_flag ||= configure_help.match(
/\s+(--with-native(?:comp|-compilation))\s+/
)&.[](1)
return @native_comp_configure_flag if @native_comp_configure_flag
return unless native_comp_configure_match&.[](1)
@native_comp_configure_flag = [
native_comp_configure_match[1],
native_comp_configure_flag_arg
].compact.join('=')
end
def native_comp_configure_flag_arg
return @native_comp_configure_flag_arg if @native_comp_configure_flag_arg
return if native_comp_configure_match&.[](2) != '[=TYPE]'
@native_comp_configure_flag_arg = \
(options[:native_full_aot] ? 'aot' : 'yes')
end
def detect_native_comp
@@ -345,15 +385,20 @@ class Build
'--with-modules',
'--enable-locallisppath=' \
'/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?
configure_flags << '--with-xwidgets'
end
if options[:tree_sitter] && supports_tree_sitter?
configure_flags << '--with-tree-sitter'
end
configure_flags << native_comp_configure_flag if options[:native_comp]
configure_flags << '--without-rsvg' if options[:rsvg] == false
configure_flags << '--without-dbus' if options[:dbus] == false
run_cmd './configure', *configure_flags
run_cmd './configure', *configure_flags.compact
# Disable aligned_alloc on Mojave and below. See issue:
# https://github.com/daviderestivo/homebrew-emacs-head/issues/15
@@ -370,8 +415,12 @@ class Build
make_flags << "BYTE_COMPILE_EXTRA_FLAGS=--eval '(setq comp-speed 2)'"
if options[:native_full_aot]
info 'Using NATIVE_FULL_AOT=1'
make_flags << 'NATIVE_FULL_AOT=1'
info 'Using native compile full AOT'
# We do not need to supply the full AOT make arg if
# --with-native-compilation=aot configure flag is supported.
unless native_comp_configure_flag_arg
make_flags << 'NATIVE_FULL_AOT=1'
end
ENV.delete('NATIVE_FAST_BOOT')
else
ENV.delete('NATIVE_FULL_AOT')
@@ -379,7 +428,7 @@ class Build
end
end
run_cmd 'make', *make_flags
run_cmd 'make', *make_flags.compact
run_cmd 'make', 'install'
end
@@ -400,13 +449,13 @@ class Build
info "Copying \"#{app_name}\" to: #{target_dir}"
FileUtils.mkdir_p(target_dir)
FileUtils.cp_r(app, target_dir)
cmd('cp', '-a', app, target_dir)
options[:dist_include]&.each do |filename|
src = File.join(source_dir, filename)
if File.exist?(src)
info "Copying \"#{filename}\" to: #{target_dir}"
FileUtils.cp_r(src, target_dir)
cmd('cp', '-pRL', src, target_dir)
else
info "Warning: #{filename} does not exist in #{source_dir}"
end
@@ -431,7 +480,7 @@ class Build
info 'Creating symlinks within Emacs.app needed for native-comp'
if !File.exist?('lisp') && File.exist?('Resources/lisp')
FileUtils.ln_s('Resources/lisp', 'lisp')
run_cmd('ln', '-s', 'Resources/lisp', 'lisp')
end
# Check for folder name containing two dots (.), as this causes Apple's
@@ -453,7 +502,7 @@ class Build
new_name = File.join(parent, base.gsub(/\.(.+)\./, '-\\1-'))
info "Renaming: #{old_name} --> #{new_name}"
FileUtils.mv(old_name, new_name)
cmd('mv', old_name, new_name)
end
base = File.basename(parent)
@@ -477,7 +526,7 @@ class Build
end
target = File.basename(source)
FileUtils.ln_s(source, target) unless File.exist?(target)
run_cmd('ln', '-s', source, target) unless File.exist?(target)
end
end
@@ -535,7 +584,7 @@ class Build
if !File.exist?(archive_filename)
info "Creating #{filename} archive in \"#{target_dir}\"..."
FileUtils.cd(parent_dir) do
system('tar', '-cjf', archive_filename, build)
cmd('tar', '-cjf', archive_filename, build)
if options[:archive_keep] == false
info "Removing \"#{build}\" directory from #{parent_dir}"
@@ -600,11 +649,6 @@ class Build
response.body
end
def run_cmd(*args)
out "CMD: #{args.join(' ')}"
system(*args) || err("Exit code: #{$CHILD_STATUS.exitstatus}")
end
def effective_version
@effective_version ||= begin
case ref
@@ -614,8 +658,10 @@ class Build
'emacs-27'
when /^emacs-28.*/
'emacs-28'
else
when /^emacs-29.*/
'emacs-29'
else
'emacs-30'
end
end
end
@@ -623,14 +669,14 @@ class Build
def patches(opts = {})
p = []
if %w[emacs-26 emacs-27 emacs-28 emacs-29].include?(effective_version)
if %w[emacs-26 emacs-27 emacs-28 emacs-29 emacs-30].include?(effective_version)
p << {
url: 'https://github.com/d12frosted/homebrew-emacs-plus/raw/master/' \
"patches/#{effective_version}/fix-window-role.patch"
}
end
if %w[emacs-27 emacs-28 emacs-29].include?(effective_version)
if %w[emacs-27 emacs-28 emacs-29 emacs-30].include?(effective_version)
p << {
url: 'https://github.com/d12frosted/homebrew-emacs-plus/raw/master/' \
"patches/#{effective_version}/system-appearance.patch"
@@ -651,6 +697,41 @@ class Build
end
end
if %w[emacs-29 emacs-30].include?(effective_version)
p << {
url: 'https://github.com/d12frosted/homebrew-emacs-plus/raw/master/' \
"patches/#{effective_version}/round-undecorated-frame.patch"
}
if options[:poll]
p << {
url: 'https://github.com/d12frosted/homebrew-emacs-plus/raw/master/' \
"patches/#{effective_version}/poll.patch"
}
end
end
if effective_version == 'emacs-28'
p << {
replace: [
'configure.ac',
'grep libgccjit.so\$',
'grep -E \'libgccjit\.(so|dylib)$\''
],
allow_failure: true
}
end
if %w[emacs-28 emacs-29].include?(effective_version)
p << {
replace: [
'configure.ac',
'grep -E \'libgccjit\.(so|dylib)$\'',
'grep -E \'libgccjit\.(so|dylib)$\' | tail -1'
],
allow_failure: true
}
end
if effective_version == 'emacs-27'
p << {
url: 'https://github.com/d12frosted/homebrew-emacs-plus/raw/master/' \
@@ -700,17 +781,34 @@ class Build
err 'Patch replace input error' unless patch[:replace].size == 3
file, before, after = patch[:replace]
info "Applying patch to #{file}..."
filepath = File.join(target, file)
err "\"#{file}\" does not exist in #{target}" unless File.exist?(filepath)
unless File.exist?(filepath)
if patch[:allow_failure]
info "File #{filepath} does not exist, skipping patch."
return
end
err "\"#{file}\" does not exist in #{target}"
end
f = File.open(filepath, 'rb')
s = f.read
sub = s.gsub!(before, after)
err "Replacement filed in #{file}" if sub.nil?
if sub.nil?
if patch[:allow_failure]
info 'Patch did not apply, skipping.'
return
end
err "Replacement failed in #{file}"
end
f.reopen(filepath, 'wb').write(s)
f.close
info "#{file} patched."
end
end
@@ -741,6 +839,7 @@ end
class AbstractEmbedder
include Output
include System
attr_reader :app
@@ -751,23 +850,27 @@ class AbstractEmbedder
end
def invocation_dir
File.join(app, 'Contents', 'MacOS')
@invocation_dir ||= File.join(app, 'Contents', 'MacOS')
end
def bin
File.join(invocation_dir, 'Emacs')
@bin ||= File.join(invocation_dir, 'Emacs')
end
def bin_dir
File.join(invocation_dir, 'bin')
@bin_dir ||= File.join(invocation_dir, 'bin')
end
def lib_dir
File.join(invocation_dir, 'lib')
@lib_dir ||= frameworks_dir
end
def frameworks_dir
@frameworks_dir ||= File.join(app, 'Contents', 'Frameworks')
end
def resources_dir
File.join(app, 'Contents', 'Resources')
@resources_dir ||= File.join(app, 'Contents', 'Resources')
end
end
@@ -777,18 +880,19 @@ class CLIHelperEmbedder < AbstractEmbedder
target = File.join(bin_dir, 'emacs')
dir = File.dirname(target)
info "Adding \"emacs\" CLI helper to #{dir}"
info 'Adding "emacs" CLI helper to Emacs.app'
FileUtils.mkdir_p(dir)
FileUtils.cp(source, target)
FileUtils.chmod('+w', target)
run_cmd('cp', '-pRL', source, target)
run_cmd('chmod', '+w', target)
end
end
class CSourcesEmbedder < AbstractEmbedder
PATH_PATCH = <<~ELISP
;; Allow Emacs to find bundled C sources.
(setq source-directory (expand-file-name ".."))
(setq source-directory
(expand-file-name ".." (file-name-directory load-file-name)))
ELISP
attr_reader :source_dir
@@ -807,7 +911,7 @@ class CSourcesEmbedder < AbstractEmbedder
rel = f[src_dir.size + 1..-1]
target = File.join(resources_dir, 'src', rel)
FileUtils.mkdir_p(File.dirname(target))
FileUtils.cp(f, target)
cmd('cp', '-pRL', f, target)
end
return if File.exist?(site_start_el_file) &&
@@ -828,14 +932,14 @@ end
class LibEmbedder < AbstractEmbedder
attr_reader :lib_source
attr_reader :extra_libs
attr_reader :embed_eln_files
attr_reader :relink_eln_files
def initialize(app, lib_source, extra_libs = [], embed_eln_files = true)
def initialize(app, lib_source, extra_libs = [], relink_eln_files = true)
super(app)
@lib_source = lib_source
@extra_libs = extra_libs
@embed_eln_files = embed_eln_files
@relink_eln_files = relink_eln_files
end
def embed
@@ -845,15 +949,20 @@ class LibEmbedder < AbstractEmbedder
binary ||= bin
FileUtils.cd(File.dirname(app)) do
rel_path = Pathname.new(lib_dir).relative_path_from(
Pathname.new(File.dirname(binary))
).to_s
rpath = File.join('@executable_path', rel_path)
set_rpath(binary, rpath)
copy_libs(binary)
copy_extra_libs(extra_libs, binary) if extra_libs.any?
if eln_files.any?
if relink_eln_files && eln_files.any?
info "Embedding libraries for #{eln_files.size} *.eln files " \
'within Emacs.app'
rel_path = Pathname.new(lib_dir).relative_path_from(
Pathname.new(File.dirname(binary))
).to_s
eln_files.each { |f| copy_libs(f, rel_path) } if embed_eln_files
eln_files.each { |f| copy_libs(f) }
end
end
end
@@ -864,21 +973,19 @@ class LibEmbedder < AbstractEmbedder
@eln_files ||= Dir[File.join(app, 'Contents', '**', '*.eln')]
end
def copy_libs(exe, rel_path = nil)
exe_file = File.basename(exe)
rel_path ||= Pathname.new(lib_dir).relative_path_from(
Pathname.new(File.dirname(exe))
).to_s
def set_rpath(exe, rpath)
return if rpath.nil? || rpath == ''
rpath = File.join('@executable_path', rel_path)
rpaths = `otool -l "#{exe}" | grep -A 2 'cmd LC_RPATH' | grep 'path'`
return if rpaths.include?(rpath)
unless rpaths.include?(rpath)
while_writable(exe) do
system('install_name_tool', '-add_rpath',
File.join('@executable_path', rel_path), exe)
end
while_writable(exe) do
cmd('install_name_tool', '-add_rpath', rpath, exe)
end
end
def copy_libs(exe)
exe_file = File.basename(exe)
`otool -L "#{exe}"`.split("\n")[1..-1].each do |line|
match = line.match(%r{^\s+(.+/(lib[^/ ]+))\s})
@@ -886,41 +993,37 @@ class LibEmbedder < AbstractEmbedder
while_writable(exe) do
if match[2] == exe_file
system('install_name_tool', '-id',
File.join('@executable_path', rel_path, match[2].to_s), exe)
cmd('install_name_tool', '-id',
File.join('@rpath', match[2].to_s), exe)
else
system('install_name_tool', '-change', match[1],
File.join('@executable_path', rel_path, match[2].to_s), exe)
cmd('install_name_tool', '-change', match[1],
File.join('@rpath', match[2].to_s), exe)
end
end
next if match[2] == exe_file || File.exist?(File.join(lib_dir, match[2]))
FileUtils.mkdir_p(lib_dir)
FileUtils.cp(match[1], lib_dir)
copy_libs(File.join(lib_dir, match[2].to_s), rel_path)
cmd('cp', '-pRL', match[1], lib_dir)
copy_libs(File.join(lib_dir, match[2].to_s))
end
end
def copy_extra_libs(extra_libs, exe, rel_path = nil)
rel_path ||= Pathname.new(lib_dir).relative_path_from(
Pathname.new(File.dirname(exe))
).to_s
def copy_extra_libs(extra_libs, exe)
extra_libs.each do |lib|
lib_file = File.basename(lib)
target = "#{lib_dir}/#{lib_file}"
unless File.exist?(target)
FileUtils.mkdir_p(lib_dir)
FileUtils.cp(lib, lib_dir)
cmd('cp', '-pRL', lib, lib_dir)
end
while_writable(target) do
system('install_name_tool', '-id',
File.join('@executable_path', rel_path, lib_file), target)
cmd('install_name_tool', '-id',
File.join('@rpath', lib_file), target)
end
copy_libs(target, rel_path)
copy_libs(target)
end
end
@@ -929,7 +1032,7 @@ class LibEmbedder < AbstractEmbedder
File.chmod(0o775, file)
yield
ensure
File.chmod(mode, file)
File.chmod(mode, file) if File.exist?(file)
end
end
@@ -954,10 +1057,12 @@ class GccLibEmbedder < AbstractEmbedder
end
FileUtils.mkdir_p(File.dirname(target_dir))
FileUtils.cp_r(source_dir, target_dir)
run_cmd('cp', '-pRL', source_dir, target_dir)
FileUtils.rm(Dir[File.join(target_dir, '**', '.DS_Store')], force: true)
FileUtils.chmod_R('u+w', target_dir)
FileUtils.mv(source_darwin_dir, target_darwin_dir)
run_cmd('chmod', '-R', 'u+w', target_dir)
if source_darwin_dir != target_darwin_dir
run_cmd('mv', source_darwin_dir, target_darwin_dir)
end
env_setup = ERB.new(NATIVE_COMP_ENV_VAR_TPL).result(gcc_info.get_binding)
return if File.exist?(site_start_el_file) &&
@@ -1045,7 +1150,7 @@ class GccInfo
end
def relative_lib_dir
@relative_lib_dir ||= relative_dir(lib_dir, root_dir)
@relative_lib_dir ||= relative_dir(lib_dir, File.join(root_dir, 'lib'))
end
def darwin_lib_dir
@@ -1060,7 +1165,9 @@ class GccInfo
end
def relative_darwin_lib_dir
@relative_darwin_lib_dir ||= relative_dir(darwin_lib_dir, root_dir)
@relative_darwin_lib_dir ||= relative_dir(
darwin_lib_dir, File.join(root_dir, 'lib')
)
end
# Sanitize folder name with full "MAJOR.MINOR.PATCH" version number to just
@@ -1098,7 +1205,8 @@ class GccInfo
def libgccjit_lib_dir
@libgccjit_lib_dir ||= Dir[
File.join(libgccjit_root_dir, 'lib/gcc/*/libgccjit.so*')
File.join(libgccjit_root_dir, 'lib/gcc/*/libgccjit*.dylib'),
File.join(libgccjit_root_dir, 'lib/gcc/*/libgccjit.so*'),
]
.map { |path| File.dirname(path) }
.select { |path| File.basename(path).match(/^\d+$/) }
@@ -1148,7 +1256,9 @@ if __FILE__ == $PROGRAM_NAME
native_march: false,
parallel: Etc.nprocessors,
rsvg: true,
dbus: true,
xwidgets: true,
tree_sitter: true,
github_auth: true,
dist_include: ['COPYING'],
archive: true,
@@ -1184,6 +1294,12 @@ if __FILE__ == $PROGRAM_NAME
cli_options[:xwidgets] = v
end
opts.on('--[no-]tree-sitter',
'Enable/disable tree-sitter if supported' \
'(default: enabled)') do |v|
cli_options[:tree_sitter] = v
end
opts.on('--[no-]native-comp',
'Enable/disable native-comp ' \
'(default: enabled if supported)') do |v|
@@ -1214,15 +1330,31 @@ if __FILE__ == $PROGRAM_NAME
cli_options[:rsvg] = v
end
opts.on('--[no-]dbus',
'Enable/disable dbus support (default: enabled)') do |v|
cli_options[:dbus] = v
end
opts.on('--no-titlebar', 'Apply no-titlebar patch (default: disabled)') do
cli_options[:no_titlebar] = true
end
opts.on('--posix-spawn', 'Apply posix-spawn patch (deprecated)') do
warn '==> WARN: posix-spawn patch is deprecated as has no effect.'
end
opts.on('--no-frame-refocus',
'Apply no-frame-refocus patch (default: disabled)') do
cli_options[:no_frame_refocus] = true
end
opts.on('--[no-]poll',
'Enable/disable experimental use of poll() instead of select() ' \
'to support > 1024 file descriptors ' \
'(default: disabled)') do |v|
cli_options[:poll] = v
end
opts.on('--[no-]github-auth',
'Make authenticated GitHub API requests if GITHUB_TOKEN ' \
'environment variable is set.' \

2
go.mod
View File

@@ -16,7 +16,7 @@ require (
github.com/hexops/gotextdiff v1.0.3
github.com/jimeh/undent v1.1.0
github.com/mattn/go-isatty v0.0.13 // indirect
github.com/mitchellh/gon v0.2.3
github.com/mitchellh/gon v0.2.5
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/stretchr/testify v1.7.0
github.com/urfave/cli/v2 v2.3.0

4
go.sum
View File

@@ -160,8 +160,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/gon v0.2.3 h1:fObN7hD14VacGG++t27GzTW6opP0lwI7TsgTPL55wBo=
github.com/mitchellh/gon v0.2.3/go.mod h1:Ua18ZhqjZHg8VyqZo8kNHAY331ntV6nNJ9mT3s2mIo8=
github.com/mitchellh/gon v0.2.5 h1:mVWtqTzV03W0avJqmqjk9M0qls3TDUXfc9ETJaPIOWY=
github.com/mitchellh/gon v0.2.5/go.mod h1:Ua18ZhqjZHg8VyqZo8kNHAY331ntV6nNJ9mT3s2mIo8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env bash
resolve_link() {
"$(type -p greadlink readlink | head -1)" "$1"
"$(command -v greadlink || command -v readlink)" "$1"
}
abs_dirname() {

View File

@@ -393,9 +393,7 @@ func (s *Updater) renderCask(
filename := asset.GetName()
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 {
info.Assets[filename] = &ReleaseAsset{

View File

@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"regexp"
"strconv"
"strings"
"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/release"
"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"
)
var nonAlphaNum = regexp.MustCompile(`[^\w_-]+`)
var gitTagMatcher = regexp.MustCompile(
`^emacs(-.*)?-((\d+\.\d+)(?:\.(\d+))?(-rc\d+)?(.+)?)$`,
)
type TestBuildType string
@@ -37,7 +41,7 @@ type Options struct {
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")
repo, err := repository.NewGitHub(opts.EmacsRepo)
@@ -66,19 +70,36 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
return nil, err
}
version := fmt.Sprintf(
absoluteVersion := fmt.Sprintf(
"%s.%s.%s",
commitInfo.DateString(),
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(
"Emacs.%s.%s.%s",
version,
sanitizeString(osInfo.Name+"-"+osInfo.DistinctVersion()),
sanitizeString(osInfo.Arch),
absoluteVersion,
sanitize.String(osInfo.Name+"-"+osInfo.DistinctVersion()),
sanitize.String(osInfo.Arch),
)
diskImage := buildName + ".dmg"
@@ -97,7 +118,8 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
OS: osInfo,
Release: &Release{
Name: releaseName,
Prerelease: true,
Prerelease: channel != release.Stable,
Channel: channel,
},
Output: &Output{
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 != "" {
testName := sanitizeString(opts.TestBuild)
testName := sanitize.String(opts.TestBuild)
plan.Build.Name += ".test." + testName
plan.Release.Title = "Test Builds"
plan.Release.Title = "Test Builds (" + testName + ")"
plan.Release.Name = "test-builds"
plan.Release.Prerelease = true
plan.Release.Draft = false
if opts.TestBuildType == Draft {
plan.Release.Prerelease = false
plan.Release.Draft = true
plan.Release.Prerelease = false
plan.Release.Draft = true
if opts.TestBuildType == Prerelease {
plan.Release.Prerelease = true
plan.Release.Draft = false
}
index := strings.LastIndex(diskImage, ".")
@@ -137,6 +149,35 @@ func Create(ctx context.Context, opts *Options) (*Plan, error) {
return plan, nil
}
func sanitizeString(s string) string {
return nonAlphaNum.ReplaceAllString(s, "-")
func parseGitRef(ref string) (string, release.Channel, error) {
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
View 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)
}
})
}
}

View File

@@ -7,6 +7,7 @@ import (
"os"
"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"
"gopkg.in/yaml.v3"
)
@@ -78,10 +79,11 @@ type Build struct {
}
type Release struct {
Name string `yaml:"name" json:"name"`
Title string `yaml:"title,omitempty" json:"title,omitempty"`
Draft bool `yaml:"draft,omitempty" json:"draft,omitempty"`
Prerelease bool `yaml:"prerelease,omitempty" json:"prerelease,omitempty"`
Name string `yaml:"name" json:"name"`
Title string `yaml:"title,omitempty" json:"title,omitempty"`
Draft bool `yaml:"draft,omitempty" json:"draft,omitempty"`
Prerelease bool `yaml:"prerelease,omitempty" json:"prerelease,omitempty"`
Channel release.Channel `yaml:"channel,omitempty" json:"channel,omitempty"`
}
type Output struct {

11
pkg/release/channel.go Normal file
View 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"
)

View File

@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"regexp"
"strings"
)
// Errors
@@ -18,7 +19,7 @@ var (
var (
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) {
@@ -26,7 +27,8 @@ func VersionToName(version string) (string, error) {
return "", ErrEmptyVersion
}
if stableVersion.MatchString(version) {
if stableVersion.MatchString(version) ||
strings.HasSuffix(version, "-pretest") {
return "Emacs-" + version, nil
}
@@ -34,7 +36,7 @@ func VersionToName(version 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
}

View File

@@ -128,3 +128,15 @@ func (s *Repository) ActionRunURL(runID string) string {
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 ""
}
}

View 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
View File

@@ -0,0 +1,9 @@
package sanitize
import "regexp"
var nonAlphaNum = regexp.MustCompile(`[^\w_-]+`)
func String(s string) string {
return nonAlphaNum.ReplaceAllString(s, "-")
}

View File

@@ -14,6 +14,7 @@ var DefaultEmacsEntitlements = []string{
"com.apple.security.cs.allow-jit",
"com.apple.security.network.client",
"com.apple.security.cs.disable-library-validation",
"com.apple.security.cs.allow-dyld-environment-variables",
"com.apple.security.automation.apple-events",
}

View File

@@ -50,6 +50,7 @@ var entitlementsTestCases = []struct {
"com.apple.security.cs.allow-jit",
"com.apple.security.network.client",
"com.apple.security.cs.disable-library-validation",
"com.apple.security.cs.allow-dyld-environment-variables",
"com.apple.security.automation.apple-events",
},
//nolint:lll
@@ -64,6 +65,8 @@ var entitlementsTestCases = []struct {
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.automation.apple-events</key>
<true/>
</dict>
@@ -78,6 +81,7 @@ func TestDefaultEmacsEntitlements(t *testing.T) {
"com.apple.security.cs.allow-jit",
"com.apple.security.network.client",
"com.apple.security.cs.disable-library-validation",
"com.apple.security.cs.allow-dyld-environment-variables",
"com.apple.security.automation.apple-events",
},
DefaultEmacsEntitlements,