summaryrefslogtreecommitdiff
path: root/editors/microsoft-edit
diff options
context:
space:
mode:
Diffstat (limited to 'editors/microsoft-edit')
-rw-r--r--editors/microsoft-edit/Makefile18
-rw-r--r--editors/microsoft-edit/Makefile.crates42
-rw-r--r--editors/microsoft-edit/distinfo90
-rw-r--r--editors/microsoft-edit/files/patch-assets_com.microsoft.edit.desktop13
-rw-r--r--editors/microsoft-edit/files/patch-assets_manpage_edit.129
-rw-r--r--editors/microsoft-edit/files/patch-src_lib.rs10
-rw-r--r--editors/microsoft-edit/files/patch-src_sys_unix.rs97
-rw-r--r--editors/microsoft-edit/files/patch-src_tui.rs421
-rw-r--r--editors/microsoft-edit/pkg-plist6
9 files changed, 123 insertions, 603 deletions
diff --git a/editors/microsoft-edit/Makefile b/editors/microsoft-edit/Makefile
index 97ea85cf8af0..26ff741b2bfa 100644
--- a/editors/microsoft-edit/Makefile
+++ b/editors/microsoft-edit/Makefile
@@ -1,7 +1,7 @@
PORTNAME= microsoft-edit
DISTVERSIONPREFIX= v
-DISTVERSION= 1.0.0
-PORTREVISION= 1
+DISTVERSION= 1.2.0
+PORTREVISION= 3
CATEGORIES= editors
MAINTAINER= nobutaka@FreeBSD.org
@@ -11,23 +11,17 @@ WWW= https://github.com/microsoft/edit
LICENSE= MIT
LICENSE_FILE= ${WRKSRC}/LICENSE
-USES= cargo
+USES= cargo desktop-file-utils
USE_GITHUB= yes
GH_ACCOUNT= microsoft
GH_PROJECT= edit
-BUILD_DEPENDS= rust-nightly>0:lang/rust-nightly
-CARGO_BUILDDEP= no
+CARGO_ENV+= RUSTC_BOOTSTRAP=1
PORTDOCS= CODE_OF_CONDUCT.md CONTRIBUTING.md README.md SECURITY.md
OPTIONS_DEFINE= DOCS
-PLIST_FILES= bin/edit \
- bin/msedit \
- share/man/man1/edit.1.gz \
- share/man/man1/msedit.1.gz
-
post-install-DOCS-on:
@${MKDIR} ${STAGEDIR}${DOCSDIR}
${INSTALL_DATA} ${PORTDOCS:S|^|${WRKSRC}/|} ${STAGEDIR}${DOCSDIR}
@@ -36,5 +30,9 @@ post-install:
${RLN} ${STAGEDIR}${PREFIX}/bin/edit ${STAGEDIR}${PREFIX}/bin/msedit
${INSTALL_MAN} ${WRKSRC}/assets/manpage/edit.1 ${STAGEDIR}${PREFIX}/share/man/man1
${RLN} ${STAGEDIR}${PREFIX}/share/man/man1/edit.1 ${STAGEDIR}${PREFIX}/share/man/man1/msedit.1
+ ${MKDIR} ${STAGEDIR}${PREFIX}/share/applications
+ ${INSTALL_DATA} ${WRKSRC}/assets/com.microsoft.edit.desktop ${STAGEDIR}${PREFIX}/share/applications/
+ ${MKDIR} ${STAGEDIR}${PREFIX}/share/icons/hicolor/scalable/apps
+ ${INSTALL_DATA} ${WRKSRC}/assets/edit.svg ${STAGEDIR}${PREFIX}/share/icons/hicolor/scalable/apps/msedit.svg
.include <bsd.port.mk>
diff --git a/editors/microsoft-edit/Makefile.crates b/editors/microsoft-edit/Makefile.crates
index 98c885e1a155..804a589b85e6 100644
--- a/editors/microsoft-edit/Makefile.crates
+++ b/editors/microsoft-edit/Makefile.crates
@@ -2,55 +2,70 @@ CARGO_CRATES= aho-corasick-1.1.3 \
anes-0.1.6 \
anstyle-1.0.10 \
autocfg-1.4.0 \
+ bitflags-2.9.1 \
bumpalo-3.17.0 \
cast-0.3.0 \
+ cc-1.2.25 \
cfg-if-1.0.0 \
ciborium-0.2.2 \
ciborium-io-0.2.2 \
ciborium-ll-0.2.2 \
- clap-4.5.35 \
- clap_builder-4.5.35 \
+ clap-4.5.39 \
+ clap_builder-4.5.39 \
clap_lex-0.7.4 \
- criterion-0.5.1 \
+ criterion-0.6.0 \
criterion-plot-0.5.0 \
crossbeam-deque-0.8.6 \
crossbeam-epoch-0.9.18 \
crossbeam-utils-0.8.21 \
crunchy-0.2.3 \
either-1.15.0 \
+ equivalent-1.0.2 \
+ getrandom-0.3.3 \
half-2.6.0 \
- hermit-abi-0.5.0 \
- is-terminal-0.4.16 \
+ hashbrown-0.15.3 \
+ indexmap-2.9.0 \
itertools-0.10.5 \
+ itertools-0.13.0 \
itoa-1.0.15 \
+ jobserver-0.1.33 \
js-sys-0.3.77 \
- libc-0.2.171 \
+ libc-0.2.172 \
log-0.4.27 \
memchr-2.7.4 \
num-traits-0.2.19 \
once_cell-1.21.3 \
oorandom-11.1.5 \
+ pkg-config-0.3.32 \
plotters-0.3.7 \
plotters-backend-0.3.7 \
plotters-svg-0.3.7 \
- proc-macro2-1.0.94 \
+ proc-macro2-1.0.95 \
quote-1.0.40 \
+ r-efi-5.2.0 \
rayon-1.10.0 \
rayon-core-1.12.1 \
regex-1.11.1 \
regex-automata-0.4.9 \
regex-syntax-0.8.5 \
- rustversion-1.0.20 \
+ rustversion-1.0.21 \
ryu-1.0.20 \
same-file-1.0.6 \
serde-1.0.219 \
serde_derive-1.0.219 \
serde_json-1.0.140 \
- syn-2.0.100 \
+ serde_spanned-0.6.8 \
+ shlex-1.3.0 \
+ syn-2.0.101 \
tinytemplate-1.2.1 \
- toml-0.5.11 \
+ toml-0.8.22 \
+ toml_datetime-0.6.9 \
+ toml_edit-0.22.26 \
+ toml_write-0.1.1 \
unicode-ident-1.0.18 \
+ version_check-0.9.5 \
walkdir-2.5.0 \
+ wasi-0.14.2+wasi-0.2.4 \
wasm-bindgen-0.2.100 \
wasm-bindgen-backend-0.2.100 \
wasm-bindgen-macro-0.2.100 \
@@ -68,4 +83,9 @@ CARGO_CRATES= aho-corasick-1.1.3 \
windows_x86_64_gnu-0.52.6 \
windows_x86_64_gnullvm-0.52.6 \
windows_x86_64_msvc-0.52.6 \
- winres-0.1.12
+ winnow-0.7.10 \
+ winresource-0.1.22 \
+ wit-bindgen-rt-0.39.0 \
+ zstd-0.13.3 \
+ zstd-safe-7.2.4 \
+ zstd-sys-2.0.15+zstd.1.5.7
diff --git a/editors/microsoft-edit/distinfo b/editors/microsoft-edit/distinfo
index b13edffb06a3..4929a17c91eb 100644
--- a/editors/microsoft-edit/distinfo
+++ b/editors/microsoft-edit/distinfo
@@ -1,4 +1,4 @@
-TIMESTAMP = 1748176479
+TIMESTAMP = 1749863433
SHA256 (rust/crates/aho-corasick-1.1.3.crate) = 8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916
SIZE (rust/crates/aho-corasick-1.1.3.crate) = 183311
SHA256 (rust/crates/anes-0.1.6.crate) = 4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299
@@ -7,10 +7,14 @@ SHA256 (rust/crates/anstyle-1.0.10.crate) = 55cc3b69f167a1ef2e161439aa98aed94e60
SIZE (rust/crates/anstyle-1.0.10.crate) = 15725
SHA256 (rust/crates/autocfg-1.4.0.crate) = ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26
SIZE (rust/crates/autocfg-1.4.0.crate) = 17712
+SHA256 (rust/crates/bitflags-2.9.1.crate) = 1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967
+SIZE (rust/crates/bitflags-2.9.1.crate) = 47913
SHA256 (rust/crates/bumpalo-3.17.0.crate) = 1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf
SIZE (rust/crates/bumpalo-3.17.0.crate) = 91975
SHA256 (rust/crates/cast-0.3.0.crate) = 37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5
SIZE (rust/crates/cast-0.3.0.crate) = 11452
+SHA256 (rust/crates/cc-1.2.25.crate) = d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951
+SIZE (rust/crates/cc-1.2.25.crate) = 106594
SHA256 (rust/crates/cfg-if-1.0.0.crate) = baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd
SIZE (rust/crates/cfg-if-1.0.0.crate) = 7934
SHA256 (rust/crates/ciborium-0.2.2.crate) = 42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e
@@ -19,14 +23,14 @@ SHA256 (rust/crates/ciborium-io-0.2.2.crate) = 05afea1e0a06c9be33d539b876f1ce369
SIZE (rust/crates/ciborium-io-0.2.2.crate) = 6697
SHA256 (rust/crates/ciborium-ll-0.2.2.crate) = 57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9
SIZE (rust/crates/ciborium-ll-0.2.2.crate) = 14695
-SHA256 (rust/crates/clap-4.5.35.crate) = d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944
-SIZE (rust/crates/clap-4.5.35.crate) = 56970
-SHA256 (rust/crates/clap_builder-4.5.35.crate) = 2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9
-SIZE (rust/crates/clap_builder-4.5.35.crate) = 168525
+SHA256 (rust/crates/clap-4.5.39.crate) = fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f
+SIZE (rust/crates/clap-4.5.39.crate) = 57328
+SHA256 (rust/crates/clap_builder-4.5.39.crate) = 89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51
+SIZE (rust/crates/clap_builder-4.5.39.crate) = 169142
SHA256 (rust/crates/clap_lex-0.7.4.crate) = f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6
SIZE (rust/crates/clap_lex-0.7.4.crate) = 12858
-SHA256 (rust/crates/criterion-0.5.1.crate) = f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f
-SIZE (rust/crates/criterion-0.5.1.crate) = 110088
+SHA256 (rust/crates/criterion-0.6.0.crate) = 3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679
+SIZE (rust/crates/criterion-0.6.0.crate) = 119470
SHA256 (rust/crates/criterion-plot-0.5.0.crate) = 6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1
SIZE (rust/crates/criterion-plot-0.5.0.crate) = 22706
SHA256 (rust/crates/crossbeam-deque-0.8.6.crate) = 9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51
@@ -39,20 +43,28 @@ SHA256 (rust/crates/crunchy-0.2.3.crate) = 43da5946c66ffcc7745f48db692ffbb10a83b
SIZE (rust/crates/crunchy-0.2.3.crate) = 3775
SHA256 (rust/crates/either-1.15.0.crate) = 48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719
SIZE (rust/crates/either-1.15.0.crate) = 20114
+SHA256 (rust/crates/equivalent-1.0.2.crate) = 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+SIZE (rust/crates/equivalent-1.0.2.crate) = 7419
+SHA256 (rust/crates/getrandom-0.3.3.crate) = 26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4
+SIZE (rust/crates/getrandom-0.3.3.crate) = 49493
SHA256 (rust/crates/half-2.6.0.crate) = 459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9
SIZE (rust/crates/half-2.6.0.crate) = 59507
-SHA256 (rust/crates/hermit-abi-0.5.0.crate) = fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e
-SIZE (rust/crates/hermit-abi-0.5.0.crate) = 17480
-SHA256 (rust/crates/is-terminal-0.4.16.crate) = e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9
-SIZE (rust/crates/is-terminal-0.4.16.crate) = 7811
+SHA256 (rust/crates/hashbrown-0.15.3.crate) = 84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3
+SIZE (rust/crates/hashbrown-0.15.3.crate) = 140413
+SHA256 (rust/crates/indexmap-2.9.0.crate) = cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e
+SIZE (rust/crates/indexmap-2.9.0.crate) = 91214
SHA256 (rust/crates/itertools-0.10.5.crate) = b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473
SIZE (rust/crates/itertools-0.10.5.crate) = 115354
+SHA256 (rust/crates/itertools-0.13.0.crate) = 413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186
+SIZE (rust/crates/itertools-0.13.0.crate) = 146261
SHA256 (rust/crates/itoa-1.0.15.crate) = 4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c
SIZE (rust/crates/itoa-1.0.15.crate) = 11231
+SHA256 (rust/crates/jobserver-0.1.33.crate) = 38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a
+SIZE (rust/crates/jobserver-0.1.33.crate) = 29136
SHA256 (rust/crates/js-sys-0.3.77.crate) = 1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f
SIZE (rust/crates/js-sys-0.3.77.crate) = 55538
-SHA256 (rust/crates/libc-0.2.171.crate) = c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6
-SIZE (rust/crates/libc-0.2.171.crate) = 785246
+SHA256 (rust/crates/libc-0.2.172.crate) = d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa
+SIZE (rust/crates/libc-0.2.172.crate) = 791646
SHA256 (rust/crates/log-0.4.27.crate) = 13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94
SIZE (rust/crates/log-0.4.27.crate) = 48120
SHA256 (rust/crates/memchr-2.7.4.crate) = 78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3
@@ -63,16 +75,20 @@ SHA256 (rust/crates/once_cell-1.21.3.crate) = 42f5e15c9953c5e4ccceeb2e7382a71648
SIZE (rust/crates/once_cell-1.21.3.crate) = 34534
SHA256 (rust/crates/oorandom-11.1.5.crate) = d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e
SIZE (rust/crates/oorandom-11.1.5.crate) = 23750
+SHA256 (rust/crates/pkg-config-0.3.32.crate) = 7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c
+SIZE (rust/crates/pkg-config-0.3.32.crate) = 21370
SHA256 (rust/crates/plotters-0.3.7.crate) = 5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747
SIZE (rust/crates/plotters-0.3.7.crate) = 149031
SHA256 (rust/crates/plotters-backend-0.3.7.crate) = df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a
SIZE (rust/crates/plotters-backend-0.3.7.crate) = 13709
SHA256 (rust/crates/plotters-svg-0.3.7.crate) = 51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670
SIZE (rust/crates/plotters-svg-0.3.7.crate) = 6715
-SHA256 (rust/crates/proc-macro2-1.0.94.crate) = a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84
-SIZE (rust/crates/proc-macro2-1.0.94.crate) = 52391
+SHA256 (rust/crates/proc-macro2-1.0.95.crate) = 02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778
+SIZE (rust/crates/proc-macro2-1.0.95.crate) = 51820
SHA256 (rust/crates/quote-1.0.40.crate) = 1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d
SIZE (rust/crates/quote-1.0.40.crate) = 31063
+SHA256 (rust/crates/r-efi-5.2.0.crate) = 74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5
+SIZE (rust/crates/r-efi-5.2.0.crate) = 64764
SHA256 (rust/crates/rayon-1.10.0.crate) = b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa
SIZE (rust/crates/rayon-1.10.0.crate) = 180155
SHA256 (rust/crates/rayon-core-1.12.1.crate) = 1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2
@@ -83,8 +99,8 @@ SHA256 (rust/crates/regex-automata-0.4.9.crate) = 809e8dc61f6de73b46c85f4c964863
SIZE (rust/crates/regex-automata-0.4.9.crate) = 618525
SHA256 (rust/crates/regex-syntax-0.8.5.crate) = 2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c
SIZE (rust/crates/regex-syntax-0.8.5.crate) = 357541
-SHA256 (rust/crates/rustversion-1.0.20.crate) = eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2
-SIZE (rust/crates/rustversion-1.0.20.crate) = 20666
+SHA256 (rust/crates/rustversion-1.0.21.crate) = 8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d
+SIZE (rust/crates/rustversion-1.0.21.crate) = 21001
SHA256 (rust/crates/ryu-1.0.20.crate) = 28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f
SIZE (rust/crates/ryu-1.0.20.crate) = 48738
SHA256 (rust/crates/same-file-1.0.6.crate) = 93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502
@@ -95,16 +111,30 @@ SHA256 (rust/crates/serde_derive-1.0.219.crate) = 5b0276cf7f2c73365f7157c8123c21
SIZE (rust/crates/serde_derive-1.0.219.crate) = 57798
SHA256 (rust/crates/serde_json-1.0.140.crate) = 20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373
SIZE (rust/crates/serde_json-1.0.140.crate) = 154852
-SHA256 (rust/crates/syn-2.0.100.crate) = b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0
-SIZE (rust/crates/syn-2.0.100.crate) = 297947
+SHA256 (rust/crates/serde_spanned-0.6.8.crate) = 87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1
+SIZE (rust/crates/serde_spanned-0.6.8.crate) = 9330
+SHA256 (rust/crates/shlex-1.3.0.crate) = 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64
+SIZE (rust/crates/shlex-1.3.0.crate) = 18713
+SHA256 (rust/crates/syn-2.0.101.crate) = 8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf
+SIZE (rust/crates/syn-2.0.101.crate) = 299250
SHA256 (rust/crates/tinytemplate-1.2.1.crate) = be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc
SIZE (rust/crates/tinytemplate-1.2.1.crate) = 26490
-SHA256 (rust/crates/toml-0.5.11.crate) = f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234
-SIZE (rust/crates/toml-0.5.11.crate) = 54910
+SHA256 (rust/crates/toml-0.8.22.crate) = 05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae
+SIZE (rust/crates/toml-0.8.22.crate) = 76224
+SHA256 (rust/crates/toml_datetime-0.6.9.crate) = 3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3
+SIZE (rust/crates/toml_datetime-0.6.9.crate) = 12622
+SHA256 (rust/crates/toml_edit-0.22.26.crate) = 310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e
+SIZE (rust/crates/toml_edit-0.22.26.crate) = 121714
+SHA256 (rust/crates/toml_write-0.1.1.crate) = bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076
+SIZE (rust/crates/toml_write-0.1.1.crate) = 17467
SHA256 (rust/crates/unicode-ident-1.0.18.crate) = 5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512
SIZE (rust/crates/unicode-ident-1.0.18.crate) = 47743
+SHA256 (rust/crates/version_check-0.9.5.crate) = 0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a
+SIZE (rust/crates/version_check-0.9.5.crate) = 15554
SHA256 (rust/crates/walkdir-2.5.0.crate) = 29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b
SIZE (rust/crates/walkdir-2.5.0.crate) = 23951
+SHA256 (rust/crates/wasi-0.14.2+wasi-0.2.4.crate) = 9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3
+SIZE (rust/crates/wasi-0.14.2+wasi-0.2.4.crate) = 140921
SHA256 (rust/crates/wasm-bindgen-0.2.100.crate) = 1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5
SIZE (rust/crates/wasm-bindgen-0.2.100.crate) = 48288
SHA256 (rust/crates/wasm-bindgen-backend-0.2.100.crate) = 2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6
@@ -139,7 +169,17 @@ SHA256 (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 24d5b23dc417412679681
SIZE (rust/crates/windows_x86_64_gnullvm-0.52.6.crate) = 435707
SHA256 (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec
SIZE (rust/crates/windows_x86_64_msvc-0.52.6.crate) = 832564
-SHA256 (rust/crates/winres-0.1.12.crate) = b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c
-SIZE (rust/crates/winres-0.1.12.crate) = 19772
-SHA256 (microsoft-edit-v1.0.0_GH0.tar.gz) = 6718d9a96aa9dd2117d9d4afa83b0278ef007bcd42bdb1e8c4e2ad34144246c0
-SIZE (microsoft-edit-v1.0.0_GH0.tar.gz) = 250150
+SHA256 (rust/crates/winnow-0.7.10.crate) = c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec
+SIZE (rust/crates/winnow-0.7.10.crate) = 176073
+SHA256 (rust/crates/winresource-0.1.22.crate) = a179ac8923651ff1d15efbee760b4dd3679fd85fa5a8b2bb1109b7248f80e30f
+SIZE (rust/crates/winresource-0.1.22.crate) = 77523
+SHA256 (rust/crates/wit-bindgen-rt-0.39.0.crate) = 6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1
+SIZE (rust/crates/wit-bindgen-rt-0.39.0.crate) = 12241
+SHA256 (rust/crates/zstd-0.13.3.crate) = e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a
+SIZE (rust/crates/zstd-0.13.3.crate) = 30514
+SHA256 (rust/crates/zstd-safe-7.2.4.crate) = 8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d
+SIZE (rust/crates/zstd-safe-7.2.4.crate) = 29350
+SHA256 (rust/crates/zstd-sys-2.0.15+zstd.1.5.7.crate) = eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237
+SIZE (rust/crates/zstd-sys-2.0.15+zstd.1.5.7.crate) = 774847
+SHA256 (microsoft-edit-v1.2.0_GH0.tar.gz) = e4ba6ff1bfecfeff2492306f5850c714bf50ffdb3cc3bb5be3aa987289f240fe
+SIZE (microsoft-edit-v1.2.0_GH0.tar.gz) = 457585
diff --git a/editors/microsoft-edit/files/patch-assets_com.microsoft.edit.desktop b/editors/microsoft-edit/files/patch-assets_com.microsoft.edit.desktop
new file mode 100644
index 000000000000..2f8c62887296
--- /dev/null
+++ b/editors/microsoft-edit/files/patch-assets_com.microsoft.edit.desktop
@@ -0,0 +1,13 @@
+--- assets/com.microsoft.edit.desktop.orig 2025-06-11 21:26:27 UTC
++++ assets/com.microsoft.edit.desktop
+@@ -3,8 +3,8 @@ Comment=A simple editor for simple needs
+ Name=Microsoft Edit
+ GenericName=Text Editor
+ Comment=A simple editor for simple needs
+-Icon=edit
+-Exec=edit %U
++Icon=msedit
++Exec=msedit %U
+ Terminal=true
+ MimeType=text/plain
+ Keywords=text;editor
diff --git a/editors/microsoft-edit/files/patch-assets_manpage_edit.1 b/editors/microsoft-edit/files/patch-assets_manpage_edit.1
deleted file mode 100644
index 0ddc19019708..000000000000
--- a/editors/microsoft-edit/files/patch-assets_manpage_edit.1
+++ /dev/null
@@ -1,29 +0,0 @@
---- assets/manpage/edit.1.orig 2025-05-27 16:45:04 UTC
-+++ assets/manpage/edit.1
-@@ -0,0 +1,26 @@
-+.TH EDIT 1 "version 1.0" "May 2025"
-+.SH NAME
-+edit \- a simple text editor
-+.SH SYNOPSIS
-+\fBedit\fP [\fIOPTIONS\fP]... [\fIARGUMENTS\fP]...
-+.SH DESCRIPTION
-+edit is a simple text editor inspired by MS-DOS edit.
-+.SH EDITING
-+Edit is an interactive mode-less editor. Use Alt-F to access the menus.
-+.SH ARGUMENTS
-+.TP
-+\fIFILE[:LINE[:COLUMN]]\fP
-+The file to open, optionally with line and column (e.g., \fBfoo.txt:123:45\fP).
-+.SH OPTIONS
-+.TP
-+\fB\-h\fP, \fB\-\-help\fP
-+Print the help message.
-+.TP
-+\fB\-v\fP, \fB\-\-version\fP
-+Print the version number.
-+.SH COPYRIGHT
-+Copyright (c) Microsoft Corporation.
-+.br
-+Licensed under the MIT License.
-+.SH SEE ALSO
-+https://github.com/microsoft/edit
diff --git a/editors/microsoft-edit/files/patch-src_lib.rs b/editors/microsoft-edit/files/patch-src_lib.rs
deleted file mode 100644
index f83f9e0d6fcb..000000000000
--- a/editors/microsoft-edit/files/patch-src_lib.rs
+++ /dev/null
@@ -1,10 +0,0 @@
---- src/lib.rs.orig 2025-05-18 18:11:22 UTC
-+++ src/lib.rs
-@@ -5,7 +5,6 @@
- allocator_api,
- breakpoint,
- cold_path,
-- inherent_str_constructors,
- let_chains,
- linked_list_cursors,
- maybe_uninit_fill,
diff --git a/editors/microsoft-edit/files/patch-src_sys_unix.rs b/editors/microsoft-edit/files/patch-src_sys_unix.rs
deleted file mode 100644
index 5bfc46a66640..000000000000
--- a/editors/microsoft-edit/files/patch-src_sys_unix.rs
+++ /dev/null
@@ -1,97 +0,0 @@
---- src/sys/unix.rs.orig 2025-05-18 18:11:22 UTC
-+++ src/sys/unix.rs
-@@ -8,9 +8,9 @@ use std::fs::{self, File};
-
- use std::ffi::{CStr, c_int, c_void};
- use std::fs::{self, File};
--use std::mem::{self, MaybeUninit};
-+use std::mem::{self, ManuallyDrop, MaybeUninit};
- use std::os::fd::{AsRawFd as _, FromRawFd as _};
--use std::ptr::{self, NonNull, null, null_mut};
-+use std::ptr::{self, NonNull, null_mut};
- use std::{thread, time};
-
- use crate::arena::{Arena, ArenaString, scratch_arena};
-@@ -195,11 +195,19 @@ pub fn read_stdin(arena: &Arena, mut timeout: time::Du
- let beg = time::Instant::now();
-
- let mut pollfd = libc::pollfd { fd: STATE.stdin, events: libc::POLLIN, revents: 0 };
-- let ts = libc::timespec {
-- tv_sec: timeout.as_secs() as libc::time_t,
-- tv_nsec: timeout.subsec_nanos() as libc::c_long,
-- };
-- let ret = libc::ppoll(&mut pollfd, 1, &ts, null());
-+ let ret;
-+ #[cfg(target_os = "linux")]
-+ {
-+ let ts = libc::timespec {
-+ tv_sec: timeout.as_secs() as libc::time_t,
-+ tv_nsec: timeout.subsec_nanos() as libc::c_long,
-+ };
-+ ret = libc::ppoll(&mut pollfd, 1, &ts, ptr::null());
-+ }
-+ #[cfg(not(target_os = "linux"))]
-+ {
-+ ret = libc::poll(&mut pollfd, 1, timeout.as_millis() as libc::c_int);
-+ }
- if ret < 0 {
- return None; // Error? Let's assume it's an EOF.
- }
-@@ -225,7 +233,7 @@ pub fn read_stdin(arena: &Arena, mut timeout: time::Du
- return None; // EOF
- }
- if ret < 0 {
-- match *libc::__errno_location() {
-+ match errno() {
- libc::EINTR if STATE.inject_resize => break,
- libc::EAGAIN if timeout == time::Duration::ZERO => break,
- libc::EINTR | libc::EAGAIN => {}
-@@ -304,7 +312,7 @@ pub fn write_stdout(text: &str) {
- continue;
- }
-
-- let err = unsafe { *libc::__errno_location() };
-+ let err = errno();
- if err != libc::EINTR {
- return;
- }
-@@ -407,7 +415,7 @@ unsafe fn load_library(name: &CStr) -> apperr::Result<
- unsafe fn load_library(name: &CStr) -> apperr::Result<NonNull<c_void>> {
- unsafe {
- NonNull::new(libc::dlopen(name.as_ptr(), libc::RTLD_LAZY))
-- .ok_or_else(|| errno_to_apperr(libc::ELIBACC))
-+ .ok_or_else(|| errno_to_apperr(libc::ENOENT))
- }
- }
-
-@@ -423,7 +431,7 @@ pub unsafe fn get_proc_address<T>(handle: NonNull<c_vo
- unsafe {
- let sym = libc::dlsym(handle.as_ptr(), name.as_ptr());
- if sym.is_null() {
-- Err(errno_to_apperr(libc::ELIBACC))
-+ Err(errno_to_apperr(libc::ENOENT))
- } else {
- Ok(mem::transmute_copy(&sym))
- }
-@@ -538,6 +546,14 @@ pub fn preferred_languages(arena: &Arena) -> Vec<Arena
- }
-
- #[inline]
-+fn errno() -> i32 {
-+ // Under `-O -Copt-level=s` the 1.87 compiler fails to fully inline and
-+ // remove the raw_os_error() call. This leaves us with the drop() call.
-+ // ManuallyDrop fixes that and results in a direct `std::sys::os::errno` call.
-+ ManuallyDrop::new(std::io::Error::last_os_error()).raw_os_error().unwrap_or(0)
-+}
-+
-+#[inline]
- pub(crate) fn io_error_to_apperr(err: std::io::Error) -> apperr::Error {
- errno_to_apperr(err.raw_os_error().unwrap_or(0))
- }
-@@ -565,5 +581,5 @@ fn check_int_return(ret: libc::c_int) -> apperr::Resul
- }
-
- fn check_int_return(ret: libc::c_int) -> apperr::Result<libc::c_int> {
-- if ret < 0 { Err(errno_to_apperr(unsafe { *libc::__errno_location() })) } else { Ok(ret) }
-+ if ret < 0 { Err(errno_to_apperr(errno())) } else { Ok(ret) }
- }
diff --git a/editors/microsoft-edit/files/patch-src_tui.rs b/editors/microsoft-edit/files/patch-src_tui.rs
deleted file mode 100644
index 14d8bcbac081..000000000000
--- a/editors/microsoft-edit/files/patch-src_tui.rs
+++ /dev/null
@@ -1,421 +0,0 @@
---- src/tui.rs.orig 2025-05-18 18:11:22 UTC
-+++ src/tui.rs
-@@ -640,6 +640,7 @@ impl Tui {
-
- tree,
- last_modal: None,
-+ focused_node: None,
- next_block_id_mixin: 0,
- needs_settling: false,
-
-@@ -653,6 +654,9 @@ impl Tui {
- // out where is to do a binary search of commenting out code in main.rs.
- debug_assert!(ctx.tree.current_node.borrow().stack_parent.is_none());
-
-+ // End the root node.
-+ ctx.block_end();
-+
- // Ensure that focus doesn't escape the active modal.
- if let Some(node) = ctx.last_modal
- && !self.is_subtree_focused(&node.borrow())
-@@ -684,18 +688,8 @@ impl Tui {
- // Remove any unknown nodes from the focus path.
- // It's important that we do this after the tree has been swapped out,
- // so that pop_focusable_node() has access to the newest version of the tree.
-- let focus_path_changed = self.pop_focusable_node(focus_path_pop_min);
-- needs_settling |= focus_path_changed;
-+ needs_settling |= self.pop_focusable_node(focus_path_pop_min);
-
-- // If some elements went away and the focus path changed above, we ignore tab presses.
-- // It may otherwise lead to weird situations where focus moves unexpectedly.
-- if !focus_path_changed
-- && !ctx.input_consumed
-- && let Some(input) = ctx.input_keyboard
-- {
-- needs_settling |= self.move_focus(input);
-- }
--
- // `needs_more_settling()` depends on the current value
- // of `settling_have` and so we increment it first.
- self.settling_have += 1;
-@@ -1213,117 +1207,6 @@ impl Tui {
- last_before != last_after
- }
-
-- // TODO: Move this into `block_end()` and run it whenever the block is a `focus_well`.
-- // It makes no sense otherwise that all input handling occurs in the controls, except for this.
-- fn move_focus(&mut self, input: InputKey) -> bool {
-- if !matches!(input, vk::TAB | SHIFT_TAB | vk::UP | vk::DOWN | vk::LEFT | vk::RIGHT) {
-- return false;
-- }
--
-- let focused_id = self.focused_node_path.last().cloned().unwrap_or(0);
-- let Some(focused) = self.prev_node_map.get(focused_id) else {
-- debug_assert!(false); // The caller should've cleaned up the focus path.
-- return false;
-- };
--
-- let mut focused_start = focused;
-- let mut root = focused;
--
-- // Figure out if we're inside a focus void (a container that doesn't
-- // allow tabbing inside), and in that case, toss the focus to it.
-- //
-- // Also, figure out the container within which the focus must be contained.
-- // This way, tab/shift-tab only moves within the same window.
-- // The ROOT_ID node has no parent, and the others have a float attribute.
-- // If the root is the focused node, it should of course not move upward.
-- loop {
-- let root_node = root.borrow();
-- if root_node.attributes.focus_well {
-- break;
-- }
-- if root_node.attributes.focus_void {
-- focused_start = root;
-- }
-- root = match root_node.parent {
-- Some(parent) => parent,
-- None => break,
-- }
-- }
--
-- let forward;
-- let min_depth;
-- match input {
-- SHIFT_TAB | vk::TAB => {
-- forward = input == vk::TAB;
-- min_depth = usize::MAX;
-- }
-- vk::UP | vk::DOWN => {
-- forward = input == vk::DOWN;
-- min_depth = usize::MAX;
-- }
-- vk::LEFT | vk::RIGHT => {
-- // Find the cell within a row within a table that we're in.
-- // To do so we'll use a circular buffer of the last 3 nodes while we travel up.
-- let mut buf = [None; 3];
-- let mut idx = buf.len() - 1;
-- let mut node = focused_start;
--
-- loop {
-- idx = (idx + 1) % buf.len();
-- buf[idx] = Some(node);
-- if let NodeContent::Table(..) = &node.borrow().content {
-- break;
-- }
-- if ptr::eq(node, root) {
-- return false;
-- }
-- node = match node.borrow().parent {
-- Some(parent) => parent,
-- None => return false,
-- }
-- }
--
-- // The current `idx` points to the table.
-- // The last item is the row.
-- // The 2nd to last item is the cell.
-- let Some(row) = buf[(idx + 3 - 1) % buf.len()] else {
-- return false;
-- };
-- let Some(cell) = buf[(idx + 3 - 2) % buf.len()] else {
-- return false;
-- };
--
-- root = row;
-- focused_start = cell;
-- forward = input == vk::RIGHT;
-- min_depth = root.borrow().depth;
-- }
-- _ => return false,
-- }
--
-- let mut focused_next = focused_start;
-- Tree::visit_all(root, focused_start, forward, |node| {
-- let n = node.borrow();
-- if ptr::eq(node, root) {
-- VisitControl::Continue
-- } else if n.attributes.focusable && !ptr::eq(node, focused_start) {
-- focused_next = node;
-- VisitControl::Stop
-- } else if n.attributes.focus_void || n.depth >= min_depth {
-- VisitControl::SkipChildren
-- } else {
-- VisitControl::Continue
-- }
-- });
--
-- if ptr::eq(focused_next, focused_start) {
-- false
-- } else {
-- Tui::build_node_path(Some(focused_next), &mut self.focused_node_path);
-- true
-- }
-- }
--
- // Scroll the focused node(s) into view inside scrollviews
- fn scroll_to_focused(&mut self) -> bool {
- let focused_id = self.focused_node_path.last().cloned().unwrap_or(0);
-@@ -1375,6 +1258,7 @@ pub struct Context<'a, 'input> {
-
- tree: Tree<'a>,
- last_modal: Option<&'a NodeCell<'a>>,
-+ focused_node: Option<&'a NodeCell<'a>>,
- next_block_id_mixin: u64,
- needs_settling: bool,
-
-@@ -1484,8 +1368,83 @@ impl<'a> Context<'a, '_> {
- /// Ends the current UI block, returning to its parent container.
- pub fn block_end(&mut self) {
- self.tree.pop_stack();
-+ self.block_end_move_focus();
- }
-
-+ fn block_end_move_focus(&mut self) {
-+ // At this point, it's more like "focus_well?" instead of "focus_well!".
-+ let focus_well = self.tree.last_node;
-+
-+ // Remember the focused node, if any, because once the code below runs,
-+ // we need it for the `Tree::visit_all` call.
-+ if self.is_focused() {
-+ self.focused_node = Some(focus_well);
-+ }
-+
-+ // Filter down to nodes that are focus wells and contain the focus.
-+ // They're basically the "tab container".
-+ if !focus_well.borrow().attributes.focus_well {
-+ return;
-+ }
-+
-+ // The mere fact that there's a `focused_node` indicates that we're the
-+ // first `block_end()` call that's a focus well and also contains the focus.
-+ let Some(focused) = self.focused_node else {
-+ return;
-+ };
-+
-+ // Filter down to Tab/Shift+Tab inputs.
-+ if self.input_consumed {
-+ return;
-+ }
-+ let Some(input) = self.input_keyboard else {
-+ return;
-+ };
-+ if !matches!(input, SHIFT_TAB | vk::TAB) {
-+ return;
-+ }
-+
-+ let forward = input == vk::TAB;
-+ let mut focused_start = focused;
-+ let mut focused_next = focused;
-+
-+ // We may be in a focus void right now (= doesn't want to be tabbed into),
-+ // so first we must go up the tree until we're outside of it.
-+ loop {
-+ if ptr::eq(focused_start, focus_well) {
-+ // If we hit the root / focus well, we weren't in a focus void,
-+ // and can reset `focused_before` to the current focused node.
-+ focused_start = focused;
-+ break;
-+ }
-+
-+ focused_start = focused_start.borrow().parent.unwrap();
-+ if focused_start.borrow().attributes.focus_void {
-+ break;
-+ }
-+ }
-+
-+ Tree::visit_all(focus_well, focused_start, forward, |node| {
-+ let n = node.borrow();
-+ if n.attributes.focusable && !ptr::eq(node, focused_start) {
-+ focused_next = node;
-+ VisitControl::Stop
-+ } else if n.attributes.focus_void {
-+ VisitControl::SkipChildren
-+ } else {
-+ VisitControl::Continue
-+ }
-+ });
-+
-+ if ptr::eq(focused_next, focused_start) {
-+ return;
-+ }
-+
-+ Tui::build_node_path(Some(focused_next), &mut self.tui.focused_node_path);
-+ self.set_input_consumed();
-+ self.needs_rerender();
-+ }
-+
- /// Mixes in an extra value to the next UI block's ID for uniqueness.
- /// Use this when you build a list of items with the same classname.
- pub fn next_block_id_mixin(&mut self, id: u64) {
-@@ -1796,6 +1755,8 @@ impl<'a> Context<'a, '_> {
- debug_assert!(matches!(parent.content, NodeContent::Table(_)));
-
- self.block_end();
-+ self.table_end_row();
-+
- self.next_block_id_mixin(parent.child_count as u64);
- }
- }
-@@ -1803,6 +1764,10 @@ impl<'a> Context<'a, '_> {
- self.block_begin("row");
- }
-
-+ fn table_end_row(&mut self) {
-+ self.table_row_move_focus();
-+ }
-+
- /// Ends the current table block.
- pub fn table_end(&mut self) {
- let current_node = self.tree.current_node.borrow();
-@@ -1811,11 +1776,136 @@ impl<'a> Context<'a, '_> {
- // current_node will refer to the table. Otherwise, it'll refer to the current row.
- if !matches!(current_node.content, NodeContent::Table(_)) {
- self.block_end();
-+ self.table_end_row();
- }
-
- self.block_end(); // table
-+ self.table_end_move_focus();
- }
-
-+ fn table_row_move_focus(&mut self) {
-+ // Filter down to table rows that are focused.
-+ if !self.contains_focus() {
-+ return;
-+ }
-+
-+ // Filter down to left/right inputs.
-+ if self.input_consumed {
-+ return;
-+ }
-+ let Some(input) = self.input_keyboard else {
-+ return;
-+ };
-+ if !matches!(input, vk::LEFT | vk::RIGHT) {
-+ return;
-+ }
-+
-+ let row = self.tree.last_node;
-+ let Some(&focused_cell_id) = self.tui.focused_node_path.get(row.borrow().depth + 1) else {
-+ return;
-+ };
-+
-+ let mut prev_next = NodeSiblings { prev: None, next: None };
-+ let mut focused = None;
-+
-+ // Iterate through the cells in the row, looking for the focused cell.
-+ // Take note of the previous and next focusable cells around the focused one.
-+ for cell in Tree::iterate_siblings(row.borrow().children.first) {
-+ let n = cell.borrow();
-+ if n.id == focused_cell_id {
-+ focused = Some(cell);
-+ } else if n.attributes.focusable {
-+ if focused.is_none() {
-+ prev_next.prev = Some(cell);
-+ } else {
-+ prev_next.next = Some(cell);
-+ break;
-+ }
-+ }
-+ }
-+
-+ if focused.is_none() {
-+ return;
-+ }
-+
-+ let forward = input == vk::RIGHT;
-+ let children_idx = if forward { NodeChildren::FIRST } else { NodeChildren::LAST };
-+ let siblings_idx = if forward { NodeSiblings::NEXT } else { NodeSiblings::PREV };
-+ let Some(focused_next) =
-+ prev_next.get(siblings_idx).or_else(|| row.borrow().children.get(children_idx))
-+ else {
-+ return;
-+ };
-+
-+ Tui::build_node_path(Some(focused_next), &mut self.tui.focused_node_path);
-+ self.set_input_consumed();
-+ self.needs_rerender();
-+ }
-+
-+ fn table_end_move_focus(&mut self) {
-+ // Filter down to table rows that are focused.
-+ if !self.contains_focus() {
-+ return;
-+ }
-+
-+ // Filter down to up/down inputs.
-+ if self.input_consumed {
-+ return;
-+ }
-+ let Some(input) = self.input_keyboard else {
-+ return;
-+ };
-+ if !matches!(input, vk::UP | vk::DOWN) {
-+ return;
-+ }
-+
-+ let table = self.tree.last_node;
-+ if table.borrow().child_count <= 1 {
-+ // If there's just one row, we can't move focus up or down.
-+ return;
-+ }
-+
-+ let Some(&focused_row_id) = self.tui.focused_node_path.get(table.borrow().depth + 1) else {
-+ return;
-+ };
-+
-+ let mut prev_next = NodeSiblings { prev: None, next: None };
-+ let mut focused = None;
-+
-+ // Iterate through the row in the table, looking for the focused row.
-+ // Take note of the previous and next focusable rows around the focused one.
-+ for cell in Tree::iterate_siblings(table.borrow().children.first) {
-+ let n = cell.borrow();
-+ if n.id == focused_row_id {
-+ focused = Some(cell);
-+ } else if n.attributes.focusable {
-+ if focused.is_none() {
-+ prev_next.prev = Some(cell);
-+ } else {
-+ prev_next.next = Some(cell);
-+ break;
-+ }
-+ }
-+ }
-+
-+ if focused.is_none() {
-+ return;
-+ }
-+
-+ let forward = input == vk::DOWN;
-+ let children_idx = if forward { NodeChildren::FIRST } else { NodeChildren::LAST };
-+ let siblings_idx = if forward { NodeSiblings::NEXT } else { NodeSiblings::PREV };
-+ let Some(focused_next) =
-+ prev_next.get(siblings_idx).or_else(|| table.borrow().children.get(children_idx))
-+ else {
-+ return;
-+ };
-+
-+ Tui::build_node_path(Some(focused_next), &mut self.tui.focused_node_path);
-+ self.set_input_consumed();
-+ self.needs_rerender();
-+ }
-+
- /// Creates a simple text label.
- pub fn label(&mut self, classname: &'static str, text: &str) {
- self.styled_label_begin(classname);
-@@ -3312,9 +3402,10 @@ impl<'a> Tree<'a> {
- /// Completes the current node and moves focus to the parent.
- fn pop_stack(&mut self) {
- let current_node = self.current_node.borrow();
-- let stack_parent = current_node.stack_parent.unwrap();
-- self.last_node = self.current_node;
-- self.current_node = stack_parent;
-+ if let Some(stack_parent) = current_node.stack_parent {
-+ self.last_node = self.current_node;
-+ self.current_node = stack_parent;
-+ }
- }
-
- fn iterate_siblings(
diff --git a/editors/microsoft-edit/pkg-plist b/editors/microsoft-edit/pkg-plist
new file mode 100644
index 000000000000..78a65691d9cd
--- /dev/null
+++ b/editors/microsoft-edit/pkg-plist
@@ -0,0 +1,6 @@
+bin/edit
+bin/msedit
+share/applications/com.microsoft.edit.desktop
+share/icons/hicolor/scalable/apps/msedit.svg
+share/man/man1/edit.1.gz
+share/man/man1/msedit.1.gz