-
Notifications
You must be signed in to change notification settings - Fork 9
feat(taskfiles)!: Use checksum tasks to prevent unnecessary repetition of Boost tasks; Add checksum unit tests. #80
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
davidlion
wants to merge
68
commits into
y-scope:main
Choose a base branch
from
davidlion:checksum-update
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 14 commits
Commits
Show all changes
68 commits
Select commit
Hold shift + click to select a range
be569ba
fix(taskfiles)!: Check the specified FILE_SHA256 matches the download…
davidlion 3a9334e
Add checksum unit tests.
davidlion f807f1a
Merge remote-tracking branch 'upstream/main' into checksum-update
davidlion ffc0c06
Merge remote-tracking branch 'upstream/main' into checksum-update
davidlion 9e41b40
feat(taskfile)!: Use checksum tasks to prevent unnecessary repetition…
davidlion 3329f52
Follow yaml guidelines.
davidlion 5572a89
Fix yaml lint.
davidlion c8d706c
Fix boost 1.89 header change.
davidlion aca9e63
Try diff?
davidlion aef0786
Full switch to cmp.
davidlion b0ea5bc
Debug logs.
davidlion 3d66108
Resolve some rabbit coments.
davidlion 6af0c39
debugging CI
davidlion ea102c7
Resolve more rabbit coments.
davidlion 7c9701d
Switch to oneliner.
davidlion a6f7922
Make TARGETS required.
davidlion 9e3b981
who knows
davidlion 6740397
shell shock
davidlion b7849d9
Verbose testing.
davidlion 3d82d19
Fix logs.
davidlion 6930c6f
npm maybe
davidlion a3fedaa
sigh task scripts
davidlion 51c0ee8
typo
davidlion 77d6fea
syntax hard
davidlion 955d6bd
not on path
davidlion df4f9cb
sigh
davidlion 319771d
what is the magic syntax
davidlion c745ba8
meh
davidlion 8959121
maybe
davidlion 040b694
if else for macos
davidlion 2240fd4
just call bash idk
davidlion 4bc7164
no silent??
davidlion 4fdc23e
losing track
davidlion 23dd1e9
help
davidlion 4997cf2
full if statement
davidlion 05b2d68
dump shell options
davidlion 8d655c2
hmm unbound
davidlion be5d231
go panic
davidlion a6297c9
weird shell
davidlion 0144e84
error swallowing hmm
davidlion 361f891
free me
davidlion da843e9
forgive me
davidlion 1292184
maybe the end
davidlion cf02bb6
maybe the end
davidlion 8a72950
clpain
davidlion 2bb4119
hardswap diff?
davidlion 96f7cfe
cipain
davidlion 42f7495
same diff
davidlion 1a2c692
not posix?
davidlion d86541d
so lost
davidlion b03226c
try without pipefail
davidlion 058b867
try again
davidlion 74a07ba
no !
davidlion bb1688b
dumb person does dumb things
davidlion 6ddec14
dumb person does more dumb stuff
davidlion 7d96c0a
dumb person does even more dumb stuff
davidlion 5ef2d31
one more
davidlion dc829f2
bed time
davidlion f1c73f2
file dne?
davidlion 853afcf
bad mistakes
davidlion a9cf000
macos rm??
davidlion 6a959ee
need local macos runner
davidlion 78abea7
macos same checksum?
davidlion f09e083
why tar mad
davidlion 4743a67
this shouldn't work
davidlion b6552d1
gtar auto installed?
davidlion 2afbc02
check ignore_errors later
davidlion 4dd002b
bam
davidlion File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -8,38 +8,39 @@ set: ["u", "pipefail"] | |||||
| shopt: ["globstar"] | ||||||
|
|
||||||
| tasks: | ||||||
| # Generates `GENERATE_DIR` by copying `SOURCE_DIR` and then running boost's bootstrap step. | ||||||
| # Runs the Boost generate (bootstrap) step. | ||||||
| # | ||||||
| # @param {string} SOURCE_DIR Project source directory. | ||||||
| # @param {string} GENERATE_DIR Directory in which to generate `b2` and the build configuration. | ||||||
| # @param {string} GENERATE_CHECKSUM_FILE Checksum file for `GENERATE_DIR`. | ||||||
| # @param {string} INSTALL_PREFIX Path prefix of where the project should be installed. | ||||||
| # @param {string} SOURCE_DIR Project source directory. | ||||||
| # @param {string[]} TARGETS Target libraries to build. | ||||||
| # @param {string} [CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`. | ||||||
| # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the generate command. | ||||||
| generate: | ||||||
| internal: true | ||||||
| label: "{{.TASK}}:{{.SOURCE_DIR}}" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: >- | ||||||
| {{default (printf "%s.md5" .SOURCE_DIR) .CHECKSUM_FILE}} | ||||||
| EXTRA_ARGS: | ||||||
| ref: "default (list) .EXTRA_ARGS" | ||||||
| SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel" | ||||||
| requires: | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| vars: ["SOURCE_DIR", "GENERATE_DIR", "GENERATE_CHECKSUM_FILE", "INSTALL_PREFIX", "TARGETS"] | ||||||
| sources: | ||||||
| - "{{.SOURCE_DIR}}/**/*" | ||||||
| vars: | ||||||
| - "INSTALL_PREFIX" | ||||||
| - "TARGETS" | ||||||
| - "SOURCE_DIR" | ||||||
| sources: ["{{.TASKFILE}}"] | ||||||
| generates: | ||||||
| - "{{.GENERATE_CHECKSUM_FILE}}" | ||||||
| - "{{.CHECKSUM_FILE}}" | ||||||
| - "{{.SOURCE_SENTINEL_FILE}}" | ||||||
| deps: | ||||||
| - task: "checksum:validate" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: | ||||||
| - "{{.GENERATE_DIR}}" | ||||||
| CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] | ||||||
| cmds: | ||||||
| - >- | ||||||
| rm -rf "{{.GENERATE_DIR}}" | ||||||
| - >- | ||||||
| cp -R "{{.SOURCE_DIR}}" "{{.GENERATE_DIR}}" | ||||||
| - >- | ||||||
| pushd "{{.GENERATE_DIR}}"; | ||||||
| pushd "{{.SOURCE_DIR}}"; | ||||||
| ./bootstrap.sh | ||||||
| --prefix="{{.INSTALL_PREFIX}}" | ||||||
| --exec-prefix="{{.INSTALL_PREFIX}}" | ||||||
|
|
@@ -48,37 +49,74 @@ tasks: | |||||
| "{{.}}" | ||||||
| {{- end}}; | ||||||
| popd | ||||||
| - "touch '{{.SOURCE_SENTINEL_FILE}}'" | ||||||
| - task: "checksum:compute" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: | ||||||
| - "{{.GENERATE_DIR}}" | ||||||
| CHECKSUM_FILE: "{{.CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] | ||||||
|
|
||||||
| # Runs boost's b2 build and install step, and creates a CMake settings file. The caller must have | ||||||
| # previously called `generate` on `SOURCE_DIR` (to produce the `GENERATE_DIR`) for this task to | ||||||
| # succeed. | ||||||
| # Runs Boost's b2 build and install step. | ||||||
| # Fails if the caller has not successfully called `generate` on `SOURCE_DIR`. | ||||||
| # | ||||||
| # @param {string} GENERATE_DIR Directory containing boost's source and build files. | ||||||
| # Required parameters | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| # @param {string} BUILD_DIR Directory in which to build boost. | ||||||
| # @param {string} INSTALL_PREFIX Path prefix of where the project should be installed. | ||||||
| # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command. | ||||||
| # @param {string} SOURCE_DIR Directory containing boost's source and build files. | ||||||
| # | ||||||
| # Checksum parameters | ||||||
| # @param {string} [BUILD_CHECKSUM_FILE={{.BUILD_DIR}}.md5] Checksum file path for `BUILD_DIR`. | ||||||
| # @param {string} [INSTALL_CHECKSUM_FILE={{.INSTALL_PREFIX}}.md5] Checksum file path for | ||||||
| # `INSTALL_PREFIX` | ||||||
| # @param {string} [SOURCE_CHECKSUM_FILE={{.SOURCE_DIR}}.md5] Checksum file path for `SOURCE_DIR`. | ||||||
| # | ||||||
| # Build command parameters | ||||||
| # @param {int} [JOBS] The maximum number of concurrent processes to use when building. If | ||||||
| # omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the | ||||||
| # default is the number of cores. | ||||||
| # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings | ||||||
| # file should be stored. | ||||||
| # @param {string[]} [EXTRA_ARGS] Any additional arguments to pass to the build command. | ||||||
| build-and-install: | ||||||
| internal: true | ||||||
| label: "{{.TASK}}:{{.BUILD_DIR}}-{{.INSTALL_PREFIX}}" | ||||||
| vars: | ||||||
| # Checksum files | ||||||
| BUILD_CHECKSUM_FILE: >- | ||||||
| {{default (printf "%s.md5" .BUILD_DIR) .BUILD_CHECKSUM_FILE}} | ||||||
| INSTALL_CHECKSUM_FILE: >- | ||||||
| {{default (printf "%s.md5" .INSTALL_PREFIX) .INSTALL_CHECKSUM_FILE}} | ||||||
| SOURCE_CHECKSUM_FILE: >- | ||||||
| {{default (printf "%s.md5" .SOURCE_DIR) .SOURCE_CHECKSUM_FILE}} | ||||||
|
|
||||||
| EXTRA_ARGS: | ||||||
| ref: "default (list) .EXTRA_ARGS" | ||||||
| JOBS: >- | ||||||
| {{default "" .JOBS}} | ||||||
| SOURCE_SENTINEL_FILE: "{{.SOURCE_DIR}}/{{.TASK}}.sentinel" | ||||||
| requires: | ||||||
| vars: ["GENERATE_DIR", "BUILD_DIR", "INSTALL_PREFIX"] | ||||||
| vars: | ||||||
| - "BUILD_DIR" | ||||||
| - "INSTALL_PREFIX" | ||||||
| - "SOURCE_DIR" | ||||||
| sources: ["{{.TASKFILE}}"] | ||||||
| generates: | ||||||
| - "{{.BUILD_CHECKSUM_FILE}}" | ||||||
| - "{{.INSTALL_CHECKSUM_FILE}}" | ||||||
| - "{{.SOURCE_CHECKSUM_FILE}}" | ||||||
| - "{{.SOURCE_SENTINEL_FILE}}" | ||||||
| deps: | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| - task: "checksum:validate" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"] | ||||||
| - task: "checksum:validate" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"] | ||||||
| - task: "checksum:validate" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] | ||||||
| FAIL: "true" | ||||||
| cmds: | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| - >- | ||||||
| pushd "{{.GENERATE_DIR}}"; | ||||||
| pushd "{{.SOURCE_DIR}}"; | ||||||
| ./b2 | ||||||
| install | ||||||
| --build-dir="{{.BUILD_DIR}}" | ||||||
|
|
@@ -89,102 +127,80 @@ tasks: | |||||
| "-j{{.JOBS}}" | ||||||
| {{- end}}; | ||||||
| popd; | ||||||
| - >- | ||||||
| {{- if .CMAKE_SETTINGS_DIR}} | ||||||
| echo "set(Boost_ROOT | ||||||
| \"{{.INSTALL_PREFIX}}\" | ||||||
| CACHE PATH | ||||||
| \"Package root for Boost.\" | ||||||
| )" >> "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake" | ||||||
| {{- end}} | ||||||
| - "touch '{{.SOURCE_SENTINEL_FILE}}'" | ||||||
| - task: "checksum:compute" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.BUILD_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.BUILD_DIR}}"] | ||||||
| - task: "checksum:compute" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.INSTALL_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.INSTALL_PREFIX}}"] | ||||||
| - task: "checksum:compute" | ||||||
| vars: | ||||||
| CHECKSUM_FILE: "{{.SOURCE_CHECKSUM_FILE}}" | ||||||
| INCLUDE_PATTERNS: ["{{.SOURCE_DIR}}"] | ||||||
|
|
||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| # Downloads boost from `URL` and installs boost. | ||||||
| # Downloads Boost from `TAR_URL` and then generates, builds, and installs Boost inside `WORK_DIR`. | ||||||
| # If `CMAKE_SETTINGS_DIR` is set, a settings file will be created in that directory, containing a | ||||||
| # `Boost_ROOT` CMake variable that points to `INSTALL_PREFIX`. | ||||||
| # | ||||||
| # General parameters | ||||||
| # @param {string} [WORK_DIR={{.ROOT_DIR}}] Base directory in which to store the source, generate, | ||||||
| # build, and install directories. | ||||||
| # @param {string} [SOURCE_DIR={{.WORK_DIR}}/boost-src] Directory in which to extract the tar | ||||||
| # file. | ||||||
| # | ||||||
| # Download parameters | ||||||
| # @param {string} FILE_SHA256 Content hash to verify the downloaded tar file against. | ||||||
| # @param {string} URL | ||||||
| # @param {string} TAR_SHA256 Content hash to verify the downloaded tar file against. | ||||||
| # @param {string} TAR_URL URL of the tar file to download. | ||||||
| # @param {string} WORK_DIR Directory in which to store the source, build, and install directories. | ||||||
| # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings | ||||||
| # file should be stored. | ||||||
| # | ||||||
| # Boost generate parameters | ||||||
| # @param {string} [GENERATE_DIR={{.WORK_DIR}}/boost-generate] Directory in which to generate the | ||||||
| # project build files. | ||||||
| # @param {string} [GENERATE_CHECKSUM_FILE={{.WORK_DIR}}/boost-generate.md5] Checksum file for the | ||||||
| # generate directory. | ||||||
| # @param {string} [INSTALL_PREFIX={{.WORK_DIR}}/boost-install] Path prefix of where the project | ||||||
| # should be installed. | ||||||
| # @param {string[]} [TARGETS] Target libraries to build. | ||||||
| # Boost parameters | ||||||
| # @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build and | ||||||
| # install command. | ||||||
| # @param {string[]} [GENERATE_ARGS] Any additional arguments to pass to the generate command. | ||||||
| # | ||||||
| # Boost build-and-install parameters | ||||||
| # @param {string} [BUILD_DIR={{.WORK_DIR}}/boost-build] Directory in which to build the project. | ||||||
| # @param {int} [JOBS] The maximum number of concurrent processes to use when building. If | ||||||
| # omitted, the b2 default number is used. Before 1.76.0, the number was 1. Since 1.76.0, the | ||||||
| # default is the number of cores. | ||||||
| # @param {string[]} [BUILD_AND_INSTALL_ARGS] Any additional arguments to pass to boost's build | ||||||
| # and install command. | ||||||
| # @param {string} [CMAKE_SETTINGS_DIR] If set, the directory where the project's CMake settings | ||||||
| # file should be stored. | ||||||
| # @param {string[]} [TARGETS] Target libraries to build. | ||||||
| download-and-install: | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
| internal: true | ||||||
| label: "{{.TASK}}:{{.URL}}-{{.INSTALL_PREFIX}}" | ||||||
| label: "{{.TASK}}:{{.TAR_URL}}-{{.WORK_DIR}}" | ||||||
| vars: | ||||||
| # General parameters | ||||||
| WORK_DIR: >- | ||||||
| {{default .ROOT_DIR .WORK_DIR}} | ||||||
| SOURCE_DIR: >- | ||||||
| {{default (printf "%s/boost-src" .WORK_DIR) .SOURCE_DIR}} | ||||||
|
|
||||||
| # Boost generate parameters | ||||||
| GENERATE_DIR: >- | ||||||
| {{default (printf "%s/boost-generate" .WORK_DIR) .GENERATE_DIR}} | ||||||
| GENERATE_CHECKSUM_FILE: >- | ||||||
| {{default (printf "%s/boost-generate.md5" .WORK_DIR) .GENERATE_CHECKSUM_FILE}} | ||||||
| INSTALL_PREFIX: >- | ||||||
| {{default (printf "%s/boost-install" .WORK_DIR) .INSTALL_PREFIX}} | ||||||
| TARGETS: | ||||||
| ref: "default (list) .TARGETS" | ||||||
| GENERATE_ARGS: | ||||||
| ref: "default (list) .GENERATE_ARGS" | ||||||
|
|
||||||
| # Boost build-and-install parameters | ||||||
| BUILD_DIR: >- | ||||||
| {{default (printf "%s/boost-build" .WORK_DIR) .BUILD_DIR}} | ||||||
| BUILD_AND_INSTALL_ARGS: | ||||||
| ref: "default (list) .BUILD_AND_INSTALL_ARGS" | ||||||
| JOBS: >- | ||||||
| {{default "" .JOBS}} | ||||||
| CMAKE_SETTINGS_DIR: >- | ||||||
| {{default "" .CMAKE_SETTINGS_DIR}} | ||||||
| # Directory parameters | ||||||
| BUILD_DIR: "{{.WORK_DIR}}/boost-build" | ||||||
| INSTALL_PREFIX: "{{.WORK_DIR}}/boost-install" | ||||||
| SOURCE_DIR: "{{.WORK_DIR}}/boost-src" | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
if we want to keep it consistent among libs |
||||||
| requires: | ||||||
| vars: ["FILE_SHA256", "URL"] | ||||||
| vars: | ||||||
| - "TAR_SHA256" | ||||||
| - "TAR_URL" | ||||||
| - "WORK_DIR" | ||||||
| deps: | ||||||
| - task: "remote:download-and-extract-tar" | ||||||
| vars: | ||||||
| FILE_SHA256: "{{.FILE_SHA256}}" | ||||||
| FILE_SHA256: "{{.TAR_SHA256}}" | ||||||
| OUTPUT_DIR: "{{.SOURCE_DIR}}" | ||||||
| URL: "{{.URL}}" | ||||||
| URL: "{{.TAR_URL}}" | ||||||
| cmds: | ||||||
| - task: "generate" | ||||||
| vars: | ||||||
| SOURCE_DIR: "{{.SOURCE_DIR}}" | ||||||
| GENERATE_DIR: "{{.GENERATE_DIR}}" | ||||||
| GENERATE_CHECKSUM_FILE: "{{.GENERATE_CHECKSUM_FILE}}" | ||||||
| INSTALL_PREFIX: "{{.INSTALL_PREFIX}}" | ||||||
| SOURCE_DIR: "{{.SOURCE_DIR}}" | ||||||
| TARGETS: | ||||||
| ref: ".TARGETS" | ||||||
| EXTRA_ARGS: | ||||||
| ref: ".GENERATE_ARGS" | ||||||
| - task: "build-and-install" | ||||||
| vars: | ||||||
| GENERATE_DIR: "{{.GENERATE_DIR}}" | ||||||
| BUILD_DIR: "{{.BUILD_DIR}}" | ||||||
| INSTALL_PREFIX: "{{.INSTALL_PREFIX}}" | ||||||
| SOURCE_DIR: "{{.SOURCE_DIR}}" | ||||||
| EXTRA_ARGS: | ||||||
| ref: ".BUILD_AND_INSTALL_ARGS" | ||||||
| JOBS: "{{.JOBS}}" | ||||||
| CMAKE_SETTINGS_DIR: "{{.CMAKE_SETTINGS_DIR}}" | ||||||
| - >- | ||||||
| {{- if .CMAKE_SETTINGS_DIR}} | ||||||
| echo "set(Boost_ROOT | ||||||
| \"{{.INSTALL_PREFIX}}\" | ||||||
| CACHE PATH | ||||||
| \"Package root for Boost.\" | ||||||
| )" > "{{.CMAKE_SETTINGS_DIR}}/Boost.cmake" | ||||||
| {{- end}} | ||||||
davidlion marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.