Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
41ddde3
chore: ignore vcpkg trees, ARM64EC output and local R installs
Sep 3, 2026
53348a1
build: upgrade protobuf to 5.29 (C++) and 3.21 (JavaScript)
Sep 3, 2026
6a47d0d
R: store controlr.cc as UTF-8
Sep 3, 2026
62ef3fa
build: retarget to the v145 toolset and add ARM64EC configurations
Sep 3, 2026
6b65cab
R: replace the hard-coded 3.5 version test with a minimum-version gate
Sep 3, 2026
65fb04c
R: select console output encoding at runtime from the hosted R version
Sep 3, 2026
b5d6f90
build: compile ControlR against R 4.5.2
Sep 3, 2026
57d94a8
console: strip CRAN markup from package names, gate untranslated logging
Sep 3, 2026
30fa743
docs: describe the build, the R version policy, and the modernisation…
Sep 3, 2026
560597d
build: mark R's exported variables as DATA so the ARM64X import libra…
Sep 3, 2026
348ea75
build: tag the add-in version with the branch and build time
Sep 3, 2026
348ed12
console: skip the release update check for tagged development builds
Sep 3, 2026
b72f036
console: move to Electron 44, TypeScript 7 and Monaco 0.56
Sep 3, 2026
db32af0
console: update rxjs, xterm, protobuf and the smaller libraries
Sep 3, 2026
6df1c39
docs: record the console upgrade and the npm build
Sep 3, 2026
ab13c71
console: use navigator.clipboard; R: parse only the numeric part of t…
Sep 3, 2026
cddad5e
R: handle string encoding explicitly on every R version
Sep 3, 2026
4a1043d
R: run with the UTF-8 code page, and send console text by length
Sep 3, 2026
f3c8093
installer: 64-bit only, no bundled R, settings kept on upgrade; relea…
Sep 3, 2026
37022d4
build: link protobuf statically so the binaries need no VC++ redistri…
Sep 3, 2026
085334f
console: restore cut, copy and paste in the editor and the Edit menu
Sep 3, 2026
d88e8e8
Excel function help: fix single-line descriptions, document, export f…
Sep 3, 2026
a6db336
docs: record that the IntelliSense tooltip was tested end to end
Sep 3, 2026
d560d97
installer: make function help an optional component, and look harder …
Sep 3, 2026
45266d6
add-in: fix the console coming back blank when it is shown again
Sep 3, 2026
a20d915
console: fix the package installer, and make the list readable
Sep 3, 2026
8b06fad
console: reach the menus from the devtools console under dev flags
Sep 3, 2026
424b049
Ask before closing a file with unsaved changes
Sep 3, 2026
76b617e
Space out alert answers
Sep 3, 2026
4fdb756
add-in: hand R's callbacks to the thread that is waiting for them
Sep 4, 2026
b62bfac
R: fix argument completion on R 4.3 and later
Sep 4, 2026
21678a8
docs: keep a changelog, and show it in the console
Sep 4, 2026
d53a14f
version: 2.4.3-r7
Sep 4, 2026
13e9d8e
R: let console completion fail quietly on a future R
Sep 4, 2026
5bbb1c1
console: put split frames back together
Sep 4, 2026
4f95474
R: offer at most 500 completions
Sep 4, 2026
e9373e8
console: ask for completions once typing pauses
Sep 4, 2026
106e298
changelog and version: 2.4.3-r8
Sep 4, 2026
f76d2c0
console: show the release notes that are on disk
Sep 4, 2026
8aa0c8d
console: load monaco through script tags, not node's vm
Sep 4, 2026
da4db5f
readme: say what this fork is, and stop sending people upstream
Sep 4, 2026
e49ce5c
ci: build the console and check startup.R on every push
Sep 4, 2026
ccf48a2
ci: turn on vcpkg's msbuild integration for the native job
Sep 4, 2026
6a12bc1
build: pin the vcpkg baseline for every project, not just the add-in
Sep 4, 2026
b18e928
ci: build the controller against R 4.5.2, the version the tree supports
Sep 4, 2026
c266cd4
say plainly that this supports R 3.5 to 4.5, and not 4.6
Sep 4, 2026
b97f0a3
R: match ReadConsole's signature to the R headers, not a patched copy
Sep 4, 2026
360cc3a
ci: park the native job, and write down why
Sep 4, 2026
6dbc54b
changelog and version: 2.4.3-r9
Sep 4, 2026
aeaef3e
support R 4.6, and ship a graphics module for each R series
Sep 4, 2026
8687f07
build: $home is read-only in powershell
Sep 4, 2026
8c03b14
ci: build the graphics modules for every R series
Sep 4, 2026
57d29d0
ci: the module cleanup step killed every build
Sep 4, 2026
feaa79a
changelog: say exactly what works on each version of R
Sep 4, 2026
995a8aa
ci: take the R series from the matrix, not from asking R
Sep 4, 2026
92d2d5f
ci: call R.exe, not R
Sep 4, 2026
9395ce7
2.4.3-r11: a graphics module for every supported R
Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

