Compare commits

...

1216 Commits

Author SHA1 Message Date
veeso 282f75c3f3 chore: release v1.1.0 2026-06-08 18:17:39 +00:00
Christian Visintin 535ed23540 chore: update cliff config 2026-06-08 20:17:02 +02:00
Christian Visintin 70bd7d7330 fix(transfer): enqueue full destination path instead of directory
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.
2026-06-08 20:17:02 +02:00
Christian Visintin 352eec4762 chore(Cargo.toml): bump 1.1.0 2026-06-08 20:17:02 +02:00
Christian Visintin 3a5327f5b1 ci(release): fetch full git history and tags for build.rs
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.
2026-06-08 20:17:02 +02:00
Christian Visintin b1601fb17e chore(deps): migrate keyring from 3 to 4
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.
2026-06-08 20:17:02 +02:00
Christian Visintin bca261b7b2 chore(deps): bump aes, cbc, md-5, rand and vergen-git2
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
2026-06-08 20:17:02 +02:00
Christian Visintin 904befaea8 fix(copy): prevent emptying file when copy destination is empty (#421)
Install.sh / build (macos-latest) (push) Has been cancelled
Install.sh / build (ubuntu-latest) (push) Has been cancelled
CI / build-(macos-latest) (push) Has been cancelled
CI / build-(ubuntu-latest) (push) Has been cancelled
CI / build-(windows-latest) (push) Has been cancelled
codeberg-mirror / mirror (push) Has been cancelled
Deploy docs to GitHub Pages / deploy (push) Has been cancelled
Site / build-site (push) Has been cancelled
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
2026-06-08 17:12:52 +02:00
Christian Visintin afe7b05830 docs(config): update config dir paths for macOS/Windows in en & zh
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.
2026-06-08 16:39:24 +02:00
Christian Visintin 837592e48a feat(config): move config dir to ~/.config/termscp on macOS and %USERPROFILE%\.termscp on Windows
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
2026-06-08 16:39:24 +02:00
Christian Visintin ab5de031e3 ci(site): always run site 2026-06-08 16:02:27 +02:00
Christian Visintin f3085161e6 fix(progress): equalize dual progress bar heights
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.
2026-06-08 16:02:27 +02:00
Christian Visintin 1dafc76850 fix(progress): rework transfer progress panel (#424)
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.
2026-06-08 16:02:27 +02:00
Christian Visintin f066d6a387 chore(readme): remove current version 2026-06-08 10:43:35 +02:00
Christian Visintin 987751d732 chore(site): add site umami analytics 2026-06-08 10:43:35 +02:00
Christian Visintin 1ca8abbfe8 ci: rename ci workflow 2026-06-08 10:16:00 +02:00
Christian Visintin 26e71a2f1d ci(release): publish to crates.io via OIDC trusted publishing 2026-06-08 10:16:00 +02:00
Christian Visintin b1d77c78fe fix(install): quote vars, fix set -e cargo check and rustup tmpfile cleanup
- 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
2026-06-08 10:16:00 +02:00
Christian Visintin 2a7d48a92b ci: unify os workflows into one 2026-06-08 10:16:00 +02:00
Christian Visintin 82141e7f2b chore: remove ko-fi 2026-06-08 10:16:00 +02:00
Christian Visintin 14bc15cfca chore(site): update og_preview 2026-06-08 10:16:00 +02:00
Christian Visintin 85fa99e4cc docs(zh): fix keyring deep-link anchor to translated heading slug 2026-06-08 10:16:00 +02:00
Christian Visintin 3ff3cdb587 ci: add github pages workflow for docs site 2026-06-08 10:16:00 +02:00
Christian Visintin 726443ae21 docs: fix update command (termscp update, not --update) in READMEs 2026-06-08 10:16:00 +02:00
Christian Visintin 0bd449e7bc docs(zh): align README with root README, drop dead language links 2026-06-08 10:16:00 +02:00
Christian Visintin c24f08691d docs: drop extra language docs/READMEs, point manual links to docs.termscp.rs 2026-06-08 10:16:00 +02:00
Christian Visintin 14e6872432 docs: disable MD060 table alignment (incompatible with CJK width) 2026-06-08 10:16:00 +02:00
Christian Visintin 88900a80b8 docs(zh): translate cli reference and developer pages 2026-06-08 10:16:00 +02:00
Christian Visintin ce619bcff2 docs(zh): translate configuration pages 2026-06-08 10:16:00 +02:00
Christian Visintin 5a16467e71 docs(zh): translate usage pages 2026-06-08 10:16:00 +02:00
Christian Visintin b6ca8c57f0 docs(zh): translate section headings in getting-started pages 2026-06-08 10:16:00 +02:00
Christian Visintin 660c17a0df docs(zh): translate introduction and getting-started pages 2026-06-08 10:16:00 +02:00
Christian Visintin aed4ecc522 docs: scaffold zh-CN mdbook 2026-06-08 10:16:00 +02:00
Christian Visintin ee69ba6ef8 docs: add markdownlint config for docs site 2026-06-08 10:16:00 +02:00
Christian Visintin 0db3ea43d2 docs(en): fix CLI references (no -t / --update flags; -b is a value option) 2026-06-08 10:16:00 +02:00
Christian Visintin 6a61eb16f7 docs(en): write cli reference and developer pages 2026-06-08 10:16:00 +02:00
Christian Visintin e32ed613cc docs(en): write configuration pages 2026-06-08 10:16:00 +02:00
Christian Visintin dbd61f0fab docs(en): write usage pages 2026-06-08 10:16:00 +02:00
Christian Visintin a18fa0ca5a docs(en): write introduction and getting-started pages 2026-06-08 10:16:00 +02:00
Christian Visintin c8846266d7 docs: add en-US table of contents 2026-06-08 10:16:00 +02:00
Christian Visintin 40440832be docs: scaffold en-US mdbook 2026-06-08 10:16:00 +02:00
Christian Visintin 34c03841be docs: add CNAME for docs.termscp.rs 2026-06-08 10:16:00 +02:00
Christian Visintin ded71dce48 docs: add mdbook language switcher script 2026-06-08 10:16:00 +02:00
Christian Visintin eefa1b3db0 docs: add shared mdbook assets and favicon.ico 2026-06-08 10:16:00 +02:00
Christian Visintin a2d766d688 ci(site): add format/lint/test/build workflow for astro site
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.
2026-06-08 10:16:00 +02:00
Christian Visintin f92cb93755 feat(install): add Windows PowerShell installer and copy buttons on site
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
2026-06-08 10:16:00 +02:00
Christian Visintin d070825dd7 chore(install.sh): remove reference to changelog 2026-06-08 10:16:00 +02:00
Christian Visintin 3774156873 docs: replace last termscp.veeso.dev refs (install.sh manual/changelog, crate homepage) 2026-06-08 10:16:00 +02:00
Christian Visintin bbeefc557e fix(site): drop @ts-check on astro config to clear false vite type error 2026-06-08 10:16:00 +02:00
Christian Visintin 3ee21aba2f docs: point READMEs to termscp.rs + install.sh, docs.termscp.rs 2026-06-08 10:16:00 +02:00
Christian Visintin 6cf5bf18cf ci: remove pages workflow, fix release version-bump for astro site 2026-06-08 10:16:00 +02:00
Christian Visintin d7b7ab7fa1 feat(site): robots, sitemap reference, vercel redirects + cache headers 2026-06-08 10:16:00 +02:00
Christian Visintin 48b387de14 chore(site): remove ko-fi, add astro check dep, drop unused explorer media 2026-06-08 10:16:00 +02:00
Christian Visintin e381484022 refactor(site): english-only, remove i18n machinery 2026-06-08 10:16:00 +02:00
Christian Visintin 203a6da387 build(site): copy install.sh from repo root at build time (single source) 2026-06-08 10:16:00 +02:00
Christian Visintin 3379940ec9 feat(site): install page led by install.sh script, package-manager tabs 2026-06-08 10:16:00 +02:00
Christian Visintin 2153164484 fix(site): hero selected-row contrast (latte) + mobile row truncation 2026-06-08 10:16:00 +02:00
Christian Visintin 0cc7362bd9 refactor(site): drop in-site manual, link to external docs.termscp.rs 2026-06-08 10:16:00 +02:00
Christian Visintin 5c84a0e88d feat(site): landing page with dual-pane explorer hero 2026-06-08 10:16:00 +02:00
Christian Visintin a25b17a4e5 feat(site): responsive mobile nav, css-driven theme icons, localizePath helper 2026-06-08 10:16:00 +02:00
Christian Visintin d670aed079 feat(site): nav, footer, theme toggle, language picker 2026-06-08 10:16:00 +02:00
Christian Visintin 6fa3c042b1 feat(site): x-default hreflang, twitter card, og:image:alt; dedupe locales/site in base layout 2026-06-08 10:16:00 +02:00
Christian Visintin fc7e789390 feat(site): base layout with og/hreflang, theme bootstrap, umami 2026-06-08 10:16:00 +02:00
Christian Visintin 3c4356af92 fix(site): robust man-fetch invocation guard, add timeout+retry 2026-06-08 10:16:00 +02:00
Christian Visintin ba513850c1 feat(site): build-time man.md fetcher pinned to release ref 2026-06-08 10:16:00 +02:00
Christian Visintin f56dd60868 refactor(site): type-safe i18n keys derived from en 2026-06-08 10:16:00 +02:00
Christian Visintin f544a63d19 feat(site): i18n string resolver with en fallback 2026-06-08 10:16:00 +02:00
Christian Visintin 02fec64d35 feat(site): catppuccin theme tokens, tailwind 4, self-hosted font 2026-06-08 10:16:00 +02:00
Christian Visintin a54ff078cc chore(site): scaffold astro project, remove legacy SPA 2026-06-08 10:16:00 +02:00
Christian Visintin c27748272d chore: gitignore .superpowers brainstorm artifacts 2026-06-08 10:16:00 +02:00
Christian Visintin f6d65cf09d ci: fix release notes generation in release workflow
Deploy static content to Pages / deploy (push) Has been cancelled
codeberg-mirror / mirror (push) Has been cancelled
Install.sh / build (macos-latest) (push) Has been cancelled
Install.sh / build (ubuntu-latest) (push) Has been cancelled
Linux / build-linux (push) Has been cancelled
MacOS / build-macos (push) Has been cancelled
Windows / build-windows (push) Has been cancelled
prepare job failed: git-cliff --latest crashed with 'trim_start_matches on
null' because the checkout was shallow (no tags/history) so no release existed.

- checkout prepare with fetch-depth: 0 + fetch-tags so git-cliff sees full
  history and tags (also fixes an otherwise-truncated CHANGELOG)
- generate release notes with --unreleased --tag v$VERSION instead of --latest:
  --latest selected the previous real tag (stale notes); --unreleased --tag
  renders the version being released
2026-06-07 19:16:00 +02:00
Christian Visintin 930e76814f build: add chocolatey package, remove legacy dist build scripts
The old manual dist/build/* scripts and dist/{deb,rpm}.sh are superseded by the
automated release workflow. Add the chocolatey package consumed by release.yml.
2026-06-07 16:58:51 +02:00
Christian Visintin cdd4c60805 ci: pin all actions to verified SHAs and clear zizmor findings
Pin every action to a commit SHA whose tag comment matches (verified via gh api),
add least-privilege permissions, set persist-credentials: false, and replace the
archived actions-rs/cargo with a plain cargo test. zizmor clean at default persona.
2026-06-07 16:58:51 +02:00
Christian Visintin c652ca18b8 ci: automated release workflow
Single workflow_dispatch (version, dry_run) that bumps versions, regenerates
CHANGELOG via git-cliff, rebuilds site CSS, builds all targets, creates the
GitHub release, updates the Homebrew tap and publishes Chocolatey.

- dist/release/bump_version.sh: version replacer across all tracked locations (+tests)
- .github/workflows/release.yml: prepare -> build matrix -> homebrew/release -> choco
- retire build-artifacts.yml (merged into release.yml)
- Linux builds via cargo-zigbuild (old glibc) for broad compatibility
2026-06-07 16:58:51 +02:00
Christian Visintin 0ad18ea5e7 chore: update release date
Close inactive issues / close-issues (push) Has been cancelled
codeberg-mirror / mirror (push) Has been cancelled
Install.sh / build (macos-latest) (push) Has been cancelled
Install.sh / build (ubuntu-latest) (push) Has been cancelled
Linux / build-linux (push) Has been cancelled
MacOS / build-macos (push) Has been cancelled
Deploy static content to Pages / deploy (push) Has been cancelled
Windows / build-windows (push) Has been cancelled
2026-04-18 22:25:40 +02:00
Christian Visintin 2ed71c7ff8 chore: 1.0.0 changelog 2026-04-19 01:54:46 +05:30
Christian Visintin 49102985a4 ci: add linux and windows aarch64 build targets 2026-04-19 01:54:46 +05:30
Christian Visintin bc59df494b fix: filter self-references and dot entries from remote directory listings
Some non-compliant FTP servers (e.g. LiteSpeed) include a self-reference
to the listed directory in the LIST response, causing the current folder
to appear as a duplicate entry in the explorer.

Closes #410
2026-04-19 01:54:46 +05:30
Christian Visintin 080c013fab build: upgrade remotefs-ssh to 0.8.3
closes #414
2026-04-19 01:54:46 +05:30
Christian Visintin 6252df2959 build: migrate to tui-realm 4.0
Upgrade tuirealm (3.x -> 4.0.0), tui-realm-stdlib (3 -> 4), tui-term
(0.2 -> 0.3). Apply all breaking changes from the 4.0 migration guide
across the termscp UI.

Key changes:

- Root-level re-exports removed; imports moved to module-qualified
  paths (`tuirealm::application`, `::component`, `::event`, `::props`,
  `::state`, `::subscription`, `::listener`, `::ratatui`). Same for
  stdlib component types (`tui_realm_stdlib::components::*`).
- `MockComponent` trait renamed to `Component`; old `Component` trait
  renamed to `AppComponent`. `#[derive(MockComponent)]` is now
  `#[derive(Component)]`. `Component::on` now takes `&Event<_>`.
- `TextSpan` replaced with `SpanStatic`/`LineStatic`/`TextStatic`
  (ratatui-based); tuple `(String, Alignment)` titles replaced with
  the new `Title` builder; `Alignment` split into
  `HorizontalAlignment`/`VerticalAlignment`; stdlib components use
  `.alignment_horizontal` instead of `.alignment`.
- `State::One`/`PropPayload::One` -> `Single`. `CmdResult::None`
  -> `NoChange`. `Props::get_or` removed; `Props::get` now returns a
  borrowed `Option<&AttrValue>` (call sites switched to
  `.and_then(AttrValue::as_*)`). `Component::query` returns
  `Option<QueryResult<'a>>`.
- `Attribute::HighlightedColor` -> `HighlightStyle` (a full `Style`).
  `.highlighted_*` helpers renamed to `.highlight_*`.
- `PollStrategy::UpTo(n)` now requires a `Duration`; tick timeout moved
  from `EventListenerCfg::poll_timeout` into `PollStrategy`.
- `TerminalBridge` removed; `Context` now holds
  `CrosstermTerminalAdapter` directly and enables raw mode + alternate
  screen explicitly. The `TerminalAdapter` trait is imported where its
  methods are used.
- `Update` trait removed; activity `update` methods are plain inherent
  functions.
- `ProgressBar` replaced by stdlib `Gauge`. Paragraph `.wrap` renamed
  to `.wrap_trim`; `.text` now takes an `Into<Text>`. Stdlib `List` row
  items are now individual lines (`Vec<Span>` per row) rather than a
  `Table` of spans; custom `FileList`/`Log` convert between the two
  models.
- Radio builders drop `.foreground(color)` so unselected items render
  with the terminal default foreground, and set
  `highlight_style(Style::default().fg(color).add_modifier(REVERSED))`
  so the selected entry is visibly highlighted only with the theme
  color.
- Custom `FileList` keeps the selected row highlighted with the full
  highlight style when focused and falls back to a foreground-only
  style when unfocused.
- Theme loading is now backwards compatible: `Theme` uses a custom
  `Deserialize` through an intermediate `ThemeFile` with optional
  fields, so missing keys, unknown values or legacy aliases
  (`transfer_progress_bar_full`/`_partial`) fall back to defaults on a
  per-field basis instead of failing the whole load.
2026-04-19 01:54:46 +05:30
Christian Visintin 9160c52cb0 build: remotefs-ssh 0.8.2
this version removes any usage of sh commands from the sftp backend and only uses pure protocol functions

closes #409
2026-04-19 01:54:46 +05:30
Christian Visintin 38f1fccfd0 build: remotefs-ssh 0.8.1 2026-04-19 01:54:46 +05:30
Christian Visintin 6ceaf048b5 fix: render progress bar immediately after mounting
Call self.view() right after mount_progress_bar() at all 6 call sites
so the bar is visible on screen before the transfer loop begins.
2026-04-19 01:54:46 +05:30
Christian Visintin 534c16427e fix: use time-based redraw interval instead of progress-delta threshold
The old 1% progress threshold caused the UI to appear frozen on large
files (e.g. 1GB) because many read/write iterations passed between
redraws. Switching to a 100ms time-based interval ensures consistent
UI responsiveness regardless of file size.
2026-04-19 01:54:46 +05:30
Christian Visintin 9b19240925 feat: consolidate theme progress bar fields into single transfer_progress_bar 2026-04-19 01:54:46 +05:30
Christian Visintin 0ddbf3b104 feat: update transfer loop to use unified TransferProgress 2026-04-19 01:54:46 +05:30
Christian Visintin 126e58503f feat: update progress bar display for new unified data model 2026-04-19 01:54:46 +05:30
Christian Visintin 0be8b60c7d feat: simplify progress bar layout to single component 2026-04-19 01:54:46 +05:30
Christian Visintin 4ed6b118ca feat: replace dual progress bar components with single TransferProgressBar 2026-04-19 01:54:46 +05:30
Christian Visintin a48b226d9b feat: rework TransferProgress to track bytes with lazy estimation 2026-04-19 01:54:46 +05:30
Christian Visintin e11af03fdd chore: enable safe clippy pedantic lints 2026-04-19 01:54:46 +05:30
Christian Visintin f044e6ace2 docs: document ssh key storage API 2026-04-19 01:54:46 +05:30
Christian Visintin e056afbd28 test: extend system regression coverage 2026-04-19 01:54:46 +05:30
Christian Visintin 9442e3b150 fix: normalize localhost relative path checks 2026-04-19 01:54:46 +05:30
Christian Visintin 9c00b9a86c test: extend config and explorer regression coverage 2026-04-19 01:54:46 +05:30
Christian Visintin 622cfe260a test: add parser and bookmark regression coverage 2026-04-19 01:54:46 +05:30
Christian Visintin 0c3ced012e refactor: split auth view helpers by responsibility 2026-04-19 01:54:46 +05:30
Christian Visintin d60c5007f9 docs: complete remaining core module docs 2026-04-19 01:54:46 +05:30
Christian Visintin 7e10b8e68b docs: document parser and file transfer params 2026-04-19 01:54:46 +05:30
Christian Visintin 08509caf1b docs: document core host and ssh modules 2026-04-19 01:54:46 +05:30
Christian Visintin 89de2d2dfa docs: add core module and API documentation 2026-04-19 01:54:46 +05:30
Christian Visintin abc80b93ad refactor: split auth update handlers by context 2026-04-19 01:54:46 +05:30
Christian Visintin 1b79a6fc91 refactor: split auth form components by protocol 2026-04-19 01:54:46 +05:30
Christian Visintin 5a3aa64fba refactor: split parser internals into focused modules 2026-04-19 01:54:46 +05:30
Christian Visintin bc4b096077 fix: stabilize core error handling
Remove production panic and unwrap paths from core modules.

Propagate bookmark encryption failures, harden file watcher and temp mapped file handling, and clean up dead code in shared utilities.
2026-04-19 01:54:46 +05:30
Christian Visintin 0025b87b0f fix: sync browsing when entering a directory from filtered/fuzzy view
Closes #382
2026-04-19 01:54:46 +05:30
Christian Visintin bd0843d3da build: replace version-compare crate with semver
closes #399
2026-04-19 01:54:46 +05:30
Christian Visintin 0ba43d5714 ci: check fmt with nightly toolchain 2026-04-19 01:54:46 +05:30
Christian Visintin 97e1ca789a chore: add fmt+clippy convention to CLAUDE.md and apply nightly fmt 2026-04-19 01:54:46 +05:30
Christian Visintin 2df13fac10 fix: pass full command string to exec, not just the first word
The `Exec` arm of `Command::from_str` only captured the first
whitespace-delimited token, silently dropping all arguments.
Now passes the entire input string so e.g. `ls -la /tmp` works.
2026-04-19 01:54:46 +05:30
Christian Visintin 186313f57c fix: resolve . and .. in terminal cd and prevent panic in path elide
`absolutize` now lexically normalizes paths so `cd ..` navigates to the
parent directory instead of appending `..` literally. Also guard against
`file_name()` returning `None` in `fmt_path_elide_ex`, which caused a
panic on paths containing unresolved `..` components.

Closes #402
2026-04-19 01:54:46 +05:30
Christian Visintin 8b0be49609 ci: run test workflows once 2026-04-19 01:54:46 +05:30
Christian Visintin e062ee0447 chore: format toml 2026-04-19 01:54:46 +05:30
Christian Visintin c81cf39fe9 build: replaced libssh with russh for remotefs-ssh 2026-04-19 01:54:46 +05:30
Christian Visintin 9cfef867a9 fix: return after empty terminal prompt 2026-04-19 01:54:46 +05:30
Christian Visintin 18314e6a2e chore: 1.0.0 version into manifests 2026-04-19 01:54:46 +05:30
Christian Visintin 9f3df1a79a style: linter 2026-04-19 01:54:46 +05:30
Christian Visintin fe424107e9 build: removed hostname, use whoami instead
whoami provides `hostname` function, so we don't need the hostname dependency, since whoami is also being used for getting the username

closes #398
2026-04-19 01:54:46 +05:30
Christian Visintin d97535894c fix: replace recursive byte-counting with entry-based transfer progress (#395)
* fix: replace recursive byte-counting with entry-based transfer progress

Replace the expensive recursive `get_total_transfer_size` pre-calculation
with a lightweight entry-based counter (`TransferProgress`) for the
overall progress bar. This avoids deep `list_dir` traversals before
transfers begin, which could cause FTP idle-timeout disconnections on
large directory trees.

The per-file byte-level progress bar (`ProgressStates`) remains
unchanged. Bytes are still tracked via `TransferStates::add_bytes` for
notification threshold logic.

Closes #384
2026-04-19 01:54:46 +05:30
Christian Visintin 4d65e48b3c fix: replace magic-crypt with aes-gcm for bookmark encryption
magic-crypt has known vulnerabilities. Replace it with aes-gcm for new
encryption (authenticated, with random nonces) while keeping a legacy
AES-128-CBC decryption path to transparently handle existing bookmarks.
2026-04-19 01:54:46 +05:30
Christian Visintin 0d24662b3d refactor: migrate from mod.rs to named module files 2026-04-19 01:54:46 +05:30
Christian Visintin bc14b049c0 chore: add centralized lint configuration to Cargo.toml 2026-04-19 01:54:46 +05:30
Christian Visintin d32c588f15 refactor: replace lazy_static with std::sync::LazyLock 2026-04-19 01:54:46 +05:30
Christian Visintin 60e86aff2a perf: use sort_by_cached_key to avoid repeated lowercase allocations in file sorting 2026-04-19 01:54:46 +05:30
Christian Visintin 5f83a1468c fix: correct typos in BadSytax and theme_provider log messages 2026-04-19 01:54:46 +05:30
Christian Visintin 5758a12c3b fix: replace assert! calls in UI activities with graceful error handling 2026-04-19 01:54:46 +05:30
Christian Visintin 49a74d02ea fix: replace panics reachable from user input with proper error handling 2026-04-19 01:54:46 +05:30
Christian Visintin f6d35f1eea refactor: FileTransferActivity pane-agnostic dispatch (#386)
Comprehensive design for incremental refactoring of the 13k-line
FileTransferActivity god-struct using a unified Pane abstraction.
Detailed step-by-step plan covering 6 phases: split monoliths,
error handling, Pane struct, action dedup, session split, view reorg.
Extract 26 popup components from the monolithic 1,868-line popups.rs
into 20 individual files under popups/. Each file contains one or two
related components with their own imports. The popups.rs module file
now contains only module declarations and re-exports.
Replace 8 panic!() calls with error!() logging and early returns/fallthrough.
These panics documented invariants (e.g. "this tab can't do X") but would crash
the app if somehow triggered. Error logging is safer and more resilient.
Replace raw FileExplorer fields in Browser with Pane structs that bundle
the explorer and connected state. Move host_bridge_connected and
remote_connected from FileTransferActivity into the panes. Add navigation
API (fs_pane, opposite_pane, is_find_tab) for future unification tasks.
Rename private get_selected_file to get_selected_file_by_id and add three
new unified methods (get_selected_entries, get_selected_file, is_selected_one)
that dispatch based on self.browser.tab(). Old per-tab methods are kept for
now until their callers are migrated in subsequent tasks.
Collapse _local_/_remote_ action method pairs (mkdir, delete, symlink,
chmod, rename, copy) into unified methods that branch internally on
is_local_tab(). This halves the number of action methods and simplifies
the update.rs dispatch logic. Also unifies ShowFileInfoPopup and
ShowChmodPopup dispatching to use get_selected_entries().
Move `host_bridge` and `client` filesystem fields from FileTransferActivity
into the Pane struct, enabling tab-agnostic dispatch via `fs_pane()`/
`fs_pane_mut()`. This eliminates most `is_local_tab()` branching across
15+ action files.
Key changes:
- Add `fs: Box<dyn HostBridge>` to Pane, remove from FileTransferActivity
- Replace per-side method pairs with unified pane-dispatched methods
- Unify navigation (changedir, reload, scan, file_exists, has_file_changed)
- Replace 147-line popup if/else chain with data-driven priority table
- Replace assert!/panic!/unreachable! with proper error handling
- Fix typo "filetransfer_activiy" across ~29 files
- Add unit tests for Pane

Net result: -473 lines, single code path for most file operations.
2026-04-19 01:54:46 +05:30
Christian Visintin 3fb61a76fe chore: funding
MacOS / build (push) Has been cancelled
Deploy static content to Pages / deploy (push) Has been cancelled
Windows / build (push) Has been cancelled
codeberg-mirror / mirror (push) Has been cancelled
Install.sh / build (macos-latest) (push) Has been cancelled
Install.sh / build (ubuntu-latest) (push) Has been cancelled
Linux / build (push) Has been cancelled
Close inactive issues / close-issues (push) Has been cancelled
2026-02-24 12:33:58 +01:00
Christian Visintin ff4452c971 chore: WTF CTRL SAVE DOESNT FUCKING WORK 2026-02-09 10:27:21 +01:00
Christian Visintin fd1d8a0e26 chore: Install with apt if installed 2026-02-09 10:25:57 +01:00
Christian Visintin b0d6da8e23 chore: Copilot is so dumb 2026-02-09 10:12:54 +01:00
Christian Visintin 4ca0865fe3 chore: Use apt to install termscp on debian base to prevent broken deps 2026-02-09 10:12:04 +01:00
Christian Visintin b8115362f8 ci: Codeberg mirroring 2026-01-30 14:57:03 +01:00
Christian Visintin 155f747563 docs: date 2025-12-20 17:12:50 +01:00
Christian Visintin b04976bde3 fix: Updated dependencies to allow build on NetBSD
closes #371
2025-12-20 16:33:50 +01:00
veeso 5f7a0d8a46 fix: install.sh deb name
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Close inactive issues / close-issues (push) Has been cancelled
2025-12-02 14:27:34 +01:00
veeso 694232564a fix: install.sh deb name 2025-12-02 14:25:55 +01:00
veeso 54b674ad43 ci: windows artifact name
Deploy static content to Pages / deploy (push) Has been cancelled
Windows / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Close inactive issues / close-issues (push) Has been cancelled
2025-11-11 12:34:36 +01:00
veeso c32822037e ci: deploy site 2025-11-11 12:21:05 +01:00
veeso abb5c212c5 feat: Merge branch '0.19.0' 2025-11-11 12:19:21 +01:00
veeso e9b54a227b chore: CHANGELOG date 2025-11-11 09:42:21 +01:00
veeso befc32198a ci: debian fix
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-11-10 17:25:29 +01:00
veeso 7e5103ff7e ci: Debian 2025-11-10 17:06:44 +01:00
veeso 2cb600083e docs: Release date 2025-11-10 16:44:24 +01:00
Christian Visintin 47d23673e6 ci: Build artifacts for Windows x86_64 and Ubuntu x86_64 (#368) 2025-11-10 16:43:25 +01:00
Christian Visintin a0b357cf8c feat: Added <CTRL+S> keybinding to get the total size of selected paths. (#367)
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
* feat: Added `<CTRL+S>` keybinding to get the total size of selected paths.

closes #297
2025-11-09 21:14:42 +01:00
Christian Visintin 75943f2b93 feat: Changed file overwrite behaviour (#366)
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Now the user can choose for each file whether to overwrite, skip or overwrite all/skip all.

closes #335
2025-11-09 19:00:17 +01:00
veeso 085ab721f9 build: remotefs-ssh 0.7.1
This version fixes compatibility with hosts which don't use bash/sh as the default shell.

closes #365
2025-11-09 17:38:50 +01:00
Christian Visintin f4156a5059 feat: Import bookmarks from ssh config with a CLI command (#364)
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
* feat: Import bookmarks from ssh config with a CLI command

Use import-ssh-hosts to import all the possible hosts by the configured ssh config or the default one on your machine

closes #331
2025-11-08 15:32:52 +01:00
Christian Visintin 4bebec369f fix: Issues with update checks (#363)
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Removed error popup message if failed to check for updates.
Prevent long timeouts when checking for updates if the network is down or the DNS is not working.

closes #354
2025-10-02 21:27:51 +02:00
Christian Visintin 05c8613279 fix: Report a message while calculating total size of files to transfer. (#362)
* fix: Report a message while calculating total size of files to transfer.

Currently, in case of huge transfers the app may look frozen while calculating the transfer size. We should at least report to the user we are actually doing something.

closes #361

* ci: windows runner
2025-10-02 20:58:26 +02:00
veeso 205d2813ad perf: Migrated to libssh.org on Linux and MacOS for better ssh agent support.
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
closes #337
2025-09-20 18:13:20 +02:00
veeso 86660a0cc9 fix: SMB support for MacOS with vendored build of libsmbclient.
closes #334
2025-09-20 18:07:26 +02:00
veeso 05830db206 docs: User manual and get started links
Install.sh / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Linux / build (push) Has been cancelled
Close inactive issues / close-issues (push) Has been cancelled
2025-09-16 10:36:17 +02:00
veeso 3c79e812eb build: 0.19 deps 2025-09-06 16:40:01 +02:00
moshyfawn 0287e7706a fix: typo in file open error message (#349)
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Close inactive issues / close-issues (push) Has been cancelled
2025-06-13 22:50:06 +02:00
veeso 67a14c2725 fix: lock
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-06-10 21:20:04 +02:00
veeso df03c5c1bf feat: 0.18
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-06-10 14:29:02 +02:00
veeso 3ce3ffee3d fix: larger file info popup 2025-06-10 14:26:36 +02:00
Christian Visintin c0b32a1847 feat: Replaced the Exec popup with a fully functional terminal emulator (#348)
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
* feat: Replaced the `Exec` popup with a fully functional terminal emulator

closes #340

* fix: colors and fmt for terminal

* feat: Handle exit and cd on terminal

* fix: Fmt pah
2025-06-10 13:17:20 +02:00
Christian Visintin 81ae0035c3 Fix SSH auth with id keys (#347)
I fixed the id_rsa/id_ed25519 SSH auth issue on Mac and now termscp should respect the key-based authentication, just like the regular ssh user@hostname, without the need for any ssh agents.

---

Co-authored-by: Lucas Czekaj <lukasz@czekaj.us>
2025-06-08 18:34:59 +02:00
veeso 783da22ca2 feat: **Updated dependencies** and updated the Rust edition to 2024 2025-06-08 18:00:42 +02:00
veeso 8715c2b6f9 chore: CODE_OF_CONDUCT update
Install.sh / build (push) Has been cancelled
2025-05-10 19:23:06 +02:00
veeso 98a748dccc style: catppuccin themes
Install.sh / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Linux / build (push) Has been cancelled
2025-04-15 12:24:08 +02:00
Christian Visintin bef031a414 Update website.yml
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-03-23 22:01:18 +01:00
veeso ce0e953182 chore: site 2025-03-23 18:13:05 +01:00
veeso 9a5caf75c3 build: so apparently native-tls vendored tries to build openssl on windows, wtf guys?
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2025-03-23 18:07:20 +01:00
veeso 446f4a3a32 build: build docker for x86 2025-03-23 16:43:51 +01:00
veeso da75912d26 docs: version
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2025-03-23 15:59:50 +01:00
veeso 4ed23c2a18 build: aws-s3 0.4.2 2025-03-23 15:58:25 +01:00
Christian Visintin 23ae334bef ci(build): build vendored smb and refactor platform deps (#333) 2025-03-23 15:57:54 +01:00
Christian Visintin ec75ae1486 feat: 132 queuing transfers (#332)
the logic of selecting files has been extended!
From now on selecting file will put the files into a transfer queue, which is shown on the bottom panel.
When a file is selected the file is added to the queue with a destination path, which is the **current other explorer path at the moment of selection.
It is possible to navigate to the transfer queue by using `P` and pressing `ENTER` on a file will remove it from the transfer queue.Other commands will work as well on the transfer queue, like `COPY`, `MOVE`, `DELETE`, `RENAME`.

closes #132
2025-03-23 14:36:13 +01:00
veeso 368570592f feat(cli): added --wno-keyring flag to disable keyring
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
closes #308
2025-03-22 13:44:02 +01:00
veeso 806793421e fix(bookmarks): Local directory path is not switching to what's specified in the bookmark
closes #316
2025-03-22 13:25:29 +01:00
veeso 1f377b242d fix(log): add suppaftp/pavao/kube to allowed logs
Windows / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
fix #330
2025-03-17 18:59:47 +01:00
veeso a4906b129a docs: veeso.me instead of veeso.dev
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2025-03-17 09:31:44 +01:00
veeso 5c6e8925ad test(remotefs_builder): check result, build doesn't panic anymore 2025-03-17 09:30:33 +01:00
veeso a18eff689d fix(aws-s3): updated remotefs-aws-s3 to 0.4.1
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
should fix #329
2025-03-16 20:06:35 +01:00
veeso 274742d6d9 build: bump to ssh2-config 0.4 and remotefs 0.6 to have support for Include in config files
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
fix #309
2025-03-15 20:04:21 +01:00
veeso cdebcbd4dc fix: the return value of --version should be 0
fix #317
2025-03-15 16:54:36 +01:00
veeso cdf303a847 fix: fixed a crash when the local directory specified in the auth form does not exist
fix #319
2025-03-15 16:46:57 +01:00
veeso dd35fe825c fix(ui): fixed input mask on host bridge on local dir up
if you go up on local dir when localhost is selected it panics

fix #327
2025-03-15 14:24:24 +01:00
veeso 5c4a971aca docs(CONTRIBUTING): docs(CONTRIBUTING): mistakes
fix #318
2025-03-15 14:19:18 +01:00
veeso 7522b4d0ff chore(changelog): changelog 2025-03-15 14:16:18 +01:00
veeso b0f314837e build(deps): updated dependencies and edition to 2024 2025-03-15 14:15:45 +01:00
Christian Visintin 8a9ba7745a Merge pull request #325 from eggplants/fix-clippy-error
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
fix: clippy error
2025-01-06 12:53:13 +01:00
haruna b7d75a2749 fix: clippy error 2025-01-05 22:52:45 +09:00
Christian Visintin fe0d9b0aa6 Update stale.yml
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
2024-12-28 13:22:03 +01:00
veeso 7dba691ccc fix: isolated-tests for localhost
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-11-13 17:06:34 +01:00
veeso 099e2154ba fix: unused import isolated tests 2024-11-13 15:57:49 +01:00
veeso f2efb25ad7 fix: 0.16.1
Install.sh / build (push) Waiting to run
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2024-11-12 12:34:26 +01:00
veeso e45c3d5b4e fix: gg rust 1.82 for introducing a nice breaking change in config which was not mentioned in changelog
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-10-21 11:09:50 +02:00
veeso 69f821baef fix: cfg unix forbidden in rust .82
Install.sh / build (push) Waiting to run
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2024-10-21 10:32:50 +02:00
Christian Visintin 11559d0962 Merge pull request #302 from veeso/0.16
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
0.16
2024-10-14 16:36:36 +02:00
veeso 79c33095fc fix: tiny ui issue 2024-10-14 16:00:15 +02:00
veeso 0ec6bcbcef fix: 0.16
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Linux / build (push) Has been cancelled
2024-10-14 11:40:45 +02:00
Christian Visintin 3cde067339 feat: Show .. directory before all the others in the explorer to navigate to the parent dir (#301) 2024-10-14 11:28:02 +02:00
Christian Visintin c05ef32270 fix: issue 292 New version alert was not displayed due to a semver regex issue. (#300) 2024-10-14 10:43:47 +02:00
Christian Visintin 7eb913ec7b fix: tuirealm 2.x (#299) 2024-10-14 09:55:52 +02:00
veeso 4e63093d25 fix: users from lock
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-10-07 17:50:15 +02:00
Christian Visintin e5d50698d2 fix: vergen (#296) 2024-10-07 17:49:52 +02:00
Christian Visintin 79c31c2d84 fix: Use uzers instead of the dead package users which has several vulnerabilities (#295) 2024-10-07 17:40:35 +02:00
Christian Visintin aab266a661 285 feature request multi host (#293) 2024-10-07 16:27:45 +02:00
veeso a4c9acb49f feat: version 0.16 2024-10-05 17:41:40 +02:00
veeso 6205c7f3c5 fix: include build.rs
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-10-03 17:57:49 +02:00
veeso e4af014013 fix: readme 2024-10-03 17:56:51 +02:00
Christian Visintin c9f649f40f Merge pull request #288 from veeso/0.15 2024-10-03 17:55:50 +02:00
veeso 1f27ca2607 fix: ci 2024-10-03 17:36:44 +02:00
veeso a1288c7480 fix: github ci is stable and reliable (one worker broken each 2 weeks) 2024-10-03 17:28:29 +02:00
veeso 4bfec52ba5 fix: set date 2024-10-03 17:12:45 +02:00
Christian Visintin 3f01be3baa 280 feature request go to path auto completion (#287) 2024-10-03 17:11:25 +02:00
Christian Visintin 8e2ffeabce fix: isolated-tests feature to run tests for releasing on distributions which run in isolated environments (#286)
* fix: `isolated-tests` feature to run tests for releasing on distributions which run in isolated environments

* fix: cond
2024-10-03 12:17:03 +02:00
Christian Visintin fc68e2621b feat: it is now possible to cancel find command; show find progress (#284) 2024-10-03 11:31:16 +02:00
Christian Visintin b2a8a3041c 249 feature request better search results (#282)
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
* feat: issue 249 - fuzzy search replaced the old find explorer

* fix: forgot to upload file

* fix: removed debug
2024-10-02 17:45:48 +02:00
veeso c507d54700 fix: popup texts
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2024-10-02 12:59:53 +02:00
veeso 31c5ad7534 fix: issue 277 Fix a bug in the configuration page, which caused being stuck if the added SSH key was empty 2024-10-02 12:44:35 +02:00
veeso 14ac10547c fix: don't clear screen after terminating termscp 2024-10-02 12:34:00 +02:00
Christian Visintin ae1638ee17 feat: Pods and container explorer for Kube protocol (#281) 2024-10-02 12:24:46 +02:00
veeso c5f76ec51c fix: bump vers 2024-10-02 10:33:42 +02:00
veeso d319a2fae4 fix: notify 6 2024-10-02 10:25:30 +02:00
veeso 72a5703a08 fix: keyring test not passing macos 2024-10-02 10:09:09 +02:00
veeso 91b4d4e463 fix: bump vers 2024-09-30 12:06:42 +02:00
veeso 17719ea370 feat: init 0.15 2024-09-30 12:06:03 +02:00
veeso 707a3faa54 fix: dbus deveL
Coverage / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-08-06 09:26:49 +02:00
veeso dfe58e6147 fix: tokio rt builder
Coverage / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-07-22 10:36:16 +02:00
veeso c49dab3888 fix: changelog
Coverage / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
2024-07-17 17:05:15 +02:00
veeso 47ff07e496 feat: termscp 0.14 2024-07-17 16:22:53 +02:00
veeso 61a8fb95e4 fix: removed support for RPM 2024-07-17 12:41:49 +02:00
Christian Visintin f757336d75 feat: kube protocol support (#267) 2024-07-17 11:59:30 +02:00
veeso cf529c1678 fix: german manual
Coverage / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
Linux / build (push) Has been cancelled
2024-07-15 15:20:29 +02:00
Christian Visintin 631f09b9a8 feat: issue 256 - filter files (#266) 2024-07-15 15:08:22 +02:00
Eric Long 65aed76605 chore: bump ring to 0.17 (#265) 2024-07-15 11:52:55 +02:00
veeso 9036d83635 fix: remotefs-ssh 0.3.1
Coverage / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
Windows / build (push) Has been cancelled
2024-07-09 12:25:47 +02:00
Christian Visintin 179c4de4ed feat: ssh-agent (#264) 2024-07-09 11:55:17 +02:00
Christian Visintin f3b84c97e1 feat: ALT+A to deselect all files (#263)
Coverage / build (push) Waiting to run
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2024-07-08 15:56:20 +02:00
Christian Visintin b5b3aeb645 fix: Jump to next entry after select (#262) 2024-07-08 15:26:27 +02:00
veeso e5172d4207 fix: sorted flags in readme 2024-07-08 15:24:42 +02:00
Christian Visintin 50e7f5f5d0 fix: CLI remote args cannot handle '@' in the username (#261)
Coverage / build (push) Waiting to run
Linux / build (push) Waiting to run
MacOS / build (push) Waiting to run
Windows / build (push) Waiting to run
2024-07-08 14:57:20 +02:00
veeso 88cdae79a8 fix: lint 2024-07-08 14:48:03 +02:00
Michał Sieroń 4f3b97b198 fix: correct help text for update subcommand (#259)
Windows / build (push) Has been cancelled
Coverage / build (push) Has been cancelled
Install.sh / build (push) Has been cancelled
Linux / build (push) Has been cancelled
MacOS / build (push) Has been cancelled
2024-06-25 22:38:59 +02:00
Hartur Alcantara 54a8317d0e Adding Brazilian Portuguese translation (#253) 2024-05-08 08:52:34 +02:00
Orhun Parmaksız 3a46aa74f9 chore: update tui-rs references to ratatui (#244) 2024-04-18 15:59:31 +02:00
Orhun Parmaksız aca5b37898 docs: update Arch Linux instructions (#243) 2024-04-17 19:26:35 +02:00
veeso 0394a12c9f fix: install script version 2024-03-02 20:42:48 +01:00
Christian Visintin e61d04aa1b Merge pull request #236 from veeso/develop
0.13.0
2024-03-02 20:27:16 +01:00
veeso c0c9f7c0dd fix: lint??? 2024-03-02 19:41:07 +01:00
veeso 905fe5fc9f fix: debian script 2024-03-02 19:36:01 +01:00
veeso 89ab53a71b fix: debian script 2024-03-02 19:35:18 +01:00
veeso 7dccac6105 fix: test 2024-03-02 19:31:36 +01:00
veeso 44051ec718 feat: termscp 0.13.0 2024-03-02 19:28:01 +01:00
Christian Visintin c7469b8594 feat: WebDAV support (#235) 2024-03-02 19:23:27 +01:00
veeso 5dfee2cbd9 fix: AWS S3 wasn't working anymore due to rust-s3 outdate 2024-03-01 17:02:58 +01:00
Christian Visintin 679a829744 233 feature request subcommands (#234) 2024-03-01 10:01:25 +01:00
PIRADATA 2a51ab984c update linux installation command from termscp.veeso.dev/get-started.html (#223) 2023-12-15 18:53:45 +01:00
Jarod 2b2ebadd6a Fixed formatting (#207) 2023-12-15 09:33:55 +01:00
Christian Visintin 2b15a23fe8 Update README.md 2023-11-15 21:50:49 +01:00
veeso d30c3dfadd force tuirealm 1.8 2023-10-06 22:03:08 +02:00
veeso ef8dbb6305 0.12.3 2023-10-06 09:19:03 +02:00
veeso 623ba806e1 0.12.3 2023-10-06 09:17:38 +02:00
veeso ea9dd03f55 Revert "feat: tui-realm 1.9"
This reverts commit cfbecc049d.
2023-10-06 09:13:57 +02:00
veeso 92d20f33fe new site 2023-10-01 16:20:35 +02:00
veeso 15caef83e6 0.12.2 2023-10-01 16:20:04 +02:00
veeso 19992402e2 fix: panic if the terminal screen is too small 2023-10-01 16:18:11 +02:00
veeso 182bbb94a2 0.12.2 2023-10-01 16:12:47 +02:00
Christian Visintin 20c3e22572 [BUG] - termscp not respecting port in ssh config (#216) 2023-10-01 16:12:43 +02:00
veeso d3c2c084db fix: fmt 2023-08-23 10:11:13 +02:00
veeso cfbecc049d feat: tui-realm 1.9 2023-08-23 09:18:09 +02:00
Christian Visintin 9de171fb83 added cfg smb-windows to be able to disable SMB on windows (#210)
* added cfg smb-windows to be able to disable SMB on windows

* lint
2023-08-20 10:24:34 +02:00
veeso 2f48c765e3 termscp 0.12.0 2023-07-06 16:17:33 +02:00
Christian Visintin ca005cbecd save local file paths in bookmark (#204)
* fix: renamed Bookmark 'directory' to 'remote_path' (keep name in file)

* feat: local_path as file transfer parameter and in bookmark
2023-07-06 16:05:22 +02:00
Christian Visintin ee28d34f29 fix: don't update path breadcrumb if enter/scan dir failed (#203) 2023-07-06 14:55:53 +02:00
veeso 295191b9eb Merge branch 'main' into develop 2023-07-06 11:49:06 +02:00
veeso 16b2aa8596 fix: rustup target 2023-07-06 11:38:38 +02:00
Christian Visintin 522ee0355e feat: build artifacts workflow (#202) 2023-07-06 11:26:14 +02:00
veeso e5ca956897 fix: don't run CI on site/.md change 2023-07-06 11:07:22 +02:00
Christian Visintin a071f3d420 feat: smb is now an optional feature (#200) 2023-07-06 11:02:53 +02:00
veeso 66888c418c fix: deps 2023-07-06 09:59:25 +02:00
veeso b5f712fa04 fix: better main runner 2023-07-06 09:49:35 +02:00
529 1509401599 Add missing row in KeybindingsPopup (#193) 2023-07-06 09:17:55 +02:00
veeso 6506f4ae59 fixed theme 2023-07-05 13:22:56 +02:00
veeso 5a5fa52b57 fixed theme 2023-07-05 12:58:21 +02:00
veeso b7d4c68ebe new termscp site 2023-07-05 12:33:17 +02:00
Renan Dorneles Schuquel 00a6c53178 Fix: Some URL typos on 'install.sh' and 'README.md'. (#197)
Co-authored-by: rschuquel <renan.schuquel@unimedvtrp.com.br>
2023-06-23 21:54:38 +02:00
Christian Visintin 67bc1a2a08 Ignore backlog issues 2023-05-23 09:20:11 +02:00
Christian Visintin 0bb3c9a26e Create stale.yml 2023-05-22 23:22:57 +02:00
veeso 4394941c71 fix: readme site links 2023-05-20 15:01:22 +02:00
veeso 175ea23bfc fix: sh compliant macos.sh build script 2023-05-18 11:53:21 +02:00
veeso cef100e5d9 fix: install workflow 2023-05-18 11:42:24 +02:00
veeso afba6c32c5 fix: release date 2023-05-16 15:52:50 +02:00
veeso 31f5bd095b fix: macos script 2023-05-16 14:38:16 +02:00
veeso e1add0ed28 fix: pavao 0.2.3 2023-05-16 09:29:57 +02:00
veeso 79bc6a684b fix: pavao 0.2.2 2023-05-16 09:27:48 +02:00
veeso bae4db8e27 fix: build 2023-05-15 14:23:13 +02:00
veeso 4cbba3f3cb fix: release date 2023-05-13 18:11:07 +02:00
veeso e9fbb7f317 fix: specify ssh2 config params 2023-05-13 17:59:24 +02:00
Christian Visintin 044f2436f8 Don't prompt for password if a ssh key is set for that host (#186)
* feat: don't ask password if a ssh key is set for that host

* fix: User from ssh config was not used as it should

* fix: forgot a file
2023-05-13 16:09:37 +02:00
Christian Visintin b7369162d2 SMB support (#184)
* feat: smb client

* fix: smb connection

* fix: smbclient deps

* feat: SMB mentions to user manual

* feat: changelog

* dlib macos

* fix: removed smb support from macos :(

* fix: restored libsmbclient build

* fix: strange lint message

* fix: macos build smb

* fix: macos build smb

* fix: macos tests

* fix: macos lint

* feat: SMB windows support

* fix: windows tests
2023-05-13 15:00:16 +02:00
Christian Visintin a13663e5e9 Brew Linux support (#185)
* feat: brew linux and arm installation

* fix: updated website refs to termscp.veeso.dev

* feat: added brew installation to website
2023-05-12 17:06:27 +02:00
Christian Visintin 79dd9e2303 chmod popup (#183)
* feat: chmod popup

* fix: windows shall not allows chmod on localhost
2023-05-10 17:04:24 +02:00
Christian Visintin b4fa50a666 feat: allow unknown fields in ssh2 configuration file (#181) 2023-05-10 09:27:54 +02:00
Christian Visintin 5a67fc7b0e fix: #153 show a loading message when loading directory's content (#180) 2023-05-09 17:43:37 +02:00
veeso 9dab34e7ee rustfmt.toml 2023-05-09 15:40:28 +02:00
veeso c5eeae74b7 fmt 2023-05-09 15:40:21 +02:00
Christian Visintin 9009002b6e debug log belongs in cache directory not config directory (#179)
* log files are now written to cache dir instead of config dir

* lint

* fmt
2023-05-09 15:32:42 +02:00
veeso 9bf23b3f6b working on 0.12 2023-05-09 12:48:51 +02:00
veeso 3ec94c17bc 0.11.3 2023-04-19 11:07:42 +02:00
veeso ed8ba628e5 feat: site improvements 2023-04-19 11:01:44 +02:00
veeso 7c638473d6 0.11.3 2023-04-19 10:17:59 +02:00
Christian Visintin d37140ead6 fix: relative paths windows (#167) 2023-04-19 10:15:00 +02:00
veeso fdb0d97a61 rtd 2023-04-18 18:10:40 +02:00
veeso 0c1e9c0d60 feat: site 0.11.2 2023-04-18 11:59:13 +02:00
veeso e1a2255a58 feat: dependencies up-to-date 2023-04-18 11:58:10 +02:00
Christian Visintin f6b2c814c0 bump remotefs-ssh to 0.1.5 (#164) 2023-04-18 11:44:49 +02:00
delta2force efb30231ee update Cargo.lock (#157) 2023-03-23 14:05:12 +01:00
veeso 8cb6c19210 updated curl 2023-03-08 12:07:25 +01:00
veeso 51c2618b5a optimized docker builds (re-use containers) 2023-03-08 11:49:09 +01:00
veeso 279df59b5d install ci 2023-03-07 21:01:29 +01:00
veeso d8373d0eba 0.11.1 2023-03-07 09:31:21 +01:00
veeso 74fe97f2e2 Don't tell me you're too blind to see 2023-03-06 11:16:40 +01:00
veeso e62f15f375 gb.png 2023-03-06 11:15:44 +01:00
veeso 21dc73b556 Bump ssh2-config to 0.1.6 2023-03-03 12:13:19 +01:00
veeso a10325f6fb removed remove_dir_all crate with tempfile 3.4 2023-02-28 11:09:57 +01:00
Christian Visintin 1ecef6fc16 issue 150: some issues with configuration (#151)
* issue 150: some issues with configuration
2023-02-28 10:45:07 +01:00
veeso 67df3dc76a working on 0.11.1 2023-02-27 12:23:01 +01:00
Christian Visintin 7ecfaea278 Update FUNDING.yml 2023-02-27 11:50:21 +01:00
veeso 97151d18bf fixed build scripts 2023-02-22 16:06:11 +01:00
veeso 7ad7a1580d fixed serializer 2023-02-19 18:46:10 +01:00
veeso 46f2954bc4 install.yml 2023-02-19 18:24:29 +01:00
veeso 0c88f559e2 0.11.0 2023-02-19 18:23:30 +01:00
veeso 8a0979578a deps 2023-02-13 09:35:10 +01:00
veeso 7ee28a00ae planned updates 2023-02-12 22:28:43 +01:00
Christian Visintin 82330f870e Optimize transfers (#147)
* When the file is exchanged, all times attributes are set (if supported by the protocol)

* If local/remote file have the same last modification time (`mtime`), the file is not transferred
2023-02-12 22:27:42 +01:00
veeso 54aecdc478 0.11.0 2023-02-11 12:49:30 +01:00
veeso d5038a22ee fixed tests 2023-02-11 12:45:12 +01:00
Christian Visintin c0bc493d21 125 installation missing aarch64 linux build (#146)
aarch64 build
2023-02-11 12:26:43 +01:00
Christian Visintin 1c75c7d386 SSH configuration path is not ~/.ssh/config by default (#145)
SSH configuration path is not `~/.ssh/config` by default
2023-02-11 12:23:57 +01:00
Christian Visintin 251b125cbb 126 new feature termscp doesnt use id rsa default ssh private key to authenticate to sftp scp endpoint (#144)
fixed issue 126 <https://github.com/veeso/termcp/issues/126>
2023-02-11 12:23:56 +01:00
veeso efd2235ff3 fmt 2023-02-11 12:23:56 +01:00
veeso 1db2ff7ec5 Popup with fixed sizes or percentage 2023-02-11 12:23:56 +01:00
veeso 4d5f3a6b63 lint 2023-02-11 12:23:56 +01:00
veeso 62003308a7 lint 2023-02-11 12:23:56 +01:00
veeso cb037cfca9 updated dependencies 2023-02-11 12:23:56 +01:00
Sergei Akhmatdinov 15fffdf0c9 fix install script for FreeBSD, add doas priv elevation 2023-01-31 15:03:07 +01:00
veeso c1b245b4c9 fixed install script for freebsd 2023-01-30 12:15:56 +01:00
veeso d14225c0b9 readme 2023-01-13 09:55:49 +01:00
veeso d60be7dc80 0.10.0 2022-12-28 10:49:36 +01:00
Christian Visintin 146a1f3ed6 Create website.yml 2022-12-27 16:44:42 +01:00
veeso 12fe10100b termscp site 2022-12-27 16:42:25 +01:00
RakerZh 298d590306 fix typo 2022-11-08 09:30:48 +01:00
pin 8e6aae08b6 Add NetBSD 2022-10-25 18:10:00 +02:00
veeso cb33ba114e fixed check on aarch64 2022-10-25 18:09:06 +02:00
veeso 6369ead491 Merge branch '0.10.0' into main 2022-10-15 14:01:40 +02:00
veeso ae350b4bfa termscp 0.10 2022-10-15 14:01:00 +02:00
veeso cd5bb28fb7 updated deps 2022-10-10 18:04:44 +02:00
veeso f27a4e2a02 lint 2022-10-10 17:40:03 +02:00
veeso 0f432d0375 fixed build 2022-10-10 17:26:26 +02:00
veeso 8b67c59247 removed deps from docker build 2022-10-10 16:50:00 +02:00
veeso fdd7901f7e removed libssl dependency 2022-10-10 16:21:32 +02:00
Christian Visintin 2eec7c4b2b Update README.md 2022-09-06 12:01:24 +02:00
veeso 64e3848c97 Use ssh2 config IdentityFile as fallback for key based authentication 2022-08-30 17:47:55 +02:00
veeso 833cd7d3ba Fixed version comparison when going above 0.9 2022-08-30 15:54:37 +02:00
veeso 2f1b644a40 backtab will now change the explorer tab; use P to change to log 2022-08-30 15:45:26 +02:00
veeso 6a5c248d35 Yes/No dialogs are now answerable by pressing Y or N on your keyboard 2022-08-30 15:29:34 +02:00
veeso 96df152220 fixed issue 122 <https://github.com/veeso/termscp/issues/122> 2022-08-30 15:10:41 +02:00
veeso a22c5025d7 lint 2022-08-17 10:33:31 +02:00
veeso cce0c92c0b dependencies updated 2022-08-17 10:28:44 +02:00
veeso 90d7083b24 lazy-regex 2022-08-17 10:24:13 +02:00
veeso b3ab76e573 working on 0.10.0 2022-08-17 10:16:03 +02:00
Christian Visintin 66913d5fc1 Update README.md 2022-08-05 14:51:28 +02:00
veeso f5174ccac0 removed dynamic libssl dep 2022-07-20 12:37:22 +02:00
veeso 82489e7459 homebrew notice 2022-07-20 12:08:11 +02:00
eric wong ad562a7b09 Optimize the presentation of zh-CN/README.md (#117) 2022-07-18 09:31:31 +02:00
veeso 08c42e5acf release date 2022-06-18 13:35:03 +02:00
veeso aac9cf4fa0 features updated 2022-06-10 12:18:38 +02:00
veeso a26b21da89 0.9.0 2022-06-09 17:45:17 +02:00
veeso bb95c9a4d0 updated dependencies 2022-06-09 15:11:55 +02:00
veeso 80dea3f71a Fixed SSH key list showing {hostname} at {username} instead of {username} at {hostname} 2022-06-09 15:08:02 +02:00
veeso 0057a657d2 removed license headers 2022-06-09 14:28:02 +02:00
Christian Visintin 816270d545 Fs watcher (#113)
fs watcher
2022-06-09 13:03:02 +02:00
veeso 2caa0432df Remote directory path in authentication form and in bookmarks parameters 2022-05-03 15:37:00 +02:00
Christian Visintin e0d8b80cdf Bookmark name as hostname for cli args (#111)
bookmark name as hostname for cli args
2022-05-03 11:54:48 +02:00
veeso f094979ddb working on 0.9.0 2022-05-03 09:16:38 +02:00
veeso 0c8144aaa8 0.8.2 2022-04-26 21:41:21 +02:00
veeso 3249e82873 lint 2022-04-22 09:56:10 +02:00
veeso 66adad3135 Fixed termscp panics when displaying long non-ascii filenames 2022-04-20 12:09:33 +02:00
veeso f2e5bf4441 Working on 0.8.2 2022-04-07 11:08:47 +02:00
veeso 601b0595d4 Write exitcode on exit 2022-04-07 11:07:41 +02:00
veeso c47fcb2225 fixed install script 2022-04-07 10:24:54 +02:00
veeso 550c7ca62a upcoming features 2022-03-22 20:55:54 +01:00
veeso 3256c276b4 0.8.1 2022-03-22 20:45:24 +01:00
veeso 04f43fff63 boolean release 2022-03-19 10:35:36 +01:00
veeso 82e8c84000 fixed make_pkg 2022-03-15 12:22:43 +01:00
veeso 31203d76ce install.sh m1 macos 2022-03-15 11:25:50 +01:00
veeso 572a948f2c macos arm64 build 2022-03-15 11:25:50 +01:00
veeso b6ee49cfa6 updated donation link in install.sh 2022-03-09 17:07:35 +01:00
veeso 0334c5db78 Updated dependencies 2022-03-09 16:19:57 +01:00
veeso c45ebec261 Fixed AltGr characters not allowed in auth form 2022-03-09 15:13:08 +01:00
veeso ad2781b62c use latest rust in macos/windows ci 2022-03-09 11:27:26 +01:00
veeso 35dc11cce3 Strip binary with new 1.59 feature 2022-03-05 11:11:07 +01:00
veeso 8d9e7443ec updated user manuals 2022-03-05 11:06:14 +01:00
veeso 697ab225ea clippy 2022-03-05 11:06:14 +01:00
veeso babbc5eadb new-path-style and endpoint s3 params 2022-03-05 11:06:14 +01:00
veeso f28dba7660 added new s3 params 2022-03-05 11:06:14 +01:00
veeso c5eba4b56a changed 'AWS S3' to 'S3' in forms 2022-03-05 11:06:14 +01:00
veeso 0b70819781 wtf git? 2022-02-06 11:09:44 +01:00
veeso 069fe8cae2 Merge branch '0.8.1' of github.com:veeso/termscp into 0.8.1 2022-02-06 10:57:44 +01:00
veeso 043f54e707 removed freebsd workflow. It is not supported anymore 2022-02-06 10:57:27 +01:00
veeso b635554e52 updated freebsd vm version 2022-02-04 15:16:07 +01:00
veeso 9e35616568 updated dependencies 2022-02-04 15:14:11 +01:00
veeso 615dbda583 clippy 2022-02-04 15:06:11 +01:00
veeso 4b421a4a87 issue 94: color not reset after leaving text editor (SORCERY!!!) 2022-01-29 19:26:37 +01:00
veeso 0fe06eb52b updated deps 2022-01-29 19:04:22 +01:00
veeso e8c6b8306f working on 0.8.1 2022-01-29 19:03:12 +01:00
Pascal Sommer d1457253c4 fix: footer listed "Delete" shortcut as "Make Dir" 2022-01-12 21:03:15 +01:00
ImgBotApp 1bcdaa5614 [ImgBot] Optimize images
*Total -- 1,968.08kb -> 1,553.38kb (21.07%)

/assets/images/termscp-96.png -- 4.01kb -> 2.78kb (30.66%)
/assets/images/termscp-128.png -- 5.41kb -> 3.75kb (30.66%)
/assets/images/termscp-512.png -- 24.29kb -> 16.96kb (30.17%)
/assets/images/termscp-64.png -- 2.77kb -> 1.96kb (29.32%)
/assets/images/config.gif -- 1,246.97kb -> 937.11kb (24.85%)
/assets/images/auth.gif -- 420.79kb -> 335.62kb (20.24%)
/assets/images/flags/jp.png -- 7.43kb -> 6.19kb (16.64%)
/assets/images/flags/cn.png -- 6.80kb -> 5.78kb (15.07%)
/assets/images/flags/br.png -- 10.83kb -> 9.35kb (13.67%)
/assets/images/flags/kr.png -- 10.04kb -> 8.72kb (13.17%)
/assets/images/termscp.svg -- 1.39kb -> 1.25kb (10.08%)
/assets/images/themes.gif -- 227.34kb -> 223.90kb (1.52%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2022-01-06 11:15:26 +01:00
veeso 85dd67721f new gifs 2022-01-06 11:07:29 +01:00
veeso a25ee67cd3 use branch in docker build 2022-01-06 10:44:34 +01:00
veeso 67d48e7a79 readme 2022-01-06 10:44:34 +01:00
veeso 49e69277af Updated deps 2022-01-06 10:44:34 +01:00
veeso 332284fec3 keyring 1.0.0 2022-01-06 10:44:34 +01:00
veeso 4897253932 2022-01-05 review 2022-01-06 10:44:34 +01:00
veeso 6559c6b083 Error popup message height is now calculated based on the content it must display 2022-01-06 10:44:34 +01:00
veeso 587d7da2cb re-use code with handle input ev 2022-01-06 10:44:34 +01:00
Christian Visintin 7d55563556 Aws s3 connection parameters extension (#89)
* Aws s3 connection parameters extension

* Changed 'save password?' popup to 'change secrets?'

* missing docs
2022-01-06 10:44:34 +01:00
veeso 53271966da Changed buffer size to 65535 2022-01-06 10:44:34 +01:00
veeso ec4daf8e25 remotefs 0.2.0 2022-01-06 10:44:34 +01:00
veeso edd0842273 Redraw UI on window resize 2022-01-06 10:44:34 +01:00
veeso c1edc20462 symlink command 2022-01-06 10:44:34 +01:00
veeso ced7573241 symlink command 2022-01-06 10:44:34 +01:00
veeso 24788fa894 remove temp archive once installation has finished 2022-01-06 10:44:34 +01:00
veeso dab98f4292 F2 to save file as 2022-01-06 10:44:34 +01:00
veeso 84cb775679 Categorize Auth activity msg 2022-01-06 10:44:34 +01:00
veeso 4e802f1dc5 Use tui-realm color parser 2022-01-06 10:44:34 +01:00
veeso b8efe6985f Removed storage key for filetransfer terminal width 2022-01-06 10:44:34 +01:00
veeso e047179ea0 Remove pending transfer with storage (use action) 2022-01-06 10:44:34 +01:00
veeso 197b3095b6 Disable sync browsing when found explorer is mounted 2022-01-06 10:44:34 +01:00
Christian Visintin 54c23079be Sync browsing prompts to create dir (#85) 2022-01-06 10:44:34 +01:00
veeso a93dbde0c8 Added help footers 2022-01-06 10:44:34 +01:00
veeso 2a3d4f2670 Default log level changed to INFO; added option to enable TRACE log level 2022-01-06 10:44:34 +01:00
Christian Visintin e6ba4d8430 SSH configuration path (#84)
SSH configuration
2022-01-06 10:44:34 +01:00
veeso 9284f101c8 mode 2022-01-06 10:44:34 +01:00
veeso 685444655c Ux improvements (described in issue #80) 2022-01-06 10:44:34 +01:00
veeso 027545f14c Removed docs headers 2022-01-06 10:44:34 +01:00
veeso 2e0322bc0e dir size is 0 on Windows 2022-01-06 10:44:34 +01:00
veeso df7a4381c4 Removed filetransfer module; migrated to remotefs crate 2022-01-06 10:44:34 +01:00
veeso 25dd1b9b0a updated donation link in help 2022-01-06 10:44:34 +01:00
veeso a1a1631fd2 Removed unused focus, fixed partial prog bar alignment 2022-01-06 10:44:34 +01:00
veeso 47f3ffef7b Removed key modifiers none on popups, since on windows they won't work 2022-01-06 10:44:34 +01:00
veeso 54b5583d1a Migrated termscp to tui-realm 1.x 2022-01-06 10:44:34 +01:00
veeso 30851a78e8 serial test for env paths 2022-01-06 10:44:34 +01:00
veeso bc6b7b582e Files found from search are now displayed with their relative path from working directory 2022-01-06 10:44:34 +01:00
veeso 3927fb2a39 Files found from search are now displayed with their absolute path 2022-01-06 10:44:34 +01:00
veeso 028f64a588 Windows opts 2022-01-06 10:44:34 +01:00
veeso 26ff496829 It is now possible to keep navigating on the other explorer while 'found tab' is open 2022-01-06 10:44:34 +01:00
veeso cb583f305c If find command doesn't return any result show an info dialog and not an empty explorer 2022-01-06 10:44:34 +01:00
veeso 88b29d3183 A "wait popup" will now be displayed while searching files 2022-01-06 10:44:34 +01:00
veeso 02fdb27cc5 Removed lib.rs 2022-01-06 10:44:34 +01:00
veeso 5fd53c1b2b -Dwarnings for clippy on windows/macos ci 2022-01-06 10:44:34 +01:00
veeso 696e3ae582 Rust 2021 2022-01-06 10:44:34 +01:00
veeso e7a29b7f1a 0.8.0 setup 2022-01-06 10:44:34 +01:00
veeso e53120f3c2 arch: install rust only if not found on local system 2021-12-21 09:05:34 +01:00
veeso 3f463f4b73 ko-fi 2021-12-04 10:46:22 +01:00
veeso 83964026ec new donations banners 2021-10-30 15:54:02 +02:00
veeso f79658a93c new donations banners 2021-10-30 15:49:35 +02:00
veeso 23fd37559e Fixed install script 2021-10-12 10:54:33 +02:00
veeso 1fadc53743 Merge branch 'main' of github.com:veeso/termscp into main 2021-10-12 10:54:18 +02:00
veeso 0eaa898e15 Fixed docker.sh 2021-10-12 09:09:57 +02:00
veeso 0aeca76f63 Fixed bash 2021-10-11 20:40:20 +02:00
veeso 8cf6c1fce3 freebsd pkg 2021-10-11 09:30:21 +02:00
veeso 736dd820a6 donate links 2021-10-10 09:52:49 +02:00
veeso db73d1e45f gitignore 2021-10-09 10:58:38 +02:00
veeso 6c31c1f2d8 deb readme 2021-10-09 10:55:21 +02:00
veeso fcce9b778b typos 2021-10-09 10:47:07 +02:00
veeso b309a55ed6 Merge branch 'md-translations' into 0.7.0 2021-10-07 11:22:14 +02:00
veeso 8b2b834818 User manuals 2021-10-07 09:37:34 +02:00
veeso 9a63f5b2cc copy template 2021-10-06 11:12:15 +02:00
veeso a7a116cb33 Badges aligned 2021-10-06 10:38:57 +02:00
veeso bc90fb1038 Align badges 2021-10-06 10:38:03 +02:00
veeso e307b6a8ac Align badges 2021-10-06 10:37:36 +02:00
veeso c9e8589689 readmes 2021-10-06 10:30:24 +02:00
veeso e09682c219 wip 2021-10-06 08:45:02 +02:00
Christian Visintin 967babbcb7 Merge pull request #71 from veeso/issue-70-cant-enter-@-in-password-input-box
Issue 70 cant enter @ in password input box
2021-10-04 21:03:58 +02:00
veeso 4973bf8cbe Fixed issue 70: Unable to type characters with CTRL+ALT 2021-10-04 21:03:17 +02:00
veeso 6421b74c66 typo 2021-10-04 17:50:07 +02:00
veeso 463329a080 docs url 2021-10-04 16:11:45 +02:00
veeso fd2144f8e9 It, zh-CN 2021-10-04 16:02:40 +02:00
veeso 18a579a204 Flags 2021-10-04 10:48:56 +02:00
veeso 58d5ea264f docs 2021-09-30 09:56:20 +02:00
veeso 4b9d23cc3a Reuse mounts 2021-09-30 09:33:34 +02:00
veeso f3e694d3d6 File list can now be rewinded 2021-09-28 12:59:43 +02:00
Christian Visintin b9a0e516c6 Merge pull request #68 from veeso/notifications
Notifications
2021-09-28 12:58:11 +02:00
veeso 198d421ab0 Notifications 2021-09-28 12:44:51 +02:00
veeso 6caf34b17a Added dbus to deps for FreeBSD 2021-09-27 22:38:08 +02:00
veeso f0a91b1579 Merge remote-tracking branch 'origin/main' into 0.7.0 2021-09-27 11:48:36 +02:00
veeso c3e5663cf4 New logo 2021-09-27 11:48:22 +02:00
veeso bcc6fcd2e7 Added file replace prompt also for 'Many' 2021-09-25 20:18:50 +02:00
veeso 3c3d681ca0 Updated chinese manual 2021-09-25 14:29:48 +02:00
veeso 3e83c26cd5 Merge branch 'main' into 0.7.0 2021-09-25 13:59:58 +02:00
veeso ec841d5382 Some flags are controversial :rolling_eyes 2021-09-25 13:58:27 +02:00
veeso d2e4252487 there's no need to specify language 2021-09-25 13:57:24 +02:00
veeso 7660dad4eb man-en 2021-09-25 13:56:40 +02:00
Christian Visintin ddfa973c19 Merge pull request #67 from flashlab/main
Translate doc into simplified Chinese
2021-09-25 11:16:47 +02:00
Jeff def0eb8586 small fix to the image path 2021-09-25 14:20:19 +08:00
flashlab c39ee82ac5 translate doc into simplified Chinese 2021-09-25 14:10:46 +08:00
Christian Visintin e1bde1971d Merge pull request #65 from veeso/prompt-when-replacing-files
Prompt user when about to replace an existing file
2021-09-24 09:22:50 +02:00
veeso 79c90c5b97 install with cargo --locked 2021-09-19 15:02:14 +02:00
veeso 06ffbaa2f4 Option: prompt user when about to replace an existing file caused by a file transfer 2021-09-19 11:18:52 +02:00
veeso 63e7023342 Re-use mounts in UI 2021-09-19 11:16:18 +02:00
veeso 88a0685097 Added misc_info_dialog to themes 2021-09-19 10:48:16 +02:00
veeso ed3225ed84 User manual updates 2021-09-18 22:07:59 +02:00
veeso 96c997c38a dirs 4.0.0 2021-09-18 14:22:00 +02:00
veeso c824d00986 Removed auto-update test for macos (blocks on github/CI) 2021-09-17 09:52:35 +02:00
veeso c052796d52 Merge remote-tracking branch 'origin/main' into 0.7.0 2021-09-16 17:07:13 +02:00
Christian Visintin 1077204965 Merge pull request #64 from veeso/self-update
Self update
2021-09-16 17:05:07 +02:00
veeso 77476596f4 Fixed new version check 2021-09-16 16:54:43 +02:00
Christian Visintin efd5443be4 choco install 2021-09-16 09:30:19 +02:00
veeso 8c88fbe10f cargo lock update 2021-09-12 10:01:52 +02:00
veeso 06a67de14f Auto update (w/ cli) 2021-09-12 10:00:56 +02:00
veeso 8bb05406c8 upcoming features 2021-09-11 22:06:18 +02:00
veeso 3f31800158 Updated dependencies 2021-09-11 21:53:38 +02:00
veeso f69489fc8f FileTransferResult 2021-09-10 20:58:26 +02:00
veeso 1f115dea92 Strip executables when making release 2021-09-10 20:51:05 +02:00
Christian Visintin f81424f1db Merge pull request #63 from veeso/aws-s3
Aws s3
2021-09-10 17:32:28 +02:00
veeso 1d09095ab9 Aws s3 support 2021-09-01 15:20:05 +02:00
Christian Visintin bf6f25310c Update README.md 2021-08-31 16:24:26 +02:00
veeso 4c1e4fef7a Removed BSD packages 2021-08-30 15:03:53 +02:00
Christian Visintin ddd4824567 Merge pull request #62 from veeso/0.6.1
0.6.1
2021-08-30 15:00:06 +02:00
veeso f31f58aa79 working on 0.7.0 2021-08-26 10:42:46 +02:00
veeso 22bb143820 0.6.1 2021-08-24 15:03:20 +02:00
veeso 78b918087e absolutize path common functions 2021-08-24 09:29:40 +02:00
veeso 91ce709d7b lint 2021-08-24 09:29:23 +02:00
veeso 214ec0c5a5 absolutize path common functions 2021-08-24 09:28:49 +02:00
veeso 0cb9254e63 fmt 2021-08-23 18:01:45 +02:00
veeso 4bbb339844 test fixed 2021-08-23 17:57:18 +02:00
veeso 92b081c076 Replaced u8 pex with UnixPex struct 2021-08-23 17:52:55 +02:00
veeso 32ab0267fb Removed unused readonly attribute for FsEntry 2021-08-23 17:18:27 +02:00
Christian Visintin 8a0f190474 Merge pull request #61 from veeso/issue-59-when-copying-files-with-tricky-copy-the-upper-progress-bar-shows-no-text
Fix: When copying files with tricky copy, the upper progress bar shows no text
2021-08-23 15:32:27 +02:00
veeso a189a4c754 Changelog 2021-08-23 14:59:47 +02:00
veeso b7b765c16e Fixed: When copying files with tricky copy, the upper progress bar shows no text 2021-08-23 14:56:27 +02:00
veeso 7713c6c21d suppaftp 4.1.2 2021-08-23 12:20:25 +02:00
Christian Visintin c49184dcb1 Merge pull request #60 from veeso/issue-58-possible-to-upload-a-directory-that-already-exists-on-remote
Issue 58 possible to upload a directory that already exists on remote
2021-08-23 12:12:07 +02:00
veeso fc3803991a Fixed scp transfer non returning DirectoryAlreadyExists 2021-08-23 11:38:41 +02:00
veeso f6011543c0 Fixed ui test units 2021-08-23 11:18:11 +02:00
veeso 7390bb58c5 Changed FTP library from ftp4 to suppaftp; Handle directory already exists on FTP transfer; mkdir already exists test units 2021-08-23 11:11:14 +02:00
veeso 81482b47f4 Merged 0.6.1; added new DirectoryAlreadyExists; return new variant for SFTP/SCP 2021-08-18 09:33:27 +02:00
veeso 6cb1dcaa43 upcoming features 2021-08-17 18:05:02 +02:00
veeso 78e4a4899c Rewind radio groups 2021-08-17 12:44:23 +02:00
veeso d15997cca0 Updated dependencies; migrated tui-realm to 0.6.0 2021-08-17 12:38:24 +02:00
veeso 1558f4ffe4 init 0.6.1 2021-08-17 11:03:35 +02:00
veeso 764cca73d1 linter 2021-08-10 22:27:20 +02:00
veeso 1757eb5bec When uploading a directory, create directory only if it doesn't exist 2021-08-10 22:17:36 +02:00
veeso 6cfac57162 Shortened url for install.sh 2021-08-03 17:09:37 +02:00
veeso d36d330244 badge 2021-07-23 21:37:12 +02:00
veeso 4203de6d3f Merge branch 'main' of github.com:veeso/termscp into main 2021-07-23 21:05:19 +02:00
veeso 098e3c709a fixed deps rpm 2021-07-23 21:05:11 +02:00
Christian Visintin 1a8e151efb Merge pull request #57 from veeso/imgbot
[ImgBot] Optimize images
2021-07-23 21:05:03 +02:00
ImgBotApp 6c8d22d396 [ImgBot] Optimize images
*Total -- 565.02kb -> 417.74kb (26.07%)

/assets/images/themes.gif -- 327.91kb -> 227.34kb (30.67%)
/assets/images/auth.gif -- 237.10kb -> 190.40kb (19.7%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-07-23 18:36:46 +00:00
Christian Visintin a0ee1d886a Merge pull request #56 from veeso/0.6.0
0.6.0
2021-07-23 20:36:25 +02:00
veeso bf6f1625ec 0.6.0 release notes 2021-07-23 14:32:50 +02:00
veeso 3271377b7e Removed redundant remoteOpts struct; use FileTransferParams only 2021-07-23 14:32:15 +02:00
veeso f36bb65b45 Removed redundant remoteOpts struct; use FileTransferParams only 2021-07-23 14:31:29 +02:00
veeso c722982c39 Removed unecessary Option<&ConfigClient> in filetransfer; use degraded mode instead 2021-07-16 15:49:00 +02:00
veeso e1109fff15 From now on, if you try to leave setup without making any change, you won't be prompted whether to save configuration or not 2021-07-16 15:32:39 +02:00
veeso 59c6567ff3 Auth view enhanchements: check if port and host are valid 2021-07-15 13:00:55 +02:00
veeso 61f6901767 Save both theme and config at the same time 2021-07-15 12:47:47 +02:00
veeso 8277c80860 Fixed config save and theme layout 2021-07-15 12:33:15 +02:00
veeso 4093ba169c Replaced '...' with '…' in texts 2021-07-15 12:24:20 +02:00
veeso e3a9d253f7 Show a 'wait' message when deleting, copying and moving files and when executing commands 2021-07-15 11:58:57 +02:00
veeso 80c67c8aa8 Fixed transfer interruption: it was not possible to abort a transfer if the size of the file was less than 65k 2021-07-13 16:43:27 +02:00
veeso 421969c3da argh instead of getopts 2021-07-10 20:19:29 +02:00
veeso e15b79750b main() refactoring 2021-07-08 16:21:39 +02:00
veeso 37abe596c7 context getters 2021-07-08 15:43:23 +02:00
veeso e6b44e1461 ConfigClient is an option no more; config client degraded mode 2021-07-08 15:07:24 +02:00
veeso b9cb961da6 full and partial progress bar colors 2021-07-08 14:29:28 +02:00
veeso 55c4b777fb Fixed save bookmark dialog: you could switch out from dialog with <TAB> 2021-07-07 21:03:21 +02:00
Christian Visintin 2231727adb Merge pull request #55 from veeso/theme-provider
Theme provider and '-t' and '-c' CLI options
2021-07-07 14:38:22 +02:00
veeso 0a7e29d92f Theme provider and '-t' and '-c' CLI options 2021-07-07 12:54:30 +02:00
veeso a105a42519 Dependencies 2021-07-03 15:56:26 +02:00
Christian Visintin d20c2c786b Merge pull request #53 from veeso/keyring-rs-linux
Keyring-rs for linux
2021-07-03 15:15:00 +02:00
veeso 14abed44a5 Keyring-rs support for Linux 2021-07-03 14:43:31 +02:00
veeso 65fee64132 Merged 0.6.0 in keyring-rs-linux 2021-07-03 14:35:17 +02:00
Christian Visintin 348688b5ce Merge pull request #54 from veeso/release-notes-in-app
Release notes in-app
2021-06-26 19:18:39 +02:00
veeso 0cb84fc531 I've no idea of what user input buffer was meant to be 2021-06-26 18:26:21 +02:00
veeso 8a36c459d5 Restored version from env 2021-06-26 18:06:16 +02:00
veeso c7414ab070 Release notes in-app 2021-06-26 18:00:03 +02:00
veeso d16f9e7ad8 Merge branch '0.6.0' into keyring-rs-linux 2021-06-26 15:13:31 +02:00
veeso 3cbd2ed013 Removed archlinux build stuff 2021-06-26 14:40:23 +02:00
veeso 398f518b2f test_utils_git_check_for_updates not when github and mac and bsd 2021-06-26 14:39:09 +02:00
veeso 97a62def11 Brought all extern crate to top level 2021-06-26 12:32:11 +02:00
veeso 7ed49126a4 security policy 2021-06-26 12:25:24 +02:00
veeso d976a34705 --lib tests 2021-06-26 12:08:05 +02:00
veeso 8b01c71819 Coverage 2021-06-26 12:06:49 +02:00
veeso 1ee5e368f6 Install cargo dependencies when building with cargo (rust too); build without default features on bsd 2021-06-26 11:02:07 +02:00
veeso 8fc71aae66 Merge branch '0.6.0' into keyring-rs-linux 2021-06-26 10:00:22 +02:00
veeso 0589cc2f0c Merge branch 'main' into 0.6.0 2021-06-26 10:00:08 +02:00
veeso 931a66498f filemode manifest freebsd 2021-06-26 09:51:13 +02:00
veeso 8ec0a0289a AUR distro: install rust too; fixed tempfile rpm 2021-06-22 09:35:52 +02:00
veeso 2d8ce475f8 Merge branch '0.6.0' into keyring-rs-linux 2021-06-21 20:51:24 +02:00
veeso f8766722d4 Merge branch 'main' into 0.6.0 2021-06-21 20:46:10 +02:00
veeso 1319e0b17b Fixed install for freebsd 2021-06-21 20:45:20 +02:00
veeso 5e17bf0736 Merge branch '0.5.1' into 0.6.0 2021-06-21 18:23:01 +02:00
veeso ca50bddc56 Merge branch '0.5.1' into 0.6.0 2021-06-21 18:22:19 +02:00
veeso c78fc583b0 Fix: target_family unix means also macos and linux; use BSD target_os 2021-06-21 09:11:28 +02:00
veeso 04cafc4181 distros 2021-06-20 17:59:27 +02:00
veeso f8300fa587 fixed tests 2021-06-20 17:00:35 +02:00
veeso 407ca567f1 keyring-rs-linux docs 2021-06-20 16:55:17 +02:00
veeso 320fd5c2dd Updated dockerfiles for dbus 2021-06-20 15:13:20 +02:00
Christian Visintin e4c616245a Merge pull request #52 from veeso/freebsd-porting
FreeBSD Build
2021-06-20 15:09:36 +02:00
veeso 5986130dfa Unused variant if keyring is not enabled 2021-06-20 15:08:35 +02:00
veeso 19610479bd keyring support for linux 2021-06-20 15:04:16 +02:00
veeso e3d2151bad Unix Build 2021-06-20 14:38:03 +02:00
veeso 89d205e946 Fixed UI not showing connection error 2021-06-20 11:03:55 +02:00
veeso 15d13af7d5 wip 2021-06-20 11:00:31 +02:00
Christian Visintin 3df8ed13a4 Merge pull request #41 from veeso/open-rs
Open-rs
2021-06-19 15:35:48 +02:00
veeso 5a4a364250 Fixed windows dying when opening text files 2021-06-19 15:06:49 +02:00
veeso 00bee04c2c open-rs fixes 2021-06-19 15:03:56 +02:00
veeso 4475e8c24c 0.5.1 ready 2021-06-19 13:44:38 +02:00
veeso 5a49987338 acceptance tests in PR 2021-06-18 14:31:11 +02:00
Christian Visintin 76f1f1dcf3 Merge pull request #51 from veeso/issue-38-transfer-size-is-wrong-when-transferring-selected-files
Fixed transfer size when sending multiple entries
2021-06-18 14:30:12 +02:00
veeso 0175cfbfb6 Code enhancements 2021-06-18 14:22:35 +02:00
veeso 48483a5c99 Unique function to send and receive files in session.rs via TransferPayload. Fixed transfer size when sending multiple entries 2021-06-18 13:02:04 +02:00
Christian Visintin 71e4cc9413 Merge pull request #50 from veeso/known-size-for-layouts
Window too small error message
2021-06-16 22:19:01 +02:00
veeso a00c0117a2 If the terminal window has less than 24 lines, then an error message is displayed in the auth activity 2021-06-16 22:00:28 +02:00
veeso c1bc81c664 typo 2021-06-16 17:48:42 +02:00
Christian Visintin 1b7ef30a50 Merge pull request #49 from veeso/status-bar-v2
Status bar improvements
2021-06-16 14:07:58 +02:00
veeso efad2b96db Status bar improvements: 'Show hidden files' in status bar; Status bar is has now been splitted into two, one for each explorer tab 2021-06-16 13:57:11 +02:00
Christian Visintin 56a200499e Merge pull request #46 from veeso/github-actions-containers
GitHub actions containers
2021-06-15 17:59:54 +02:00
veeso 1c58f1d623 Use containers to test file transfers
Use containers to test file transfers

Container setup

Container setup

tests with docker-compose

these tests won't work with containers

ftp tests with containers; removed crap servers; tests only lib

hostname for github

booooooh

fixed recursive remove FTP

Use containers to test file transfers

Container setup

Container setup

tests with docker-compose

these tests won't work with containers

ftp tests with containers; removed crap servers; tests only lib

hostname for github

booooooh

fixed recursive remove FTP

fixed rename

changelog

Desperate attempt

Fixed ftp tests; migrated sftp tests to containers; use env for services

github actions are just broken imo

github actions are just broken imo

Don't use services, since they just don't fuckin work...

docker compose not supported yet?

deprecated typo

Now explain this: github actions have services (which don't work) and then you find out docker-compose is already installed *BLOWMIND*

Fixed hostname for tests

scp tests

maybe

tests

wtf

Restored host tests

Changelog

Improving coverage

Improving coverage

Restored coverage task

More tests for file transfers; test ssh keys too

typo

tests; code improvements

Use tests helpers

fixed tempdir

fixed tempdir
2021-06-15 17:51:06 +02:00
veeso 6cdd56e22f changelog 2021-06-13 10:20:16 +02:00
Christian Visintin 53acb847bc Merge pull request #47 from veeso/issue-44-ftp-cant-move-files-to-other-directories
Ftp: cant move files to other directories
2021-06-13 10:20:00 +02:00
veeso 2b006457c7 fixed rename 2021-06-13 10:10:04 +02:00
Christian Visintin fbc1672e3d Merge pull request #45 from veeso/issue-43-unable-to-remove-non-empty-directories-ftp
fixed recursive remove FTP
2021-06-13 10:04:51 +02:00
veeso 542123ce04 fixed recursive remove FTP 2021-06-13 09:47:17 +02:00
Christian Visintin 59eb7f7935 Merge pull request #42 from veeso/issue-37-progress-bar-not-visible-when-editing-remote-files
Fixed progress bar not visible when editing remote files
2021-06-12 15:33:11 +02:00
veeso 74482d6e2c Fixed progress bar not visible when editing remote files; moved edit and tricky_copy to actions; added new function recv/send one 2021-06-12 14:36:01 +02:00
Christian Visintin 529ac2f778 Merge pull request #40 from veeso/issue-39-help-window-content-is-not-fully-visible
Help panels as ScrollTable
2021-06-12 09:27:05 +02:00
veeso b73c3228e4 manual 2021-06-12 09:26:33 +02:00
veeso 26f7c1f9d1 Help panels as ScrollTable to allow displaying entire content on small screens 2021-06-12 09:05:02 +02:00
veeso f078232499 tui-realm 0.4.1 2021-06-11 15:32:45 +02:00
veeso 8cd91f6df3 tui-realm 0.3.2 2021-06-11 15:31:33 +02:00
veeso 5670c0f975 0.5.1 setup 2021-06-11 15:28:14 +02:00
veeso 99d4177e89 changelog 2021-06-11 15:20:49 +02:00
veeso d07b1c86be tui-realm 0.4.1 2021-06-11 14:48:38 +02:00
veeso fe494c52b1 Clear screen once opened file, to prevent crap on stderr 2021-06-11 14:46:20 +02:00
veeso bc50328006 open-rs docs 2021-06-11 13:01:28 +02:00
veeso 90afe204b1 Open files with <V>; fixed cache file names 2021-06-11 09:52:50 +02:00
veeso d981b77ed7 Working on open 2021-06-10 22:36:29 +02:00
veeso 541a9a55b5 Handle shift enter (file list) 2021-06-10 20:55:12 +02:00
veeso cd3fc15bcb Fmt symlink with len 48 in found dialog 2021-06-10 12:16:48 +02:00
veeso 4e50038b41 Open file with 2021-06-10 12:14:09 +02:00
veeso a8354ee38f Open file on <SUBMIT> 2021-06-10 11:08:17 +02:00
veeso c4907c8ce5 Added open-rs to deps 2021-06-07 22:28:52 +02:00
veeso 3c3c680b00 tui-realm 0.4.0 2021-06-07 22:09:33 +02:00
veeso 3a32f45334 tui-realm 0.3.2 2021-06-06 14:19:20 +02:00
veeso 8e1843f90b Working on 0.6.0 2021-06-02 22:32:52 +02:00
veeso dc01de98dc Defined summer update 2021-06-01 17:10:25 +02:00
Christian Visintin 971061d231 Fixed AUR pub workflow
See <https://github.com/KSXGitHub/github-actions-deploy-aur/issues/15>
2021-05-24 11:09:56 +02:00
veeso d04dd831e4 README 2021-05-23 15:56:18 +02:00
Christian Visintin 8dcfda9787 Merge pull request #35 from veeso/imgbot
[ImgBot] Optimize images
2021-05-23 15:53:56 +02:00
veeso c938021bef AUR pkgs 2021-05-23 15:52:18 +02:00
ImgBotApp 3fcf0fb72a [ImgBot] Optimize images
*Total -- 3,507.59kb -> 2,729.63kb (22.18%)

/assets/images/config.gif -- 453.13kb -> 313.39kb (30.84%)
/assets/images/explorer.gif -- 2,764.58kb -> 2,185.64kb (20.94%)
/assets/images/bookmarks.gif -- 289.89kb -> 230.60kb (20.45%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-05-23 13:46:14 +00:00
veeso e99406fbe4 Merged 0.5.0 into main 2021-05-23 15:45:04 +02:00
veeso 60073be993 Going to release 0.5.0 2021-05-23 15:42:51 +02:00
veeso d3df4c7020 install.sh 2021-05-23 14:48:46 +02:00
veeso adce92e312 install.sh 2021-05-23 14:48:32 +02:00
veeso 4973545fe1 Docs 2021-05-23 14:47:55 +02:00
veeso 8425c97102 docs 2021-05-22 16:04:42 +02:00
veeso 1876b8bdc7 Migrated documentation to website 2021-05-22 16:03:07 +02:00
veeso 99ff3a8e45 New gifs 2021-05-22 10:54:06 +02:00
veeso cae251905c Fixed new ssh key box 2021-05-22 10:53:51 +02:00
veeso f738ce90e0 Fixed bookmarks not being loaded properly 2021-05-22 10:27:37 +02:00
veeso 2f2bb20550 readme 2021-05-21 12:59:42 +02:00
veeso 591ede0507 changelog 2021-05-21 12:45:25 +02:00
veeso 09665fead3 Fixed error overlay for auth activity 2021-05-21 12:31:30 +02:00
Christian Visintin 60ee2f1c2b Merge pull request #34 from veeso/double-progress-bar
Double progress bar
2021-05-21 12:09:03 +02:00
veeso d6d8197869 feature changelog 2021-05-21 12:08:53 +02:00
veeso b1da42b543 Double progress bar 2021-05-21 11:49:44 +02:00
veeso e874550d29 Refactored transfer states 2021-05-20 22:44:17 +02:00
Christian Visintin 6cd9657446 Merge pull request #33 from veeso/logging
Logging
2021-05-18 09:03:50 +02:00
veeso 2790c613aa Logging docs 2021-05-17 22:35:28 +02:00
veeso 7b868bc60b Activity log 2021-05-17 22:15:20 +02:00
veeso c1b3511c06 Working on logging 2021-05-16 22:26:16 +02:00
veeso 1e3c859ae0 Fixed empty bookmark name causing termscp to crash 2021-05-16 22:05:33 +02:00
veeso faab67800f Log always to trace; may be disabled 2021-05-16 15:12:01 +02:00
veeso 7f9d92cbe9 Working on logging 2021-05-16 15:09:17 +02:00
veeso 4e287a0231 Logging setup 2021-05-16 10:36:16 +02:00
veeso 8c9c331d7e Tricky-copy in case copy is not supported 2021-05-15 22:07:20 +02:00
veeso 37ce54051e codecov badge 2021-05-15 19:11:12 +02:00
veeso f31b047671 Copy command support for SFTP 2021-05-15 19:09:58 +02:00
veeso aaff616332 grcov: exclude activities 2021-05-15 18:53:07 +02:00
veeso cfc1b73c74 Updated dependencies 2021-05-15 18:04:51 +02:00
Christian Visintin 0d2967423b Merge pull request #32 from veeso/file-group-select
Work on multiple files in explorers
2021-05-15 18:00:02 +02:00
veeso cb3681ffdd Ignore files 2021-05-15 17:58:16 +02:00
veeso 4c343c6f34 Grcov with coverall 2021-05-15 17:55:20 +02:00
veeso ff158add1f Restored '<A>' key behaviour for file list 2021-05-15 17:52:58 +02:00
veeso 2c64cd5cce Changed Multi variant to Many 2021-05-15 17:46:29 +02:00
veeso c43ab28fb0 Work on multiple files docs 2021-05-15 17:43:33 +02:00
veeso dd00e1f55a Selection help; Fixed find actions for selections 2021-05-15 17:20:06 +02:00
veeso 2b3acee97c Handle file selections in activity 2021-05-15 17:03:44 +02:00
veeso d96558c3df wip 2021-05-12 20:55:17 +02:00
veeso b8db557ffe Added file selection to file_list component 2021-05-09 21:08:31 +02:00
veeso 300256b196 Changed activity paths 2021-05-08 19:28:47 +02:00
Christian Visintin 7ba1b316f7 Merge pull request #31 from veeso/mini-refactoring-file-transfer-activity
Mini refactoring file transfer activity
2021-05-08 19:05:37 +02:00
veeso 822d41e885 Split actions on multi files 2021-05-08 18:52:13 +02:00
veeso 0253572975 Clippy rust 1.52 2021-05-08 18:21:24 +02:00
veeso 0328c1de81 Browser with explorers 2021-05-08 15:28:56 +02:00
veeso c6ee9dedb9 Changed log function to accept String instead of &str 2021-05-08 14:32:21 +02:00
veeso 88136811b9 Fixed logbox wrap 2021-05-06 22:28:27 +02:00
veeso 7c816d0822 Removed log width 2021-05-06 22:24:55 +02:00
veeso a5fe62e502 Localhost in activity; no more in Context 2021-05-06 22:16:38 +02:00
veeso 892be42988 pretty assert 2021-05-06 21:57:04 +02:00
veeso c0eb98c3f9 Renamed to lowercase termscp 2021-05-05 22:13:57 +02:00
veeso 1ddbd0aa4e Use default port method 2021-05-05 22:07:49 +02:00
veeso 4f1e505a7a Moved file transfer protocol input on top; port will now be set to default for current protocol on change 2021-05-05 22:05:46 +02:00
veeso dcec804681 Fixed default protocol not being loaded 2021-05-04 10:17:07 +02:00
veeso a127f46a06 Removed the good old figlet termscp title with a simple label 2021-05-04 09:46:18 +02:00
Christian Visintin c8d277c51d Merge pull request #30 from veeso/issue-8-synchronized-browsing-of-local-and-remote-directories
Synchronized browsing of local and remote directories
2021-05-04 09:13:42 +02:00
veeso 42477d6893 tui-realm 0.2.2 2021-05-03 22:24:17 +02:00
veeso 4c1fb826be Status bar 2021-05-03 22:23:55 +02:00
veeso a0c29d1174 Fixed sync browser 2021-05-03 18:08:05 +02:00
veeso 2f0b340fe0 Working on sync 2021-05-02 21:04:03 +02:00
veeso cbe242bb94 WIP 2021-05-02 14:59:21 +02:00
veeso a088c6dbd3 <Y> key toggle sync browsing 2021-05-02 14:35:45 +02:00
veeso 036aba2420 Merge branch '0.5.0' into issue-8-synchronized-browsing-of-local-and-remote-directories 2021-05-02 12:09:52 +02:00
veeso 60269c7777 wip 2021-05-02 12:09:50 +02:00
veeso e90f561584 Bumped tui-realm to 0.2.1 2021-05-02 12:09:32 +02:00
Christian Visintin 4bd18c1386 Merge pull request #29 from veeso/issue-23-remove-file-if-transfer-failed
Remove created file if transfer failed
2021-05-02 11:01:13 +02:00
veeso fe51185f74 If transfer error reason is Abrupted or IO, then stat created file and remove it 2021-05-02 10:45:14 +02:00
veeso a35395bd51 Fixed upload transfer error not being logged 2021-05-01 21:59:52 +02:00
Christian Visintin f1225b1ff3 Merge pull request #27 from veeso/local-and-remote-file-fmt
Remote file syntax for formatter
2021-05-01 19:29:37 +02:00
Christian Visintin 63d727d5c5 Merge pull request #28 from veeso/imgbot
[ImgBot] Optimize images
2021-05-01 18:02:45 +02:00
veeso 46864ee23a Merge branch 'main' into 0.5.0 2021-05-01 18:00:18 +02:00
ImgBotApp 46728d8bc3 [ImgBot] Optimize images
*Total -- 500.68kb -> 489.72kb (2.19%)

/assets/images/termscp.svg -- 4.29kb -> 1.46kb (66.06%)
/assets/images/termscp-128.png -- 3.40kb -> 2.19kb (35.41%)
/assets/images/termscp-96.png -- 2.63kb -> 1.79kb (31.8%)
/assets/images/termscp-512.png -- 15.31kb -> 10.58kb (30.91%)
/assets/images/termscp-64.png -- 1.81kb -> 1.31kb (27.93%)
/assets/images/config.gif -- 473.23kb -> 472.39kb (0.18%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-05-01 15:59:27 +00:00
veeso daa9a7c012 termscp logo 2021-05-01 17:58:00 +02:00
veeso 0f595b8cbf Coverage: githubActions 2021-05-01 17:54:37 +02:00
veeso 26b001a5fc Coverage: githubActions 2021-05-01 17:26:28 +02:00
veeso 3704d2520d Remote file syntax for formatter 2021-05-01 17:12:48 +02:00
veeso 41e89605f0 Sponsor uri in help 2021-05-01 16:41:47 +02:00
veeso 065ea59114 Restored context test (not for github actions); Context destructor: just call leave_alternate_screen 2021-05-01 16:34:56 +02:00
veeso 64bb2ed101 Merge branch 'main' into 0.5.0 2021-05-01 16:22:47 +02:00
veeso c48c73909d User manual; cleaned readme up 2021-05-01 10:38:13 +02:00
Christian Visintin 68d113f335 Merge pull request #25 from veeso/tui-realm-integration
Tui realm integration
2021-05-01 10:13:55 +02:00
veeso 8bb66b53e0 Removed tui; added tuirealm 2021-04-25 23:00:49 +02:00
veeso 84c36f1789 0.5.0 setup 2021-04-23 22:05:05 +02:00
veeso 2214c1dee3 Removed winscp references 2021-04-23 22:03:12 +02:00
veeso 150a3cf346 Arch pkgs 2021-04-13 20:42:59 +02:00
veeso b31de185c5 Merge branch '0.4.2' into main 2021-04-13 18:44:02 +02:00
Christian Visintin 477930bef9 Merge pull request #24 from veeso/imgbot
[ImgBot] Optimize images
2021-04-13 12:03:06 +02:00
ImgBotApp 03bbd6420e [ImgBot] Optimize images
*Total -- 3,783.77kb -> 3,022.10kb (20.13%)

/assets/images/auth.gif -- 314.23kb -> 212.31kb (32.43%)
/assets/images/config.gif -- 689.24kb -> 473.23kb (31.34%)
/assets/images/bookmarks.gif -- 291.46kb -> 222.71kb (23.59%)
/assets/images/explorer.gif -- 635.33kb -> 503.95kb (20.68%)
/assets/images/text-editor.gif -- 1,853.52kb -> 1,609.90kb (13.14%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-04-13 10:01:21 +00:00
veeso b21607cd77 Use highlight symbol instead of an additional span 2021-04-13 09:17:07 +02:00
veeso 6c6dadc4e7 Removed eprintln! in ftp file transfer causing break when on Windows 2021-04-13 09:09:04 +02:00
veeso 08b8946429 Working on 0.4.2 2021-04-13 09:06:22 +02:00
Christian Visintin 23882df474 Create FUNDING.yml 2021-04-12 21:09:27 +02:00
Christian Visintin d8547d8f21 fixed readme 2021-04-12 21:03:30 +02:00
veeso c6de101808 Merge branch 'main' of github.com:veeso/termscp into main 2021-04-12 21:01:11 +02:00
veeso d0688be5cb updated readme 2021-04-12 21:00:48 +02:00
Christian Visintin 35f37cc2d3 Removed codecov badge
tarpaulin is not saying the truth anyway
2021-04-07 15:58:19 +02:00
veeso 81ae310e3d Arch sha 2021-04-06 22:31:31 +02:00
veeso 3be890c63a Merge branch 'main' of github.com:veeso/termscp into main 2021-04-06 21:00:22 +02:00
veeso 64a08e1440 Scheduled release for 06/04/2021 2021-04-06 21:00:03 +02:00
veeso fe5c35d789 Fixed cargo.toml 2021-04-06 20:59:02 +02:00
Christian Visintin df391dfb6f Merge pull request #20 from veeso/issue-17-still-some-problems-with-symlinks
[BUG] Problems with symlinks
2021-04-05 18:07:45 +02:00
Christian Visintin f5ac4207e8 Merge pull request #21 from maelvls/patch-1
One-liner for installing with Homebrew 😅
2021-04-05 17:40:39 +02:00
Maël Valais b8c54b53d9 Readme: one-liner for Homebrew
The one-liner command

  brew install veeso/termscp/termscp

is equivalent to the two commands

  brew tap veeso/termscp
  brew install termscp
2021-04-05 17:22:30 +02:00
veeso 6be9294e11 stable toolchain 2021-04-05 10:04:53 +02:00
veeso 7676e6e3a1 Improved coverage 2021-04-05 09:59:10 +02:00
veeso 9776ecbe60 Removed codecov path fix 2021-04-05 09:40:57 +02:00
veeso a1632492ed Restored coverage with tarpaulin 2021-04-05 09:32:59 +02:00
veeso 8d74d4c4e5 FTP: added support for symlinks for Linux servers 2021-04-04 18:03:11 +02:00
veeso e29ce3d0dd Merge branch '0.4.1' into issue-17-still-some-problems-with-symlinks 2021-04-04 17:33:00 +02:00
veeso e6b952966c SCP: fixed symlink not properly detected 2021-04-04 17:29:17 +02:00
Christian Visintin 1ba139aed1 Merge pull request #19 from veeso/issue-18-every-ftp-transfer-is-made-in-ascii-mode
[BUG] every ftp transfer is made in ascii mode
2021-04-04 17:18:49 +02:00
veeso f136057484 File transfer errors: to_string instead of format! 2021-04-04 16:32:54 +02:00
veeso 47cd112e69 FTP: transfer type set to binary 2021-04-04 16:32:39 +02:00
veeso 871a02c8b5 Updated contributing, issue templates and docs 2021-04-04 16:08:16 +02:00
veeso 44ba1111af Fixed test for edit 0.1.3 2021-04-03 22:20:20 +02:00
veeso 52b35f9232 Updated dependencies 2021-04-03 17:45:02 +02:00
veeso f8a448f5e9 Use default color if Text span part is Reset 2021-04-03 17:27:43 +02:00
Christian Visintin 37da49f4f8 Merge pull request #16 from veeso/issue-13-could-not-start-activity-manager-no-such-file-or-directory
[BUG] Issue 13 could not start activity manager no such file or directory
2021-04-03 17:19:23 +02:00
veeso c0ae922264 format 2021-04-03 16:48:37 +02:00
veeso 91081cb86a Use thiserror to format error messages 2021-04-03 16:33:18 +02:00
veeso af678802bb Added path to HostError; scan_dir won't fail if it is not possible to stat an entry 2021-04-03 16:21:37 +02:00
veeso 66068ec73c Merge branch '0.4.1' into issue-13-could-not-start-activity-manager-no-such-file-or-directory 2021-04-03 15:47:31 +02:00
Christian Visintin 32e939c183 Merge pull request #15 from veeso/issue-9-some-problems-with-symlinks-hash-and-backslash-characters
[BUG] Issue 9 some problems with symlinks hash and backslash characters
2021-04-02 22:31:56 +02:00
veeso b610da16a9 Fix remote paths for Windows 2021-04-02 22:09:58 +02:00
veeso 5dfcba3c51 Merge branch '0.4.1' into issue-13-could-not-start-activity-manager-no-such-file-or-directory 2021-04-01 22:20:50 +02:00
veeso d48e05cd74 Merge branch '0.4.1' of github.com:veeso/termscp into 0.4.1 2021-04-01 22:20:29 +02:00
veeso 6f4cb46d94 Merge branch 'main' into 0.4.1 2021-04-01 22:19:19 +02:00
veeso 5886d90d16 Merge branch '0.4.1' into issue-13-could-not-start-activity-manager-no-such-file-or-directory 2021-04-01 22:18:45 +02:00
Christian Visintin ade7160c20 Merge pull request #11 from veeso/issue-10-port-number-isnt-correctly-retrieved-from-the-bookmarks.toml
Issue 10 port number isnt correctly retrieved from the bookmarks.toml
2021-04-01 22:06:22 +02:00
veeso 0c22b322ae Fixed sha256sum 2021-03-30 22:07:23 +02:00
veeso a5ba118393 changelog 2021-03-29 21:16:14 +02:00
veeso 7acf119c77 Fixed port not being loaded from bookmarks into gui 2021-03-29 21:14:35 +02:00
veeso bd00ba7971 Working on 0.4.1 2021-03-29 20:59:55 +02:00
veeso f94a811dd9 Missing 'S' key in keymap 2021-03-28 16:55:26 +02:00
veeso deb46eaf41 pkgbuild 2021-03-27 20:58:10 +01:00
veeso 7812d1c37b Fixed missing color for update notice 2021-03-27 20:43:45 +01:00
veeso c2d401723f Updated contributing 2021-03-27 15:28:01 +01:00
veeso 142169ee42 Fixed logbox multi-lines not working properly; fixed exec command format 2021-03-27 14:59:46 +01:00
veeso 55e884889c Clippy 2021-03-27 12:17:35 +01:00
veeso 67e36fa38f Fixed system test which deleted the termscp configuration 2021-03-27 11:56:18 +01:00
veeso 3dbe024029 Fixed warnings 2021-03-27 11:41:47 +01:00
veeso 96b7aff3b6 format 2021-03-26 22:30:47 +01:00
veeso 1ad75adf87 License changed to MIT 2021-03-26 22:25:10 +01:00
veeso 423f84353d Clippy 2021-03-26 22:19:24 +01:00
veeso de3983e53f Clippy: don't allow warnings 2021-03-26 21:51:53 +01:00
veeso 15bea93da8 find test is broken on windows 2021-03-26 21:46:23 +01:00
veeso f5f84ac346 Fixed del_entry 2021-03-26 21:26:18 +01:00
veeso d44e2d8eb0 Fixed log message 2021-03-26 21:04:04 +01:00
veeso 39bcd5e83b From now on cargo fmt must pass the tests 2021-03-26 20:42:13 +01:00
veeso 3dd6dbbb37 Mount find explorer instead of local/remote; don't use a popup 2021-03-26 20:41:08 +01:00
veeso 5a5d2fb162 fmt 2021-03-26 20:38:47 +01:00
veeso 08b855e779 Find dialog in view 2021-03-25 22:59:42 +01:00
veeso 8a22259eba Fixed tests on windows 2021-03-21 22:58:38 +01:00
veeso 24d727dec8 Fixed host tests 2021-03-21 22:58:32 +01:00
ChristianVisintin 93c4d1c2e3 File explorer features 2021-03-21 22:58:00 +01:00
ChristianVisintin 66f9ace7bd Find command now supports also directories 2021-03-21 22:57:45 +01:00
ChristianVisintin f3788ef61a Find method for localhost 2021-03-21 22:57:37 +01:00
ChristianVisintin b9d801e8bc find method for FileTransfer trait 2021-03-21 22:57:31 +01:00
veeso 3a1c6cac95 Exec command 2021-03-21 22:57:05 +01:00
veeso 8ff7040a0a Localhost exec for windows 2021-03-21 22:47:50 +01:00
veeso 118467e079 Exec on Localhos 2021-03-21 22:47:15 +01:00
veeso 51f0c56b84 File transfer exec command 2021-03-21 22:46:39 +01:00
ChristianVisintin 88a014807f Fixed duplicated bookmarks after overwrite 2021-03-21 22:45:33 +01:00
ChristianVisintin 7a5861f32f prevent infinite loops while performing stat on symbolic links pointing to themselves 2021-03-21 22:44:33 +01:00
veeso 63a627e4d0 bin/ no more accessible in github actions? 2021-03-21 22:42:09 +01:00
veeso f0d87ff8c4 will_umount method in Activity 2021-03-21 17:16:52 +01:00
veeso 30c2aa144b FileTransferParams as member of Context 2021-03-21 16:38:11 +01:00
veeso bf4f24ceec Removed unicode-width 2021-03-21 16:01:12 +01:00
veeso 3520499289 Removed index from explorer 2021-03-21 15:58:14 +01:00
veeso 977becd5c9 File transfer activity refactoring OK 2021-03-21 13:18:53 +01:00
veeso fd4c4a3772 Handle transfer aborted 2021-03-21 12:59:47 +01:00
veeso 7c6a22d3e1 Fixed msgbox wrap 2021-03-21 12:56:31 +01:00
veeso 41360bb2c5 Wrap message box texts; renamed ctext to msgbox 2021-03-21 12:53:11 +01:00
veeso 9b00feb286 Fixed file list to refresh after download / upload 2021-03-21 12:23:46 +01:00
veeso f2681ba0b9 Fixed centered text 2021-03-21 12:21:50 +01:00
veeso 7c9548c668 Prevent subtract with underflow 2021-03-21 12:16:11 +01:00
veeso 7caa4575bd Keep index in file_list if possible 2021-03-21 12:06:42 +01:00
veeso 16a8fc3ad8 Handle enter/space for explorers 2021-03-21 12:03:08 +01:00
veeso cd31cc1fc9 File transfer activity refactoring 2021-03-20 21:06:12 +01:00
veeso 2f3c1e7f7f Removed unused keys from keymap 2021-03-20 20:36:41 +01:00
veeso 61404cfbec Get method for file explorer 2021-03-20 15:31:53 +01:00
veeso 12ec87235f Keymap 2021-03-20 15:31:20 +01:00
veeso b822e2131a From String for TextSpan 2021-03-20 11:28:52 +01:00
veeso 3b99a5401f Migrated setup activity to new activity lifecycle 2021-03-17 21:00:26 +01:00
veeso 5156928bdc Merge branch 'rethink-context' into rethink-activities 2021-03-15 21:09:02 +01:00
veeso 20e7a66ded Working on setup activity; need to merge rethink-context 2021-03-15 21:00:55 +01:00
veeso 411f734aef changelog 2021-03-14 20:59:35 +01:00
veeso 2c898a91da Auth activity OK! 2021-03-14 20:56:36 +01:00
veeso 28f8c82ccf Fixed styles not properly being rendered on text 2021-03-14 20:55:25 +01:00
veeso 54342178e0 Don't blur if new active component is the same as before 2021-03-14 20:53:55 +01:00
veeso 11af0666ea Border to props 2021-03-14 20:48:44 +01:00
veeso a72ecb39e0 Borders to component properties 2021-03-14 20:48:30 +01:00
veeso 47c23c6828 Fixed bookmark list colors 2021-03-14 20:40:27 +01:00
ChristianVisintin 00e2a1db31 Fixed crash due to bookmark delete 2021-03-14 19:37:25 +01:00
veeso 36cc6f445a Title component 2021-03-14 19:21:41 +01:00
veeso ad9ed8facf Fixed radio colors 2021-03-14 17:12:02 +01:00
veeso 4a7eb831b8 Fixed radio colors 2021-03-14 17:09:05 +01:00
veeso 28d51fdcf6 Active component after blur 2021-03-14 17:08:23 +01:00
veeso 4ebb8a3b51 Fixed popups 2021-03-14 16:54:27 +01:00
veeso e76dcd4638 Quit popup 2021-03-14 15:44:21 +01:00
veeso eaada667b3 Fixed cursor 2021-03-14 15:35:02 +01:00
veeso 5bc46dd720 Something is working, but it is still unusable 2021-03-14 15:31:49 +01:00
veeso fe6e0eeab5 Blur previous active component after active 2021-03-14 15:31:21 +01:00
veeso 7e075c5b3d Fixed cursor 2021-03-14 15:25:20 +01:00
veeso 86dfc2bf97 Blur previous active component after active 2021-03-14 15:24:47 +01:00
veeso bda69c661f Layout utils 2021-03-14 14:30:37 +01:00
veeso 8f3fe14843 Removed who_has_focus method 2021-03-14 14:09:36 +01:00
veeso 5c952169b3 Removed layout 2021-03-14 14:09:23 +01:00
veeso 371ba5c399 Fixed input 2021-03-14 14:09:03 +01:00
veeso 0f4649ab8d ctext component 2021-03-14 14:08:27 +01:00
veeso 2b6f7e4868 Components will now render and set cursor 2021-03-14 12:22:50 +01:00
veeso 2e3dc7f7a5 Working on auth activity view 2021-03-13 17:30:57 +01:00
veeso 2d1af97590 who_has_focus method on View 2021-03-10 16:35:29 +01:00
veeso 1e813b0d4d Handle focus on umount 2021-03-10 15:35:08 +01:00
veeso cdbfb3977b view render method 2021-03-10 14:22:00 +01:00
ChristianVisintin e9d3684f87 Working on view 2021-03-10 12:29:41 +01:00
ChristianVisintin 021bcf0c97 Char 'E' in addition to <DEL> for bookmarks 2021-03-10 12:14:46 +01:00
ChristianVisintin fba6da8120 auth activity update 2021-03-10 12:10:36 +01:00
ChristianVisintin 9dbfbd0dc3 View: return String instead of id 2021-03-10 11:26:40 +01:00
veeso 5980bc1fcb Working on activity refactoring 2021-03-09 21:52:11 +01:00
veeso b2aaf5c57f Allow value update in input 2021-03-09 15:40:45 +01:00
veeso e17224184e bookmarks list 2021-03-09 15:12:32 +01:00
veeso 042007d9ed Layout View 2021-03-09 14:19:52 +01:00
veeso c832a6cb6f Codecov: ignore activities, context, input but not layout/ 2021-03-09 08:56:12 +01:00
veeso 3aed691cb8 Removed will_umount from components 2021-03-09 08:54:24 +01:00
veeso 7b92bd22e7 Removed ligatures 2021-03-09 08:17:46 +01:00
veeso 581badd101 Working on view 2021-03-09 08:16:28 +01:00
ChristianVisintin c4bc0af58a Allow store in codecov 2021-03-08 14:23:42 +01:00
ChristianVisintin f75dd5d4e3 Cache version fetched from Github 2021-03-08 14:20:13 +01:00
ChristianVisintin a4544e35f6 Store as part of the Context 2021-03-08 13:57:16 +01:00
ChristianVisintin 56d705e253 Config client shared in the context 2021-03-08 12:01:40 +01:00
veeso 43c177e04d All components must have focus 2021-03-07 17:40:45 +01:00
veeso 5a2d0b7b0b Logbox 2021-03-07 12:41:00 +01:00
veeso 43298dee1c Table component 2021-03-07 12:24:58 +01:00
veeso 26014ecb58 Table in text parts 2021-03-07 12:05:47 +01:00
veeso 57dd06d774 Progress bar; use render_value for input 2021-03-07 11:32:55 +01:00
veeso e21eb72705 Text component 2021-03-06 22:48:54 +01:00
veeso 00b1dbdffa TextSpanBuilder 2021-03-06 20:49:39 +01:00
veeso 55f74a8244 TextSpan instead of strings 2021-03-06 20:34:32 +01:00
veeso db0c54b781 PropsBuilder: use from trait 2021-03-06 20:15:23 +01:00
veeso 5c9cb7eece Merge branch '0.4.0' into rethink-activities 2021-03-06 16:19:20 +01:00
veeso b2d816d20c Radio group 2021-03-06 16:16:36 +01:00
veeso 5b832cea8b Input tests 2021-03-06 15:46:11 +01:00
veeso c1780230e9 Changed Unumber and Number names 2021-03-06 15:10:54 +01:00
veeso b90953f65e PropValue enum 2021-03-06 15:10:19 +01:00
veeso 44041863ad typo 2021-03-04 20:08:15 +01:00
veeso 2692041329 Moved focus to states 2021-03-04 20:06:59 +01:00
veeso 4a8ea185e6 Empty structs 2021-03-04 15:49:13 +01:00
veeso 98861a6bbd Working on 0.4.0 2021-03-04 15:05:27 +01:00
veeso 135d947c39 Working on input 2021-03-04 15:03:29 +01:00
veeso f3cbbb8d81 File list tests 2021-03-04 13:55:10 +01:00
veeso 3ecf172fb5 Input len 2021-03-04 13:36:07 +01:00
veeso c9871a0079 file list 2021-03-04 09:13:29 +01:00
veeso 744e5a251a Render struct instead of Widget; get_value method 2021-03-04 08:53:49 +01:00
veeso e89198d9bb InputType prop 2021-03-04 08:53:19 +01:00
veeso e61e0c018c File list component 2021-03-03 22:02:58 +01:00
veeso b57763e688 Msg instead of callbacks 2021-03-03 15:47:25 +01:00
veeso 3ccbb325b3 Defined Component and State 2021-03-03 12:08:47 +01:00
veeso 3ea345ee8f Layout props tests 2021-03-03 09:32:53 +01:00
veeso ed2c50daac Defined properties 2021-03-02 21:01:36 +01:00
ChristianVisintin f27d5ea08f diagrams of new arch 2021-03-02 15:37:24 +01:00
veeso 35ab9ae202 Added githubActions features to handle github tests; set git fetch test under github actions exclude pattern 2021-03-01 20:33:04 +01:00
veeso bd99665d1c AUR ok 2021-02-28 21:23:22 +01:00
veeso 93bab299ec debian 8 is too old? 2021-02-28 21:07:51 +01:00
veeso eb33f93322 rpm name changed 2021-02-28 16:24:24 +01:00
veeso d165b699f0 Removed archlinux from build (it doesn't work anymore 2021-02-28 16:01:07 +01:00
veeso 7817295d8e The archlinux image is so broken 2021-02-28 15:12:34 +01:00
veeso a986e531d9 Docker is broken 2021-02-28 15:11:08 +01:00
veeso 8a3b652dcd It seems they broke the archlinux docker image with latest version (gg) 2021-02-28 15:07:44 +01:00
Christian Visintin efbea63154 Merge pull request #7 from veeso/fetch-new-release
Check for updates through Github API
2021-02-28 14:47:55 +01:00
veeso 61045fa548 Check for updates OK 2021-02-28 13:10:59 +01:00
veeso da5e1f315d Show new version available in auth activity 2021-02-28 13:01:51 +01:00
veeso 85c57ce027 Handle check for updates in setup activity 2021-02-28 12:47:55 +01:00
veeso 6682c07eb6 Added check_for_updates to config 2021-02-28 12:44:00 +01:00
veeso 4e887c3429 Git: check for new updates (utils) 2021-02-28 12:33:12 +01:00
veeso 6435271be8 Parse semver util 2021-02-28 12:21:28 +01:00
veeso c9a77fa65d 0.3.3 is ready for release I guess 2021-02-27 20:57:07 +01:00
veeso cc5399d36e Cargo clippy 2021-02-27 20:49:20 +01:00
veeso ca1aa5675a Try test threads: 1 2021-02-27 20:30:50 +01:00
ChristianVisintin e21bfbbd14 Use a regex to parse the remote host args 2021-02-26 16:56:03 +01:00
ChristianVisintin e948d598b0 Convert to lowercase when sorting bookmarks 2021-02-26 08:13:38 +01:00
Christian Visintin 0173d67a3b Merge pull request #6 from veeso/fmt-props
Format key attributes
2021-02-25 20:08:01 +01:00
veeso 025547a3dc Format key attributes 2021-02-25 17:47:50 +01:00
veeso af830d603d Now bookmarks and recents are sorted in the UI (bookmarks are sorted by name; recents are sorted by connection datetime) 2021-02-25 16:15:06 +01:00
veeso 669fd23868 Support for older distributions 2021-02-25 14:43:27 +01:00
veeso 4ff7fc079c Added CLI options to set starting working directory on both local and remote hosts 2021-02-25 14:27:34 +01:00
ChristianVisintin 7f24d6db5c Default choice for deleting file set to NO (way too easy to delete files by mistake) 2021-02-16 12:53:28 +01:00
ChristianVisintin 8c8d01c29c working on 0.3.3 2021-02-16 12:50:04 +01:00
ChristianVisintin d23e6bb60c centos7 dockerfile 2021-01-28 12:03:11 +01:00
veeso 87aa900bc6 0.3.2 2021-01-24 20:48:46 +01:00
veeso e8e4cd22a1 0.3.2 ready 2021-01-24 20:31:24 +01:00
veeso 780cf592e4 Updated dependencies 2021-01-24 12:04:27 +01:00
Christian Visintin 45db58a0b3 Merge pull request #5 from veeso/ls-fmt
File explorer formatter
2021-01-24 11:59:31 +01:00
veeso f5218bc582 test_utils_fmt_path_elide: don't run on windows 2021-01-24 11:48:00 +01:00
veeso c5e2e02415 Optimized formatter: instead of replacing in fmt_str, keep 'prefix' in the call chain 2021-01-24 11:29:20 +01:00
veeso e088772685 Docs 2021-01-23 16:38:46 +01:00
veeso 859daa3107 Clippy 2021-01-23 16:38:36 +01:00
veeso 56c580fc80 Use file_fmt in explorer activity 2021-01-23 16:26:25 +01:00
veeso 7a9ee697ff Added fmt_file to setupt activity 2021-01-23 16:22:32 +01:00
veeso c16a2f6441 Improved getters/setters config client 2021-01-23 16:21:30 +01:00
veeso b3c4385617 Added to ConfigClient getters/setters for file_fmt 2021-01-23 16:09:13 +01:00
veeso e92370bd05 Added file_fmt to configuration 2021-01-23 16:00:41 +01:00
veeso da0d5231bf Use formatter to fmt fs entries instead of fmt::Display trait 2021-01-23 15:51:46 +01:00
veeso c1f6308795 Explorer formatter module 2021-01-23 15:41:07 +01:00
veeso 54ab24fc0c fmt_path_elide 2021-01-23 15:03:43 +01:00
veeso d99efb9de4 SCP File transfer: when listing directory entries, check if a symlink points to a directory or to a file 2021-01-23 12:20:34 +01:00
ChristianVisintin 0c9ed38eb7 Solved file index in explorer files at start of termscp, in case the first entry is an hidden file 2021-01-19 09:13:08 +01:00
ChristianVisintin ec801f1555 Working on 0.3.2 2021-01-19 09:12:59 +01:00
veeso e0d8879961 typos 2021-01-18 19:09:54 +01:00
veeso 3f2be65a6c termscp 0.3.1 2021-01-18 17:56:13 +01:00
veeso a5a745e444 0.3.1 2021-01-18 17:36:53 +01:00
Christian Visintin 7ee142314e Merge pull request #4 from Fenex/refactoring/1
Refactoring FtpFileTransfer::parse_unix_list_line
2021-01-18 14:25:24 +01:00
Christian Visintin c412d98ec7 Merge branch '0.3.1' into refactoring/1 2021-01-18 08:07:00 +01:00
Vitaliy Busko d7e5eacd79 Refactoring ScpFileTransfer::parse_ls_output 2021-01-18 11:31:35 +07:00
Vitaliy Busko 367fb235f6 Refactoring FtpFileTransfer::parse_unix_list_line 2021-01-18 10:51:22 +07:00
Christian Visintin d68d63b978 Merge pull request #3 from veeso/keystorage
Keystorage
2021-01-16 18:10:18 +01:00
ChristianVisintin 23ca2baa8c Cargo clippy 2021-01-16 18:02:12 +01:00
ChristianVisintin ac02928e69 Don't run bookmarks tests on macos 2021-01-16 17:37:03 +01:00
ChristianVisintin cb20589b01 Macos test thread (?) 2021-01-16 17:27:07 +01:00
ChristianVisintin 1acbf89717 keyring ok 2021-01-16 17:13:41 +01:00
ChristianVisintin 08d8a3621c Keyring storage in bookmarks client (if possible) 2021-01-16 16:57:00 +01:00
ChristianVisintin 0192b86422 Check if supported (test) 2021-01-16 16:07:53 +01:00
ChristianVisintin 0e4caaecfd Keyring storage 2021-01-16 16:07:11 +01:00
ChristianVisintin 215927d432 Fixed copyright header 2021-01-16 15:37:29 +01:00
ChristianVisintin eee08bd623 Key storage (file) 2021-01-16 15:37:19 +01:00
ChristianVisintin 76fdd9864c Fixed copyright header 2021-01-16 15:13:58 +01:00
ChristianVisintin 350443ec99 SCP file transfer: fixed possible wrong file size when sending file, due to a possible incoherent size between the file explorer and the actual file size 2021-01-16 11:49:59 +01:00
ChristianVisintin 928fc1b450 Solved index of files list no more kept after 0.3.0 (use set_abs_index instead) 2021-01-16 11:35:33 +01:00
ChristianVisintin 03e1bf53d0 Solved index of files list no more kept after 0.3.0 2021-01-16 11:16:31 +01:00
ChristianVisintin 9330025d07 Connection timeout for SFTP/SCP clients 2021-01-16 10:58:07 +01:00
ChristianVisintin bf56a269e0 Replaced Box<dyn Iterator... with impl Iterator 2021-01-16 10:37:53 +01:00
ChristianVisintin 0393c1a850 working on 0.3.1... 2021-01-16 10:33:34 +01:00
ChristianVisintin 69ece00ae2 working on 0.3.1... 2021-01-16 10:31:24 +01:00
Christian Visintin 97656536d4 Cargo build requirements 2021-01-13 10:49:46 +01:00
Christian Visintin 94b78d85ef Merge pull request #1 from Byron/main
run `cargo diet` to reduce crate size by 85%
2021-01-11 08:11:52 +01:00
Sebastian Thiel ba3a888d26 run cargo diet to reduce crate size by 85%
I noticed the crate is pretty big and took a quick look, here
is the outcome of slimming it down.

```
➜  termscp git:(main) cargo diet
┌───────────────────────────────────────────┬─────────────┐
│ File                                      │ Size (Byte) │
├───────────────────────────────────────────┼─────────────┤
│ codecov.yml                               │          96 │
│ .github/ISSUE_TEMPLATE/feature_request.md │         203 │
│ dist/deb.sh                               │         210 │
│ .github/workflows/macos.yml               │         319 │
│ .github/workflows/windows.yml             │         321 │
│ dist/rpm.sh                               │         336 │
│ dist/build/README.md                      │         345 │
│ .gitignore                                │         356 │
│ dist/build/x86_64/Dockerfile              │         509 │
│ dist/pkgs/arch/.SRCINFO                   │         511 │
│ .github/workflows/aur-pub.yml             │         570 │
│ dist/pkgs/arch/PKGBUILD                   │         580 │
│ .github/ISSUE_TEMPLATE/bug_report.md      │         598 │
│ dist/build/x86_64_archlinux/Dockerfile    │         905 │
│ .github/workflows/linux.yml               │        1013 │
│ .github/PULL_REQUEST_TEMPLATE.md          │        1093 │
│ dist/build/deploy.sh                      │        1291 │
│ docs/drawio/UI.drawio                     │        1993 │
│ CODE_OF_CONDUCT.md                        │        3368 │
│ CONTRIBUTING.md                           │       10756 │
│ assets/images/bookmarks.gif               │      298453 │
│ assets/images/auth.gif                    │      321769 │
│ assets/images/explorer.gif                │      650583 │
│ assets/images/config.gif                  │      705780 │
│ assets/images/text-editor.gif             │     1898000 │
└───────────────────────────────────────────┴─────────────┘
Saved 85% or 3.9 MB in 25 files (of 4.6 MB and 75 files in entire crate)
```

Please let me know if you would like some other files to be included
or whatever else is needed to make this PR mergeable.

Thanks :).
2021-01-11 09:09:50 +08:00
veeso d62a6e98c8 0.3.0 2021-01-10 18:22:53 +01:00
veeso eeed99b013 Merge branch '0.3.0' into main 2021-01-10 17:31:31 +01:00
veeso 2b54326334 0.3.0 ready 2021-01-10 17:30:20 +01:00
veeso 2bd3d33ff6 Updated copyright 2021-01-09 20:45:06 +01:00
veeso c54a9ef5c9 termscp 0.3.0 ready 2021-01-09 20:35:55 +01:00
veeso a7ae0159cc config gif 2021-01-09 15:28:20 +01:00
veeso f981602221 Definetely fixed FTP issues 2021-01-09 15:05:49 +01:00
veeso fa5468be4a Fixed time check tests 2021-01-09 14:29:30 +01:00
veeso 591182414f Updated references to veeso 2021-01-08 22:02:40 +01:00
veeso 49790b4704 Updated references to veeso 2021-01-02 13:04:49 +01:00
ChristianVisintin daa3b3e549 Fixed 0 B/S transfer rate displayed after completing download in less than 1 second 2020-12-28 22:54:28 +01:00
ChristianVisintin 120dc8ecb4 Fixed buffer sizes for transfers 2020-12-28 22:45:28 +01:00
ChristianVisintin 06a2373776 parse dos line test 2020-12-27 20:42:52 +01:00
ChristianVisintin 32ae5cc182 Removed test for macos 2020-12-27 19:28:41 +01:00
ChristianVisintin 6975beaf30 Fixed file extension not found in SCP/FTP 2020-12-27 15:08:57 +01:00
ChristianVisintin c141c6c44d Added LIST command parser for Windows server (DOS-like syntax) 2020-12-27 15:08:42 +01:00
ChristianVisintin 68cd77a9b3 Added utils::parser::parse_datetime 2020-12-27 12:01:20 +01:00
ChristianVisintin e20a78acef Don't collapse bookmarks tabs 2020-12-27 11:05:01 +01:00
ChristianVisintin 6dd4cfaa3c InputMode as Option<Popup> in AuthActivity 2020-12-27 11:03:44 +01:00
ChristianVisintin d756bf7786 InputMode as Option<Popup> in FileTransferActivity 2020-12-27 10:59:12 +01:00
ChristianVisintin 65e7ff22f7 Explorers: append '/' to directories name 2020-12-27 10:47:11 +01:00
ChristianVisintin 655084c5f6 typo 2020-12-27 10:36:48 +01:00
ChristianVisintin 09bc8a92a2 show_hidden_files and group_dirs in termscp configuration; instantiate FileExplorer based on current configuration in FileTransferActivity 2020-12-27 10:31:33 +01:00
ChristianVisintin 99fd0b199d FileTransferActivity: sort files with <B> 2020-12-26 21:47:48 +01:00
ChristianVisintin 740d906eb3 ToString, FromStr for FileSorting and GroupDirs 2020-12-26 19:03:54 +01:00
ChristianVisintin b137fecc12 FileSorting and GroupDirs as enums 2020-12-26 18:55:14 +01:00
ChristianVisintin 14125f673a Added options to explorer, in order to define sorting modes and other options. Added bitflags to dependencies; Moved Explorer to Fs module 2020-12-26 17:29:12 +01:00
ChristianVisintin 4911cc5410 Removed issues badge 2020-12-26 15:53:14 +01:00
ChristianVisintin e0d9ac2ed8 FileTransferActivity::Explorer refactoring; toggle hidden files with <A> 2020-12-26 15:50:57 +01:00
ChristianVisintin 5b042e86ef FsEntry::is_hidden() method 2020-12-26 11:58:28 +01:00
ChristianVisintin 8ccf5eb0bb FsEntry::get_name() returns &str 2020-12-26 10:51:01 +01:00
ChristianVisintin c0fdc9b8f8 Added new keybindings to help; log new file created 2020-12-26 10:40:45 +01:00
ChristianVisintin 545544ebe2 Added test to config client 2020-12-26 10:33:23 +01:00
ChristianVisintin 644ea1566c Create new file with <N> 2020-12-26 10:16:01 +01:00
ChristianVisintin f6d1f24b60 cargo clippy 2020-12-26 09:40:24 +01:00
ChristianVisintin c9a4706c24 Fixed paths 2020-12-25 21:54:10 +01:00
ChristianVisintin 7e275a9075 Docs: private keys with passwords 2020-12-25 21:35:28 +01:00
ChristianVisintin 22a9eb03b6 Added configuration and ssh key storage features to docs 2020-12-25 19:45:49 +01:00
ChristianVisintin 46ee01e073 SetupActivity: <CTRL+E> as <DEL> 2020-12-25 19:38:17 +01:00
ChristianVisintin 16a011e81e Use default protocol also in opt parser 2020-12-25 19:10:28 +01:00
ChristianVisintin 90f28d9f27 SetupActivity ok 2020-12-25 18:39:18 +01:00
ChristianVisintin 2e4ff78124 Refuse empty ssh key 2020-12-25 18:22:12 +01:00
ChristianVisintin 9e66207bf7 SetupActivity layout 2020-12-25 18:20:30 +01:00
ChristianVisintin 226ad8cc50 Show CTRL+C to enter setup in auth activity 2020-12-25 17:25:35 +01:00
ChristianVisintin 00731d67d2 ToString for protocol in AuthActivity 2020-12-25 16:44:01 +01:00
ChristianVisintin e354d17c70 SetupActivity logic 2020-12-25 16:41:49 +01:00
ChristianVisintin 264b5afad6 Typo in system 2020-12-25 11:43:32 +01:00
ChristianVisintin 76c4f1b67f Close popups also with <ENTER> 2020-12-25 10:00:24 +01:00
ChristianVisintin 96a395615b FileTransferActivity: load ConfigClient; set text editor to configuration's value 2020-12-24 19:01:42 +01:00
ChristianVisintin 82d8bd0342 Read default protocol in auth activity 2020-12-24 18:47:00 +01:00
ChristianVisintin 39e8d1f704 AuthActivity: enter setup with <CTRL+C> 2020-12-24 18:27:38 +01:00
ChristianVisintin 6bf503331e SSH key storage in scp/sftp file transfers 2020-12-24 17:27:57 +01:00
ChristianVisintin 920d3b4af4 get_bookmarks_paths; get_config_paths 2020-12-24 17:19:47 +01:00
ChristianVisintin f601a0451c fix relative paths codecov 2020-12-24 17:01:11 +01:00
ChristianVisintin 841db02b30 empty method sshkey_storage 2020-12-24 16:57:04 +01:00
ChristianVisintin 1449b5a524 SSH Key Storage 2020-12-24 16:49:02 +01:00
ChristianVisintin fbb60c7cbc ConfigClient: return key path, not content 2020-12-24 16:42:42 +01:00
ChristianVisintin f0144e3bc2 ConfigClient 2020-12-24 16:21:53 +01:00
ChristianVisintin ce924bb294 random utils 2020-12-24 11:23:31 +01:00
ChristianVisintin 797174446c Config module 2020-12-24 11:12:02 +01:00
ChristianVisintin 9b9dc43a7f FileTransferProtocol ToString and FromStr traits 2020-12-24 10:03:48 +01:00
ChristianVisintin 53ee0f618c Updated known issues 2020-12-23 17:49:30 +01:00
ChristianVisintin c35a5590b5 Updated dependencies 2020-12-22 18:33:38 +01:00
ChristianVisintin d23fe09f86 fmt 2020-12-22 17:35:07 +01:00
ChristianVisintin e761a90826 Crypto as utility module 2020-12-22 17:34:52 +01:00
ChristianVisintin b5abe4538f Replaced sha256 sum with last modification time check, to verify if a file has been changed in the text editor 2020-12-22 17:23:16 +01:00
ChristianVisintin 7202b19d45 Working on 0.3.0 2020-12-22 17:14:44 +01:00
ChristianVisintin 88f9c8910b Fixed download paths 2020-12-21 15:12:47 +01:00
ChristianVisintin c9948162b9 lol, for some reason cargo-aur renames my crate into termscp-bin. WHY OMG WHY. 2020-12-21 14:42:26 +01:00
ChristianVisintin 4e8e0d1b41 Fixed that f aur action 2020-12-21 14:33:00 +01:00
ChristianVisintin 95b7a773d7 aur runs on 2020-12-21 14:24:25 +01:00
ChristianVisintin 07c924d6a0 0.2.0 2020-12-21 14:21:04 +01:00
ChristianVisintin 50efebdd63 Fixed deploy script 0.2.0 2020-12-21 14:07:43 +01:00
ChristianVisintin 50b8f3cd71 Improved abs paths in host 2020-12-21 13:59:03 +01:00
ChristianVisintin 093dc4f33d Fixed test 2020-12-21 13:43:05 +01:00
ChristianVisintin 963ef88ae5 Arch package (0.2.0) 2020-12-21 12:22:13 +01:00
ChristianVisintin 03e63e11ac 0.2.0 2020-12-21 12:06:44 +01:00
ChristianVisintin 9f478227a9 0.2.0 readme 2020-12-21 12:02:45 +01:00
ChristianVisintin 1d112b3f32 Arch publish workflow and build with docker 2020-12-21 11:48:41 +01:00
ChristianVisintin 1a5bd394b6 Optimizations 2020-12-21 11:12:49 +01:00
ChristianVisintin 3901ed54c6 Copy feature in ui; new keybinding <C> 2020-12-21 11:11:29 +01:00
ChristianVisintin 08728bf55e Copy method (host/transfer) 2020-12-21 10:49:31 +01:00
ChristianVisintin 3220d00b14 archlinux dist 2020-12-21 10:27:33 +01:00
ChristianVisintin eb12da0308 Utils into multiple files 2020-12-20 15:36:48 +01:00
ChristianVisintin 77545ec87d Text editor documentation 2020-12-20 15:22:52 +01:00
ChristianVisintin 3f6f03af33 Text editor input and session 2020-12-20 15:05:22 +01:00
ChristianVisintin 47f9b39630 Sha256 in utils 2020-12-20 14:49:32 +01:00
ChristianVisintin 9171e0789f Moved recv_file and send_file to an independent method (fix) 2020-12-20 14:47:37 +01:00
ChristianVisintin 5eabaf8ac2 Moved recv_file and send_file to an independent method 2020-12-20 12:33:19 +01:00
ChristianVisintin b8ad1e7feb edit file method 2020-12-19 21:49:53 +01:00
ChristianVisintin 4d7ea1cdb4 Context methods 2020-12-19 21:47:03 +01:00
ChristianVisintin 021f860ca6 context enter_alternate_screen leave_alternate_screen clear_screen 2020-12-19 21:39:31 +01:00
ChristianVisintin d0774fd7ed FsEntry::is_file 2020-12-19 21:38:56 +01:00
ChristianVisintin 5632ac6f0b Optimizing log code 2020-12-19 21:12:30 +01:00
ChristianVisintin 7a115e5dc3 wrkdir as member of FileExplorer 2020-12-19 21:10:00 +01:00
ChristianVisintin d95cda3dfc Optimizing log code 2020-12-19 21:05:56 +01:00
ChristianVisintin dd9f54acae Working on text-editor 2020-12-19 21:04:55 +01:00
ChristianVisintin 6bc2bcb89e Include set_permissions in UNIX/macos/linux only 2020-12-18 20:58:57 +01:00
ChristianVisintin 9c2e751e11 Rounded borders; collapsed bookmarks borders 2020-12-18 20:54:34 +01:00
ChristianVisintin 2a52a19552 Display transfer speed 2020-12-18 17:06:17 +01:00
ChristianVisintin 1b99d63c47 Added one more space to size in FsEntry::fmt, since sometimes size has 4 digits 2020-12-18 16:42:06 +01:00
ChristianVisintin 33683bc8ce SFTP speed issue marked as solved 2020-12-18 16:16:23 +01:00
ChristianVisintin 61b4a3b76e Log how long it took to download/upload a file 2020-12-18 16:14:23 +01:00
ChristianVisintin 386db6278b Updated github uri 2020-12-18 14:47:48 +01:00
ChristianVisintin 47664b98ad Updated github uri 2020-12-18 14:47:32 +01:00
ChristianVisintin 898b57943b Improved test coverage 2020-12-18 14:40:37 +01:00
ChristianVisintin d37cc4f796 test name elide in fs fmt 2020-12-18 12:27:37 +01:00
ChristianVisintin b3fed60d12 Fixed fmt explorer windows 2020-12-18 12:06:54 +01:00
ChristianVisintin a3d1db3fa2 Fs test fmt 2020-12-18 11:56:08 +01:00
ChristianVisintin 0a79fb3687 Scp: when username was not provided, it didn't fallback to current username 2020-12-18 11:40:51 +01:00
ChristianVisintin 900d9ac3c6 Apply file mode of file downloaded from remote 2020-12-18 11:31:51 +01:00
ChristianVisintin 50b523f9f4 codecov.yml 2020-12-18 10:49:41 +01:00
ChristianVisintin 0759651ee4 codecov 2020-12-18 10:47:37 +01:00
ChristianVisintin daedee3f66 Documentation about bookmarks 2020-12-16 21:09:59 +01:00
ChristianVisintin 61c58e227e Merge branch 'bookmarks' into 0.2.0 2020-12-16 20:42:47 +01:00
ChristianVisintin 3cd9fc407e Bookmarks layout OK 2020-12-16 20:41:42 +01:00
ChristianVisintin dd6e2be75d Panic if bookmark name is empty 2020-12-16 20:39:35 +01:00
ChristianVisintin 38e015efe4 removed args from SaveBookmark 2020-12-16 20:34:36 +01:00
ChristianVisintin 335bfc8460 Added 'save password' tab to auth activity when saving bookmarks 2020-12-16 17:01:11 +01:00
ChristianVisintin 344bf8604f Fixed crash in auth_activity 2020-12-16 16:51:21 +01:00
ChristianVisintin 562a1b3ae8 Clippy optimizations 2020-12-16 16:35:11 +01:00
ChristianVisintin 65c541ff2a bookmarks client OK 2020-12-16 16:32:50 +01:00
ChristianVisintin 14ddba022f Implemented BookmarkClient in AuthActivity 2020-12-16 16:01:29 +01:00
ChristianVisintin 10df5abae2 Added Option<String> password to bookmarks 2020-12-16 16:00:43 +01:00
ChristianVisintin 443789698b Copy trait for FileTransferProtocol 2020-12-16 15:57:46 +01:00
ChristianVisintin 52df9bc73b Macro use for magic-crypt 2020-12-16 15:47:02 +01:00
ChristianVisintin 8cb3637954 Magic-crypt 2020-12-16 15:46:46 +01:00
ChristianVisintin ee55d1fd31 Bookmarks client 2020-12-16 12:09:34 +01:00
ChristianVisintin dcc289153f Working on bookmarksClient 2020-12-15 22:17:19 +01:00
ChristianVisintin 940d8d94e5 Moving bookmarks from ui to system 2020-12-15 20:48:43 +01:00
ChristianVisintin c9f1086408 Merge branch 'bookmarks' into 0.2.0 2020-12-15 16:45:34 +01:00
ChristianVisintin ff4f35e5f5 Clippy ok 2020-12-15 16:31:21 +01:00
ChristianVisintin b865fed7e9 Removed bookmarks from upcoming features (since implemented) 2020-12-15 16:23:09 +01:00
ChristianVisintin 274c5e309b Set password as InputField after loading bookmark 2020-12-15 16:17:56 +01:00
ChristianVisintin e7d53a7d00 Help page in auth activity 2020-12-15 15:00:21 +01:00
ChristianVisintin 99117e067e Bookmarks layouts 2020-12-15 14:46:59 +01:00
ChristianVisintin 88e27ee8fe New popup handlers 2020-12-15 14:18:16 +01:00
ChristianVisintin d3fe546264 Callbacks and handler for Bookmarks events 2020-12-15 14:15:35 +01:00
ChristianVisintin 982b3ec8d0 Delete recents/bookmarks 2020-12-15 14:03:50 +01:00
ChristianVisintin b8cf2bea77 load bookmarks 2020-12-15 13:55:41 +01:00
ChristianVisintin a511cd4ac3 Read one input event at a time 2020-12-15 13:44:51 +01:00
ChristianVisintin 0bab9a77a2 Working on bookmarks 2020-12-15 12:28:06 +01:00
ChristianVisintin 1f9b616de7 Bookmarks in auth activity (logic) 2020-12-15 12:22:47 +01:00
ChristianVisintin 71593e3ea7 PartialEq for bookmark 2020-12-15 12:18:35 +01:00
ChristianVisintin db7ee624e3 Bookmark default 2020-12-15 12:03:31 +01:00
ChristianVisintin 0e7527fb3f file_exists as pub 2020-12-15 11:36:07 +01:00
ChristianVisintin 50fcba63c4 Bookmarks serializer and data types 2020-12-15 11:13:29 +01:00
ChristianVisintin 8046f82214 AuthActivity refactoring 2020-12-15 09:21:52 +01:00
ChristianVisintin c33045b4b8 Refactoring auth activity... 2020-12-15 09:14:08 +01:00
ChristianVisintin bb2a60e776 Updated gif 2020-12-14 19:26:16 +01:00
ChristianVisintin 04e2dc86e8 TermSCP 0.1.3 2020-12-14 19:11:42 +01:00
ChristianVisintin ad44f020a5 Highlight selected entry in tabs, only when the tab is active 2020-12-14 15:52:01 +01:00
ChristianVisintin ad339aa959 Added missing help entry 2020-12-14 15:47:41 +01:00
ChristianVisintin 3ea8188805 Docker build and deploy 2020-12-14 15:35:41 +01:00
ChristianVisintin 18aacef89f Bookmarks in upcoming features 2020-12-14 13:54:42 +01:00
ChristianVisintin b8b29371ca Reload directory content with '<L>' 2020-12-14 13:52:49 +01:00
ChristianVisintin bd99a0c2b2 align auth popup error to center 2020-12-14 13:39:47 +01:00
ChristianVisintin c493ba45a8 align_text_center as part of utils 2020-12-14 13:33:24 +01:00
ChristianVisintin e9d5093a52 Read buffer is now 65536 bytes long 2020-12-14 10:03:20 +01:00
ChristianVisintin 7aa8a892f8 Cargo toml 0.1.3 2020-12-14 09:14:58 +01:00
ChristianVisintin 99a3b64833 Explorer tabs have now 70% of layout height, while logging area is 30% 2020-12-14 09:14:23 +01:00
ChristianVisintin d94c331569 Fixed keybindings readme 2020-12-14 09:03:57 +01:00
ChristianVisintin e2e25e4ac1 Fixed memory vulnerability in Windows version 2020-12-14 09:03:40 +01:00
ChristianVisintin 2b8be4d1e9 Fixed color mismatch in local explorer tab (Yellow/LightYellow) 2020-12-14 09:01:35 +01:00
ChristianVisintin db38a53172 Filemode explorer.gif 2020-12-14 08:55:43 +01:00
ChristianVisintin 29f7e3c759 0.1.2 2020-12-13 20:42:20 +01:00
ChristianVisintin 83bc7db048 Optimized performance for file transfer 2020-12-13 11:43:04 +01:00
ChristianVisintin e273192f19 Working on 0.2.0 2020-12-13 10:27:21 +01:00
ChristianVisintin 55d05be626 README 2020-12-13 10:25:22 +01:00
ChristianVisintin 5c26b10671 0.1.2 is ready for release 2020-12-13 10:04:27 +01:00
ChristianVisintin d29428a53b Reduced layout margin 2020-12-13 10:02:54 +01:00
ChristianVisintin 2a8ad5e0ed Selected file has now colourful background, instead of foreground, for a better readability 2020-12-13 09:55:16 +01:00
ChristianVisintin f06f718b47 when file index is at the end of the list, moving down will set the current index to the first element and viceversa 2020-12-13 09:46:36 +01:00
ChristianVisintin db532cc4b7 Added <CTRL+C> to help page 2020-12-13 09:41:41 +01:00
ChristianVisintin 962843bb97 Log transfer aborted 2020-12-13 09:39:12 +01:00
ChristianVisintin 619ac4e753 Windows fix for fs mod 2020-12-12 22:04:59 +01:00
ChristianVisintin a8a9cb9d2e Abort upload/download pressing Ctrl+C 2020-12-12 22:00:12 +01:00
ChristianVisintin 3e72787625 Transfer states 2020-12-12 21:32:11 +01:00
ChristianVisintin 794dfb8cee Upcoming features 2020-12-12 19:14:45 +01:00
ChristianVisintin d89839443d Trim hostname 2020-12-12 18:04:47 +01:00
ChristianVisintin 99db7b6d8e Fixed FsEntry fmt 2020-12-12 17:50:01 +01:00
ChristianVisintin 1fb614642c Added 'E' to keybindings; behaves as <DEL> (added because some keyboards don't have <DEL> 2020-12-12 17:44:04 +01:00
ChristianVisintin 3b33c55d97 Removed redundant code for fsEntry fmt 2020-12-12 17:36:39 +01:00
ChristianVisintin 5aea1d286b Code optimizations 2020-12-12 17:34:15 +01:00
ChristianVisintin 3dcf33ebe2 Optimized code, with the newest fsentry methods 2020-12-12 17:33:15 +01:00
ChristianVisintin 912da10696 When downloading symlinks, the filename and its size is now known (thanks to the new symlinks management) 2020-12-12 17:32:49 +01:00
ChristianVisintin 8281a840a7 Optimizing FsEntry and relatd stuff 2020-12-12 17:03:31 +01:00
ChristianVisintin 57e83a63dd Optimized code for fsentry 2020-12-12 16:32:21 +01:00
ChristianVisintin f73e43304e FsEntry::*::symlink is now a Option<Box<FsEntry>>; this improved symlinks, which gave errors some times 2020-12-12 16:26:03 +01:00
ChristianVisintin 23ac5089a7 Added clippy to workflows 2020-12-12 12:17:33 +01:00
ChristianVisintin 55bda874f0 Optimized code and performance using clippy 2020-12-12 12:14:51 +01:00
ChristianVisintin 0eae159bb9 Working on 0.1.2 2020-12-12 10:06:11 +01:00
ChristianVisintin 6d49fe4e7d changed emoji in readme 2020-12-10 14:26:39 +01:00
ChristianVisintin 5b8c03babd typo in readme 2020-12-10 14:26:13 +01:00
ChristianVisintin 20872829f1 changelog 2020-12-10 12:38:09 +01:00
ChristianVisintin 2d37607d2c 0.1.1 2020-12-10 12:36:09 +01:00
ChristianVisintin c9c35d027b Removed unused import 2020-12-10 12:13:45 +01:00
ChristianVisintin 11475b64ea Removed ctrl to 'Q' 2020-12-10 12:06:32 +01:00
ChristianVisintin 53249c8bc5 Break on recv/send errors 2020-12-10 11:52:00 +01:00
ChristianVisintin 843c5ab6d0 Break on recv/send errors 2020-12-10 11:51:49 +01:00
ChristianVisintin 66f17c93c2 Finalize get stream for FTP 2020-12-10 11:27:00 +01:00
ChristianVisintin 69df9f0aa9 ftp4 0.4.1 2020-12-10 11:26:52 +01:00
ChristianVisintin 5c5a93cc41 use macos-latest 2020-12-10 11:10:42 +01:00
ChristianVisintin 040b684398 Typo in windows version 2020-12-10 11:04:53 +01:00
ChristianVisintin d75867ed7b Build all branches 2020-12-10 10:47:26 +01:00
ChristianVisintin e36ae7e32d Updated textwrap to 0.13.0 2020-12-10 10:41:13 +01:00
ChristianVisintin 4aa262a273 Build all branches 2020-12-10 10:40:36 +01:00
ChristianVisintin 7e6044a41b Removed CTRL key; just press associated key to perform command 2020-12-10 10:28:40 +01:00
ChristianVisintin 145b778ff3 Added FileInfo popup ('I') 2020-12-10 10:28:13 +01:00
ChristianVisintin ca46c872cf fmt_pex is now a method 2020-12-10 10:05:30 +01:00
ChristianVisintin 98e3866447 Elide paths in explorer tabs if they are too long 2020-12-10 09:22:58 +01:00
ChristianVisintin 95ab3daa86 Elide file names longer than 24 2020-12-10 08:44:35 +01:00
ChristianVisintin 93977cc714 Ignore capital letters when sorting files 2020-12-09 16:35:16 +01:00
ChristianVisintin b3537afd2e Check value in set_progress 2020-12-09 16:29:35 +01:00
ChristianVisintin 939f741a1b some stuff in readme 2020-12-09 16:20:55 +01:00
ChristianVisintin 5a96091258 Fixed help 2020-12-09 16:19:27 +01:00
ChristianVisintin 2d20f0c534 Working on 0.1.1 2020-12-09 16:18:13 +01:00
ChristianVisintin 8f3e416144 Ask password before cleaning screen 2020-12-09 16:17:11 +01:00
363 changed files with 67291 additions and 10069 deletions
+4
View File
@@ -0,0 +1,4 @@
# These are supported funding model platforms
github: veeso
liberapay: veeso
+9 -4
View File
@@ -1,9 +1,9 @@
---
name: Bug report
about: Create a report to help me improving TermSCP
title: "[BUG]"
about: Create a report of the bug you've encountered
title: "[BUG] - ISSUE_TITLE"
labels: bug
assignees: ChristianVisintin
assignees: veeso
---
@@ -24,10 +24,15 @@ A clear and concise description of what you expected to happen.
- OS: [e.g. GNU/Linux Debian 10]
- Architecture [Arm, x86_64, ...]
- Rust version
- TermSCP version
- termscp version
- Protocol used
- Remote server version and name
## Log
Report the snippet of the log file containing the unexpected behaviour.
If there is any information you consider to be confidential, shadow it.
## Additional information
Add any other context about the problem here.
+35
View File
@@ -0,0 +1,35 @@
---
name: Copy
about: Report a typo/error in a repository document
title: "[COPY] - ISSUE_TITLE"
labels: documentation
assignees: veeso
---
## Report
### DOCUMENT NAME
This sentence at row ROW_NUMBER doesn't seem right:
> Write down here the wrong sentence
and I think it should be changed to:
> Write down here the correct sentence
`Copy paste the template above for all the sentences to fix`
---
`Copy paste the template above for all the documents to fix`
## Additional information
> ❗ Report LANGUAGE checks only if it concerns the documents above
> ❗ If the documents concerns more than one language, copy paste the checks below for each check you want to report
> ❗ The PR mention regards the indicated language. If you check the box, I may add you to a PR where I need to translate a new section of the user manual/README or other documents. I promise I won't stress you anyway.
- [ ] I am C1/C2 speaker for this language: LANGUAGE
- [ ] You can mention me in a PR in case a review for translations is needed
+16 -5
View File
@@ -1,12 +1,23 @@
---
name: Feature request
about: Suggest an idea for TermSCP
title: "[Feature Request]"
labels: enhancement
assignees: ChristianVisintin
about: Suggest an idea to improve termscp
title: "[Feature Request] - FEATURE_TITLE"
labels: "new feature"
assignees: veeso
---
## Description
Describe the feature you'd like to be added
Put here a brief introduction to your suggestion.
### Changes
The following changes to the application are expected
- ...
## Implementation
Provide any kind of suggestion you propose on how to implement the feature.
If you have none, delete this section.
+8
View File
@@ -0,0 +1,8 @@
---
name: Question
about: Ask what you want about the project
title: "[QUESTION] - TITLE"
labels: question
assignees: veeso
---
+23
View File
@@ -0,0 +1,23 @@
---
name: Security report
about: Create a report of a security vulnerability
title: "[SECURITY] - ISSUE_TITLE"
labels: security
assignees: veeso
---
## Description
Severity:
- [ ] **critical**
- [ ] high
- [ ] medium
- [ ] low
A clear and concise description of the security vulnerability.
## Additional information
Add any other context about the problem here.
+12 -3
View File
@@ -1,4 +1,4 @@
# Pull Request Title
# ISSUE _NUMBER_ - PULL_REQUEST_TITLE
Fixes # (issue)
@@ -25,7 +25,16 @@ Please select relevant options.
- [ ] My code follows the contribution guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I formatted the code with `cargo fmt`
- [ ] I checked my code using `cargo clippy` and reports no warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] Any dependent changes have been merged and published in downstream modules
- [ ] I have introduced no new *C-bindings*
- [ ] The changes I've made are Windows, MacOS, UNIX, Linux compatible (or I've handled them using `cfg target_os`)
- [ ] I increased or maintained the code coverage for the project, compared to the previous commit
## Acceptance tests
wait for a *project maintainer* to fulfill this section...
- [ ] regression test: ...
+16
View File
@@ -0,0 +1,16 @@
branch: false
ignore-not-existing: true
llvm: true
output-type: lcov
ignore:
- "/*"
- "C:/*"
- "../*"
- src/main.rs
- src/activity_manager.rs
- src/cli_opts.rs
- src/support.rs
- src/system/notifications.rs
- "src/ui/activities/*"
- src/ui/context.rs
- src/ui/input.rs
+68
View File
@@ -0,0 +1,68 @@
name: CI
on:
pull_request:
branches: [main]
paths-ignore:
- "*.md"
- "./site/**/*"
push:
branches: [main]
paths-ignore:
- "*.md"
- "./site/**/*"
env:
CARGO_TERM_COLOR: always
permissions:
contents: read
jobs:
build:
name: build-(${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: sudo apt update && sudo apt install -y libdbus-1-dev libsmbclient-dev
- name: Install macOS dependencies
if: runner.os == 'macOS'
run: |
brew update
brew install \
pkg-config \
samba
brew link --force samba
- name: Install nightly toolchain
if: runner.os == 'Linux'
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
with:
toolchain: nightly
components: rustfmt
- name: Format
if: runner.os == 'Linux'
run: cargo +nightly fmt --all -- --check
- name: Install stable toolchain
uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
with:
toolchain: stable
components: clippy
- name: Build
if: runner.os != 'Linux'
run: cargo build
- name: Run tests (Linux)
if: runner.os == 'Linux'
run: cargo test --no-default-features --features github-actions --no-fail-fast
- name: Run tests
if: runner.os != 'Linux'
run: cargo test --verbose --features github-actions
- name: Clippy
run: cargo clippy -- -Dwarnings
+21
View File
@@ -0,0 +1,21 @@
name: codeberg-mirror
on:
push:
permissions:
contents: read
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
fetch-depth: 0
persist-credentials: false
- name: "Mirror to Codeberg"
uses: yesolutions/mirror-action@1708f16cdb28634fd3ba10c5c79abc91f5578a14 # v0.7.0
with:
REMOTE: 'ssh://git@codeberg.org/veeso/termscp.git'
GIT_SSH_PRIVATE_KEY: ${{ secrets.GIT_SSH_PRIVATE_KEY }}
GIT_SSH_NO_VERIFY_HOST: "true"
+32
View File
@@ -0,0 +1,32 @@
name: Install.sh
on:
push:
branches: [main]
tags:
- "v*"
env:
CARGO_TERM_COLOR: always
permissions:
contents: read
jobs:
build:
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- name: Install termscp from script
run: |
./install.sh -f
which termscp || exit 1
termscp --version
-22
View File
@@ -1,22 +0,0 @@
name: Linux
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
-22
View File
@@ -1,22 +0,0 @@
name: MacOS
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: macos-10.14
steps:
- uses: actions/checkout@v2
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
+66
View File
@@ -0,0 +1,66 @@
name: Deploy docs to GitHub Pages
on:
push:
branches:
- main
paths:
- "docs/**"
- ".github/workflows/pages.yml"
workflow_dispatch:
permissions:
contents: read
concurrency:
group: pages
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- name: Install mdBook
uses: peaceiris/actions-mdbook@ee69d230fe19748b7abf22df32acaa93833fad08 # v2
with:
mdbook-version: latest
- name: Install mdbook-mermaid
run: cargo install mdbook-mermaid
- name: Build en-US
run: mdbook build docs/en-US
- name: Build zh-CN
run: mdbook build docs/zh-CN
- name: Assemble site
run: |
rm -rf site_out
mkdir -p site_out/en-US site_out/zh-CN
cp -r docs/en-US/book/* site_out/en-US/
cp -r docs/zh-CN/book/* site_out/zh-CN/
cp -r docs/shared site_out/shared
cp docs/shared/og_preview.jpg site_out/og_preview.jpg
cp docs/shared/favicon.ico site_out/favicon.ico
cp docs/CNAME site_out/CNAME
cat > site_out/index.html <<'HTML'
<!doctype html>
<meta charset="utf-8">
<title>termscp docs</title>
<meta http-equiv="refresh" content="0; url=./en-US/">
<link rel="canonical" href="./en-US/">
<a href="./en-US/">termscp documentation</a>
HTML
- name: Upload artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
with:
path: site_out
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
+448
View File
@@ -0,0 +1,448 @@
name: Release
on:
workflow_dispatch:
inputs:
version:
description: "Version to release, e.g. 1.1.0 (no leading v)"
required: true
type: string
dry_run:
description: "Dry run: build & compute everything, push/publish nothing"
required: true
type: boolean
default: true
permissions:
contents: read
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ inputs.version }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
token: ${{ secrets.RELEASE_PAT }}
persist-credentials: true
fetch-depth: 0
fetch-tags: true
- name: Configure git identity
run: |
git config user.name "veeso"
git config user.email "christian.visintin@veeso.dev"
- name: Install git-cliff
uses: taiki-e/install-action@56545b37b57562edd73171cb6c62cc509db4c34e # v2
with:
tool: git-cliff
- name: Bump version
env:
VERSION: ${{ inputs.version }}
run: dist/release/bump_version.sh "$VERSION" "$(date +%F)"
- name: Generate CHANGELOG
env:
VERSION: ${{ inputs.version }}
run: git-cliff --tag "v$VERSION" -o CHANGELOG.md
- name: Generate release notes
env:
VERSION: ${{ inputs.version }}
run: git-cliff --unreleased --tag "v$VERSION" --strip header -o RELEASE_NOTES.md
- name: Upload release notes
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: release-notes
path: RELEASE_NOTES.md
retention-days: 1
if-no-files-found: error
- name: Show diff (dry run)
if: ${{ inputs.dry_run }}
run: git --no-pager diff
- name: Commit & push version bump
if: ${{ !inputs.dry_run }}
env:
VERSION: ${{ inputs.version }}
run: |
rm -f RELEASE_NOTES.md
git add -A
git commit -m "chore: release v$VERSION"
git push origin HEAD:main
build:
needs: prepare
name: build-${{ matrix.target }}
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
kind: linux
deb_suffix: amd64
- target: aarch64-unknown-linux-gnu
os: ubuntu-24.04-arm
kind: linux
deb_suffix: arm64
- target: aarch64-apple-darwin
os: macos-latest
kind: macos
features: "--features smb-vendored"
- target: x86_64-apple-darwin
os: macos-latest
kind: macos
features: "--no-default-features --features keyring"
- target: x86_64-pc-windows-msvc
os: windows-latest
kind: windows
- target: aarch64-pc-windows-msvc
os: windows-11-arm
kind: windows
runs-on: ${{ matrix.os }}
env:
VERSION: ${{ needs.prepare.outputs.version }}
TARGET: ${{ matrix.target }}
FEATURES: ${{ matrix.features }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
ref: ${{ inputs.dry_run && github.sha || 'main' }}
persist-credentials: false
fetch-depth: 0
fetch-tags: true
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
with:
targets: ${{ matrix.target }}
# ---- Linux: native per-arch build (x86_64 on ubuntu-latest, aarch64 on ubuntu-24.04-arm) ----
- name: Install dependencies (Linux)
if: matrix.kind == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y \
make \
libgit2-dev \
build-essential \
pkg-config \
libbsd-dev \
libcap-dev \
libcups2-dev \
libgnutls28-dev \
libicu-dev \
libjansson-dev \
libkeyutils-dev \
libldap2-dev \
zlib1g-dev \
libpam0g-dev \
libacl1-dev \
libarchive-dev \
flex \
bison \
libntirpc-dev \
libtracker-sparql-3.0-dev \
libglib2.0-dev \
libdbus-1-dev \
libsasl2-dev \
libunistring-dev \
cpanminus
sudo cpanm Parse::Yapp::Driver
cargo install cargo-deb
- name: Build (Linux)
if: matrix.kind == 'linux'
run: cargo build --release --features smb-vendored --target "$TARGET"
- name: Build deb (Linux)
if: matrix.kind == 'linux'
run: cargo deb --no-build --target "$TARGET" --features smb-vendored
# ---- macOS ----
- name: Install deps (macOS)
if: matrix.kind == 'macos'
run: |
brew update
brew install bison cpanminus cups flex gettext gmp gnutls icu4c jansson \
libarchive libbsd libunistring libgit2 libtirpc openldap pkg-config zlib
for p in bison cups flex gettext gmp gnutls icu4c jansson libarchive \
libbsd libgit2 libtirpc libunistring openldap zlib; do brew link --force "$p"; done
cpanm Parse::Yapp::Driver
- name: Build (macOS)
if: matrix.kind == 'macos'
run: cargo build --release $FEATURES --target "$TARGET"
# ---- Windows ----
- name: Build (Windows)
if: matrix.kind == 'windows'
run: cargo build --release --features smb-vendored --target "$env:TARGET"
# ---- Package posix (tar.gz) ----
- name: Package (posix)
if: matrix.kind != 'windows'
run: |
mkdir -p artifact
cp "target/$TARGET/release/termscp" artifact/termscp
tar -czf "artifact/termscp-v$VERSION-$TARGET.tar.gz" -C artifact termscp
shasum -a 256 "artifact/termscp-v$VERSION-$TARGET.tar.gz" | awk '{print $1}' > "artifact/$TARGET.sha256"
# ---- Package windows (zip) ----
- name: Package (windows)
if: matrix.kind == 'windows'
shell: pwsh
run: |
New-Item -ItemType Directory -Force artifact | Out-Null
Copy-Item "target/$env:TARGET/release/termscp.exe" artifact/termscp.exe
Compress-Archive -Path artifact/termscp.exe -DestinationPath "artifact/termscp-v$env:VERSION-$env:TARGET.zip"
(Get-FileHash "artifact/termscp-v$env:VERSION-$env:TARGET.zip" -Algorithm SHA256).Hash.ToLower() | Out-File -NoNewline "artifact/$env:TARGET.sha256"
- name: Move deb into artifact dir (Linux)
if: matrix.kind == 'linux'
run: cp target/"$TARGET"/debian/*.deb artifact/
- name: Upload build artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: build-${{ matrix.target }}
path: artifact/*
retention-days: 1
if-no-files-found: error
publish-homebrew:
needs: [prepare, build]
runs-on: ubuntu-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- name: Download build artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
pattern: build-*
path: dl
merge-multiple: true
- name: Checkout homebrew tap
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
repository: veeso/homebrew-termscp
token: ${{ secrets.RELEASE_PAT }}
path: tap
persist-credentials: true
- name: Rewrite formula
run: |
set -euo pipefail
cd "$GITHUB_WORKSPACE"
SHA_MAC_ARM=$(cat dl/aarch64-apple-darwin.sha256)
SHA_MAC_X64=$(cat dl/x86_64-apple-darwin.sha256)
SHA_LIN_ARM=$(cat dl/aarch64-unknown-linux-gnu.sha256)
SHA_LIN_X64=$(cat dl/x86_64-unknown-linux-gnu.sha256)
BASE="https://github.com/veeso/termscp/releases/latest/download"
cat > tap/Formula/termscp.rb <<EOF
class Termscp < Formula
desc "A feature rich terminal file transfer and explorer with support for SCP/SFTP/FTP/S3/Kube/SMB/WebDAV"
homepage "https://termscp.rs/"
license "MIT"
version "$VERSION"
on_macos do
depends_on "bison"
depends_on "cups"
depends_on "flex"
depends_on "gettext"
depends_on "gmp"
depends_on "gnutls"
depends_on "icu4c"
depends_on "jansson"
depends_on "libarchive"
depends_on "libbsd"
depends_on "libgit2"
depends_on "libtirpc"
depends_on "libunistring"
depends_on "openldap"
depends_on "zlib"
on_arm do
url "$BASE/termscp-v$VERSION-aarch64-apple-darwin.tar.gz"
sha256 "$SHA_MAC_ARM"
end
on_intel do
url "$BASE/termscp-v$VERSION-x86_64-apple-darwin.tar.gz"
sha256 "$SHA_MAC_X64"
end
end
on_linux do
depends_on "dbus"
on_arm do
url "$BASE/termscp-v$VERSION-aarch64-unknown-linux-gnu.tar.gz"
sha256 "$SHA_LIN_ARM"
end
on_intel do
url "$BASE/termscp-v$VERSION-x86_64-unknown-linux-gnu.tar.gz"
sha256 "$SHA_LIN_X64"
end
end
def install
bin.install "termscp"
end
end
EOF
- name: Show formula (dry run)
if: ${{ inputs.dry_run }}
run: cat tap/Formula/termscp.rb
- name: Commit & push formula
if: ${{ !inputs.dry_run }}
run: |
cd tap
git config user.name "veeso"
git config user.email "christian.visintin@veeso.dev"
git add Formula/termscp.rb
git commit -m "termscp $VERSION"
git push
release:
needs: [prepare, build]
runs-on: ubuntu-latest
permissions:
contents: write
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
token: ${{ secrets.RELEASE_PAT }}
ref: ${{ inputs.dry_run && github.sha || 'main' }}
persist-credentials: true
- name: Download build artifacts
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
pattern: build-*
path: dl
merge-multiple: true
- name: Download release notes
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: release-notes
path: notes
- name: Patch chocolatey checksums & pack
run: |
set -euo pipefail
SHA_WIN_X64=$(cat dl/x86_64-pc-windows-msvc.sha256)
SHA_WIN_ARM=$(cat dl/aarch64-pc-windows-msvc.sha256)
PS=dist/chocolatey/tools/chocolateyinstall.ps1
# arm checksum is the first $checksum line, x64 the second (matches file order)
SHA_WIN_ARM="$SHA_WIN_ARM" SHA_WIN_X64="$SHA_WIN_X64" \
perl -0pi -e 'BEGIN{our $n=0} s/(\$checksum\s*=\s*'"'"')[0-9a-f]*('"'"')/ $n++==0 ? "${1}$ENV{SHA_WIN_ARM}${2}" : "${1}$ENV{SHA_WIN_X64}${2}" /ge' "$PS"
docker run --rm -v "$PWD/dist/chocolatey:/work" -w /work \
chocolatey/choco:latest choco pack --output-directory /work
- name: Assemble release assets
run: |
mkdir -p out
cp dl/*.tar.gz dl/*.deb dl/*.zip out/ 2>/dev/null || true
cp dist/chocolatey/*.nupkg out/
- name: Upload assets artifact (dry run)
if: ${{ inputs.dry_run }}
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: release-assets-dryrun
path: out/*
retention-days: 3
- name: Create GitHub release
if: ${{ !inputs.dry_run }}
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
run: |
gh release create "v$VERSION" out/* \
--title "v$VERSION" \
--notes-file notes/RELEASE_NOTES.md
publish-crate:
needs: [prepare, release]
if: ${{ !inputs.dry_run }}
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
ref: main
persist-credentials: false
fetch-depth: 0
fetch-tags: true
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
- name: Install dependencies (Linux)
run: |
sudo apt-get update
sudo apt-get install -y \
make \
libgit2-dev \
build-essential \
pkg-config \
libbsd-dev \
libcap-dev \
libcups2-dev \
libgnutls28-dev \
libicu-dev \
libjansson-dev \
libkeyutils-dev \
libldap2-dev \
zlib1g-dev \
libpam0g-dev \
libacl1-dev \
libarchive-dev \
flex \
bison \
libntirpc-dev \
libtracker-sparql-3.0-dev \
libglib2.0-dev \
libdbus-1-dev \
libsasl2-dev \
libunistring-dev \
cpanminus
sudo cpanm Parse::Yapp::Driver
- name: Authenticate to crates.io
id: auth
uses: rust-lang/crates-io-auth-action@bbd81622f20ce9e2dd9622e3218b975523e45bbe # v1.0.4
- name: Publish to crates.io
env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
run: cargo publish --features smb-vendored
publish-choco:
needs: [prepare, release]
if: ${{ !inputs.dry_run }}
runs-on: windows-latest
env:
VERSION: ${{ needs.prepare.outputs.version }}
steps:
- name: Download nupkg from release
env:
GH_TOKEN: ${{ secrets.RELEASE_PAT }}
run: gh release download "v$env:VERSION" --repo veeso/termscp --pattern "*.nupkg"
- name: Push to Chocolatey
env:
CHOCO_API_KEY: ${{ secrets.CHOCO_API_KEY }}
run: |
choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/
choco push (Get-ChildItem *.nupkg).Name --source https://push.chocolatey.org/
+38
View File
@@ -0,0 +1,38 @@
name: Site
on:
pull_request:
branches: [main]
push:
branches: [main]
permissions:
contents: read
defaults:
run:
working-directory: site
jobs:
build-site:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
with:
persist-credentials: false
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 24
cache: npm
cache-dependency-path: site/package-lock.json
- name: Install dependencies
run: npm ci
- name: Format
run: npm run format:check
- name: Lint
run: npm run check
- name: Test
run: npm test --if-present
- name: Build
run: npm run build
+27
View File
@@ -0,0 +1,27 @@
name: Close inactive issues
on:
schedule:
- cron: "30 1 * * *"
permissions:
contents: read
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@a20b814fb01b71def3bd6f56e7494d667ddf28da # v4.1.1
with:
days-before-issue-stale: 30
days-before-issue-close: 7
stale-issue-label: "stale"
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
close-issue-message: "This issue was closed because it has been inactive for 7 days since being marked as stale."
days-before-pr-stale: -1
days-before-pr-close: -1
repo-token: ${{ secrets.GITHUB_TOKEN }}
exempt-issue-labels: "backlog"
exempt-all-milestones: true
-22
View File
@@ -1,22 +0,0 @@
name: Windows
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
runs-on: windows-2019
steps:
- uses: actions/checkout@v2
- name: Build
run: cargo build --verbose
- name: Run tests
run: cargo test --verbose
+19
View File
@@ -13,3 +13,22 @@
**/*.rs.bk
# End of https://www.gitignore.io/api/rust
# Distributions
*.rpm
*.deb
dist/pkgs/arch/*.tar.gz
# Macos
.DS_Store
dist/pkgs/
dist/build/macos/openssl/
.idea/
.claude/
# brainstorming visual companion
.superpowers/
docs/*/book/
+21
View File
@@ -0,0 +1,21 @@
{
// Markdown lint config for the termscp docs site (mdBook).
"config": {
// Line length is impractical for keyboard/style tables and long prose;
// mdBook reflows in the browser, so we don't enforce a hard wrap.
"MD013": false,
// Table column alignment can't be satisfied for CJK (zh-CN) content:
// markdownlint counts code points while CJK glyphs are double-width, so a
// visually aligned table never matches. Rendering is unaffected.
"MD060": false
},
"globs": ["docs/en-US/**/*.md", "docs/zh-CN/**/*.md"],
"ignores": [
// mdBook build output.
"**/book/**",
// SUMMARY.md uses multiple level-1 headings as mdBook part titles.
"**/SUMMARY.md",
// GitHub READMEs (not part of the book) keep centered HTML badges.
"**/README.md"
]
}
+857 -6
View File
@@ -1,12 +1,863 @@
# Changelog
## 1.1.0
- [Changelog](#changelog)
- [0.1.0](#010)
Released on 2026-06-08
---
### Added
- **site:** catppuccin theme tokens, tailwind 4, self-hosted font
- **site:** i18n string resolver with en fallback
- **site:** build-time man.md fetcher pinned to release ref
- **site:** base layout with og/hreflang, theme bootstrap, umami
- **site:** x-default hreflang, twitter card, og:image:alt; dedupe locales/site in base layout
- **site:** nav, footer, theme toggle, language picker
- **site:** responsive mobile nav, css-driven theme icons, localizePath helper
- **site:** landing page with dual-pane explorer hero
- **site:** install page led by install.sh script, package-manager tabs
- **site:** robots, sitemap reference, vercel redirects + cache headers
- **install:** add Windows PowerShell installer and copy buttons on site
> 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
- **config:** move config dir to ~/.config/termscp on macOS and %USERPROFILE%\.termscp on Windows
> 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.
### CI
- automated release workflow
> Single workflow_dispatch (version, dry_run) that bumps versions, regenerates
> CHANGELOG via git-cliff, rebuilds site CSS, builds all targets, creates the
> GitHub release, updates the Homebrew tap and publishes Chocolatey.
>
> - dist/release/bump_version.sh: version replacer across all tracked locations (+tests)
> - .github/workflows/release.yml: prepare -> build matrix -> homebrew/release -> choco
> - retire build-artifacts.yml (merged into release.yml)
> - Linux builds via cargo-zigbuild (old glibc) for broad compatibility
- pin all actions to verified SHAs and clear zizmor findings
> Pin every action to a commit SHA whose tag comment matches (verified via gh api),
> add least-privilege permissions, set persist-credentials: false, and replace the
> archived actions-rs/cargo with a plain cargo test. zizmor clean at default persona.
- fix release notes generation in release workflow
> prepare job failed: git-cliff --latest crashed with 'trim_start_matches on
> null' because the checkout was shallow (no tags/history) so no release existed.
>
> - checkout prepare with fetch-depth: 0 + fetch-tags so git-cliff sees full
> history and tags (also fixes an otherwise-truncated CHANGELOG)
> - generate release notes with --unreleased --tag v$VERSION instead of --latest:
> --latest selected the previous real tag (stale notes); --unreleased --tag
> renders the version being released
- remove pages workflow, fix release version-bump for astro site
- **site:** add format/lint/test/build workflow for astro site
> 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 github pages workflow for docs site
- unify os workflows into one
- **release:** publish to crates.io via OIDC trusted publishing
- rename ci workflow
- **site:** always run site
- **release:** fetch full git history and tags for build.rs
> 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.
### Changed
- **site:** type-safe i18n keys derived from en
- **site:** drop in-site manual, link to external docs.termscp.rs
- **site:** english-only, remove i18n machinery
### Documentation
- point READMEs to termscp.rs + install.sh, docs.termscp.rs
- replace last termscp.veeso.dev refs (install.sh manual/changelog, crate homepage)
- add shared mdbook assets and favicon.ico
- add mdbook language switcher script
- add CNAME for docs.termscp.rs
- scaffold en-US mdbook
- add en-US table of contents
- **en:** write introduction and getting-started pages
- **en:** write usage pages
- **en:** write configuration pages
- **en:** write cli reference and developer pages
- **en:** fix CLI references (no -t / --update flags; -b is a value option)
- add markdownlint config for docs site
- scaffold zh-CN mdbook
- **zh:** translate introduction and getting-started pages
- **zh:** translate section headings in getting-started pages
- **zh:** translate usage pages
- **zh:** translate configuration pages
- **zh:** translate cli reference and developer pages
- disable MD060 table alignment (incompatible with CJK width)
- drop extra language docs/READMEs, point manual links to docs.termscp.rs
- **zh:** align README with root README, drop dead language links
- fix update command (termscp update, not --update) in READMEs
- **zh:** fix keyring deep-link anchor to translated heading slug
- **config:** update config dir paths for macOS/Windows in en & zh
> 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.
### Fixed
- **site:** robust man-fetch invocation guard, add timeout+retry
- **site:** hero selected-row contrast (latte) + mobile row truncation
- **site:** drop @ts-check on astro config to clear false vite type error
- **install:** quote vars, fix set -e cargo check and rustup tmpfile cleanup
> - 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
- **progress:** rework transfer progress panel (#424)
> 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.
- **progress:** equalize dual progress bar heights
> 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.
- **copy:** prevent emptying file when copy destination is empty (#421)
> 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.
- **transfer:** enqueue full destination path instead of directory
> 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
- add chocolatey package, remove legacy dist build scripts
> The old manual dist/build/* scripts and dist/{deb,rpm}.sh are superseded by the
> automated release workflow. Add the chocolatey package consumed by release.yml.
- **site:** copy install.sh from repo root at build time (single source)
## 1.0.0
Released on 2026-04-18
### Added
- rework TransferProgress to track bytes with lazy estimation
- replace dual progress bar components with single TransferProgressBar
- simplify progress bar layout to single component
- update progress bar display for new unified data model
- update transfer loop to use unified TransferProgress
- consolidate theme progress bar fields into single transfer_progress_bar
### CI
- Codeberg mirroring
- run test workflows once
- check fmt with nightly toolchain
- add linux and windows aarch64 build targets
### Changed
- FileTransferActivity pane-agnostic dispatch (#386)
> Comprehensive design for incremental refactoring of the 13k-line
> FileTransferActivity god-struct using a unified Pane abstraction.
> Detailed step-by-step plan covering 6 phases: split monoliths,
> error handling, Pane struct, action dedup, session split, view reorg.
> Extract 26 popup components from the monolithic 1,868-line popups.rs
> into 20 individual files under popups/. Each file contains one or two
> related components with their own imports. The popups.rs module file
> now contains only module declarations and re-exports.
> Replace 8 panic!() calls with error!() logging and early returns/fallthrough.
> These panics documented invariants (e.g. "this tab can't do X") but would crash
> the app if somehow triggered. Error logging is safer and more resilient.
> Replace raw FileExplorer fields in Browser with Pane structs that bundle
> the explorer and connected state. Move host_bridge_connected and
> remote_connected from FileTransferActivity into the panes. Add navigation
> API (fs_pane, opposite_pane, is_find_tab) for future unification tasks.
> Rename private get_selected_file to get_selected_file_by_id and add three
> new unified methods (get_selected_entries, get_selected_file, is_selected_one)
> that dispatch based on self.browser.tab(). Old per-tab methods are kept for
> now until their callers are migrated in subsequent tasks.
> Collapse _local_/_remote_ action method pairs (mkdir, delete, symlink,
> chmod, rename, copy) into unified methods that branch internally on
> is_local_tab(). This halves the number of action methods and simplifies
> the update.rs dispatch logic. Also unifies ShowFileInfoPopup and
> ShowChmodPopup dispatching to use get_selected_entries().
> Move `host_bridge` and `client` filesystem fields from FileTransferActivity
> into the Pane struct, enabling tab-agnostic dispatch via `fs_pane()`/
> `fs_pane_mut()`. This eliminates most `is_local_tab()` branching across
> 15+ action files.
> Key changes:
> - Add `fs: Box<dyn HostBridge>` to Pane, remove from FileTransferActivity
> - Replace per-side method pairs with unified pane-dispatched methods
> - Unify navigation (changedir, reload, scan, file_exists, has_file_changed)
> - Replace 147-line popup if/else chain with data-driven priority table
> - Replace assert!/panic!/unreachable! with proper error handling
> - Fix typo "filetransfer_activiy" across ~29 files
> - Add unit tests for Pane
>
> Net result: -473 lines, single code path for most file operations.
- replace lazy_static with std::sync::LazyLock
- migrate from mod.rs to named module files
- split parser internals into focused modules
- split auth form components by protocol
- split auth update handlers by context
- split auth view helpers by responsibility
### Documentation
- date
- add core module and API documentation
- document core host and ssh modules
- document parser and file transfer params
- complete remaining core module docs
- document ssh key storage API
### Fixed
- replace panics reachable from user input with proper error handling
- replace assert! calls in UI activities with graceful error handling
- correct typos in BadSytax and theme_provider log messages
- replace magic-crypt with aes-gcm for bookmark encryption
> magic-crypt has known vulnerabilities. Replace it with aes-gcm for new
> encryption (authenticated, with random nonces) while keeping a legacy
> AES-128-CBC decryption path to transparently handle existing bookmarks.
- replace recursive byte-counting with entry-based transfer progress (#395)
> * fix: replace recursive byte-counting with entry-based transfer progress
>
> Replace the expensive recursive `get_total_transfer_size` pre-calculation
> with a lightweight entry-based counter (`TransferProgress`) for the
> overall progress bar. This avoids deep `list_dir` traversals before
> transfers begin, which could cause FTP idle-timeout disconnections on
> large directory trees.
>
> The per-file byte-level progress bar (`ProgressStates`) remains
> unchanged. Bytes are still tracked via `TransferStates::add_bytes` for
> notification threshold logic.
- return after empty terminal prompt
- resolve `.` and `..` in terminal `cd` and prevent panic in path elide
> `absolutize` now lexically normalizes paths so `cd ..` navigates to the
> parent directory instead of appending `..` literally. Also guard against
> `file_name()` returning `None` in `fmt_path_elide_ex`, which caused a
> panic on paths containing unresolved `..` components.
- pass full command string to exec, not just the first word
> The `Exec` arm of `Command::from_str` only captured the first
> whitespace-delimited token, silently dropping all arguments.
> Now passes the entire input string so e.g. `ls -la /tmp` works.
- sync browsing when entering a directory from filtered/fuzzy view
- stabilize core error handling
> Remove production panic and unwrap paths from core modules.
>
> Propagate bookmark encryption failures, harden file watcher and temp mapped file handling, and clean up dead code in shared utilities.
- normalize localhost relative path checks
- use time-based redraw interval instead of progress-delta threshold
> The old 1% progress threshold caused the UI to appear frozen on large
> files (e.g. 1GB) because many read/write iterations passed between
> redraws. Switching to a 100ms time-based interval ensures consistent
> UI responsiveness regardless of file size.
- render progress bar immediately after mounting
> Call self.view() right after mount_progress_bar() at all 6 call sites
> so the bar is visible on screen before the transfer loop begins.
- filter self-references and dot entries from remote directory listings
> Some non-compliant FTP servers (e.g. LiteSpeed) include a self-reference
> to the listed directory in the LIST response, causing the current folder
> to appear as a duplicate entry in the explorer.
### Performance
- use sort_by_cached_key to avoid repeated lowercase allocations in file sorting
### Testing
- add parser and bookmark regression coverage
- extend config and explorer regression coverage
- extend system regression coverage
### Build
- removed `hostname`, use `whoami` instead
> whoami provides `hostname` function, so we don't need the hostname dependency, since whoami is also being used for getting the username
- replaced libssh with russh for remotefs-ssh
- replace `version-compare` crate with `semver`
- remotefs-ssh 0.8.1
- remotefs-ssh 0.8.2
> this version removes any usage of sh commands from the sftp backend and only uses pure protocol functions
- migrate to tui-realm 4.0
> Upgrade tuirealm (3.x -> 4.0.0), tui-realm-stdlib (3 -> 4), tui-term
> (0.2 -> 0.3). Apply all breaking changes from the 4.0 migration guide
> across the termscp UI.
>
> Key changes:
>
> - Root-level re-exports removed; imports moved to module-qualified
> paths (`tuirealm::application`, `::component`, `::event`, `::props`,
> `::state`, `::subscription`, `::listener`, `::ratatui`). Same for
> stdlib component types (`tui_realm_stdlib::components::*`).
> - `MockComponent` trait renamed to `Component`; old `Component` trait
> renamed to `AppComponent`. `#[derive(MockComponent)]` is now
> `#[derive(Component)]`. `Component::on` now takes `&Event<_>`.
> - `TextSpan` replaced with `SpanStatic`/`LineStatic`/`TextStatic`
> (ratatui-based); tuple `(String, Alignment)` titles replaced with
> the new `Title` builder; `Alignment` split into
> `HorizontalAlignment`/`VerticalAlignment`; stdlib components use
> `.alignment_horizontal` instead of `.alignment`.
> - `State::One`/`PropPayload::One` -> `Single`. `CmdResult::None`
> -> `NoChange`. `Props::get_or` removed; `Props::get` now returns a
> borrowed `Option<&AttrValue>` (call sites switched to
> `.and_then(AttrValue::as_*)`). `Component::query` returns
> `Option<QueryResult<'a>>`.
> - `Attribute::HighlightedColor` -> `HighlightStyle` (a full `Style`).
> `.highlighted_*` helpers renamed to `.highlight_*`.
> - `PollStrategy::UpTo(n)` now requires a `Duration`; tick timeout moved
> from `EventListenerCfg::poll_timeout` into `PollStrategy`.
> - `TerminalBridge` removed; `Context` now holds
> `CrosstermTerminalAdapter` directly and enables raw mode + alternate
> screen explicitly. The `TerminalAdapter` trait is imported where its
> methods are used.
> - `Update` trait removed; activity `update` methods are plain inherent
> functions.
> - `ProgressBar` replaced by stdlib `Gauge`. Paragraph `.wrap` renamed
> to `.wrap_trim`; `.text` now takes an `Into<Text>`. Stdlib `List` row
> items are now individual lines (`Vec<Span>` per row) rather than a
> `Table` of spans; custom `FileList`/`Log` convert between the two
> models.
> - Radio builders drop `.foreground(color)` so unselected items render
> with the terminal default foreground, and set
> `highlight_style(Style::default().fg(color).add_modifier(REVERSED))`
> so the selected entry is visibly highlighted only with the theme
> color.
> - Custom `FileList` keeps the selected row highlighted with the full
> highlight style when focused and falls back to a foreground-only
> style when unfocused.
> - Theme loading is now backwards compatible: `Theme` uses a custom
> `Deserialize` through an intermediate `ThemeFile` with optional
> fields, so missing keys, unknown values or legacy aliases
> (`transfer_progress_bar_full`/`_partial`) fall back to defaults on a
> per-field basis instead of failing the whole load.
- upgrade remotefs-ssh to 0.8.3
### Style
- linter
## 0.19.1
Released on 2025-12-20
### CI
- windows artifact name
### Fixed
- install.sh deb name
- install.sh deb name
- Updated dependencies to allow build on NetBSD
## 0.19.0
Released on 2025-11-11
### Added
- Import bookmarks from ssh config with a CLI command (#364)
> * feat: Import bookmarks from ssh config with a CLI command
>
> Use import-ssh-hosts to import all the possible hosts by the configured ssh config or the default one on your machine
- Changed file overwrite behaviour (#366)
> Now the user can choose for each file whether to overwrite, skip or overwrite all/skip all.
- Added `<CTRL+S>` keybinding to get the total size of selected paths. (#367)
> * feat: Added `<CTRL+S>` keybinding to get the total size of selected paths.
- Merge branch '0.19.0'
### CI
- Build artifacts for Windows x86_64 and Ubuntu x86_64 (#368)
- Debian
- debian fix
- deploy site
### Documentation
- User manual and get started links
- Release date
### Fixed
- typo in file open error message (#349)
- SMB support for MacOS with vendored build of libsmbclient.
- Report a message while calculating total size of files to transfer. (#362)
> * fix: Report a message while calculating total size of files to transfer.
>
> Currently, in case of huge transfers the app may look frozen while calculating the transfer size. We should at least report to the user we are actually doing something.
- Issues with update checks (#363)
> Removed error popup message if failed to check for updates.
> Prevent long timeouts when checking for updates if the network is down or the DNS is not working.
### Performance
- Migrated to libssh.org on Linux and MacOS for better ssh agent support.
### Build
- 0.19 deps
- remotefs-ssh 0.7.1
> This version fixes compatibility with hosts which don't use bash/sh as the default shell.
## 0.18.0
Released on 2025-06-10
### Added
- **Updated dependencies** and updated the Rust edition to `2024`
- Replaced the `Exec` popup with a fully functional terminal emulator (#348)
> * feat: Replaced the `Exec` popup with a fully functional terminal emulator
- 0.18
### Fixed
- larger file info popup
- lock
### Style
- catppuccin themes
## 0.17.0
Released on 2025-03-23
### Added
- **cli:** added `--wno-keyring` flag to disable keyring
- 132 queuing transfers (#332)
> the logic of selecting files has been extended!
> From now on selecting file will put the files into a transfer queue, which is shown on the bottom panel.
> When a file is selected the file is added to the queue with a destination path, which is the **current other explorer path at the moment of selection.
> It is possible to navigate to the transfer queue by using `P` and pressing `ENTER` on a file will remove it from the transfer queue.Other commands will work as well on the transfer queue, like `COPY`, `MOVE`, `DELETE`, `RENAME`.
### CI
- **build:** build vendored smb and refactor platform deps (#333)
### Documentation
- **CONTRIBUTING:** docs(CONTRIBUTING): mistakes
- veeso.me instead of veeso.dev
- version
### Fixed
- unused import isolated tests
- isolated-tests for localhost
- clippy error
- **ui:** fixed input mask on host bridge on local dir up
> if you go up on local dir when localhost is selected it panics
- fixed a crash when the local directory specified in the auth form does not exist
- the return value of `--version` should be `0`
- **aws-s3:** updated remotefs-aws-s3 to 0.4.1
> should fix #329
- **log:** add suppaftp/pavao/kube to allowed logs
- **bookmarks:** Local directory path is not switching to what's specified in the bookmark
### Testing
- **remotefs_builder:** check result, build doesn't panic anymore
### Build
- **deps:** updated dependencies and edition to 2024
- bump to ssh2-config 0.4 and remotefs 0.6 to have support for Include in config files
- aws-s3 0.4.2
- build docker for x86
- so apparently native-tls vendored tries to build openssl on windows, wtf guys?
## 0.16.1
Released on 2024-11-12
### Fixed
- cfg unix forbidden in rust .82
- gg rust 1.82 for introducing a nice breaking change in config which was not mentioned in changelog
- 0.16.1
## 0.16.0
Released on 2024-10-14
### Added
- version 0.16
- Show `..` directory before all the others in the explorer to navigate to the parent dir (#301)
### Fixed
- Use `uzers` instead of the dead package `users` which has several vulnerabilities (#295)
- vergen (#296)
- users from lock
- tuirealm 2.x (#299)
- issue 292 New version alert was not displayed due to a semver regex issue. (#300)
- 0.16
- tiny ui issue
## 0.15.0
Released on 2024-10-03
### Added
- init 0.15
- Pods and container explorer for Kube protocol (#281)
- it is now possible to cancel find command; show find progress (#284)
### Fixed
- tokio rt builder
- dbus deveL
- bump vers
- keyring test not passing macos
- notify 6
- bump vers
- don't clear screen after terminating termscp
- issue 277 Fix a bug in the configuration page, which caused being stuck if the added SSH key was empty
- popup texts
- `isolated-tests` feature to run tests for releasing on distributions which run in isolated environments (#286)
> * fix: `isolated-tests` feature to run tests for releasing on distributions which run in isolated environments
>
> * fix: cond
- set date
- github ci is stable and reliable (one worker broken each 2 weeks)
- ci
- readme
- include build.rs
## 0.14.0
Released on 2024-07-17
### Added
- ALT+A to deselect all files (#263)
- ssh-agent (#264)
- issue 256 - filter files (#266)
- kube protocol support (#267)
- termscp 0.14
### Documentation
- update Arch Linux instructions (#243)
### Fixed
- install script version
- correct help text for update subcommand (#259)
- lint
- CLI remote args cannot handle '@' in the username (#261)
- sorted flags in readme
- Jump to next entry after select (#262)
- remotefs-ssh 0.3.1
- german manual
- removed support for RPM
- changelog
## 0.13.0
Released on 2024-03-02
### Added
- WebDAV support (#235)
- termscp 0.13.0
### Fixed
- AWS S3 wasn't working anymore due to rust-s3 outdate
- test
- debian script
- debian script
- lint???
## 0.12.2
Released on 2023-10-01
### Added
- tui-realm 1.9
### Fixed
- fmt
- panic if the terminal screen is too small
## 0.12.1
Released on 2023-07-06
### Added
- smb is now an optional feature (#200)
- build artifacts workflow (#202)
### Fix
- Some URL typos on 'install.sh' and 'README.md'. (#197)
### Fixed
- install workflow
- sh compliant macos.sh build script
- readme site links
- better main runner
- deps
- don't run CI on site/.md change
- rustup target
- don't update path breadcrumb if enter/scan dir failed (#203)
## 0.12.0
Released on 2023-05-16
### Added
- allow unknown fields in ssh2 configuration file (#181)
### Fixed
- #153 show a loading message when loading directory's content (#180)
- specify ssh2 config params
- release date
- build
- pavao 0.2.2
- pavao 0.2.3
- macos script
- release date
## 0.11.3
Released on 2023-04-19
### Added
- site improvements
### Fixed
- relative paths windows (#167)
## 0.11.2
Released on 2023-04-18
### Added
- dependencies up-to-date
- site 0.11.2
## 0.8.1
Released on 2022-03-22
### Fixed
- footer listed "Delete" shortcut as "Make Dir"
## 0.8.0
Released on 2022-01-06
### Arch
- install rust only if not found on local system
## 0.7.0
Released on 2021-10-12
### Option
- prompt user when about to replace an existing file caused by a file transfer
## 0.6.1
Released on 2021-08-30
### Fixed
- When copying files with tricky copy, the upper progress bar shows no text
## 0.5.1
Released on 2021-06-21
### Fix
- target_family unix means also macos and linux; use BSD target_os
## 0.5.0
Released on 2021-05-23
### Coverage
- githubActions
- githubActions
### Grcov
- exclude activities
## 0.4.1
Released on 2021-04-06
### FTP
- transfer type set to binary
- added support for symlinks for Linux servers
### Readme
- one-liner for Homebrew
> The one-liner command
>
> brew install veeso/termscp/termscp
>
> is equivalent to the two commands
>
> brew tap veeso/termscp
> brew install termscp
### SCP
- fixed symlink not properly detected
## 0.4.0
Released on 2021-03-27
### Clippy
- don't allow warnings
### Codecov
- ignore activities, context, input but not layout/
### PropsBuilder
- use from trait
### View
- return String instead of id
## 0.3.3
Released on 2021-02-28
### Git
- check for new updates (utils)
## 0.3.2
Released on 2021-01-24
### Testing
- don't run on windows
## 0.3.0
Released on 2021-01-10
### AuthActivity
- enter setup with <CTRL+C>
### ConfigClient
- return key path, not content
### Docs
- private keys with passwords
### Explorers
- append '/' to directories name
### FileTransferActivity
- load ConfigClient; set text editor to configuration's value
- :Explorer refactoring; toggle hidden files with <A>
- sort files with <B>
### FsEntry
- :get_name() returns &str
- :is_hidden() method
### SetupActivity
- <CTRL+E> as <DEL>
## 0.2.0
Released on 2020-12-21
### FsEntry
- :is_file
### Scp
- when username was not provided, it didn't fallback to current username
## 0.1.2
Released on 2020-12-13
### FsEntry
- :*::symlink is now a Option<Box<FsEntry>>; this improved symlinks, which gave errors some times
## 0.1.0
Released on 06/12/2020
Released on 2020-12-06
- First release
### FileTransferActivity
- ftp is now allowed
### Host
- :mkdir and Host::remove
- mkdir support for absolute path
### Scp
- use oneshot channels instead of ptys (more stable; more reliable and overall works)
### Std
- :fmt::Display for HostError
- :fmt::Display for HostError
+111
View File
@@ -0,0 +1,111 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
termscp is a terminal file transfer client with a TUI (Terminal User Interface), supporting SFTP, SCP, FTP/FTPS, Kube, S3, SMB, and WebDAV protocols. It features a dual-pane file explorer (local + remote), bookmarks, system keyring integration, file watching/sync, an embedded terminal, and customizable themes.
- **Language**: Rust (edition 2024, MSRV 1.89.0)
- **UI Framework**: tuirealm v3 (built on crossterm)
- **File Transfer**: remotefs ecosystem
## Build & Development Commands
```bash
# Build
cargo build
cargo build --release
cargo build --no-default-features # minimal build without SMB/keyring
# Test (CI-equivalent)
cargo test --no-default-features --features github-actions --no-fail-fast
# Run a single test
cargo test <test_name> -- --nocapture
# Run tests for a module
cargo test --lib filetransfer::
cargo test --lib config::params::tests
# Lint
cargo clippy -- -Dwarnings
# Format
cargo fmt --all -- --check # check only
cargo fmt --all # fix
```
### System Dependencies (for building)
- **Linux**: `libdbus-1-dev`, `libsmbclient-dev`
- **macOS**: `pkg-config`, `samba` (brew, with force link)
## Feature Flags
- **`smb`** (default): SMB/Samba protocol support
- **`keyring`** (default): System keyring integration for password storage
- **`smb-vendored`**: Vendored SMB library (for static builds)
- **`github-actions`**: CI flag — disables real keyring in tests, uses file-based storage
- **`isolated-tests`**: For parallel test isolation
## Architecture
### Application Lifecycle
```
main.rs → parse CLI args → ActivityManager::new() → ActivityManager::run()
Activity loop (draw → poll → update)
├── AuthActivity (login/bookmarks)
├── FileTransferActivity (dual-pane explorer)
└── SetupActivity (configuration)
```
`ActivityManager` owns a `Context` that is passed between activities. Each activity takes ownership of the Context on `on_create()` and returns it on `on_destroy()`.
### Key Modules
| Module | Path | Purpose |
|--------|------|---------|
| **activity_manager** | `src/activity_manager.rs` | Orchestrates activity lifecycle and transitions |
| **ui/activities** | `src/ui/activities/{auth,filetransfer,setup}/` | Three main screens, each implementing the `Activity` trait |
| **ui/context** | `src/ui/context.rs` | Shared `Context` struct (terminal, config, bookmarks, theme) |
| **filetransfer** | `src/filetransfer/` | Protocol enum, `RemoteFsBuilder`, connection parameters |
| **host** | `src/host/` | `HostBridge` trait — abstracts local (`Localhost`) and remote (`RemoteBridged`) file operations |
| **explorer** | `src/explorer/` | `FileExplorer` — directory navigation, sorting, filtering, transfer queue |
| **system** | `src/system/` | `BookmarksClient`, `ConfigClient`, `ThemeProvider`, `SshKeyStorage`, `KeyStorage` trait |
| **config** | `src/config/` | TOML-based serialization for themes, bookmarks, user params |
### Core Traits
- **`Activity`** (`src/ui/activities/mod.rs`): `on_create`, `on_draw`, `will_umount`, `on_destroy` — UI screen lifecycle
- **`HostBridge`** (`src/host/bridge.rs`): Unified file operations interface (connect, list_dir, open_file, mkdir, remove, rename, copy, etc.)
- **`KeyStorage`** (`src/system/keys/mod.rs`): `get_key`/`set_key` — password storage abstraction (keyring or encrypted file fallback)
### Conditional Compilation
The `build.rs` defines cfg aliases via `cfg_aliases`:
- `posix`, `macos`, `linux`, `win` — platform shortcuts
- `smb`, `smb_unix`, `smb_windows` — feature + platform combinations
Platform-specific dependencies: SSH and FTP crates use different TLS backends on Unix vs Windows. SMB support is completely gated behind the `smb` feature flag.
### File Transfer Protocols
`FileTransferProtocol` enum maps to protocol-specific parameter types (`ProtocolParams` enum) and `RemoteFsBuilder` constructs the appropriate `RemoteFs` client. Each protocol has its own params struct (e.g., `GenericProtocolParams` for SSH-based, `AwsS3Params`, `KubeProtocolParams`, `SmbParams`, `WebDAVProtocolParams`).
## Code Conventions
- **rustfmt**: `group_imports = "StdExternalCrate"`, `imports_granularity = "Module"`
- **Error handling**: Custom error types with `thiserror`, module-level Result aliases (e.g., `HostResult<T>`)
- **Builder pattern**: Used for `RemoteFsBuilder`, `HostBridgeBuilder`
- **Client pattern**: System services wrapped as clients (`BookmarksClient`, `ConfigClient`)
- **Tests**: Unit tests in `#[cfg(test)]` blocks within source files. Tests requiring serial execution use `#[serial]` from `serial_test`
- **Encryption**: Bookmark passwords encrypted with `magic-crypt`; keys stored in system keyring or encrypted file
## Other conventions
- Always run `cargo +nightly fmt --all` and `cargo clippy --no-default-features -- -Dwarnings` after modifying Rust code
- Always put plans to `./.claude/plans/`
- When changing behavior that is documented under `docs/` (paths, config keys, commands, flags, etc.), update BOTH `docs/en-US/` and `docs/zh-CN/` to keep the translations in sync
+104 -48
View File
@@ -2,75 +2,131 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
Examples of behavior that contributes to a positive environment for our
community include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
professional setting
## Our Responsibilities
## Enforcement Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at christian.visintin1997@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
reported to the community leaders responsible for enforcement at
[INSERT CONTACT METHOD].
All complaints will be reviewed and investigated promptly and fairly.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at <https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
<https://www.contributor-covenant.org/faq>
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
+125 -180
View File
@@ -1,15 +1,107 @@
# Contributing
Before contributing to this repository, please first discuss the change you wish to make via issue of this repository before making a change.
Please note we have a [code of conduct](./CODE_OF_CONDUCT.md), please follow it in all your interactions with the project.
Please note we have a [code of conduct](CODE_OF_CONDUCT.md). Please follow it in all your interactions with the project.
- [Contributing](#contributing)
- [Project mission](#project-mission)
- [Project goals](#project-goals)
- [Open an issue](#open-an-issue)
- [Questions](#questions)
- [Bug reports](#bug-reports)
- [Copy error](#copy-error)
- [Feature requests](#feature-requests)
- [Preferred contributions](#preferred-contributions)
- [Pull Request Process](#pull-request-process)
- [Software guidelines](#software-guidelines)
- [Developer contributions guide](#developer-contributions-guide)
- [How TermSCP works](#how-termscp-works)
- [Activities](#activities)
- [Implementing File Transfers](#implementing-file-transfers)
---
## Project mission
termscp was born because, as a terminal lover and Linux user, I wanted something like WinSCP on Linux and on terminal. At my previous job, I used SFTP/SCP practically everyday and that made me desire an application like termscp so much that eventually I started to work on it in my spare time.
I saw there was a very cool library to create terminal user interfaces (`tui-rs`, now `ratatui`), so I started to code it.
I wrote termscp as an experiment. I didn't design anything at the time. I just said,
> "Ok, there must be a FileTransfer trait somehow. I'll have more views, so I'll use something like Android activities, and there must be a module to interact with the local host."
And so in december 2020 I had the first version of termscp running and it worked, but was very simple, raw and minimal.
A lot of things have changed since them, both the features the project provides and my personal view of this project.
Today I don't see termscp as a WinSCP clone anymore. I've also thought about changing the name as the time passed by, but I liked it and it would be hard to change the name on the registries, etc.
Right now I see termscp as a **rich-featured file transfer client for terminals**. All I want is to provide all the features users need to use it correctly, I want it to be **safe and reliable** and eventually I want people to consider termscp **the first choice as a file transfer client**.
### Project goals
- Have support for all the most used file transfer protocol
- Provide all the features a file explorer requires
- Have a well designed application
- Make a reliable, safe and fast application
---
## Open an issue
Open an issue when:
- You have questions or concerns regarding the project or the application itself.
- You have a bug to report.
- You have a copy error to report. (Error in documentation; bad translation or sentence)
- You have a feature or a suggestion to improve termscp to submit.
### Questions
If you have a question open an issue using the `Question` template.
By default your question should already be labeled with the `question` label, if you need help with your installation, please also add the `help wanted` label.
Check the issue is always assigned to `veeso`.
### Bug reports
If you want to report an issue or a bug you've encountered while using termscp, open an issue using the `Bug report` template.
The `Bug` label should already be set and the issue should already be assigned to `veeso`.
Don't set other labels to your issue, not even priority.
When you open a bug try to be the most precise as possible in describing your issue. I'm not saying you should always be that precise, since sometimes it's very easy for maintainers to understand what you're talking about. Just try to be reasonable to understand sometimes we might not know what you're talking about or we just don't have the technical knowledge you might think.
Please always provide the environment you're working on and consider that we don't provide any support for older version of termscp, at least for those not classified as LTS (if we'll ever have them).
If you can, provide the log file or the snippet involving your issue. You can find in the [user manual](https://docs.termscp.rs/en-US/configuration/logging.html) the location of the log file. Please, if you can, enable the **debug mode**, before submitting the log, in order to provide us with a better overview of the problem.
Last but not least: the template I've written must be used. Full stop.
Maintainers will may add additional labels to your issue:
- **duplicate**: the issue is duplicated; the reference to the related issue will be added to your description. Your issue will be closed.
- **priority**: this must be fixed asap
- **sorcery**: it is not possible to find out what's causing your bug, nor is reproducible on our test environments.
- **wontfix**: your bug has a very high ratio between the difficulty to fix it and the probability to encounter it, or it just isn't a bug, but a feature.
### Copy error
If you want to report a copy error, create an issue using the `copy` template.
The `Documentation` label should already be set and the issue should already be assigned to `veeso`.
If you want to fix the copy by yourself you can fork the project and open a PR, otherwise I will fix it by myself.
The copy issue is accepted **also if you're not a C1/C2 speaker**, but a speaker of that level in case the language is different from Italian/English is preferred.
Please fullfil the form on the bottom of the template if you want.
### Feature requests
Whenever you have a good idea which chould improve the project, it is a good idea to submit it to the project owner.
The first thing you should do though, is not starting to write the code, but is to become concern about how termscp works, what kind
of contribution I appreciate and what kind of contribution I won't consider.
Said so, follow these steps:
- Read the contributing guidelines, entirely
- Think on whether your idea would fit in the project mission and guidelines or not
- Think about the impact your idea would have on the project
- Open an issue using the `feature request` template describing with accuracy your suggestion
- Wait for the maintainer feedback on your idea
It is very important to follow these steps, since it will prevent you from working on a feature that will be rejected and trust me, none of us wants to deal with this situation.
Always mind that your suggestion, may be rejected: I'll always provide a feedback on the reasons that brought me to reject your feature, just try not to get mad about that.
---
@@ -17,191 +109,44 @@ Please note we have a [code of conduct](./CODE_OF_CONDUCT.md), please follow it
At the moment, these kind of contributions are more appreciated and should be preferred:
- Fix for issues described in [Known Issues](./README.md#known-issues) or [issues reported by the community](https://github.com/ChristianVisintin/TermSCP/issues)
- New file transfers: for further details see [Implementing File Transfer](#implementing-file-transfers)
- Improvements to translators: any improvement to transliteration is accepted if makes sense, consider that my implementations could be not 100% correct (and probably they're not), indeed consider that I don't speak all these languages (tbh I only can speak Russian as a language with a different alphabet from latin - and I can't even speak it very well).
- Code optimizations: any optimization to the code is welcome
- Fix for issues described in [Known Issues](./README.md#known-issues-) or [issues reported by the community](https://github.com/veeso/termscp/issues)
- **New file transfers**: for further details see [Implementing File Transfer](#implementing-file-transfers). ⚠️ this is going to be deprecated SOON! We're moving the file transfers into another library. Please see [remotefs-rs](https://github.com/veeso/remotefs-rs).
- **Code optimizations**: any optimization to the code is welcome
- See also features described in [Upcoming features](./README.md##upcoming-features-). Open an issue first though.
- README/User manual **translations**: really appreciated atm. Please just add a folder into `docs/` with the language code. Language code with two characters is used in case the language is understandable by all the countries where this language is spoken (e.g. `it-CH`, `it-IT` are not really different, so I just created `it`, but there is a big difference from `zh-CN` and `zh-TW` for instance). Don't worry about flags in README, I will implement that part if it's too complicated.
For any other kind of contribution, especially for new features, please submit an issue first.
For any other kind of contribution, especially for new features, please submit a new issue first.
## Pull Request Process
Let's make it simple and clear:
1. Open an issue with an **appropriate label** (e.g. bug, enhancement, ...).
2. Write a **properly documentation** compliant with **rustdoc** standard.
3. Write tests for your code. This doesn't apply necessarily for implementation regarding the user-interface module (`ui`).
4. Report changes to the issue you opened, writing a report of what you changed and what you have introduced.
5. Update the `CHANGELOG.md` file with details of changes to the application.
6. Request maintainers to merge your changes.
1. Open a PR with an **appropriate label** (e.g. bug, enhancement, ...).
2. Write a **properly documentation** for your software compliant with **rustdoc** standard.
3. Write tests for your code. This doesn't apply necessarily for implementation regarding the user-interface module (`ui/activities`) and (if a test server is not available) for file transfers.
4. Check your code with `cargo clippy`.
5. Check if the CI for your commits reports three-green.
6. Report changes to the PR you opened, writing a report of what you changed and what you have introduced.
7. Update the `CHANGELOG.md` file with details of changes to the application. In changelog report changes under a chapter called `PR{PULL_REQUEST_NUMBER}` (e.g. PR12).
8. Assign a maintainer to the reviewers.
9. Wait for a maintainer to fullfil the acceptance tests
10. Wait for a maintainer to complete the acceptance tests
11. Request maintainers to merge your changes.
### Software guidelines
In addition to the process described for the PRs, I've also decided to introduce a list of guidelines to follow when writing the code, that should be followed:
1. **Let's stop the NPM apocalypse**: personally I'm against the abuse of dependencies we make in software projects and I think that NodeJS has opened the way to this drama (and has already gone too far). Nowadays nobody cares about adding hundreds of dependencies to their projects. Don't misunderstand me: I think that package managers are cool, but I'm totally against the abuse we're making of them. I think when we work on a project, we should try to use the minor quantity of dependencies as possible, especially because it's not hard to see how many libraries are getting abandoned right now, causing compatibility issues after a while. So please, when working on termscp, try not to add useless dependencies.
2. **No C-bindings**: personally I think that Rust still relies too much on C. And that's bad, really bad. Many libraries in Rust are just wrappers to C libraries, which is a huge problem, especially considering this is a multiplatform project. Everytime you add a C-binding to your project, you're forcing your users to install additional libraries to their systems. Sometimes these libraries are already installed on their systems (as happens for openssl in this case), but sometimes not. So if you really have to add a dependency to this project, please AVOID completely adding C-bounded libraries.
3. **Test units matter**: Whenever you implement something new to this project, always implement test units which cover the most cases as possible.
4. **Comments are useful**: Many people say that the code should be that simple to talk by itself about what it does, and comments should then be useless. I personally don't agree. I'm not saying they're wrong, but I'm just saying that this approach has, in my personal opinion, many aspects which are underrated:
1. What's obvious for me, might not be for the others.
2. Our capacity to work on a code depends mostly on **time and experience**, not on complexity: I'm not denying complexity matter, but the most decisive factor when working on code is the experience we've acquired working on it and the time we've spent. As the author of the project, I know the project like the back of my hands, but if I didn't work on it for a year, then I would probably have some problems in working on it again as the same speed as before. And do you know what's really time-saving in these cases? Comments.
## Developer contributions guide
Welcome to the contributions guide for TermSCP. This chapter DOESN'T contain the documentation for TermSCP, which can instead be found on Rust Docs at <https://docs.rs/termscp>
This chapter describes how TermSCP works and the guide lines to implement stuff such as file transfers and add features to the user interface.
### How TermSCP works
TermSCP is basically made up of 4 components:
- the **filetransfer**: the filetransfer takes care of managing the remote file system; it provides function to establish a connection with the remote, operating on the remote server file system (e.g. remove files, make directories, rename files, ...), read files and write files. The FileTransfer, as we'll see later, is actually a trait, and for each protocol a FileTransfer must be implement the trait.
- the **host**: the host module provides functions to interact with the local host file system.
- the **ui**: this module contains the implementation of the user interface, as we'll see in the next chapter, this is achieved through **activities**.
- the **activity_manager**: the activity manager takes care of managing activities, basically it runs the activities of the user interface, and chooses, based on their state, when is the moment to terminate the current activity and which activity to run after the current one.
#### Activities
Just a little paragraph about activities. Really, read the code and the documentation to have a clear idea of how the ui works.
I think there are many ways to implement a user interface; for termscp, I decided to go for a **Android-like** approach.
Android works with Activity, each activity represents a view and there is a context shared between them, and so it works here.
Just a little note about activities, activities work with a `Context`, the context is a data holder for different data, which are shared and common between the activities.
I've implemented a Trait called `Activity`, which, is a very very reduced version of the Android activity of course.
This trait provides only 3 methods:
- `on_create`: this method must initialize the activity; the context is passed to the activity, which will be the only owner of the Context, until the activity terminates.
- `on_draw`: this method must be called each time you want to perform an update of the user interface. This is basically the run method of the activity. This method also cares about handling input events. The developer shouldn't draw the interface on each call of this method (consider that this method might be called hundreds of times per second), but only when actually something has changed (for example after an input event has been raised).
- `on_destroy`: this method finalizes the activity and drops it; this method returns the Context to the caller (the activity manager).
---
### Implementing File Transfers
This chapter describes how to implement a file transfer in TermSCP. A file transfer is a module which implements the `FileTransfer` trait. The file transfer provides different modules to interact with a remote server, which in addition to the most obvious methods, used to download and upload files, provides also methods to list files, delete files, create directories etc.
In the following steps I will describe how to implement a new file transfer, in this case I will be implementing the SCP file transfer (which I'm actually implementing the moment I'm writing this lines).
1. Add the Scp protocol to the `FileTransferProtocol` enum.
Move to `src/filetransfer/mod.rs` and add `Scp` to the `FileTransferProtocol` enum
```rs
/// ## FileTransferProtocol
///
/// This enum defines the different transfer protocol available in TermSCP
#[derive(std::cmp::PartialEq, std::fmt::Debug, std::clone::Clone)]
pub enum FileTransferProtocol {
Sftp,
Ftp(bool), // Bool is for secure (true => ftps)
Scp, // <-- here
}
```
In this case Scp is a "plain" enum type. If you need particular options, follow the implementation of `Ftp` which uses a boolean flag for indicating if using FTPS or FTP.
2. Implement the FileTransfer struct
Create a file at `src/filetransfer/mytransfer.rs`
Declare your file transfer struct
```rs
/// ## ScpFileTransfer
///
/// SFTP file transfer structure
pub struct ScpFileTransfer {
session: Option<Session>,
sftp: Option<Sftp>,
wrkdir: PathBuf,
}
```
3. Implement the `FileTransfer` trait for it
You'll have to implement the following methods for your file transfer:
- connect: connect to remote server
- disconnect: disconnect from remote server
- is_connected: returns whether the file transfer is connected to remote
- pwd: get working directory
- change_dir: change working directory.
- list_dir: get files and directories at a certain path
- mkdir: make a new directory. Return an error in case the directory already exists
- remove: remove a file or a directory. In case the protocol doesn't support recursive removing of directories you MUST implement this through a recursive algorithm
- rename: rename a file or a directory
- stat: returns detail for a certain path
- send_file: opens a stream to a remote path for write purposes (write a remote file)
- recv_file: opens a stream to a remote path for read purposes (write a local file)
- on_sent: finalize a stream when writing a remote file. In case it's not necessary just return `Ok(())`
- on_recv: fianlize a stream when reading a remote file. In case it's not necessary just return `Ok(())`
In case the protocol you're working on doesn't support any of this features, just return `Err(FileTransferError::new(FileTransferErrorType::UnsupportedFeature))`
4. Add your transfer to filetransfers:
Move to `src/filetransfer/mod.rs` and declare your file transfer:
```rs
// Transfers
pub mod ftp_transfer;
pub mod scp_transfer; // <-- here
pub mod sftp_transfer;
```
5. Handle FileTransfer in `FileTransferActivity::new`
Move to `src/ui/activities/filetransfer_activity/mod.rs` and add the new protocol to the client match
```rs
client: match protocol {
FileTransferProtocol::Sftp => Box::new(SftpFileTransfer::new()),
FileTransferProtocol::Ftp(ftps) => Box::new(FtpFileTransfer::new(ftps)),
FileTransferProtocol::Scp => Box::new(ScpFileTransfer::new()), // <--- here
},
```
6. Handle right/left input events in `AuthActivity`:
Move to `src/ui/activities/auth_activity.rs` and handle the new protocol in `handle_input_event_mode_text` for `KeyCode::Left` and `KeyCode::Right`.
Consider that the order they "rotate" must match the way they will be drawned in the interface.
For newer protocols, please put them always at the end of the list. In this list I won't, because Scp is more important than Ftp imo.
```rs
KeyCode::Left => {
// If current field is Protocol handle event... (move element left)
if self.selected_field == InputField::Protocol {
self.protocol = match self.protocol {
FileTransferProtocol::Sftp => FileTransferProtocol::Ftp(true), // End of list (wrap)
FileTransferProtocol::Scp => FileTransferProtocol::Sftp,
FileTransferProtocol::Ftp(ftps) => match ftps {
false => FileTransferProtocol::Scp,
true => FileTransferProtocol::Ftp(false),
}
};
}
}
KeyCode::Right => {
// If current field is Protocol handle event... ( move element right )
if self.selected_field == InputField::Protocol {
self.protocol = match self.protocol {
FileTransferProtocol::Sftp => FileTransferProtocol::Scp,
FileTransferProtocol::Scp => FileTransferProtocol::Ftp(false),
FileTransferProtocol::Ftp(ftps) => match ftps {
false => FileTransferProtocol::Ftp(true),
true => FileTransferProtocol::Sftp, // End of list (wrap)
}
};
}
}
```
7. Add your new file transfer to the protocol input field
Move to `AuthActivity::draw_protocol_select` method.
Here add your new protocol to the `Spans` vector and to the match case, which chooses which element to highlight.
```rs
let protocols: Vec<Spans> = vec![Spans::from("SFTP"), Spans::from("SCP"), Spans::from("FTP"), Spans::from("FTPS")];
let index: usize = match self.protocol {
FileTransferProtocol::Sftp => 0,
FileTransferProtocol::Scp => 1,
FileTransferProtocol::Ftp(ftps) => match ftps {
false => 2,
true => 3,
}
};
```
You can view the developer guide [here](https://docs.termscp.rs/en-US/developer/developer.html).
---
Generated
+7483 -359
View File
File diff suppressed because it is too large Load Diff
+135 -40
View File
@@ -1,47 +1,17 @@
[package]
name = "termscp"
version = "0.1.0"
authors = ["Christian Visintin"]
edition = "2018"
license = "GPL-3.0"
keywords = ["scp-client", "sftp-client", "ftp-client", "winscp", "command-line-utility"]
version = "1.1.0"
edition = "2024"
authors = ["Christian Visintin <christian.visintin@veeso.dev>"]
description = "termscp is a feature rich terminal file transfer and explorer with support for SCP/SFTP/FTP/Kube/S3/WebDAV"
license = "MIT"
repository = "https://github.com/veeso/termscp"
categories = ["command-line-utilities"]
description = "TermSCP is a SCP/SFTP/FTPS client for command line with an integrated UI to explore the remote file system. Basically WinSCP on a terminal."
homepage = "https://github.com/ChristianVisintin/TermSCP"
repository = "https://github.com/ChristianVisintin/TermSCP"
documentation = "https://docs.rs/termscp"
homepage = "https://termscp.rs"
include = ["src/**/*", "build.rs", "LICENSE", "README.md", "CHANGELOG.md"]
keywords = ["terminal", "ftp", "scp", "sftp", "tui"]
readme = "README.md"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
crossterm = "0.18.2"
ftp4 = { version = "^4.0.0", features = ["secure"] }
getopts = "0.2.21"
ssh2 = "0.9.0"
tui = { version = "0.13.0", features = ["crossterm"], default-features = false }
whoami = "1.0.0"
rpassword = "5.0.0"
unicode-width = "0.1.7"
chrono = "0.4.19"
bytesize = "1.0.1"
textwrap = "0.12.1"
regex = "1.4.2"
lazy_static = "1.4.0"
hostname = "0.3.1"
[target.'cfg(any(unix, macos, linux))'.dependencies]
users = "0.11.0"
[dev-dependencies]
tempfile = "3"
#[patch.crates-io]
#ftp = { git = "https://github.com/ChristianVisintin/rust-ftp" }
[[bin]]
name = "termscp"
path = "src/main.rs"
rust-version = "1.89.0"
[package.metadata.rpm]
package = "termscp"
@@ -51,3 +21,128 @@ buildflags = ["--release"]
[package.metadata.rpm.targets]
termscp = { path = "/usr/bin/termscp" }
[package.metadata.deb]
maintainer = "Christian Visintin <christian.visintin@veeso.dev>"
copyright = "2025, Christian Visintin <christian.visintin@veeso.dev>"
extended-description-file = "docs/misc/README.deb.txt"
[features]
default = ["keyring", "smb"]
github-actions = []
isolated-tests = []
keyring = []
smb = ["dep:remotefs-smb"]
smb-vendored = ["remotefs-smb/vendored"]
[dependencies]
aes = "0.9"
aes-gcm = "0.10"
argh = "0.1"
base64 = "0.22"
bitflags = "2"
bytesize = "2"
cbc = { version = "0.2", features = ["alloc"] }
chrono = "0.4"
content_inspector = "0.2"
dirs = "6"
edit = "0.1"
filetime = "0.2"
keyring-core = "1"
lazy-regex = "3"
log = "0.4"
md-5 = "0.11"
notify = "8"
notify-rust = { version = "4", default-features = false, features = ["d"] }
nucleo = "0.5"
open = "5"
rand = "0.10"
regex = "1"
remotefs = "0.3"
remotefs-aws-s3 = "0.4"
remotefs-kube = "0.4"
remotefs-smb = { version = "0.3", optional = true }
remotefs-ssh = { version = "0.8", default-features = false, features = [
"russh",
] }
remotefs-webdav = "0.2"
rpassword = "7"
self_update = { version = "0.42", default-features = false, features = [
"archive-tar",
"archive-zip",
"compression-flate2",
"compression-zip-deflate",
"rustls",
] }
semver = "1"
serde = { version = "1", features = ["derive"] }
shellexpand = "3"
simplelog = "0.12"
ssh2-config = "0.7"
tempfile = "3"
thiserror = "2"
tokio = { version = "1", features = ["rt"] }
toml = "1"
tui-realm-stdlib = "4"
tui-term = "0.3"
tuirealm = "4"
unicode-width = "0.2"
whoami = "2"
wildmatch = "2"
[target."cfg(any(target_os = \"linux\", target_os = \"freebsd\"))".dependencies]
dbus-secret-service-keyring-store = { version = "1", features = [
"crypto-rust",
"vendored",
] }
[target."cfg(target_family = \"unix\")".dependencies]
remotefs-ftp = { version = "0.4", features = [
"native-tls",
"native-tls-vendored",
] }
uzers = "0.12"
[target."cfg(target_family = \"windows\")".dependencies]
remotefs-ftp = { version = "0.4", features = ["native-tls"] }
[target."cfg(target_os = \"macos\")".dependencies]
apple-native-keyring-store = { version = "1", features = ["keychain"] }
[target."cfg(target_os = \"windows\")".dependencies]
windows-native-keyring-store = "1"
[dev-dependencies]
pretty_assertions = "1"
serial_test = "3"
[build-dependencies]
cfg_aliases = "0.2"
vergen-git2 = { version = "10", features = ["build", "cargo", "rustc", "si"] }
[[bin]]
name = "termscp"
path = "src/main.rs"
[lints.rust]
trivial_numeric_casts = "warn"
unsafe_op_in_unsafe_fn = "warn"
unused_lifetimes = "warn"
[lints.clippy]
complexity = { level = "warn", priority = -1 }
correctness = { level = "warn", priority = -1 }
cloned_instead_of_copied = "warn"
implicit_clone = "warn"
manual_string_new = "warn"
perf = { level = "warn", priority = -1 }
redundant_closure_for_method_calls = "warn"
style = { level = "warn", priority = -1 }
suspicious = { level = "warn", priority = -1 }
unnested_or_patterns = "warn"
[profile.dev]
incremental = true
[profile.release]
strip = true
+21 -674
View File
@@ -1,674 +1,21 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
TermSCP
Copyright (C) 2020 Christian Visintin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
TermSCP Copyright (C) 2020 Christian Visintin
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
MIT License
Copyright (c) 2020-2022 Christian Visintin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+136 -185
View File
@@ -1,269 +1,220 @@
# TermSCP
# termscp
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Stars](https://img.shields.io/github/stars/ChristianVisintin/TermSCP.svg)](https://github.com/ChristianVisintin/TermSCP) [![Issues](https://img.shields.io/github/issues/ChristianVisintin/TermSCP.svg)](https://github.com/ChristianVisintin/TermSCP/issues) [![Downloads](https://img.shields.io/crates/d/termscp.svg)](https://crates.io/crates/termscp) [![Crates.io](https://img.shields.io/badge/crates.io-v0.1.0-orange.svg)](https://crates.io/crates/termscp) [![Docs](https://docs.rs/termscp/badge.svg)](https://docs.rs/termscp)
<p align="center">
<img src="/assets/images/termscp.svg" alt="termscp logo" width="256" height="256" />
</p>
[![Build](https://github.com/ChristianVisintin/TermSCP/workflows/Linux/badge.svg)](https://github.com/ChristianVisintin/TermSCP/actions) [![Build](https://github.com/ChristianVisintin/TermSCP/workflows/MacOS/badge.svg)](https://github.com/ChristianVisintin/TermSCP/actions) [![Build](https://github.com/ChristianVisintin/TermSCP/workflows/Windows/badge.svg)](https://github.com/ChristianVisintin/TermSCP/actions)
<p align="center">~ A feature rich terminal file transfer ~</p>
<p align="center">
<a href="https://termscp.rs" target="_blank">Website</a>
·
<a href="https://termscp.rs/install" target="_blank">Installation</a>
·
<a href="https://docs.termscp.rs" target="_blank">User manual</a>
</p>
~ Basically, WinSCP on a terminal ~
Developed by Christian Visintin
Current version: 0.1.0 (06/12/2020)
<p align="center">
<a
href="/docs/zh-CN/README.md"
><img
height="20"
src="/assets/images/flags/cn.png"
alt="简体中文"
/></a>
</p>
<p align="center">Developed by <a href="https://veeso.me/" target="_blank">@veeso</a></p>
[![License-MIT](https://img.shields.io/crates/l/termscp.svg?logo=rust)](https://opensource.org/licenses/MIT)
[![Repostars](https://img.shields.io/github/stars/veeso/termscp?style=flat&logo=github)](https://github.com/veeso/termscp/stargazers)
[![Downloadscounter](https://img.shields.io/crates/d/termscp.svg?logo=rust)](https://crates.io/crates/termscp)
[![Latest version](https://img.shields.io/crates/v/termscp.svg?logo=rust)](https://crates.io/crates/termscp)
[![CI](https://github.com/veeso/termscp/workflows/CI/badge.svg?logo=github)](https://github.com/veeso/termscp/actions/workflows/ci.yml)
---
- [TermSCP](#termscp)
- [About TermSCP 🖥](#about-termscp-)
- [Why TermSCP 🤔](#why-termscp-)
- [Features 🎁](#features-)
- [Installation ▶](#installation-)
- [Cargo 🦀](#cargo-)
- [Deb package 📦](#deb-package-)
- [RPM Package 📦](#rpm-package-)
- [Chocolatey 🍫](#chocolatey-)
- [Brew 🍻](#brew-)
- [Usage ❓](#usage-)
- [Address argument](#address-argument)
- [How Password can be provided](#how-password-can-be-provided)
- [Keybindings ⌨](#keybindings-)
- [Documentation 📚](#documentation-)
- [Known issues 🧻](#known-issues-)
- [Upcoming Features 🧪](#upcoming-features-)
- [Contributions 🤙🏻](#contributions-)
- [Changelog ⏳](#changelog-)
- [Powered by 🚀](#powered-by-)
- [Gallery 🎬](#gallery-)
- [License 📃](#license-)
## About termscp 🖥
---
## About TermSCP 🖥
TermSCP is basically a porting of WinSCP to terminal. So basically is a terminal utility with an TUI to connect to a remote server to retrieve and upload files and to interact with the local file system. It works both on **Linux**, **MacOS**, **UNIX** and **Windows** and supports SFTP, SCP, FTP and FTPS.
Termscp is a feature rich terminal file transfer and explorer, with support for SCP/SFTP/FTP/Kube/S3/WebDAV. So basically is a terminal utility with an TUI to connect to a remote server to retrieve and upload files and to interact with the local file system. It is **Linux**, **MacOS**, **FreeBSD**, **NetBSD** and **Windows** compatible.
![Explorer](assets/images/explorer.gif)
---
### Why TermSCP 🤔
It happens very often to me, when using SCP at work to forget the path of a file on a remote machine, which forces me then to connect through SSH, gather the file path and finally download it through SCP. I could use WinSCP, but I use Linux and I pratically use the terminal for everything, so I wanted something like WinSCP on my terminal. Yeah, I know there midnight commander too, but actually I don't like it very much tbh (and doesn't support scp).
## Features 🎁
- Different communication protocols
- SFTP
- SCP
- FTP and FTPS
- Practical user interface to explore and operate on the remote and on the local machine file system
- Compatible with Windows, Linux, UNIX and MacOS
- Written in Rust
- Easy to extend with new file transfers protocols
- 📁 Different communication protocols
- **SFTP**
- **SCP**
- **FTP** and **FTPS**
- **Kube**
- **S3**
- **SMB**
- **WebDAV**
- 🖥 Explore and operate on the remote and on the local machine file system with a handy UI
- Create, remove, rename, search, view and edit files
- ⭐ Connect to your favourite hosts through built-in bookmarks and recent connections
- 📝 View and edit files with your favourite applications
- 💁 SFTP/SCP authentication with SSH keys and username/password
- 🐧 Compatible with Windows, Linux, FreeBSD, NetBSD and MacOS
- 🐚 Embedded terminal for executing commands on the system.
- 🎨 Make it yours!
- Themes
- Custom file explorer format
- Customizable text editor
- Customizable file sorting
- and many other parameters...
- 📫 Get notified via Desktop Notifications when a large file has been transferred
- 🔭 Keep file changes synchronized with the remote host
- 🔐 Save your password in your operating system key vault
- 🦀 Rust-powered
- 👀 Developed keeping an eye on performance
- 🦄 Frequent awesome updates
---
## Installation ▶
## Get started 🚀
If you're considering to install TermSCP I want to thank you 💛 ! I hope you will enjoy TermSCP!
If you want to contribute to this project, don't forget to check out our contribute guide. [Read More](CONTRIBUTING.md)
If you're considering to install termscp I want to thank you 💜 ! I hope you will enjoy termscp!
If you want to contribute to this project, don't forget to check out our [contribute guide](CONTRIBUTING.md).
### Cargo 🦀
If you are a Linux, a FreeBSD or a MacOS user this simple shell script will install termscp on your system with a single command:
```sh
# Install termscp through cargo
cargo install termscp
curl --proto '=https' --tlsv1.2 -sSLf https://termscp.rs/install.sh | sh
```
### Deb package 📦
> ❗ MacOs installation requires [Homebrew](https://brew.sh/), otherwise the Rust compiler will be installed
Get `deb` package from [HERE](https://github.com/ChristianVisintin/TermSCP/releases/download/latest/termscp_0.1.0_amd64.deb)
or run `wget https://github.com/ChristianVisintin/TermSCP/releases/download/latest/termscp_0.1.0_amd64.deb`
if you're a Windows user, you can install termscp from PowerShell with a single command:
then install through dpkg:
```sh
dpkg -i termscp_*.deb
# Or even better with gdebi
gdebi termscp_*.deb
```ps
irm https://termscp.rs/install.ps1 | iex
```
### RPM Package 📦
Get `rpm` package from [HERE](https://github.com/ChristianVisintin/TermSCP/releases/download/latest/termscp-0.1.0-1.x86_64.rpm)
or run `wget https://github.com/ChristianVisintin/TermSCP/releases/download/latest/termscp-0.1.0-1.x86_64.rpm`
then install through rpm:
```sh
rpm -U termscp_*.rpm
```
### Chocolatey 🍫
You can install TermSCP on Windows using [chocolatey](https://chocolatey.org/)
Start PowerShell as administrator and run
or, alternatively, with [Chocolatey](https://chocolatey.org/):
```ps
choco install termscp
```
Alternatively you can download the ZIP file from [HERE](https://github.com/ChristianVisintin/TermSCP/releases/download/latest/termscp.0.1.0.nupkg)
and then with PowerShell started with administrator previleges, run:
```ps
choco install termscp -s .
```
### Brew 🍻
You can install TermSCP on MacOS using [brew](https://brew.sh/)
From your terminal run
NetBSD users can install termscp from the official repositories.
```sh
brew tap ChristianVisintin/termscp
brew install termscp
pkgin install termscp
```
---
Arch Linux users can install termscp from the official repositories.
## Usage ❓
TermSCP can be started with the following options:
- `-P, --password <password>` if address is provided, password will be this argument
- `-v, --version` Print version info
- `-h, --help` Print help page
TermSCP can be started in two different mode, if no extra arguments is provided, TermSCP will show the authentication form, where the user will be able to provide the parameters required to connect to the remote peer.
Alternatively, the user can provide an address as argument to skip the authentication form and starting directly the connection to the remote server.
### Address argument
The address argument has the following syntax:
```txt
[protocol]://[username@]<address>[:port]
```sh
pacman -S termscp
```
Let's see some example of this particular syntax, since it's very comfortable and you'll probably going to use this instead of the other one...
For more information or other platforms, please visit [termscp.rs](https://termscp.rs/install) to view all installation methods.
- Connect using default protocol (sftp) to 192.168.1.31, port is default for this protocol (22); username is current user's name
⚠️ If you're looking on how to update termscp just run termscp from CLI with: `(sudo) termscp update` ⚠️
```sh
termscp 192.168.1.31
```
### Requirements ❗
- Connect using default protocol (sftp) to 192.168.1.31, port is default for this protocol (22); username is `root`
- **Linux** users:
- libdbus-1
- pkg-config
- libsmbclient
- **FreeBSD** or, **NetBSD** users:
- dbus
- pkgconf
- libsmbclient
```sh
termscp root@192.168.1.31
```
### Optional Requirements ✔️
- Connect using scp to 192.168.1.31, port is 4022; username is `omar`
These requirements are not forced required to run termscp, but to enjoy all of its features
```sh
termscp scp://omar@192.168.1.31:4022
```
#### How Password can be provided
You have probably noticed, that, when providing the address as argument, there's no way to provide the password.
Password can be basically provided through 3 ways when address argument is provided:
- `-P, --password` option: just use this CLI option providing the password. I strongly unrecommend this method, since it's very unsecure (since you might keep the password in the shell history)
- Via `sshpass`: you can provide password via `sshpass`, e.g. `sshpass -f ~/.ssh/topsecret.key termscp cvisintin@192.168.1.31`
- You will be prompted for it: if you don't use any of the previous methods, you will be prompted for the password, as happens with the more classics tools such as `scp`, `ssh`, etc.
- **Linux/FreeBSD** users:
- To **open** files via `V` (at least one of these)
- *xdg-open*
- *gio*
- *gnome-open*
- *kde-open*
- **Linux** users:
- A keyring manager: read more in the [User manual](https://docs.termscp.rs/en-US/configuration/password-security.html#linux-keyring)
- **WSL** users
- To **open** files via `V` (at least one of these)
- [wslu](https://github.com/wslutilities/wslu)
---
## Keybindings ⌨
## User manual 📚
| Key | Command |
|---------------|-------------------------------------------------------|
| `<ESC>` | Disconnect from remote; return to authentication page |
| `<TAB>` | Switch between log tab and explorer |
| `<BACKSPACE>` | Go to previous directory in stack |
| `<RIGHT>` | Move to remote explorer tab |
| `<LEFT>` | Move to local explorer tab |
| `<UP>` | Move up in selected list |
| `<DOWN>` | Move down in selected list |
| `<PGUP>` | Move up in selected list by 8 rows |
| `<PGDOWN>` | Move down in selected list by 8 rows |
| `<ENTER>` | Enter directory |
| `<SPACE>` | Upload / download selected file |
| `<CTRL+D>` | Make directory |
| `<CTRL+G>` | Go to supplied path |
| `<CTRL+H>` | Show help |
| `<CTRL+Q>` | Quit TermSCP |
| `<CTRL+R>` | Rename file |
| `<CTRL+U>` | Go to parent directory |
| `<CANC>` | Delete file |
---
## Documentation 📚
The developer documentation can be found on Rust Docs at <https://docs.rs/termscp>
---
## Known issues 🧻
- Ftp:
- Time in explorer is `1 Jan 1970`, but shouldn't be: that's because chrono can't parse date in a different locale. So if your server has a locale different from the one on your machine, it won't be able to parse the date.
- Some servers don't work: yes, some kind of ftp server don't work correctly, sometimes it won't display any files in the directories, some other times uploading files will fail. Up to date, `vsftpd` is the only one server which I saw working correctly with TermSCP. Am I going to solve this? I'd like to, but it's not my fault at all. Unfortunately [rust-ftp](https://github.com/mattnenterprise/rust-ftp) is an abandoned project (up to 2020), indeed I had to patch many stuff by myself. I'll try to solve these issues, but it will take a long time.
- Sftp:
- sftp is much slower than scp: Okay this is an annoying issue, and again: not my fault. It seems there is an issue with [ssh2-rs](https://github.com/alexcrichton/ssh2-rs) library. If you want to stay up to date with the status of this issue, subscribe to [this issue](https://github.com/alexcrichton/ssh2-rs/issues/206)
- `NoSuchFileOrDirectory` on connect: let me guess, you're running on WSL and you've installed termscp through cargo. I know about this issue and it's a glitch of WSL I guess. Don't worry about it, just move the termscp executable into another PATH location, such as `/usr/bin`.
The user manual can be found on [termscp's documentation website](https://docs.termscp.rs).
---
## Upcoming Features 🧪
- **File viewer**: possibility to show in a popup the file content from the explorer.
See [Milestones](https://github.com/veeso/termscp/milestones)
---
## Contributions 🤙🏻
## Contributing and issues 🤝🏻
Contributions are welcome! 😉
Contributions, bug reports, new features and questions are welcome! 😉
If you have any question or concern, or you want to suggest a new feature, or you want just want to improve termscp, feel free to open an issue or a PR.
If you think you can contribute to TermSCP, please follow [TermSCP's contributions guide](CONTRIBUTING.md)
An **appreciated** contribution would be a translation of the user manual and readme in **other languages**
Please follow [our contributing guidelines](CONTRIBUTING.md)
---
## Changelog ⏳
View TermSCP's changelog [HERE](CHANGELOG.md)
View termscp's changelog [HERE](CHANGELOG.md)
---
## Powered by 🚀
## Powered by 💪
TermSCP is powered by these aweseome projects:
termscp is powered by these awesome projects:
- [bytesize](https://github.com/hyunsik/bytesize)
- [crossterm](https://github.com/crossterm-rs/crossterm)
- [edit](https://github.com/milkey-mouse/edit)
- [keyring-rs](https://github.com/hwchen/keyring-rs)
- [kube](https://github.com/kube-rs/kube)
- [open-rs](https://github.com/Byron/open-rs)
- [pavao](https://github.com/veeso/pavao)
- [remotefs](https://github.com/veeso/remotefs-rs)
- [rpassword](https://github.com/conradkleinespel/rpassword)
- [ssh2-rs](https://github.com/alexcrichton/ssh2-rs)
- [textwrap](https://github.com/mgeisler/textwrap)
- [tui-rs](https://github.com/fdehau/tui-rs)
- [self_update](https://github.com/jaemk/self_update)
- [ratatui](https://github.com/ratatui-org/ratatui)
- [tui-realm](https://github.com/veeso/tui-realm)
- [whoami](https://github.com/libcala/whoami)
- [wildmatch](https://github.com/becheran/wildmatch)
---
## Gallery 🎬
> Termscp Home
![Auth](assets/images/auth.gif)
> Bookmarks
![Bookmarks](assets/images/bookmarks.gif)
> Setup
![Setup](assets/images/config.gif)
> Text editor
![TextEditor](assets/images/text-editor.gif)
---
## License 📃
Licensed under the GNU GPLv3 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
<http://www.gnu.org/licenses/gpl-3.0.txt>
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
termscp is licensed under the MIT license.
You can read the entire license [HERE](LICENSE)
+10
View File
@@ -0,0 +1,10 @@
# Security Policy
## Supported Versions
Only latst version of termscp has the latest security updates.
Because of that, **you should always consider updating termscp to the latest version**.
## Reporting a Vulnerability
If you have any security vulnerability or concern to report, please open an issue using the `Security report` template.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 632 KiB

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1002 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><circle style="fill:#31363b" cx="250" cy="250" r="250"/><circle style="fill:#ea4444" cx="225" cy="40" r="7.344"/><circle style="fill:#eac944" cx="58.177" cy="22.745" r="7.344" transform="matrix(1, 0, 0, 1.031863, 191.822998, 16.530386)"/><circle style="fill:#34b938" cx="57.564" cy="22.269" r="7.344" transform="matrix(1, 0, 0, 1.031863, 217.43605, 17.021263)"/><polygon style="stroke:#000;fill:#f0f0f0" points="83.462 135.575 200 252.112 87.687 364.425 48.108 324.846 122.07 250.881 45.738 174.55"/><g transform="matrix(0.408921, 0, 0, 0.408921, 241.338654, 169.687912)"><polygon style="fill:#f0f0f0" points="196.4 0 292 49.2 388 98 292 147.2 196.4 196.4 100.8 147.2 4.8 98 100.8 49.2"/><polygon style="fill:#31363b" points="316 179.6 316 135.2 268 159.6 268 204 294.4 171.6"/><polygon style="fill:#f0f0f0" points="196.4 196.4 196.4 392.8 388 294.8 388 98 316 135.2 314.4 136 314.4 179.2 294.4 171.6 268 204 268 159.6"/><polygon style="fill:#f0f0f0" points="196.4 392.8 196.4 196.4 100.8 147.2 4.8 98 4.8 294.8"/><polygon style="fill:#31363b" points="76.8 61.2 268 159.6 314.4 136 316 135.2 124.8 36.8 100.8 49.2"/></g><rect style="fill:#f0f0f0" width="200" height="35.702" x="222.229" y="364.298" rx="10" ry="10"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

+33
View File
@@ -0,0 +1,33 @@
use cfg_aliases::cfg_aliases;
use vergen_git2::{Build, Cargo, Emitter, Git2, Rustc, Sysinfo};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Setup cfg aliases
cfg_aliases! {
// Platforms
macos: { target_os = "macos" },
linux: { target_os = "linux" },
posix: { target_family = "unix" },
win: { target_family = "windows" },
// exclusive features
smb: { feature = "smb" },
smb_unix: { all(unix, feature = "smb") },
smb_windows: { all(windows, feature = "smb") }
}
let build = Build::all_build();
let cargo = Cargo::all_cargo();
let git2 = Git2::all_git();
let rustc = Rustc::all_rustc();
let si = Sysinfo::all_sysinfo();
Emitter::default()
.add_instructions(&build)?
.add_instructions(&cargo)?
.add_instructions(&git2)?
.add_instructions(&rustc)?
.add_instructions(&si)?
.emit()?;
Ok(())
}
+46
View File
@@ -0,0 +1,46 @@
[changelog]
body = """
## {{ version | trim_start_matches(pat="v") }}
Released on {{ timestamp | date(format="%Y-%m-%d") }}
{%- if commits | filter(attribute="breaking", value=true) | length > 0 %}
### ⚠ Breaking Changes
{%- for commit in commits | filter(attribute="breaking", value=true) %}
- {% if commit.scope %}**{{ commit.scope }}:** {% endif %}{{ commit.message | split(pat="\n") | first | trim }}
{%- if commit.breaking_description %}
> {{ commit.breaking_description }}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- for group, commits in commits | group_by(attribute="group") %}
### {{ group | upper_first }}
{% for commit in commits %}
- {% if commit.breaking %}💥 {% endif %}{% if commit.scope %}**{{ commit.scope }}:** {% endif %}{{ commit.message | split(pat="\n") | first | trim }}
{%- if commit.body %}
> {{ commit.body | split(pat="\n") | join(sep="\n > ") }}
{%- endif %}
{%- endfor %}
{%- endfor %}
"""
trim = false
[git]
conventional_commits = true
filter_unconventional = true
split_commits = false
commit_parsers = [
{ message = "^feat", group = "Added" },
{ message = "^fix", group = "Fixed" },
{ message = "^refactor", group = "Changed" },
{ message = "^perf", group = "Performance" },
{ message = "^doc", group = "Documentation" },
{ message = "^test", group = "Testing" },
{ message = "^ci", group = "CI" },
{ message = "^chore", skip = true },
]
filter_commits = false
tag_pattern = "v[0-9].*"
sort_commits = "oldest"
+8
View File
@@ -0,0 +1,8 @@
# Chocolatey How To
Just:
1. Calculate the SHA256 checksum for the latest release of ZIP files both for aarch64 and x86_64 versions.
2. Update checksums in `tools/chocolateyinstall.ps1`
3. run `choco pack`
4. run `choco push termscp.$VERSION.nupkg --source https://push.chocolatey.org/`
+58
View File
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
<metadata>
<id>termscp</id>
<version>1.1.0</version>
<title>termSCP</title>
<authors>Christian Visintin</authors>
<owners>Christian Visintin</owners>
<projectUrl>https://veeso.github.io/termscp/</projectUrl>
<copyright>Christian Visintin (C) 2024</copyright>
<licenseUrl>https://github.com/veeso/TermSCP/blob/main/LICENSE</licenseUrl>
<iconUrl>https://rawcdn.githack.com/veeso/termscp/c3e5663cf45c4d6a7b50c8b15f89683a2e01b829/assets/images/termscp-512.png</iconUrl>
<requireLicenseAcceptance>true</requireLicenseAcceptance>
<projectSourceUrl>https://github.com/veeso/termscp/tree/main/src</projectSourceUrl>
<packageSourceUrl>https://github.com/veeso/termscp</packageSourceUrl>
<releaseNotes>https://github.com/veeso/termscp/blob/main/CHANGELOG.md</releaseNotes>
<docsUrl>https://docs.rs/termscp</docsUrl>
<bugTrackerUrl>https://github.com/veeso/termscp/issues</bugTrackerUrl>
<tags>termscp winscp rust rust-lang rust-crate scp ssh-client ssh sftp-client ftp-client ftps utility terminal-app terminal command-line-utility command-line-tool tui-rs winscp sftp</tags>
<summary>A feature rich terminal UI file transfer and explorer with support for SCP/SFTP/FTP/Kube/WebDAV/S3</summary>
<description>
## About TermSCP
Termscp is a feature rich terminal file transfer and explorer, with support for SCP/SFTP/FTP/S3. So basically is a terminal utility with an TUI to connect to a remote server to retrieve and upload files and to interact with the local file system. It is **Linux**, **MacOS**, **BSD** and **Windows** compatible and supports SFTP, SCP, FTP and FTPS.
Features:
- 📁 Different communication protocols
- SFTP
- Kube
- WebDAV
- SCP
- FTP and FTPS
- S3
- SMB
- 🖥 Explore and operate on the remote and on the local machine file system with a handy UI
- Create, remove, rename, search, view and edit files
- ⭐ Connect to your favourite hosts through built-in bookmarks and recent connections
- 📝 View and edit text files with your favourite text editor
- 💁 SFTP/SCP authentication through SSH keys and username/password
- 🐧 Compatible with Windows, Linux, BSD and MacOS
- ✏ Customizable
- Themes
- Custom file explorer format
- Customizable text editor
- Customizable file sorting
- 🔐 Save your password in your operating system key vault
- 🦀 Rust-powered
- 🤝 Easy to extend with new file transfers protocols
- 👀 Developed keeping an eye on performance
- 🦄 Frequent awesome updates
</description>
</metadata>
<files>
<file src="tools/**" target="tools" />
</files>
</package>
+25
View File
@@ -0,0 +1,25 @@
$ErrorActionPreference = 'Stop';
$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
# Detect arch: PROCESSOR_ARCHITECTURE is "ARM64" on ARM, "AMD64" on x64
$is_arm64 = $env:PROCESSOR_ARCHITECTURE -eq 'ARM64' -or $env:PROCESSOR_ARCHITEW6432 -eq 'ARM64'
if ($is_arm64) {
$url = 'https://github.com/veeso/termscp/releases/download/v1.1.0/termscp-v1.1.0-msvc.zip'
$checksum = 'f6ad6c62f1578562f9af4bcee93bd4cc429cb52219c3636359b008db8789587e'
} else {
$url = 'https://github.com/veeso/termscp/releases/download/v1.1.0/termscp-v1.1.0-x86_64-pc-windows-msvc.zip'
$checksum = 'd7796081b6f67b82acfa94557aa6852d12a33daab3cca6490660b20e42752005'
}
$packageArgs = @{
packageName = $env:ChocolateyPackageName
fileType = 'EXE'
url = $url
unzipLocation = $toolsDir
softwareName = 'termscp*'
checksum = $checksum
checksumType = 'sha256'
validExitCodes = @(0, 3010, 1641)
}
Install-ChocolateyZipPackage @packageArgs
Vendored
-11
View File
@@ -1,11 +0,0 @@
#!/bin/bash
echo "Installing cargo-deb..."
cargo install cargo-deb
if [ ! -f "Cargo.toml" ]; then
echo "Yout must be in the project root directory"
exit 1
fi
echo "Running cargo-deb"
cargo deb
exit $?
Vendored Executable
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env bash
# Bump termscp version across all tracked locations.
# Usage: bump_version.sh <version> [date] [root]
set -euo pipefail
VERSION="${1:?usage: bump_version.sh <version> [date] [root]}"
DATE="${2:-$(date +%F)}"
ROOT="${3:-$(git rev-parse --show-toplevel)}"
# in-place sed that works on both GNU and BSD/macOS
sedi() { perl -0777 -pi -e "$1" "$2"; }
# Cargo.toml — only the top-level package version (line-anchored), not deps
sedi "s/^version = \"[0-9][0-9A-Za-z.\\-]*\"/version = \"$VERSION\"/m" "$ROOT/Cargo.toml"
# install.sh — the literal default assignment only
sedi "s/^TERMSCP_VERSION=\"[0-9][0-9A-Za-z.\\-]*\"/TERMSCP_VERSION=\"$VERSION\"/m" "$ROOT/install.sh"
# install.ps1 — the default -Version parameter value only
sedi "s/\\\$Version = \"[0-9][0-9A-Za-z.\\-]*\"/\\\$Version = \"$VERSION\"/" "$ROOT/install.ps1"
# README.md — version + release date
sedi "s/Current version: [0-9][0-9A-Za-z.\\-]* [0-9]{4}-[0-9]{2}-[0-9]{2}/Current version: $VERSION $DATE/" "$ROOT/README.md"
# site: version constant displayed on the website
sedi "s/^export const VERSION = \"[0-9][0-9A-Za-z.\\-]*\";/export const VERSION = \"$VERSION\";/m" "$ROOT/site/src/consts.ts"
# chocolatey nuspec
sedi "s#<version>[0-9][0-9A-Za-z.\\-]*</version>#<version>$VERSION</version>#" "$ROOT/dist/chocolatey/termscp.nuspec"
# chocolatey install script — release tag + asset name in the URLs (checksums set later by CI)
sedi "s#releases/download/v[0-9][0-9A-Za-z.\\-]*/termscp-v[0-9][0-9A-Za-z.\\-]*-#releases/download/v$VERSION/termscp-v$VERSION-#g" "$ROOT/dist/chocolatey/tools/chocolateyinstall.ps1"
echo "Bumped to $VERSION ($DATE)"
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUMP="$SCRIPT_DIR/bump_version.sh"
ROOT="$(mktemp -d)"
trap 'rm -rf "$ROOT"' EXIT
# --- build a fixture tree mirroring the real layout, all at 1.0.0 ---
mkdir -p "$ROOT/site/html" "$ROOT/site/lang" "$ROOT/dist/chocolatey/tools"
cat > "$ROOT/Cargo.toml" <<'EOF'
[package]
name = "termscp"
version = "1.0.0"
[dependencies]
foo = { version = "1.0.0" }
EOF
cat > "$ROOT/install.sh" <<'EOF'
TERMSCP_VERSION="1.0.0"
set_termscp_version() {
TERMSCP_VERSION="$1"
}
EOF
cat > "$ROOT/README.md" <<'EOF'
<p align="center">Current version: 1.0.0 2026-04-18</p>
EOF
cat > "$ROOT/site/html/home.html" <<'EOF'
<span>termscp 1.0.0 is NOW out! Download it from</span>
EOF
cat > "$ROOT/site/html/get-started.html" <<'EOF'
<a href="https://github.com/veeso/termscp/releases/latest/download/termscp.1.0.0.nupkg">Github</a>
<pre>wget -O termscp.deb https://github.com/veeso/termscp/releases/latest/download/termscp_1.0.0_amd64.deb</pre>
EOF
for lang in en it fr es zh-CN; do
cat > "$ROOT/site/lang/$lang.json" <<'EOF'
{ "versionAlert": "termscp 1.0.0 is NOW out! Download it from" }
EOF
done
cat > "$ROOT/dist/chocolatey/termscp.nuspec" <<'EOF'
<version>1.0.0</version>
EOF
cat > "$ROOT/dist/chocolatey/tools/chocolateyinstall.ps1" <<'EOF'
$url = 'https://github.com/veeso/termscp/releases/download/v1.0.0/termscp-v1.0.0-aarch64-pc-windows-msvc.zip'
$url = 'https://github.com/veeso/termscp/releases/download/v1.0.0/termscp-v1.0.0-x86_64-pc-windows-msvc.zip'
EOF
# --- run the bump ---
"$BUMP" 1.1.0 2026-06-07 "$ROOT"
fail() { echo "FAIL: $1"; exit 1; }
have() { grep -q -- "$2" "$ROOT/$1" || fail "$1 missing: $2"; }
missing() { ! grep -q -- "$2" "$ROOT/$1" || fail "$1 still has: $2"; }
# package version bumped, dependency version NOT touched
have "Cargo.toml" 'version = "1.1.0"'
have "Cargo.toml" 'foo = { version = "1.0.0" }'
have "install.sh" 'TERMSCP_VERSION="1.1.0"'
have "README.md" 'Current version: 1.1.0 2026-06-07'
missing "README.md" '2026-04-18'
have "site/html/home.html" 'termscp 1.1.0 is NOW out'
have "site/lang/en.json" 'termscp 1.1.0 is NOW out'
have "site/lang/zh-CN.json" 'termscp 1.1.0 is NOW out'
have "site/html/get-started.html" 'termscp.1.1.0.nupkg'
have "site/html/get-started.html" 'termscp_1.1.0_amd64.deb'
have "dist/chocolatey/termscp.nuspec" '<version>1.1.0</version>'
have "dist/chocolatey/tools/chocolateyinstall.ps1" 'releases/download/v1.1.0/termscp-v1.1.0-'
missing "dist/chocolatey/tools/chocolateyinstall.ps1" 'v1.0.0'
# --- idempotency: running again at same version is a no-op (no error) ---
"$BUMP" 1.1.0 2026-06-07 "$ROOT"
have "Cargo.toml" 'version = "1.1.0"'
echo "PASS"
Vendored
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
which rpmbuild > /dev/null
if [ $? -ne 0 ]; then
echo "You must install rpmbuild on your machine"
fi
echo "Installing cargo-rpm..."
cargo install cargo-rpm
if [ ! -f "Cargo.toml" ]; then
echo "Yout must be in the project root directory"
exit 1
fi
echo "Running cargo-rpm"
cargo rpm init
cargo rpm build
exit $?
+1
View File
@@ -0,0 +1 @@
docs.termscp.rs
-1
View File
@@ -1 +0,0 @@
<mxfile host="Electron" modified="2020-11-21T19:08:13.709Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/13.3.1 Chrome/83.0.4103.119 Electron/9.0.5 Safari/537.36" etag="CH09h_mpCNwCuwQp3CzT" version="13.3.1" type="device" pages="2"><diagram id="SlpWaeKyUTlHltKKkHdB" name="ScpActivity">7ZlRk5owEMc/DY/HABGEx2rv2pnWmXaczj3nJEKmgdAQD+yn7wJBoOhUrbbcTHwx2SSb5L+/4EoMtEzKDwJn8YqHhBmOFZYGem84ju26FnxVln1j8QO3MUSChqpTZ1jTn0QZ1bhoR0OSDzpKzpmk2dC44WlKNnJgw0LwYthty9lw1gxHZGRYbzAbW59pKGO1C2fe2T8SGsXtzLYXNC0JbjurneQxDnnRM6FHAy0F57IpJeWSsEq8Vpdm3NOJ1sPCBEnlOQOyRbEsv31ixSv+vi6c588r9vXBaby8YrZTG1aLlftWAcF3aUgqJ5aBFkVMJVlneFO1FhBzsMUyYVCzobiljC054wLqKU+h00LNQIQk5cml2wdBgCTCEyLFHrqoAchEqBmzH9JRdCFBgWd6KipxLyJopvpiRUJ0cN+JBQWl1wXaoTeh3azl77R0M8s6pptj+t6dpJsdkc5jMPPiBQqRrLfeGLYc9tkX1fux423DQ14/MN5BB9Ck7BpbL1+qU6g8wUobZ8MJwNyb9MYBxIxGKVQZ2crbxBMo9/58Fo4E1L3XOXB1MK8/nO60YumNYvlEGUlxQkBVnFQapS95Vu/e+semGo8b+seS3nZbGREJzXPK0/w6H7xIiahTIb7L3gC+o2fR/Bi/8Os9GyPs3QvhuUZYI3x1ejQFgn1NsCb4fILNwA96H3+YUaAJAB1ooDXQl2QVbh/o+RDoYAJAt3m6JloT/ddEH/7N/VeibU20JvqStNm0+p/f3klNIeuwxy+3NdIa6bNflE8i0RhfMmiGNcOnGbaHqcYUM43x5c+K5Hl1D+tYL7y8m8wbEBGi2Vw2rJV/u603N8+Oe6NAmEEwkB55Y+l92zUteyz94clzgfZQ7a6S67behTx6/AU=</diagram><diagram id="SK1VvSCf6-f5suE94Ksw" name="AuthActivity">5ZfRbpswFIafhstIAQNtL1OarlI1qUq6RdrNZLADnowPs00ge/qZYCA0ldZOSiqVK+z/2Mec/zuWwEFRXn+RuMi+AqHc8eakdtCd43luEMzNo1H2rXJ9E7RCKhmxiwZhzf5QK9p9ackIVaOFGoBrVozFBISgiR5pWEqoxsu2wMenFjilJ8I6wfxU3TCiM1uFdzXoD5SlWXeyG960kRx3i20lKsMEqiMJLR0USQDdjvI6orwxr/Pl8ennZvUQzVZ3uwXDz8pfPaNZm+z+PVv6EiQV+r9Tb/ax+q59lCz5D/5rN4sf0z71DvPS+mVr1fvOQAmlILRJMnfQbZUxTdcFTppoZVrGaJnOuZm5ZrhlnEfAQZq5AEEbCYS2beEFZo45S4WZcLo1xdzaF6BS0/oFsX+U6/YMTPNSyKmWe7PP9qlvqVXH0K2WHQFHXaNi22hpn2ow0wysn+/w1jvxdlHqzNTEEqwZiKk5HZ7LaPRKE4dcW0dGHoe/S+gCM3XwamEWuH5RD0EzSu3zkCXuhAUhkip12NOGzPvGL5cbrT23kz8HZnf+Rs7+uTj7l+L8BFJPFPJbL/PZIAcXgyxBQwK83aQob74+Jkj8+qOJh5ci/k1RKXBOp3m1++/YDwN9dbGrjZWqQJIWNM4bJiJWxRjyZMCH5wNvpsMP0CF29BuJln8B</diagram></mxfile>
+37
View File
@@ -0,0 +1,37 @@
# Summary
[Introduction](index.md)
# Getting started
- [Installation](getting-started/installation.md)
- [Connecting to a server](getting-started/connecting.md)
- [Connection parameters](getting-started/connection-parameters.md)
# Using termscp
- [The file explorer](usage/file-explorer.md)
- [Keyboard shortcuts](usage/keyboard-shortcuts.md)
- [Working with multiple files](usage/multiple-files.md)
- [Synchronized browsing](usage/synced-browsing.md)
- [Opening and editing files](usage/open-edit-files.md)
- [Bookmarks and recent hosts](usage/bookmarks.md)
- [Keeping files in sync](usage/file-watcher.md)
# Configuration
- [Configuration](configuration/configuration.md)
- [File explorer format](configuration/explorer-format.md)
- [SSH key storage](configuration/ssh-keys.md)
- [Themes](configuration/themes.md)
- [Notifications](configuration/notifications.md)
- [Logging](configuration/logging.md)
- [Password security](configuration/password-security.md)
# CLI reference
- [Command-line usage](cli/cli.md)
# Developer
- [Developer manual](developer/developer.md)
+22
View File
@@ -0,0 +1,22 @@
[book]
title = "termscp"
description = "A feature rich terminal UI file transfer and explorer with support for SCP/SFTP/FTP/Kube/S3/SMB/WebDAV"
authors = ["Christian Visintin"]
language = "en"
src = "."
[output.html]
default-theme = "light"
preferred-dark-theme = "navy"
git-repository-url = "https://github.com/veeso/termscp"
edit-url-template = "https://github.com/veeso/termscp/edit/main/docs/en-US/{path}"
additional-js = ["lang-switcher.js", "mermaid.min.js", "mermaid-init.js"]
[output.html.fold]
enable = true
level = 1
[preprocessor]
[preprocessor.mermaid]
command = "mdbook-mermaid"
+76
View File
@@ -0,0 +1,76 @@
# Command-line usage
termscp can be started with the following invocation forms:
```sh
termscp [options]... [protocol://user@address:port:wrkdir] [protocol://user@address:port:wrkdir] [local-wrkdir]
```
OR
```sh
termscp [options]... -b [bookmark-name] -b [bookmark-name] [local-wrkdir]
```
AND any combination of the two.
If no extra arguments are provided, termscp shows the authentication form. If an
address argument or a bookmark name is provided, termscp skips the form and
connects directly to the remote server. When an address or bookmark is given,
you may also provide the starting working directory for the local host as the
last positional argument.
## Options
| Key | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `-b <bookmark-name>` | Resolve the positional address argument as a bookmark name. Repeat the flag to open multiple bookmarks. |
| `-D` | Enable the `TRACE` log level (debug/verbose logging). |
| `-P <password>` | Provide the password from the CLI. Repeat the flag for multiple remotes; the order must match the address arguments. Discouraged. |
| `-q` | Disable logging. |
| `-T <ticks>` | Set the UI tick interval in milliseconds. Default is `10`. |
| `--wno-keyring` | Disable system keyring support. |
| `-v` | Print version info. |
| `--help` | Print the help page. |
The `-P` option is discouraged because the password may be kept in the shell
history. See the bookmarks and password-security chapters for safer ways to
provide credentials.
## Subcommands
termscp exposes the following subcommands.
### Import a theme
```sh
termscp theme <theme-file>
```
Import the theme defined in `<theme-file>`.
### Install the latest version
```sh
termscp update
```
Download and install the latest available version of termscp.
### Import ssh hosts
```sh
termscp import-ssh-hosts [ssh-config-file]
```
Import all the hosts from the specified ssh config file as bookmarks in
termscp. If `[ssh-config-file]` is not provided, the default location
`~/.ssh/config` is used. Identity files are imported as ssh keys in termscp too.
### Open configuration
```sh
termscp config
```
Start termscp directly in the configuration (setup) screen.
+50
View File
@@ -0,0 +1,50 @@
# Configuration
termscp supports a number of user-defined parameters. termscp stores them in a
TOML file and a few directories, but you never edit these files by hand:
configuration is done entirely from the user interface.
To enter the configuration, press `<CTRL+C>` from the termscp home.
termscp requires these paths to be accessible:
- `$HOME/.config/termscp/` on Linux/BSD
- `$HOME/.config/termscp/` on macOS
- `%USERPROFILE%\.termscp\` on Windows
## Parameters
The following parameters can be configured:
- **Text Editor**: the text editor to use. By default termscp finds the default
editor for you; with this option you can force an editor to be used (e.g.
`vim`). GUI editors are also supported, unless they detach (`nohup`) from the
parent process.
- **Default Protocol**: the default value for the file transfer protocol to be
used in termscp. It applies to the login page and to the address CLI argument.
- **Show Hidden Files**: whether hidden files are displayed by default. You can
also toggle hidden files at runtime by pressing `A`.
- **Check for updates**: if set to `yes`, termscp queries the GitHub API to
check whether a new version of termscp is available.
- **Prompt when replacing existing files**: if set to `yes`, termscp prompts for
confirmation whenever a file transfer would replace an existing file on the
target host.
- **Group Dirs**: whether directories are grouped in the file explorers. If
`Display first` is selected, directories are sorted with the configured method
but displayed before files; with `Display last` they are displayed after
files.
- **Remote file formatter syntax**: syntax used to display file info for each
file in the remote explorer. See [File explorer format](explorer-format.md).
- **Local file formatter syntax**: syntax used to display file info for each file
in the local explorer. See [File explorer format](explorer-format.md).
- **Enable notifications**: if set to `Yes`, desktop notifications are displayed.
See [Notifications](notifications.md).
- **Notifications: minimum transfer size**: if the transfer size is greater than
or equal to the specified value, transfer notifications are displayed. The
accepted format is `{UNSIGNED} B/KB/MB/GB/TB/PB`.
- **SSH configuration path**: SSH configuration file to use when connecting to a
SCP/SFTP server. If left empty, no file is used. You can specify a path
starting with `~` to indicate the home directory (e.g. `~/.ssh/config`). The
attributes supported by termscp are listed at
[the ssh2-config exposed attributes](https://github.com/veeso/ssh2-config#exposed-attributes).
See also [SSH key storage](ssh-keys.md).
@@ -0,0 +1,49 @@
# File explorer format
You can define a custom format for the file explorer through the configuration.
This is possible for both the local and the remote host, so you can use two
different syntaxes. The fields are named **File formatter syntax (local)** and
**File formatter syntax (remote)**, and they define how the file entries are
displayed in the file explorer.
## Syntax
The syntax for the formatter is the following:
```text
{KEY1}... {KEY2:LENGTH}... {KEY3:LENGTH:EXTRA} {KEYn}...
```
Each key in braces is replaced with the related attribute, while everything
outside braces is left unchanged.
- The key name is mandatory and must be one of the keys below.
- `LENGTH` describes the width reserved to display the field. Static attributes
do not support it (`GROUP`, `PEX`, `SIZE`, `USER`).
- `EXTRA` is supported only by some keys and provides an additional option. See
the keys below to check whether `EXTRA` is supported.
## Keys
These are the keys supported by the formatter:
| Key | Description |
| --------- | ------------------------------------------------------------------------------------------------ |
| `ATIME` | Last access time (default `%b %d %Y %H:%M`); `EXTRA` is the time format (e.g. `{ATIME:8:%H:%M}`) |
| `CTIME` | Creation time (default `%b %d %Y %H:%M`); `EXTRA` is the time format (e.g. `{CTIME:8:%H:%M}`) |
| `GROUP` | Owner group |
| `MTIME` | Last change time (default `%b %d %Y %H:%M`); `EXTRA` is the time format (e.g. `{MTIME:8:%H:%M}`) |
| `NAME` | File name (folders between root and first ancestors are elided if longer than `LENGTH`) |
| `PATH` | File absolute path (folders between root and first ancestors are elided if longer than `LENGTH`) |
| `PEX` | File permissions (UNIX format) |
| `SIZE` | File size (omitted for directories) |
| `SYMLINK` | Symlink target (if any, `-> {FILE_PATH}`) |
| `USER` | Owner user |
## Default format
If left empty, the default formatter syntax is used:
```text
{NAME:24} {PEX} {USER} {SIZE} {MTIME:17:%b %d %Y %H:%M}
```
+28
View File
@@ -0,0 +1,28 @@
# Logging
termscp writes a log file for each session, located at:
- `$HOME/.cache/termscp/termscp.log` on Linux/BSD
- `$HOME/Library/Caches/termscp/termscp.log` on macOS
- `FOLDERID_LocalAppData\termscp\termscp.log` on Windows
The log is not rotated: it is truncated on each launch of termscp. If you want
to report an issue and attach the log file, save the log somewhere safe before
launching termscp again.
By default the log reports at the `INFO` level, so it is not very verbose.
## Reproducing an issue at TRACE level
To submit an issue, reproduce the problem with the log level set to `TRACE` by
launching termscp with the `-D` CLI option.
## Disabling logging
To turn logging off, start termscp with the `-q` or `--quiet` option. You can
alias termscp to make it persistent.
## Security
The log file does not contain any plaintext password. It exposes the same
information as the sibling `bookmarks` file.
+23
View File
@@ -0,0 +1,23 @@
# Notifications
termscp sends desktop notifications for the following events:
- **Transfer completed**: sent once a transfer has been successfully completed.
Displayed only if the total transfer size is at least the configured
`Notifications: minimum transfer size`.
- **Transfer failed**: sent once a transfer has failed due to an error.
Displayed only if the total transfer size is at least the configured
`Notifications: minimum transfer size`.
- **Update available**: sent whenever a new version of termscp is available.
- **Update installed**: sent whenever a new version of termscp has been
installed.
- **Update failed**: sent whenever the installation of an update fails.
## Disable notifications
To turn notifications off, enter setup and set `Enable notifications?` to `No`.
## Change the minimum transfer size
To change the threshold that gates transfer notifications, enter setup and set
`Notifications: minimum transfer size` to the value that suits you.
@@ -0,0 +1,49 @@
# Password security
Bookmarks are saved in your configuration directory along with their passwords.
Passwords are not stored in plaintext: they are encrypted with AES.
The key used to encrypt passwords is stored, where possible, in the operating
system secret store:
- The Windows Vault on Windows
- The system keyring on Linux
- The Keychain on macOS
This is managed directly by your operating system.
On BSD and WSL there is no such secret store, so the encryption key is saved on
disk at `$HOME/.config/termscp`. The location protects the key with file
permissions so that it cannot be read by other users, but you should still avoid
saving passwords for servers exposed on the internet on these systems.
## Linux keyring
On Linux there might be no keyring installed on your system. The key storage
requires a service that exposes `org.freedesktop.secrets` on D-Bus, and only a
few services provide it:
- If you use GNOME as your desktop environment (e.g. Ubuntu users), the keyring
is already provided by `gnome-keyring` and everything should work out of the
box.
- For other desktop environments, you can use [KeepassXC](https://keepassxc.org/)
to obtain a keyring. It must be set up to work with termscp; see
[KeepassXC setup](#keepassxc-setup) below.
- If you do not want to install any of these services, termscp keeps working as
usual and falls back to saving the key in a file, as it does for BSD and WSL.
### KeepassXC setup
Follow these steps to set up KeepassXC for termscp:
1. Install KeepassXC.
2. Go to "Tools" > "Settings" in the toolbar.
3. Select "Secret service integration" and enable "Enable KeepassXC
freedesktop.org secret service integration".
4. Create a database, if you do not have one yet: from the toolbar, "Database" >
"New database".
5. From the toolbar, go to "Database" > "Database settings".
6. Select "Secret service integration" and enable "Expose entries under this
group".
7. Select the group where the termscp secret will be kept. Note that any other
application can read secrets exposed via D-Bus for that group.
+25
View File
@@ -0,0 +1,25 @@
# SSH key storage
Along with configuration, termscp provides an essential feature for SFTP/SCP
clients: the SSH key storage.
To access the SSH key storage, enter the configuration and move to the
`SSH Keys` tab.
## Manage keys
From the `SSH Keys` tab you can:
- **Add a new key**: press `<CTRL+N>`. You are prompted to provide the
hostname/IP address and the username associated with the key, then a text
editor opens: paste the **private** SSH key into the editor, save and quit.
- **Remove an existing key**: press `<DEL>` or `<CTRL+E>` on the key you want to
remove to delete it persistently from termscp.
- **Edit an existing key**: press `<ENTER>` on the key you want to edit to change
the private key.
## Password-protected keys
Password-protected private keys are supported. The password you provide for
authentication in termscp is valid both for username/password authentication and
for key authentication.
+113
View File
@@ -0,0 +1,113 @@
# Themes
termscp lets you set the colors for several components in the application. There
are two ways to customize termscp:
- From the **configuration menu**
- Importing a **theme file**
## Customize from the configuration menu
To customize termscp from the configuration menu, enter the configuration from
the auth screen by pressing `<CTRL+C>`, then press `<TAB>` twice to reach the
`themes` panel. Move with `<UP>` and `<DOWN>` to select the style you want to
change, as shown in the gif below:
![Themes](https://github.com/veeso/termscp/blob/main/assets/images/themes.gif?raw=true)
## Import a theme file
You can also import theme files. You can take inspiration from, or directly use,
one of the themes bundled with termscp in the `themes/` directory of the
repository. Import a theme by running:
```sh
termscp theme <theme_file>
```
If everything is fine, termscp confirms the theme has been imported.
## Color syntax
termscp accepts the following color formats:
- Explicit hexadecimal: `#rrggbb`
- RGB: `rgb(r, g, b)`
- [CSS color names](https://www.w3schools.com/cssref/css_colors.asp) (such as
`crimson`)
- The special keyword `Default`, which uses the situational default foreground
or background color (foreground for texts and lines, background otherwise)
## Recovering from a theme that won't load
After an update, a saved theme can fail to load. This happens when a new key is
added to themes: the previously saved theme no longer contains that key. There
are two quick fixes:
1. Re-import the official theme. After each release the official themes are
patched, so download the updated theme from the repository and re-import it:
```sh
termscp theme <theme.toml>
```
2. Edit your theme by hand. If you use a custom theme, edit the file and add the
missing key. The theme is located at `$CONFIG_DIR/theme.toml`, where
`$CONFIG_DIR` is:
- FreeBSD/Linux: `$HOME/.config/termscp`
- macOS: `$HOME/.config/termscp`
- Windows: `%USERPROFILE%\.termscp`
Missing keys are reported in the CHANGELOG under `BREAKING CHANGES` for the
version you have just installed.
## Styles
The tables below describe each style field. Note that styles do **not** apply to
the configuration page, so it always remains usable in case you change something
by mistake.
### Authentication page
| Key | Description |
| ---------------- | ---------------------------------------- |
| `auth_address` | Color of the input field for IP address |
| `auth_bookmarks` | Color of the bookmarks panel |
| `auth_password` | Color of the input field for password |
| `auth_port` | Color of the input field for port number |
| `auth_protocol` | Color of the radio group for protocol |
| `auth_recents` | Color of the recents panel |
| `auth_username` | Color of the input field for username |
### Transfer page
| Key | Description |
| -------------------------------------- | ------------------------------------------------------------------------- |
| `transfer_local_explorer_background` | Background color of localhost explorer |
| `transfer_local_explorer_foreground` | Foreground color of localhost explorer |
| `transfer_local_explorer_highlighted` | Border and highlighted color for localhost explorer |
| `transfer_remote_explorer_background` | Background color of remote explorer |
| `transfer_remote_explorer_foreground` | Foreground color of remote explorer |
| `transfer_remote_explorer_highlighted` | Border and highlighted color for remote explorer |
| `transfer_log_background` | Background color for log panel |
| `transfer_log_window` | Window color for log panel |
| `transfer_progress_bar_partial` | Partial progress bar color |
| `transfer_progress_bar_total` | Total progress bar color |
| `transfer_status_hidden` | Color for status bar "hidden" label |
| `transfer_status_sorting` | Color for status bar "sorting" label; applies also to file sorting dialog |
| `transfer_status_sync_browsing` | Color for status bar "sync browsing" label |
### Misc
These styles apply to different parts of the application.
| Key | Description |
| ------------------- | ------------------------------------------- |
| `misc_error_dialog` | Color for error messages |
| `misc_info_dialog` | Color for info dialogs |
| `misc_input_dialog` | Color for input dialogs (such as copy file) |
| `misc_keys` | Color of text for key strokes |
| `misc_quit_dialog` | Color for quit dialogs |
| `misc_save_dialog` | Color for save dialogs |
| `misc_warn_dialog` | Color for warn dialogs |
+128
View File
@@ -0,0 +1,128 @@
# Developer manual
Welcome to the developer manual for termscp. This chapter does NOT contain the
documentation for termscp modules, which can instead be found on Rust Docs at
<https://docs.rs/termscp>. This chapter describes how termscp works and the
guidelines to implement features such as file transfers and additions to the
user interface.
termscp is written in Rust (edition 2024, MSRV 1.89.0). The user interface is
built with [tuirealm](https://github.com/veeso/tui-realm) v3, which runs on top
of [crossterm](https://github.com/crossterm-rs/crossterm).
## How termscp works
termscp is basically made up of 3 core modules:
- The **host**: the host module provides functions to interact with file
systems. It exposes the `HostBridge` trait, which abstracts file operations
over both the local host (`Localhost`) and the remote host (`RemoteBridged`).
- The **ui**: this module contains the implementation of the user interface. As
shown in the next chapter, this is achieved through **activities**.
- The **activity_manager**: the activity manager takes care of managing
activities. It runs the activities of the user interface and chooses, based on
their state, when to terminate the current activity and which activity to run
next.
In addition to the 3 core modules, others have been added over time:
- **config**: provides the configuration schema and its serialization methods.
- **explorer**: exposes the explorer structures, which are used to handle the
file explorer in the ui. They store the current directory model and the view
states (e.g. sorting, whether to display hidden files, the transfer queue).
- **filetransfer**: defines the `FileTransferProtocol` enum and the
`RemoteFsBuilder`, which constructs the appropriate `RemoteFs` client from the
connection parameters.
- **system**: provides a way to interact with the configuration, the ssh key
storage and the bookmarks.
- **utils**: contains the utilities used by pretty much all of the project.
termscp supports the following protocols: SFTP, SCP, FTP/FTPS, Kube, S3, SMB and
WebDAV.
## Activities
This paragraph gives a short overview of activities. Read the code and the
documentation for a clear idea of how the ui works.
There are many ways to implement a user interface. This project borrows what
works best from different frameworks:
- **Activities on top**: each "view" is an Activity, and an `Activity Manager`
handles them. This approach is inspired by Android. It fits a ui that has
different views, each one with its own components and logic. Activities work
with the `Context`, which is a data holder used to share data between
activities.
- **Activities display Applications**: each activity can show different
**Applications**. An application contains a **View**, which is basically a list
of **components**, each one with its properties. The view is a facade to the
components and also handles the focus, which is the current active component.
You cannot have more than one active component, so this must be handled; at the
same time, focus must be given back to the previously active component if the
current one is destroyed. The **Application** takes care of all this. To learn
more, read <https://github.com/veeso/tui-realm>.
- **Components**: components are built around tui in order to reuse widgets. This
is achieved through the `Component` trait, inspired by
[React](https://reactjs.org/). Each component has its *Properties* and can have
its *States*. Each component must handle input events, accept new properties,
and provide a method to **render** itself. This logic now lives in
[tui-realm](https://github.com/veeso/tui-realm).
- **Messages: an Elm-based approach**: input events are handled with an approach
inspired by [Elm](https://elm-lang.org/). In Elm you implement your ui using
three basic functions: **update**, **view** and **init**. termscp implements
the equivalent of the Elm update function as a large match case inside a
recursive function, which you can find in the `update.rs` file inside each
activity. This match case handles the messages produced by the components in
response to incoming input events and causes the activity to change its state.
termscp implements a trait called `Activity`, a much reduced version of the
Android activity. This trait provides these methods:
- `on_create`: initializes the activity. The context is passed to the activity,
which becomes the only owner of the Context until the activity terminates.
- `on_draw`: called each time the user interface should be updated. This is
basically the run method of the activity, and it also handles input events. The
interface should not be drawn on every call (this method may be called hundreds
of times per second), but only when something has actually changed (for example
after an input event).
- `will_umount`: returns whether the activity should be destroyed. If so, it
returns an `ExitReason`, which indicates why the activity should terminate.
Based on the reason, the activity manager chooses whether to stop the execution
of termscp or to start a new activity, and which one.
- `on_destroy`: finalizes the activity and drops it. This method returns the
Context to the caller (the activity manager).
### The Context
The context is a structure that holds data shared between activities. Every time
an Activity starts, the Context is taken by the activity, until it is destroyed,
where the context is finally returned to the activity manager. The context holds
the following data:
- The **Localhost**: the local host structure.
- The **File Transfer Params**: the current parameters used to connect to the
remote.
- The **Config Client**: a structure that provides functions to access the user
configuration.
- The **Store**: a key-value storage that can hold any kind of data. It can be
used to share state between activities or to keep persistence for heavy or slow
tasks (such as checking for updates).
- The **Terminal**: used to render the tui on the terminal.
## Achieving an abstract file transfer client
When the implementation of termscp started, in December 2020, file transfer was
at the core of the design, since it is at the heart of termscp. The first
implementation consisted of a `filetransfer` module that exposed a trait called
`FileTransfer`, which provided methods to generically interact with the remote
file system.
This changed over time, as different users asked for a dedicated library. In the
last quarter of 2021, [remotefs](https://github.com/veeso/remotefs-rs) was born:
an abstract library to work with remote device file systems. remotefs provides a
`RemoteFs` trait that exposes all of the core file-system functionalities, and
since version 0.8.0 it has replaced the `FileTransfer` trait.
The file transfer module still exists, but its only task is to build a
`RemoteFs` client implementation from the file transfer parameters through the
`RemoteFsBuilder`.
+77
View File
@@ -0,0 +1,77 @@
# Connecting to a server
termscp can start in three different ways depending on the arguments you pass.
- No arguments: termscp opens the authentication form, where you provide the
parameters required to connect to the remote host.
- An address argument: termscp skips the authentication form and connects
directly to the remote host.
- A bookmark name with `-b <bookmark-name>`: termscp resolves the argument as a
saved bookmark and connects. Repeat `-b` to open several bookmarks.
When you provide an address argument or a bookmark name, you can also provide a
start working directory for the local host.
## The authentication form
When termscp starts without an address, it shows the authentication form. Fill
in the protocol, address, port, username, and password, then connect. termscp
will open the dual-pane explorer once the connection succeeds.
## Address argument syntax
The generic address argument has the following syntax:
```txt
[protocol://][username@]<address>[:port][:wrkdir]
```
This syntax is convenient, and you will probably use it instead of the
interactive form. Here are some examples.
Connect using the default protocol (defined in your configuration) to
`192.168.1.31`. If the port is not provided, the default port for the selected
protocol is used. The username is the current user's name.
```sh
termscp 192.168.1.31
```
Connect using the default protocol to `192.168.1.31` as user `root`:
```sh
termscp root@192.168.1.31
```
Connect using SCP to `192.168.1.31` on port `4022` as user `omar`:
```sh
termscp scp://omar@192.168.1.31:4022
```
Connect using SCP to `192.168.1.31` on port `4022` as user `omar`, starting in
directory `/tmp`:
```sh
termscp scp://omar@192.168.1.31:4022:/tmp
```
For protocol-specific address syntax (S3, Kube, WebDAV, and SMB), see
[Connection parameters](connection-parameters.md).
## How the password is provided
When you provide the address as an argument, there is no field for the password
in the address itself. You can provide the password in three ways:
- You will be prompted for it. This is the default: if you don't use any of the
methods below, termscp prompts for the password, like classic tools such as
`scp` and `ssh`.
- `-P, --password` option: pass the password directly on the command line. This
method is discouraged because it is insecure: the password may be kept in
your shell history.
- Via `sshpass`: provide the password through `sshpass`, for example:
```sh
sshpass -f ~/.ssh/topsecret.key termscp cvisintin@192.168.1.31
```
@@ -0,0 +1,168 @@
# Connection parameters
Each protocol has its own set of authentication-form fields and its own
command-line address syntax. This page describes them protocol by protocol.
## SFTP / SCP
Authentication-form fields:
- Host (address)
- Port (default `22`)
- Username
- Password or SSH key
You can authenticate either with a username and password or with an SSH key.
See [SSH key storage](../configuration/ssh-keys.md) for how to manage keys.
Address syntax:
```txt
[protocol://][username@]<address>[:port][:wrkdir]
```
## FTP / FTPS
Authentication-form fields:
- Host (address)
- Port (default `21`)
- Username
- Password
- Secure (FTPS): enable TLS to use FTPS instead of plain FTP
Address syntax:
```txt
[protocol://][username@]<address>[:port][:wrkdir]
```
## Kube
Authentication-form fields:
- Namespace
- Cluster URL (Kubernetes API URL)
- Username
- Client certificate path
- Client key path
Address syntax:
```txt
kube://[namespace][@<cluster_url>][$</path>]
```
## S3
termscp supports both AWS S3 and other S3-compatible endpoints.
Authentication-form fields:
- Bucket name
- Region (for AWS S3) or endpoint (for other S3-compatible servers)
- Profile
- Access key
- Secret access key
- Security token
- Session token
- New path style
The required and optional fields differ depending on the endpoint:
- AWS S3:
- bucket name (required)
- region (required)
- profile (optional; defaults to `default`)
- access key (required unless the bucket is public)
- secret access key (required unless the bucket is public)
- security token (if required)
- session token (if required)
- new path style: NO
- Other S3 endpoints:
- bucket name (required)
- endpoint (required)
- access key (required unless the bucket is public)
- secret access key (required unless the bucket is public)
- new path style: YES
Address syntax:
```txt
s3://<bucket>@<region>[:profile][:/wrkdir]
```
For example:
```txt
s3://buckethead@eu-central-1:default:/assets
```
### S3 credentials
To connect to an AWS S3 bucket you must provide credentials. There are three
ways to do this.
1. Authentication form: provide the access key (usually mandatory), the secret
access key (usually mandatory), the security token, and the session token.
If you save the S3 connection as a bookmark, the access key and secret access
key are saved as an encrypted AES-256/BASE64 string in your bookmarks file.
The security token and session token are not saved, since they are meant to
be temporary credentials.
2. Credentials file: configure the AWS CLI with `aws configure`. Your
credentials are then stored at `~/.aws/credentials`. If you use a profile
other than `default`, provide it in the profile field of the authentication
form.
3. Environment variables: provide your credentials as environment variables.
These always override the credentials in the credentials file. The following
are usually mandatory:
- `AWS_ACCESS_KEY_ID`: AWS access key ID (usually starts with `AKIA...`)
- `AWS_SECRET_ACCESS_KEY`: the secret access key
If you have configured stronger security, you may also need:
- `AWS_SECURITY_TOKEN`: security token
- `AWS_SESSION_TOKEN`: session token
Your credentials are safe: termscp does not manipulate these values directly.
They are consumed directly by the `s3` crate.
## SMB
Authentication-form fields:
- Server (address)
- Share
- Username
- Password
- Port (other systems only; default `445`)
- Workgroup (other systems only)
On Windows the port and workgroup fields are not used.
Windows address syntax:
```txt
\\[username@]<server-name>\<share>[\path\...]
```
Other systems address syntax:
```txt
smb://[username@]<server-name>[:port]/<share>[/path/.../]
```
## WebDAV
Authentication-form fields:
- URI (the base WebDAV endpoint)
- Username
- Password
Address syntax:
```txt
http(s)://<username>:<password>@<url></path>
```
@@ -0,0 +1,83 @@
# Installation
termscp is available for many platforms. Pick the method that matches your
system below.
## Linux, FreeBSD, and macOS
This shell script installs termscp on your system with a single command:
```sh
curl --proto '=https' --tlsv1.2 -sSLf https://termscp.rs/install.sh | sh
```
On macOS the installation requires [Homebrew](https://brew.sh/); otherwise the
Rust compiler is installed to build termscp from source.
## Windows
Install termscp from PowerShell with a single command:
```ps
irm https://termscp.rs/install.ps1 | iex
```
Alternatively, install it with [Chocolatey](https://chocolatey.org/):
```ps
choco install termscp
```
## NetBSD
Install termscp from the official repositories:
```sh
pkgin install termscp
```
## Arch Linux
Install termscp from the official repositories:
```sh
pacman -S termscp
```
## Requirements
The following system dependencies are required to run termscp.
- Linux users:
- libdbus-1
- pkg-config
- libsmbclient
- FreeBSD and NetBSD users:
- dbus
- pkgconf
- libsmbclient
### Optional requirements
These dependencies are not required to run termscp, but they are needed to
enjoy all of its features.
- Linux and FreeBSD users, to open files via `V` (at least one of these):
- xdg-open
- gio
- gnome-open
- kde-open
- Linux users: a keyring manager. Read more in the
[Password security](../configuration/password-security.md) page.
- WSL users, to open files via `V`:
- [wslu](https://github.com/wslutilities/wslu)
## Updating termscp
To update termscp to the latest version, run it from the command line with:
```sh
(sudo) termscp update
```
For all platforms and methods, see <https://termscp.rs/install>.
+28
View File
@@ -0,0 +1,28 @@
# termscp
![termscp explorer](https://github.com/veeso/termscp/blob/main/assets/images/explorer.gif?raw=true)
termscp is a feature-rich terminal file transfer client and explorer with a
TUI (Terminal User Interface). It lets you connect to a remote server to
upload and download files while interacting with your local file system at the
same time. termscp runs on Linux, macOS, FreeBSD, NetBSD, and Windows.
## Features
- Multiple transfer protocols: SFTP, SCP, FTP and FTPS, Kube, S3, SMB,
and WebDAV.
- Dual-pane explorer to browse and operate on both the remote and the local
file system: create, remove, rename, search, view, and edit files.
- Bookmarks and recent connections to quickly reconnect to your favorite
hosts.
- View and edit files with your favorite editor.
- SFTP/SCP authentication with SSH keys or username and password.
- Embedded terminal for running commands on your system.
- Make it yours: themes, custom file explorer format, customizable text
editor, and customizable file sorting.
- Desktop notifications when a large file has been transferred.
- File watcher that keeps your changes synchronized with the remote host.
- Save your passwords in your operating system's key vault.
- Rust-powered and built with an eye on performance.
Ready to try it? See [Installation](getting-started/installation.md).
+47
View File
@@ -0,0 +1,47 @@
// Injects a language toggle (EN / 中文) into the mdBook menu bar.
// Swaps the leading /en-US/ <-> /zh-CN/ path segment, preserving the
// rest of the path; falls back to the language root on 404 navigation.
(function () {
const LANGS = [
{ code: "en-US", label: "EN" },
{ code: "zh-CN", label: "中文" },
];
function currentLang() {
const m = window.location.pathname.match(/\/(en-US|zh-CN)\//);
return m ? m[1] : "en-US";
}
function swapTo(code) {
const path = window.location.pathname;
const cur = currentLang();
if (path.includes(`/${cur}/`)) {
return path.replace(`/${cur}/`, `/${code}/`);
}
return `/${code}/`;
}
function build() {
const right = document.querySelector(".right-buttons");
if (!right) return;
const cur = currentLang();
const wrap = document.createElement("div");
wrap.className = "lang-switcher";
wrap.style.display = "inline-flex";
wrap.style.gap = "0.5rem";
wrap.style.marginInlineStart = "0.5rem";
LANGS.forEach((l) => {
const a = document.createElement("a");
a.textContent = l.label;
a.href = swapTo(l.code);
a.title = l.code;
a.setAttribute("aria-current", l.code === cur ? "true" : "false");
if (l.code === cur) a.style.fontWeight = "bold";
wrap.appendChild(a);
});
right.appendChild(wrap);
}
if (document.readyState !== "loading") build();
else document.addEventListener("DOMContentLoaded", build);
})();
+39
View File
@@ -0,0 +1,39 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
(() => {
const darkThemes = ['ayu', 'navy', 'coal'];
const lightThemes = ['light', 'rust'];
const classList = document.getElementsByTagName('html')[0].classList;
let lastThemeWasLight = true;
for (const cssClass of classList) {
if (darkThemes.includes(cssClass)) {
lastThemeWasLight = false;
break;
}
}
const theme = lastThemeWasLight ? 'default' : 'dark';
mermaid.initialize({ startOnLoad: true, theme });
// Simplest way to make mermaid re-render the diagrams in the new theme is via refreshing the page
for (const darkTheme of darkThemes) {
document.getElementById(darkTheme).addEventListener('click', () => {
if (lastThemeWasLight) {
window.location.reload();
}
});
}
for (const lightTheme of lightThemes) {
document.getElementById(lightTheme).addEventListener('click', () => {
if (!lastThemeWasLight) {
window.location.reload();
}
});
}
})();
+2609
View File
File diff suppressed because one or more lines are too long
+13
View File
@@ -0,0 +1,13 @@
<link rel="icon" type="image/x-icon" href="/shared/favicon.ico">
<link rel="icon" type="image/svg+xml" href="/shared/termscp.svg">
<meta property="og:title" content="{{#if chapter_title}}{{ chapter_title }} · {{/if}}{{ book_title }}">
<meta property="og:description" content="A feature rich terminal UI file transfer and explorer with support for SCP/SFTP/FTP/Kube/S3/SMB/WebDAV">
<meta property="og:image" content="https://docs.termscp.rs/og_preview.jpg">
<meta property="og:url" content="https://docs.termscp.rs/">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="{{#if chapter_title}}{{ chapter_title }} · {{/if}}{{ book_title }}">
<meta name="twitter:description" content="A feature rich terminal UI file transfer and explorer with support for SCP/SFTP/FTP/Kube/S3/SMB/WebDAV">
<meta name="twitter:image" content="https://docs.termscp.rs/og_preview.jpg">
+31
View File
@@ -0,0 +1,31 @@
# Bookmarks and recent hosts
termscp lets you save your favourite hosts as bookmarks, which can then be loaded quickly from the main layout. termscp also keeps the last 16 hosts you connected to. Both features let you reload all the parameters required to connect to a remote simply by selecting an entry in the tab under the authentication form.
## Where bookmarks are stored
Bookmarks are saved, when possible, in the configuration directory:
- `$HOME/.config/termscp/` on Linux/BSD
- `$HOME/.config/termscp/` on macOS
- `%USERPROFILE%\.termscp\` on Windows
## Saving passwords
For bookmarks only, you can optionally save the password used to authenticate. This does not apply to recent hosts, which never save passwords. The password is not saved by default; you are prompted to choose whether to save it when you create a new bookmark.
If you are concerned about the security of the passwords saved for your bookmarks, see [Are my passwords safe?](../configuration/password-security.md)
## Creating a bookmark
1. Fill in the authentication form with the parameters to connect to your remote server.
2. Press `<CTRL+S>`.
3. Type the name you want to give to the bookmark.
4. Choose whether to remember the password.
5. Press `<ENTER>` to submit.
## Loading a bookmark
To use a previously saved connection, press `<TAB>` to navigate to the bookmarks list, then press `<ENTER>` to load the bookmark parameters into the form.
![Bookmarks](https://github.com/veeso/termscp/blob/main/assets/images/bookmarks.gif?raw=true)
+18
View File
@@ -0,0 +1,18 @@
# The file explorer
After you establish a connection with a remote host, termscp shows the file explorer. The explorer is made up of three panels.
- **Local explorer panel**: displayed on the left of the screen. It shows the entries of the current directory on localhost.
- **Remote explorer panel**: displayed on the right of the screen. It shows the entries of the current directory on the remote host.
- **Find results panel**: shown after you search for files. Depending on where you searched (local or remote), it replaces the local explorer panel or the remote explorer panel and lists the entries matching your search query.
## Switching between panels
Use the following keys to move between panels.
- `<LEFT>`: move to the local explorer panel.
- `<RIGHT>`: move to the remote explorer panel.
- `<TAB>`: switch the active explorer tab.
- `<ESC>`: while in the find results panel, exit it and return to the previous panel.
For the complete list of keys available in the explorer, see [Keyboard shortcuts](keyboard-shortcuts.md).
+29
View File
@@ -0,0 +1,29 @@
# Keeping files in sync
The file watcher synchronizes local paths to a remote path. When a change is detected on a watched local path, it is propagated to the configured remote path within about 5 seconds.
You can watch as many paths as you like.
## Watching a path
1. Put the cursor on the local explorer, on the file or directory you want to keep synchronized.
2. In the remote panel, navigate to the directory where the changes should be reported.
3. Press `<T>`.
4. Answer `<YES>` to the popup.
## Unwatching a path
You can stop watching a path in two ways:
- Press `<T>` on the watched local path (or any of its subfolders).
- Press `<CTRL+T>`, then press `<ENTER>` on the path you want to unwatch.
## Propagated changes
The following changes are reported to the remote host:
- New files and file changes
- Files moved or renamed
- Files removed or unlinked
The watcher works in one direction only (local to remote). Changes made on the remote host are **not** synchronized back to the local host.
+49
View File
@@ -0,0 +1,49 @@
# Keyboard shortcuts
The following keys are available in the file explorer. Press `<H|F1>` at any time to open the in-app help.
| Key | Action |
| -------------- | ---------------------------------------------------------------------- |
| `<ESC>` | Disconnect from the remote and return to the authentication page |
| `<BACKSPACE>` | Go to the previous directory in the navigation stack |
| `<TAB>` | Switch the active explorer tab |
| `<RIGHT>` | Move to the remote explorer tab |
| `<LEFT>` | Move to the local explorer tab |
| `<UP>` | Move up in the selected list |
| `<DOWN>` | Move down in the selected list |
| `<PGUP>` | Move up in the selected list by 8 rows |
| `<PGDOWN>` | Move down in the selected list by 8 rows |
| `<ENTER>` | Enter the selected directory |
| `<SPACE>` | Upload or download the selected file |
| `<BACKTAB>` | Switch between the log tab and the explorer |
| `<A>` | Toggle the display of hidden files |
| `<B>` | Choose how files are sorted |
| `<C\|F5>` | Copy the selected file or directory |
| `<D\|F7>` | Make a new directory |
| `<E\|F8\|DEL>` | Delete the selected file |
| `<F>` | Search for files (wildcard matching is supported) |
| `<G>` | Go to the supplied path |
| `<H\|F1>` | Show the help |
| `<I>` | Show information about the selected file or directory |
| `<K>` | Create a symlink pointing to the currently selected entry |
| `<L>` | Reload the current directory's content, or clear the current selection |
| `<M>` | Select a file |
| `<N>` | Create a new file with the provided name |
| `<O\|F4>` | Edit the selected file in your text editor |
| `<P>` | Open the log panel |
| `<Q\|F10>` | Quit termscp |
| `<R\|F6>` | Rename the selected file |
| `<S\|F2>` | Save the selected file as a new name |
| `<T>` | Synchronize changes on the selected path to the remote |
| `<U>` | Go to the parent directory |
| `<V\|F3>` | Open the selected file with the default program for its file type |
| `<W>` | Open the selected file with a program you specify |
| `<X>` | Execute a command |
| `<Y>` | Toggle synchronized browsing |
| `<Z>` | Change the file mode |
| `</>` | Filter files (both regex and wildcard matching are supported) |
| `<CTRL+A>` | Select all files |
| `<ALT+A>` | Deselect all files |
| `<CTRL+C>` | Abort the file transfer process |
| `<CTRL+S>` | Get the total size of the selected path |
| `<CTRL+T>` | Show all synchronized paths |
+32
View File
@@ -0,0 +1,32 @@
# Working with multiple files
termscp lets you act on several files at once. Use these controls to build a selection.
- `<M>`: mark the highlighted file for selection.
- `<CTRL+A>`: select all files in the current directory.
- `<ALT+A>`: deselect all files.
Once a file is marked for selection, it is displayed with a highlighted background.
When a selection exists, only the selected files are processed for actions; the currently highlighted item is ignored. You can also work on multiple files while in the find results panel.
## Actions on a selection
All actions are available when working with multiple files, but some behave slightly differently. With a selection, the name you enter refers to the destination directory rather than a single destination file.
- **Copy**: you are prompted for a destination. With multiple files selected, this name is the destination directory where all the files are copied.
- **Rename**: same as copy, but the files are moved to the destination directory.
- **Save as**: same as copy, but the files are written to the destination directory.
## The transfer queue
If you select a file in a directory (for example `/home`) and then change directory, the file stays selected and is shown in the **transfer queue** in the bottom panel.
When a file is selected, the remote directory active at that moment is associated with its entry. If the file is later transferred, it is transferred to the remote directory associated with it.
### Example
Suppose you select the local file `/home/a.txt` while the remote panel is at `/tmp`, then you move to `/var`, select `/var/b.txt` while the remote panel is at `/home`, and finally perform a transfer. The result is:
- `/home/a.txt` is transferred to `/tmp/a.txt`
- `/var/b.txt` is transferred to `/home/b.txt`
+24
View File
@@ -0,0 +1,24 @@
# Opening and editing files
termscp can open files with an external application and edit text files in your configured editor. Both local and remote files are supported.
## Open and Open With
Press `<V>` to open a file with the system default application for its file type. termscp relies on your operating system's default opener (powered by the [open](https://docs.rs/crate/open/1.7.0) crate), so make sure at least one of the following is available on your system.
- **Windows**: handled automatically through the `start` command.
- **macOS**: handled automatically through `open`, which is already installed.
- **Linux**: one of `xdg-open`, `gio`, `gnome-open`, or `kde-open` must be installed.
- **WSL**: `wslview` is required. Install [wslu](https://github.com/wslutilities/wslu).
Press `<W>` to open a file with a program you specify.
## Editing text files
Press `<O>` to open a file in your configured text editor. Only text files are supported; binary files are not.
If the file is located on the remote host, it is first downloaded into your temporary file directory, and then re-uploaded to the remote host **only** if you changed it. termscp detects changes by checking the file's last modification time.
## Editing remote files
You cannot edit a remote file in place directly from the remote panel. When you open a remote file, it is downloaded into a temporary directory, but termscp cannot create a watcher to detect when the external program you used to open it has closed, so it cannot tell when you are done editing. To edit a remote file, download it to a local directory first, edit it there, and then upload it again.
+5
View File
@@ -0,0 +1,5 @@
# Synchronized browsing
Synchronized browsing keeps navigation in sync between the two explorer panels. While it is enabled, whenever you change the working directory in one panel, the same change is reproduced in the other panel.
To enable synchronized browsing, press `<Y>`. Press `<Y>` again to disable it. While it is enabled, the status bar reports the synchronized browsing state as `ON`.
+28
View File
@@ -0,0 +1,28 @@
Termscp is a feature rich terminal file transfer and explorer, with support for SCP/SFTP/FTP/Kube/S3/WebDAV.
Basically is a terminal utility with an TUI to connect to a remote server to retrieve and upload files and
to interact with the local file system.
Features:
- 📁 Different communication protocols
- SFTP
- SCP
- FTP and FTPS
- S3
- 🖥 Explore and operate on the remote and on the local machine file system with a handy UI
- Create, remove, rename, search, view and edit files
- ⭐ Connect to your favourite hosts through built-in bookmarks and recent connections
- 📝 View and edit files with your favourite applications
- 💁 SFTP/SCP authentication with SSH keys and username/password
- 🐧 Compatible with Windows, Linux, FreeBSD and MacOS
- 🎨 Make it yours!
- Themes
- Custom file explorer format
- Customizable text editor
- Customizable file sorting
- and many other parameters...
- 📫 Get notified via Desktop Notifications when a large file has been transferred
- 🔐 Save your password in your operating system key vault
- 🦀 Rust-powered
- 👀 Developed keeping an eye on performance
- 🦄 Frequent awesome updates
Binary file not shown.

After

Width:  |  Height:  |  Size: 879 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

+47
View File
@@ -0,0 +1,47 @@
// Injects a language toggle (EN / 中文) into the mdBook menu bar.
// Swaps the leading /en-US/ <-> /zh-CN/ path segment, preserving the
// rest of the path; falls back to the language root on 404 navigation.
(function () {
const LANGS = [
{ code: "en-US", label: "EN" },
{ code: "zh-CN", label: "中文" },
];
function currentLang() {
const m = window.location.pathname.match(/\/(en-US|zh-CN)\//);
return m ? m[1] : "en-US";
}
function swapTo(code) {
const path = window.location.pathname;
const cur = currentLang();
if (path.includes(`/${cur}/`)) {
return path.replace(`/${cur}/`, `/${code}/`);
}
return `/${code}/`;
}
function build() {
const right = document.querySelector(".right-buttons");
if (!right) return;
const cur = currentLang();
const wrap = document.createElement("div");
wrap.className = "lang-switcher";
wrap.style.display = "inline-flex";
wrap.style.gap = "0.5rem";
wrap.style.marginInlineStart = "0.5rem";
LANGS.forEach((l) => {
const a = document.createElement("a");
a.textContent = l.label;
a.href = swapTo(l.code);
a.title = l.code;
a.setAttribute("aria-current", l.code === cur ? "true" : "false");
if (l.code === cur) a.style.fontWeight = "bold";
wrap.appendChild(a);
});
right.appendChild(wrap);
}
if (document.readyState !== "loading") build();
else document.addEventListener("DOMContentLoaded", build);
})();
Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500"><circle style="fill:#31363b" cx="250" cy="250" r="250"/><circle style="fill:#ea4444" cx="225" cy="40" r="7.344"/><circle style="fill:#eac944" cx="58.177" cy="22.745" r="7.344" transform="matrix(1, 0, 0, 1.031863, 191.822998, 16.530386)"/><circle style="fill:#34b938" cx="57.564" cy="22.269" r="7.344" transform="matrix(1, 0, 0, 1.031863, 217.43605, 17.021263)"/><polygon style="stroke:#000;fill:#f0f0f0" points="83.462 135.575 200 252.112 87.687 364.425 48.108 324.846 122.07 250.881 45.738 174.55"/><g transform="matrix(0.408921, 0, 0, 0.408921, 241.338654, 169.687912)"><polygon style="fill:#f0f0f0" points="196.4 0 292 49.2 388 98 292 147.2 196.4 196.4 100.8 147.2 4.8 98 100.8 49.2"/><polygon style="fill:#31363b" points="316 179.6 316 135.2 268 159.6 268 204 294.4 171.6"/><polygon style="fill:#f0f0f0" points="196.4 196.4 196.4 392.8 388 294.8 388 98 316 135.2 314.4 136 314.4 179.2 294.4 171.6 268 204 268 159.6"/><polygon style="fill:#f0f0f0" points="196.4 392.8 196.4 196.4 100.8 147.2 4.8 98 4.8 294.8"/><polygon style="fill:#31363b" points="76.8 61.2 268 159.6 314.4 136 316 135.2 124.8 36.8 100.8 49.2"/></g><rect style="fill:#f0f0f0" width="200" height="35.702" x="222.229" y="364.298" rx="10" ry="10"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+231
View File
@@ -0,0 +1,231 @@
# termscp
<p align="center">
<img src="/assets/images/termscp.svg" alt="termscp logo" width="256" height="256" />
</p>
<p align="center">~ 功能丰富的终端文件传输工具 ~</p>
<p align="center">
<a href="https://termscp.rs" target="_blank">网站</a>
·
<a href="https://termscp.rs/install" target="_blank">安装</a>
·
<a href="https://docs.termscp.rs" target="_blank">用户手册</a>
</p>
<p align="center">
<a
href="https://github.com/veeso/termscp/blob/main/README.md"
><img
height="20"
src="/assets/images/flags/gb.png"
alt="English"
/></a>
</p>
<p align="center">由 <a href="https://veeso.me/" target="_blank">@veeso</a> 开发</p>
[![License-MIT](https://img.shields.io/crates/l/termscp.svg?logo=rust)](https://opensource.org/licenses/MIT)
[![Repostars](https://img.shields.io/github/stars/veeso/termscp?style=flat&logo=github)](https://github.com/veeso/termscp/stargazers)
[![Downloadscounter](https://img.shields.io/crates/d/termscp.svg?logo=rust)](https://crates.io/crates/termscp)
[![Latest version](https://img.shields.io/crates/v/termscp.svg?logo=rust)](https://crates.io/crates/termscp)
[![CI](https://github.com/veeso/termscp/workflows/CI/badge.svg?logo=github)](https://github.com/veeso/termscp/actions/workflows/ci.yml)
---
## 关于 termscp 🖥
termscp 是一个功能丰富的终端文件浏览和传输工具,支持 SCP/SFTP/FTP/Kube/S3/WebDAV。 简而言之,它是一个带有 TUI 的终端工具,可以连接到远程服务器进行文件的检索和上传,并能够与本地文件系统进行交互。 它兼容 **Linux**、**MacOS**、**FreeBSD**、**NetBSD** 和 **Windows** 操作系统。
![Explorer](assets/images/explorer.gif)
---
## 特性 🎁
- 📁 支持多种通信协议
- **SFTP**
- **SCP**
- **FTP** 和 **FTPS**
- **Kube**
- **S3**
- **SMB**
- **WebDAV**
- 🖥 使用便捷的 UI 在远程和本地文件系统上浏览和操作
- 创建、删除、重命名、搜索、查看和编辑文件
- ⭐ 通过“内置书签”和“最近连接”快速连接到您喜爱的主机
- 📝 使用您喜欢的应用程序查看和编辑文件
- 💁 使用 SSH 密钥和用户名/密码进行 SFTP/SCP 身份验证
- 🐧 兼容 Windows、Linux、FreeBSD、NetBSD 和 MacOS 操作系统
- 🐚 内置终端,可在系统上执行命令。
- 🎨 丰富的个性化设置!
- 主题
- 自定义文件浏览器格式
- 可自定义的文本编辑器
- 可自定义的文件排序
- 以及许多其他参数...
- 📫 传输大文件时通过桌面通知获得提醒
- 🔭 与远程主机文件更改保持同步
- 🔐 将密码保存在操作系统密钥保管库中
- 🦀 由 Rust 提供强力支持
- 👀 开发时更注重性能
- 🦄 频繁的精彩更新
---
## 开始 🚀
如果您正在考虑安装 termscp,我想对您表示感谢 💜 ! 希望您会喜欢 termscp!
如果您想为此项目做出贡献,请不要忘记查看我们的[贡献指南](CONTRIBUTING.md)。
如果您是 Linux、FreeBSD 或 MacOS 用户,使用以下简单的 shell 脚本即可通过单行指令在您的系统上安装 termscp:
```sh
curl --proto '=https' --tlsv1.2 -sSLf https://termscp.rs/install.sh | sh
```
> ❗ MacOS 安装需要 [Homebrew](https://brew.sh/),否则将会安装 Rust 编译器
如果您是 Windows 用户,则可以在 PowerShell 中通过单行指令安装 termscp:
```ps
irm https://termscp.rs/install.ps1 | iex
```
或者,使用 [Chocolatey](https://chocolatey.org/)
```ps
choco install termscp
```
NetBSD 用户可以从官方仓库安装 termscp。
```sh
pkgin install termscp
```
Arch Linux 用户可以从官方仓库安装 termscp。
```sh
pacman -S termscp
```
如需更多信息或其他平台支持,请访问 [termscp.rs](https://termscp.rs/install) 查看所有安装方法。
⚠️ 如果您想了解如何更新 termscp,只需从 CLI 运行 termscp `(sudo) termscp update` ⚠️
### 依赖 ❗
- **Linux** 用户:
- libdbus-1
- pkg-config
- libsmbclient
- **FreeBSD** 或 **NetBSD** 用户:
- dbus
- pkgconf
- libsmbclient
### 可选依赖 ✔️
这些依赖并非运行 termscp 的强制要求,但有助于享受其全部功能
- **Linux/FreeBSD** 用户:
-`V` **打开**文件(至少其中之一)
- *xdg-open*
- *gio*
- *gnome-open*
- *kde-open*
- **Linux** 用户:
- 密钥环管理器:在[用户手册](https://docs.termscp.rs/zh-CN/configuration/password-security.html#linux-密钥环)中阅读更多内容
- **WSL** 用户
-`V` **打开**文件(至少其中之一)
- [wslu](https://github.com/wslutilities/wslu)
---
## 支持开发者 ☕
如果您喜欢 termscp 并且感激我所做的工作,请考虑给予一点捐赠 🥳
您可以通过以下平台之一进行捐赠:
[![ko-fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/veeso)
[![PayPal](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://www.paypal.me/chrisintin)
---
## 用户手册 📚
用户手册可以在 [termscp 文档网站](https://docs.termscp.rs)上找到。
---
## 即将推出的功能 🧪
请查看 [Milestones](https://github.com/veeso/termscp/milestones)
---
## 贡献和问题 🤝🏻
欢迎贡献、bug 报告、新功能和问题! 😉
如果您有任何问题或困惑,或者想建议新功能,或者只是想改进 termscp,请随时打开 issue 或 PR。
一个**值得赞赏**的贡献是将用户手册和 README 翻译成**其他语言**
请遵循[我们的贡献指南](CONTRIBUTING.md)
---
## 更新日志 ⏳
查看 termscp 的更新日志[点此](CHANGELOG.md)
---
## 支持 💪
termscp 由这些很棒的项目提供支持:
- [bytesize](https://github.com/hyunsik/bytesize)
- [crossterm](https://github.com/crossterm-rs/crossterm)
- [edit](https://github.com/milkey-mouse/edit)
- [keyring-rs](https://github.com/hwchen/keyring-rs)
- [kube](https://github.com/kube-rs/kube)
- [open-rs](https://github.com/Byron/open-rs)
- [pavao](https://github.com/veeso/pavao)
- [remotefs](https://github.com/veeso/remotefs-rs)
- [rpassword](https://github.com/conradkleinespel/rpassword)
- [self_update](https://github.com/jaemk/self_update)
- [ratatui](https://github.com/ratatui-org/ratatui)
- [tui-realm](https://github.com/veeso/tui-realm)
- [whoami](https://github.com/libcala/whoami)
- [wildmatch](https://github.com/becheran/wildmatch)
---
## 演示 🎬
> termscp 首页
![Auth](assets/images/auth.gif)
> 书签
![Bookmarks](assets/images/bookmarks.gif)
> 设置
![Setup](assets/images/config.gif)
> 文本编辑器
![TextEditor](assets/images/text-editor.gif)
---
## 许可协议 📃
termscp 使用 MIT 许可证授权。
您可以阅读完整的[许可证](LICENSE)
+37
View File
@@ -0,0 +1,37 @@
# 目录
[简介](index.md)
# 入门
- [安装](getting-started/installation.md)
- [连接到服务器](getting-started/connecting.md)
- [连接参数](getting-started/connection-parameters.md)
# 使用 termscp
- [文件浏览器](usage/file-explorer.md)
- [键盘快捷键](usage/keyboard-shortcuts.md)
- [批量操作文件](usage/multiple-files.md)
- [同步浏览](usage/synced-browsing.md)
- [打开与编辑文件](usage/open-edit-files.md)
- [书签与最近主机](usage/bookmarks.md)
- [保持文件同步](usage/file-watcher.md)
# 配置
- [配置](configuration/configuration.md)
- [文件浏览器格式](configuration/explorer-format.md)
- [SSH 密钥存储](configuration/ssh-keys.md)
- [主题](configuration/themes.md)
- [通知](configuration/notifications.md)
- [日志](configuration/logging.md)
- [密码安全](configuration/password-security.md)
# 命令行参考
- [命令行用法](cli/cli.md)
# 开发者
- [开发者手册](developer/developer.md)

Some files were not shown because too many files have changed in this diff Show More