Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
fd8fa0d
Refresh About dialog snapshot for the repository URL
kkaminsk Oct 8, 2026
43fa6de
Implement OpenSpec change ui-animations
kkaminsk Oct 8, 2026
6c7127c
Archive OpenSpec change ui-animations
kkaminsk Oct 8, 2026
5414324
Merge branch 'build/ui-animations' into build/open-proposals-2026-10
kkaminsk Oct 9, 2026
f6ed8cd
Implement OpenSpec change config-profile-directory
kkaminsk Oct 10, 2026
07c2a24
Implement OpenSpec change command-line-clear-key
kkaminsk Oct 10, 2026
1928961
Implement OpenSpec change reread-preserves-cursor
kkaminsk Oct 10, 2026
e75ffaa
Implement OpenSpec change line-editing-in-text-fields
kkaminsk Oct 10, 2026
615612b
Implement OpenSpec change full-mode-column-widths
kkaminsk Oct 10, 2026
d159432
Implement OpenSpec change hidden-entry-styling
kkaminsk Oct 10, 2026
2b0a982
Implement OpenSpec change open-with-associated-app
kkaminsk Oct 10, 2026
8d9323b
Implement OpenSpec change pulldown-menu-completion
kkaminsk Oct 10, 2026
1bada6f
Archive completed OpenSpec changes
kkaminsk Oct 12, 2026
fab622b
Import 21 open proposals from Spec onto the batch branch
kkaminsk Oct 13, 2026
2d692bf
Implement OpenSpec change copy-onto-itself-guard
kkaminsk Oct 13, 2026
8d4ae48
Archive OpenSpec change copy-onto-itself-guard
kkaminsk Oct 13, 2026
5abe389
Implement OpenSpec change installer-scope-coexistence
kkaminsk Oct 13, 2026
a352990
Archive OpenSpec change installer-scope-coexistence
kkaminsk Oct 13, 2026
ed7d6e3
Implement OpenSpec change git-info-timeout-memory
kkaminsk Oct 14, 2026
a73a517
Archive OpenSpec change git-info-timeout-memory
kkaminsk Oct 14, 2026
a9137fc
Implement OpenSpec change error-diagnostics
kkaminsk Oct 14, 2026
0c08f99
Archive OpenSpec change error-diagnostics
kkaminsk Oct 14, 2026
81148a8
Implement OpenSpec change viewer-mapping-safety
kkaminsk Oct 14, 2026
9af03a3
Archive OpenSpec change viewer-mapping-safety
kkaminsk Oct 14, 2026
e172cfb
Implement OpenSpec change filter-selection-safety
kkaminsk Oct 14, 2026
ea01295
Archive OpenSpec change filter-selection-safety
kkaminsk Oct 14, 2026
b60afc4
Implement OpenSpec change idle-aware-event-loop
kkaminsk Oct 14, 2026
1f79918
Archive OpenSpec change idle-aware-event-loop
kkaminsk Oct 14, 2026
bd4bfd3
Implement OpenSpec change relative-destination-resolution
kkaminsk Oct 14, 2026
87ca2aa
Archive OpenSpec change relative-destination-resolution
kkaminsk Oct 14, 2026
c73633f
Implement OpenSpec change editor-encoding-safety
kkaminsk Oct 14, 2026
0050a0e
Archive OpenSpec change editor-encoding-safety
kkaminsk Oct 14, 2026
9d6f553
Implement OpenSpec change resize-preserves-session-state
kkaminsk Oct 14, 2026
543ffe3
Archive OpenSpec change resize-preserves-session-state
kkaminsk Oct 14, 2026
3189580
Reconcile resize tests with the fallible editor from_bytes
kkaminsk Oct 14, 2026
70f4174
Implement OpenSpec change process-lifecycle-hardening
kkaminsk Oct 14, 2026
f7984cf
Archive OpenSpec change process-lifecycle-hardening
kkaminsk Oct 14, 2026
ff94aef
Implement OpenSpec change config-parsing-robustness
kkaminsk Oct 14, 2026
70881a9
Archive OpenSpec change config-parsing-robustness
kkaminsk Oct 14, 2026
298cc77
Implement OpenSpec change history-persistence-hardening
kkaminsk Oct 14, 2026
afb6f24
Archive OpenSpec change history-persistence-hardening
kkaminsk Oct 14, 2026
6edcf16
Reconcile headless Runtime test literals with the history writer
kkaminsk Oct 14, 2026
496f01e
Implement OpenSpec change move-reparse-point-safety
kkaminsk Oct 14, 2026
85f41d4
Archive OpenSpec change move-reparse-point-safety
kkaminsk Oct 14, 2026
26a1f77
Implement OpenSpec change durable-file-copy
kkaminsk Oct 14, 2026
c8d89b3
Archive OpenSpec change durable-file-copy
kkaminsk Oct 14, 2026
9b33655
Reconcile the mid-copy quit test with the partial-file copy path
kkaminsk Oct 14, 2026
233d27a
Implement OpenSpec change listing-request-guard
kkaminsk Oct 14, 2026
d6e157d
Archive OpenSpec change listing-request-guard
kkaminsk Oct 14, 2026
8c6241c
Implement OpenSpec change link-aware-listing
kkaminsk Oct 14, 2026
2e6a85a
Archive OpenSpec change link-aware-listing
kkaminsk Oct 14, 2026
e8269a3
Archive OpenSpec change delete-key-triggers-delete
kkaminsk Oct 14, 2026
489fc36
Implement OpenSpec change offload-blocking-io
kkaminsk Oct 14, 2026
3bafaf3
Archive OpenSpec change offload-blocking-io
kkaminsk Oct 14, 2026
3b79860
Implement OpenSpec change streaming-listing-performance
kkaminsk Oct 14, 2026
57ad7ea
Archive OpenSpec change streaming-listing-performance
kkaminsk Oct 14, 2026
58a7792
Format the workspace with rustfmt
kkaminsk Oct 14, 2026
fbf9ffa
Implement OpenSpec change ci-and-build-tooling
kkaminsk Oct 14, 2026
c6e43cf
Archive OpenSpec change ci-and-build-tooling
kkaminsk Oct 14, 2026
fccd2c5
Split update.rs into update/*.rs (pure move)
kkaminsk Oct 15, 2026
9428766
Split update/tests.rs into update/tests/*.rs (pure move)
kkaminsk Oct 15, 2026
69692de
Implement OpenSpec change reducer-overlay-structure
kkaminsk Oct 15, 2026
b6f072d
Archive OpenSpec change reducer-overlay-structure
kkaminsk Oct 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Commits that only reformat code; `git blame` skips them when configured
# with `git config blame.ignoreRevsFile .git-blame-ignore-revs` (GitHub's
# blame view reads this file automatically).

# ci-and-build-tooling: one-time `cargo fmt --all` with the committed
# rustfmt.toml (max_width = 150, use_small_heuristics = "Max").
58a7792b2404d3ca04d6e66478fe25183ee8d2e1
95 changes: 95 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
# Continuous integration for FileCommand (build-tooling capability; design D1).
#
# `windows` and `msrv` are the required checks (branch protection on `main`
# lists them). `linux` is best-effort and never blocks a merge: non-Windows
# builds are best-effort per the project charter.
#
# The stable toolchain is pinned to one version so a Rust release cannot turn
# `-D warnings` red on an unchanged branch. Bump RUST_TOOLCHAIN deliberately,
# in a PR that also fixes whatever new lints the release brings.

name: CI

on:
pull_request:
push:
branches: [main]

env:
RUST_TOOLCHAIN: "1.98.1"
CARGO_TERM_COLOR: always

jobs:
windows:
name: windows
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

- name: Install pinned stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
components: rustfmt, clippy

- uses: Swatinem/rust-cache@v2

- name: Format check
run: cargo fmt --all -- --check

- name: Clippy
run: cargo clippy --workspace --all-targets --locked -- -D warnings

- name: Test
run: cargo test --workspace --locked

- name: Doc
run: cargo doc --workspace --no-deps --locked
env:
RUSTDOCFLAGS: -D warnings

msrv:
name: msrv
runs-on: windows-latest
steps:
- uses: actions/checkout@v4

# The floor is whatever `[workspace.package] rust-version` says, so the
# manifest and this job cannot drift apart.
- name: Read rust-version from Cargo.toml
id: msrv
shell: bash
run: |
version=$(sed -n 's/^rust-version = "\([^"]*\)"/\1/p' Cargo.toml)
test -n "$version"
echo "version=$version" >> "$GITHUB_OUTPUT"

- name: Install rust-version toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ steps.msrv.outputs.version }}

- uses: Swatinem/rust-cache@v2

- name: Check on the declared minimum toolchain
run: cargo check --workspace --all-targets --locked

linux:
name: linux (best-effort)
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4

- name: Install pinned stable toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}

- uses: Swatinem/rust-cache@v2

- name: Build
run: cargo build --workspace --locked

- name: Test
run: cargo test --workspace --locked
49 changes: 3 additions & 46 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

64 changes: 62 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ members = ["crates/filecommand-core", "crates/filecommand-tui"]
[workspace.package]
version = "0.1.4"
edition = "2021"
# Minimum supported Rust version. Verified empirically: the lowest toolchain
# on which `cargo check --workspace --all-targets --locked` passes, and
# re-checked by the `msrv` CI job on every pull request (ci-and-build-tooling
# design D3).
rust-version = "1.88"
license = "MIT OR Apache-2.0"
authors = ["The FileCommand Authors"]
repository = "https://github.com/kkaminsk/FileCommand"
Expand All @@ -15,5 +20,60 @@ ratatui = "0.29"
crossterm = "0.28"
insta = "1"
proptest = "1"
memmap2 = "0.9"
git2 = "0.19"
# Local repository state only (`discover`, `head`, `statuses`): no SSH or
# HTTPS transport, so libssh2 and, on Unix, OpenSSL drop out of the build
# (ci-and-build-tooling design D5).
git2 = { version = "0.19", default-features = false }
# Windows-only binding crate shared by both crates. The feature list is the
# union of what the workspace calls (ci-and-build-tooling design D6):
# - Win32_Foundation: HANDLE, BOOL, SYSTEMTIME, CloseHandle, GetLastError,
# INVALID_HANDLE_VALUE and the ERROR_* codes
# - Win32_Storage_FileSystem: CreateFileW, GetFileInformationByHandle,
# FindFirstStreamW/FindNextStreamW/FindClose, GetLogicalDrives,
# GetVolumeInformationW, GetDiskFreeSpaceExW, CopyFileExW, ReplaceFileW
# and their constants
# - Win32_Security: required by `windows-sys` to compile CreateFileW
# (its SECURITY_ATTRIBUTES parameter)
# - Win32_System_Diagnostics_Debug: SetThreadErrorMode, SEM_FAILCRITICALERRORS
# - Win32_System_SystemInformation: GlobalMemoryStatusEx, MEMORYSTATUSEX,
# GetLocalTime
# - Win32_System_SystemServices: FILE_NAMED_STREAMS
# - Win32_System_WindowsProgramming: COPY_FILE_* and PROGRESS_* for
# CopyFileExW
# - Win32_System_Console: the console control handler
# (process-lifecycle-hardening)
# - Win32_System_Com: CoInitializeEx/CoUninitialize around ShellExecuteW
# (offload-blocking-io)
# - Win32_UI_Shell, Win32_UI_WindowsAndMessaging: ShellExecuteW
# (open-with-associated-app)
windows-sys = { version = "0.59", features = [
"Win32_Foundation",
"Win32_Storage_FileSystem",
"Win32_Security",
"Win32_System_Diagnostics_Debug",
"Win32_System_SystemInformation",
"Win32_System_SystemServices",
"Win32_System_WindowsProgramming",
"Win32_System_Console",
"Win32_System_Com",
"Win32_UI_Shell",
"Win32_UI_WindowsAndMessaging",
] }

[workspace.lints.clippy]
# Every `unsafe` block carries a `// SAFETY:` comment stating the invariant
# that makes it sound; with `-D warnings` in CI an undocumented one fails the
# pull request (ci-and-build-tooling design D6).
undocumented_unsafe_blocks = "warn"

[profile.release]
lto = "thin"
codegen-units = 1
strip = "symbols"
# `panic` deliberately stays at its default, "unwind" (ci-and-build-tooling
# design D4). Three things depend on unwinding: the terminal-restoring RAII
# guard and chained panic hook in `filecommand-tui::terminal` must run on a
# main-thread panic; worker threads isolate their panics with `catch_unwind`
# so one bad listing or job ends that thread, not the process; and the
# `panic_restoration` integration test checks that order. `panic = "abort"`
# would kill the process with the terminal left in raw mode.
Loading
Loading