# excel add-in, binary
*.xlam binary
95 changes: 95 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
name: CI

# What is built here, and what is not
#
# The console and the R-side checks run on every push. Neither native binary
# is built, for different reasons.
#
# The add-in cannot be built at all: XLCALL.H and XLCALL.CPP come from
# Microsoft's Excel XLL SDK and BERT/.gitignore deliberately keeps them out of
# the repository, so BERT64.xll is not buildable from a clean checkout by
# anyone, CI included.
#
# The controller can be built, but not yet here. It was tried, and the attempt
# is worth recording because it found two real faults before it ran out of
# road -- the vcpkg baseline was pinned for the add-in only, so a standalone
# controller build resolved a protobuf incompatible with the checked-in
# generated code; and R_ReadConsole carried R 3.5's signature and compiled
# locally only because a header in the local R tree had been edited by hand.
# Both are fixed.
#
# What the attempt needed, if anyone picks it up again:
#
# r-lib/actions/setup-r@v2 with r-version 4.5.2 (not 'release': R 4.6
# removed Rf_isFrame and changed the ReadConsole callback signature)
# BertRHome pointed at that R, for its headers; the import libraries are
# checked in, so no .lib generation is needed
# vcpkg integrate install, because hosted runners ship vcpkg unintegrated
# and manifest mode otherwise restores nothing
# /p:PlatformToolset=v143, because the tree targets v145 (VS 2026) and
# hosted runners carry VS 2022
#
# Where it stops: the link fails with an unresolved __std_rotate out of
# libprotobuf and abseil, which is a C runtime mismatch -- vcpkg resolves
# protobuf:x64-windows (dynamic CRT) on the runner while the project links
# the static CRT. Forcing /p:VcpkgTriplet=x64-windows-static is the obvious
# next thing to try. It was not pursued: with the add-in unbuildable anyway,
# a controller-only build earns less than the time it costs, and the native
# build is exercised locally by Install/build-release.ps1 on every release.

on:
push:
branches: [master, console-upgrade]
pull_request:
workflow_dispatch:

jobs:

console:
name: console (typescript + styles)
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
cache-dependency-path: Console/package-lock.json

- name: install
working-directory: Console
run: npm ci

- name: build
working-directory: Console
run: npm run build

- name: the build produced something
working-directory: Console
shell: pwsh
run: |
$js = Get-ChildItem build -Recurse -Filter *.js -ErrorAction SilentlyContinue
if (-not $js) { throw "no javascript in Console/build" }
if (-not (Test-Path build/style.css)) { throw "no build/style.css" }
"compiled $($js.Count) files, $([math]::Round((Get-Item build/style.css).Length / 1kb)) kB of css"

r-checks:
name: startup.R on R ${{ matrix.r }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
# the oldest R the controller will start against, the version that
# began warning about length-2 conditions, the one that made it an
# error, and current
r: ['3.6.3', '4.2.3', '4.3.3', 'release']
steps:
- uses: actions/checkout@v4

- uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.r }}

- name: startup.R checks
run: Rscript tests/startup-guard.R
84 changes: 84 additions & 0 deletions .github/workflows/modules.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: graphics modules

# BERTModule is compiled against R's graphics engine, and R checks that
# version whenever a graphics device is created -- so a module built for one R
# series cannot draw on another, and the install ships one per series.
#
# Building them locally means an R installation and its matching Rtools for
# every series, which is well over a gigabyte of downloads. Runners can do it
# instead: setup-r installs the right Rtools for each version. Each job
# uploads its module as an artifact, and Install/build-release.ps1 -FetchModules
# collects them into Build/module for packaging.

on:
workflow_dispatch:
push:
paths:
- 'Module/**'
- '.github/workflows/modules.yml'

jobs:

module:
name: BERTModule for R ${{ matrix.r }}
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
# one per series BERT supports. old versions are allowed to fail
# without failing the run: the toolchains for them are ancient and
# may not be installable for ever.
r: ['4.6.1', '4.5.2', '4.4.3', '4.3.3', '4.2.3']
include:
- r: '3.5.3'
optional: true
continue-on-error: ${{ matrix.optional == true }}
steps:
- uses: actions/checkout@v4

- uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.r }}
# the matching toolchain; setup-r picks rtools by R version
update-rtools: true

- name: build the module
shell: pwsh
run: |
# the series comes from the matrix, not from asking R: one less
# thing to go wrong before anything has been built
$series = ("${{ matrix.r }}" -split '\.')[0..1] -join '.'
Write-Host "building BERTModule for R $series"
"SERIES=$series" | Out-File -FilePath $env:GITHUB_ENV -Append

Write-Host "R on this runner:"
& Rscript --vanilla -e "cat(R.version.string)"

