Queued transfers stored only the destination directory as the target
path. Downstream upload logic treats the queued destination as the full
file path and passes it straight to create_file, so transfers failed
with a Failure error when the remote target resolved to a directory.
Append each entry's file name to the destination directory at enqueue
time in both enqueue_file and enqueue_all, matching the single-file
transfer path which already builds the full target path.
build.rs uses vergen-git2 (Git2::all_git), which runs `git describe` and
reads commit metadata. The build and publish-crate jobs checked out a
shallow clone without tags, so vergen could not resolve the describe
string and libgit2 may fail on shallow repos. Add fetch-depth: 0 and
fetch-tags: true to both jobs that compile the crate.
keyring v4 is no longer a library crate; the API moved to keyring-core
plus per-platform credential store crates. Replace the keyring dependency
with keyring-core and the native store crates, and register the default
store at runtime (lazily, once) since v4 no longer selects it at compile
time via Cargo features.
Migrate to the new RustCrypto cipher 0.5 traits (aes 0.9, cbc 0.2),
rand 0.10 and vergen-git2 10, whose APIs changed:
- vergen-git2: builders renamed (BuildBuilder -> Build, etc.) and the
all_* constructors no longer return a Result
- aes/cbc: BlockDecryptMut -> BlockModeDecrypt and
decrypt_padded_vec_mut -> decrypt_padded_vec
- rand: sample API moved
An empty copy destination resolved to the source file's own path, so
std::fs::copy truncated the original file to 0 bytes.
- localhost::copy now refuses to copy a file onto itself, returning an
error instead of truncating it (root cause).
- action_copy treats an empty/whitespace destination as a cancel.
Closes#421
Reflect the new config directory locations (~/.config/termscp on macOS,
%USERPROFILE%\.termscp on Windows) across the English and Chinese docs,
and add a CLAUDE.md note to keep both translations in sync.
Resolve the config directory through a single per-platform config_dir()
function instead of relying on dirs::config_dir everywhere:
- macOS: ~/.config/termscp (was ~/Library/Application Support/termscp)
- Windows: %USERPROFILE%\.termscp (was roaming %APPDATA%\termscp)
- Linux/other: /termscp (unchanged)
Existing users are migrated automatically on first run: when the new
directory is absent and the legacy location exists, the whole config
directory is moved to the new path. The cache directory stays at the
platform-native location.
Closes#431
The bottom (partial) bar carried a block title (the current filename),
which forces a 1-row top inset in ratatui's `Block::inner` even though
its top border is dropped to join the seam with the full bar. That left
the partial bar with one inner row while the full bar kept two, so the
two gauges rendered at unequal heights.
- Move the filename from the partial bar's title into its gauge label.
- Skip setting an empty title so no phantom top-positioned title triggers
the inset.
- Put the panel title on the top (full) bar for multi-file transfers.
- Bump the two-bar popup height to fit the joined panel.
Also bump Cargo.lock and adapt the embedded terminal to the new vt100
`screen_mut()` API.
Migrate the transfer progress UI to tuirealm 4, where the stdlib
`ProgressBar` widget was dropped, by rebuilding the dual-bar panel on
top of `Gauge`.
- Restore the unified two-bar look: the full bar (top) and partial bar
(bottom) draw joined borders so they read as a single panel; a single
file shows one fully-bordered bar.
- Redraw on every file boundary in the send/recv queue loops so the
full bar's (N/total) counter advances even for small files that finish
within one in-loop redraw interval.
- Track progress with a single `TransferProgress` (exact file count from
the pre-scan, lazy partial/full computation) and consolidate the theme
progress-bar fields.
- silence SC3043 by declaring dash dialect (local is supported)
- quote unquoted vars (SC2086/SC1090)
- fix set -e aborting arch install before cargo check
- fix install_cargo removing unset $archive instead of $rustup
- make brew upgrade fallback a real if-then-else (SC2015)
- drop leftover starship BASE_URL and debug echo $1
Add Site GitHub Actions workflow running prettier format check, astro
check, tests, and build on changes under site/. Wire prettier into the
site package with config, ignore, and scripts, and format existing
sources.
Add install.ps1 mirroring install.sh for Windows: arch detection,
release zip download, binary extraction, user PATH update.
- copy install.ps1 to site public/ at build time (copy-install.mjs)
- serve /install.ps1 with text/plain Content-Type (vercel.json)
- add PowerShell one-liner to install page and README
- bump install.ps1 default version in bump_version.sh
- add CopyButton component next to every install command line