# a module must never be relinked from objects compiled against
# another R. github runs pwsh with ErrorActionPreference=Stop, so
# guard the case where there is nothing to clean.
if (Test-Path Module/src) {
$stale = Get-ChildItem -Path Module/src/* -Include *.o, *.dll -File -ErrorAction Ignore
if ($stale) { $stale | Remove-Item -Force }
}

New-Item -ItemType Directory -Force "out/$series" | Out-Null
# R.exe, not R: powershell aliases R to Invoke-History, so "& R CMD"
# silently runs the wrong thing
& R.exe CMD INSTALL --library="out/$series" --no-multiarch Module
if ($LASTEXITCODE) { throw "R CMD INSTALL failed for R $series" }

- name: check what it was built against
shell: pwsh
run: |
$desc = (Get-Content "out/$env:SERIES/BERTModule/DESCRIPTION" | Select-String "^Built:").ToString()
Write-Host $desc
if ($desc -notmatch "R $([regex]::Escape($env:SERIES))") {
throw "module reports '$desc' but should be built for R $env:SERIES"
}

- uses: actions/upload-artifact@v4
with:
name: BERTModule-${{ env.SERIES }}
path: out/${{ env.SERIES }}
if-no-files-found: error
44 changes: 44 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,47 @@ BERTModule_*.gz
notes.md

yarn-error.log

# ---------------------------------------------------------------------------
# added on the r4-support branch
# ---------------------------------------------------------------------------

# vcpkg manifest-mode install trees. these are regenerated from vcpkg.json
# and vcpkg-configuration.json; they run to hundreds of megabytes each.
vcpkg_installed/

# R distributions used as build inputs (headers + import libs). these are
# local installs, not part of the source tree. see docs/BUILDING.md.
/R-3.5.0/
/R-4.5.2/

# visual studio per-user and per-machine state
.vs/
*.vcxproj.user

# build output directories, all platforms
[Xx]64/
Win32/
ARM64/
ARM64EC/

# editor-local settings and scratch notes
.vscode/

# local archives and scratch copies
*.7z
Console/generated/variable_pb_new.js
Console/generated/variable_pb_old.js

# release outputs (Install/build-release.ps1)
Install/BERT-Installer-*.exe
Install/BERT-*.zip
Install/build-log.txt

# R CMD INSTALL byproducts in the module source
Module/src/*.dll
Module/src/*.o

# the third-party add-in the optional help feature ships; build-release.ps1
# downloads and verifies it
Install/ExcelDna.IntelliSense64.xll
3 changes: 3 additions & 0 deletions BERT/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ enc_temp_folder

*.exe
*.xll
ARM64
ARM64EC
vcpkg_installed
26 changes: 20 additions & 6 deletions BERT/BERT.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2002
# Visual Studio Version 18
VisualStudioVersion = 18.1.11312.151
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BERT", "BERT\BERT.vcxproj", "{0CA760D0-16BE-4A7E-A1BF-7296BF699485}"
ProjectSection(ProjectDependencies) = postProject
Expand All @@ -21,44 +21,58 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ControlJulia07", "..\Contro
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64EC = Debug|ARM64EC
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM64EC = Release|ARM64EC
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x64.ActiveCfg = Debug|x64
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x64.Build.0 = Debug|x64
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Debug|x86.ActiveCfg = Debug|Win32
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|ARM64EC.Build.0 = Release|ARM64EC
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x64.ActiveCfg = Release|x64
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x64.Build.0 = Release|x64
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x86.ActiveCfg = Release|Win32
{0CA760D0-16BE-4A7E-A1BF-7296BF699485}.Release|x86.Build.0 = Release|Win32
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x64.ActiveCfg = Debug|x64
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x64.Build.0 = Debug|x64
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Debug|x86.ActiveCfg = Debug|Win32
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|ARM64EC.Build.0 = Release|ARM64EC
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x64.ActiveCfg = Release|x64
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x64.Build.0 = Release|x64
{ADE9DA3C-93BF-4469-83B7-FBC015B6497F}.Release|x86.ActiveCfg = Release|Win32
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x64.ActiveCfg = Debug|x64
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x64.Build.0 = Debug|x64
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Debug|x86.ActiveCfg = Debug|Win32
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|ARM64EC.Build.0 = Release|ARM64EC
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x64.ActiveCfg = Release|x64
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x64.Build.0 = Release|x64
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x86.ActiveCfg = Release|Win32
{3FAA4E29-8871-445F-9068-BF6518C295B5}.Release|x86.Build.0 = Release|Win32
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x64.ActiveCfg = Debug|x64
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x64.Build.0 = Debug|x64
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Debug|x86.ActiveCfg = Debug|Win32
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x64.ActiveCfg = Release|x64
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x64.Build.0 = Release|x64
{3F1862DE-C93C-4980-84E1-D69792BF271F}.Release|x86.ActiveCfg = Release|Win32
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x64.ActiveCfg = Debug|x64
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x64.Build.0 = Debug|x64
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x86.ActiveCfg = Debug|Win32
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Debug|x86.Build.0 = Debug|Win32
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x64.ActiveCfg = Release|x64
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x64.Build.0 = Release|x64
{E94424C4-D404-42CC-8D18-EF3462C4D7FB}.Release|x86.ActiveCfg = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
Expand Down
Loading