Skip to content

Releases: jalexiscv/vscode-sftp

v1.30.2

Choose a tag to compare

@jalexiscv jalexiscv released this 15 Oct 08:41
  • New Feature : Published on the Visual Studio Marketplace as SFTP Forge — the fork is now installable and updated from the Marketplace: https://marketplace.visualstudio.com/items?itemName=jalexiscv.sftp-forge. The display name "SFTP" is taken there, so the extension is renamed SFTP Forge and its id becomes jalexiscv.sftp-forge (the manifest name goes from sftp to sftp-forge). Settings, commands, views and the sftp.json format keep their sftp.* names: nothing has to be reconfigured. Install it with code --install-extension jalexiscv.sftp-forge; the vsix attached to the GitHub releases is now sftp-forge-<version>.vsix.
  • New Feature : The earlier build retires itself — for VS Code a new id is another extension, so the 1.30.1 build (jalexiscv.sftp, distributed as vsix only) would stay installed next to SFTP Forge, both registering the same commands. On activation SFTP Forge uninstalls jalexiscv.sftp when it is there and offers Reload Window; when the uninstall fails, a warning says to remove it from the Extensions view. The output channel logs [legacy] ….
  • Changed : the READMEs (six languages) point to the Marketplace as the recommended install, with its version and installs badges; installing from a vsix is kept as the manual way.
  • Quality : Test suite grows from 971 to 979 tests (the old build absent, uninstalled with and without reload, a failed uninstall, the old build running the code, an unknown id, extensionIdOf).

v1.30.1

Choose a tag to compare

@jalexiscv jalexiscv released this 06 Oct 13:36
  • Fix : A refused FTPS certificate is a failure of the connection, told with the way out — the TLS layer refuses a server certificate whose chain is incomplete (unable to verify the first certificate: the server sends its leaf without the intermediate, and node never fetches one on its own), self-signed, expired or issued for another name, before any file is transferred. That failure was treated as the failure of each file: the item was marked failed in the plan and the index, every save reconnected at once, and each failure opened a dialog with the bare OpenSSL error and node's hint about --use-system-ca, which nothing in an extension can act on — the cascade 1.28.0 had removed for network errors. A refused certificate (UNABLE_TO_VERIFY_LEAF_SIGNATURE, SELF_SIGNED_CERT_IN_CHAIN, DEPTH_ZERO_SELF_SIGNED_CERT, CERT_HAS_EXPIRED, ERR_TLS_CERT_ALTNAME_INVALID…, by code or by message) is now a failure of the connection: the plan's items go on hold, the index is left alone, the connection gate holds new attempts for a minute at least (a retry does not fix a certificate), and one notice per server says what is wrong and what to do — SFTP: host: certificate rejected: unable to verify the first certificate (UNABLE_TO_VERIFY_LEAF_SIGNATURE). N upload(s) of server are on hold until the certificate or the configuration is fixed. Have the server send its complete certificate chain, issued for this host name, or accept the certificate unverified with "secureOptions": { "rejectUnauthorized": false } in sftp.json. A command (Upload Folder, Sync…) holds and resumes the same way and ends, when its resumes run out, with Could not upload (certificate rejected: …) and the same hint. The output channel logs [connection] host: certificate rejected: … once per attempt.
  • Changed : the one-line reason of a lost or failed connection — in the on hold: … of plan items, the output channel and the notices — is built in one place (connectionFailureReason): the message with its code appended when the message lost it, as the connection gate already did; a connection on hold is quoted as it is, without its ECONNHOLD bookkeeping code.
  • Quality : Test suite grows from 957 to 971 tests (the certificate codes and messages as connection failures, with the negatives; the one-line description without node's hint; CertificateRejectedError; the minute-long hold for the wrapped and the bare error; the reason of a hold error and of a coded error; a refused connect told with the host and held, and a corrected configuration as another identity; a plan on hold with its single notice; a command held, resumed and reported with the hint).

v1.30.0

Choose a tag to compare

@jalexiscv jalexiscv released this 06 Oct 03:24

Feature release.

  • The extension offers its own updates from the GitHub releases — VS Code updates on its own only the extensions that come from the Marketplace; one installed from a vsix stayed as it was for ever. Now, per sftp.updates.check (daily by default, startup or off), the extension asks GitHub for the latest release 15 s after activating and, when there is a newer one, offers Install, Release notes and Skip this version. Nothing is installed unless asked. Install downloads the vsix into the extension's global storage, verifies it against the .sha256 published with the release, installs it through VS Code's own Install from VSIX mechanism and offers to reload the window. Drafts and prereleases are ignored; a newer local build is never downgraded; a failed automatic check only reaches the output channel.
  • SFTP: Check for Updates — runs the check now, whatever the setting says, and answers in every case. A skipped version is still offered here.
  • Changed: every release now publishes <vsix>.sha256 next to the vsix.
  • Test suite grows from 920 to 957 tests.

Releases before 1.30.0 carry no checksum and no checker: this version still has to be installed by hand; the notice will show up from the first release published after it.

As with every new version since 1.27.0, the sync index and the activity log are discarded the first time this version activates in a workspace: seed the index again with SFTP: Mark Local Files as Uploaded or SFTP: Rebuild Sync Index.

Full details: CHANGELOG.md and documents/Changelogs (Natizyskunk#69, liximomo#70).

Install: code --install-extension sftp-1.30.0.vsix

v1.29.2

Choose a tag to compare

@jalexiscv jalexiscv released this 06 Oct 03:05

Fix release.

  • A folder command survives a lost connection — Upload Folder, Upload Project, Sync…, Download Folder and the single-file commands ended at the first lost connection: the folder walk ran ensureDir/list on the client the drop had closed, every call answered Client is closed because read ECONNRESET (data socket), and the command gave up with the rest of the tree untouched and one error dialog per selected folder. Now the command is put on hold like a plan: it waits for the connection gate (the recovery, or the gate's hold, never less than 5 s), asks for a live connection and walks the same target again, up to ten times, skipping the files it already verified and giving up, after three interruptions, a file the connection dies on every time. One warning per server and outage; [upload] path on hold: … resuming in N s (k/10, M file(s) done so far) in the output channel. When the resumes run out the command fails once for the whole run, even over several selected folders.
  • A folder selected together with one of its subfolders is walked once — every file under both used to be transferred twice at the same time.
  • Changed: a single-file command against a server that is down holds and resumes the same way instead of failing at once.
  • Test suite grows from 901 to 920 tests.

As with every new version since 1.27.0, the sync index and the activity log are discarded the first time this version activates in a workspace: seed the index again with SFTP: Mark Local Files as Uploaded or SFTP: Rebuild Sync Index.

Full details: CHANGELOG.md and documents/Changelogs (Natizyskunk#67, Natizyskunk#68).

Install: code --install-extension sftp-1.29.2.vsix

v1.29.1: archivos vacíos por FTPS

Choose a tag to compare

@jalexiscv jalexiscv released this 05 Oct 16:44

Archivos vacíos por FTPS

La v1.29.1 es una versión de corrección. Responde a un plan de subida contra un servidor FTPS (Pure-FTPd con TLS 1.3) que se caía una y otra vez con ERR_SSL_TLSV1_ALERT_DECODE_ERROR … SSL alert number 50 (data socket) y quedaba en espera sin avanzar: el archivo sobre el que caía pesaba 0 bytes.

  • Los archivos de 0 bytes vuelven a subir por FTPS. Subir un archivo vacío cerraba el socket de datos a mitad del handshake TLS; el servidor respondía con una alerta decode error (o un FIN) y se cerraba la sesión entera, en cada .gitkeep, __init__.py o salida de compilación vacía. Ahora el fin del archivo se retiene hasta que el socket de datos termina el handshake. FTP sin TLS y SFTP no estaban afectados.
  • Un archivo que tumba la conexión ya no retiene el plan. Si la conexión se pierde tres veces seguidas durante la subida del mismo archivo, ese archivo queda failed (connection lost 3 times while uploading this file: …) y el plan continúa con el resto. Ejecutar el plan a mano lo reintenta.
  • Reanudación automática. Un plan en espera que se reanuda solo ejecuta lo que estaba en espera, no los archivos que fallaron en una ejecución anterior.

Al instalarla, como en toda versión nueva desde la 1.27.0, el índice de sincronización y el registro de actividad se descartan: siembra el índice de nuevo con SFTP: Mark Local Files as Uploaded o SFTP: Rebuild Sync Index.

Suite: 901 tests (887 en la 1.29.0). Detalle en documents/Changelogs (Natizyskunk#65 y Natizyskunk#66) y en el CHANGELOG.

Instalación: descarga sftp-1.29.1.vsix y en VS Code usa "Instalar desde VSIX…", o code --install-extension sftp-1.29.1.vsix.

v1.29.0: huella de contenido

Choose a tag to compare

@jalexiscv jalexiscv released this 24 Sep 23:38

Huella de contenido: un archivo solo cuenta como modificado si cambiaron sus bytes

La v1.29.0 responde a un síntoma concreto: la extensión seguía proponiendo como "modificados" archivos cuyo contenido no había cambiado. La causa era la regla del índice de sincronización, tamaño y mtime al segundo, y el mtime se mueve por muchos motivos que no son una edición: un git checkout, stash o pull que deja el contenido idéntico, una copia o una restauración de copia de seguridad, un formateador o un paso de build que reescribe el mismo texto, un touch.

  • Huella de contenido. Cada subida verificada guarda en el índice el SHA-1 de los bytes que envió, calculado sobre el propio flujo (nada se lee dos veces); las descargas también. Un escaneo, un evento del watcher, un sondeo o una vista previa que encuentra un archivo con el mismo tamaño y otro mtime lo lee una vez, compara la huella y, si coincide, lo deja en paz y mueve la entrada al mtime nuevo; solo bytes distintos lo hacen modified. Un tamaño distinto sigue siendo cambio sin lectura; los archivos de más de 64 MB conservan la regla anterior.
  • Siembra con huella. SFTP: Rebuild Sync Index y SFTP: Mark Local Files as Uploaded leen los archivos que registran (progreso N fingerprinted, cancelable), y Mark as uploaded y Skip en un plan hacen lo mismo con los suyos.
  • externalChanges.compareContent. Clave nueva, true por defecto. Apagada, no se lee ningún archivo ni se anota huella alguna: comportamiento idéntico a la 1.28.0.
  • Índices existentes. Las entradas anteriores no tienen huella y siguen la regla vieja hasta que una subida, un rebuild o un dar por subido se la anoten. Para cubrir de golpe un proyecto ya sincronizado, ejecuta una vez SFTP: Mark Local Files as Uploaded (o Rebuild Sync Index) por servidor.

Suite: 887 tests (859 en la 1.28.0). Detalle en documents/Changelogs (Natizyskunk#63 y Natizyskunk#64) y en el CHANGELOG.

Instalación: descarga sftp-1.29.0.vsix y en VS Code usa "Instalar desde VSIX…", o code --install-extension sftp-1.29.0.vsix.

v1.28.0

Choose a tag to compare

@jalexiscv jalexiscv released this 24 Sep 18:01

Resilient connections

This release answers three symptoms of an unstable connection: the cascade of retries that followed an ECONNRESET, "changes" detected in files nobody had edited, and too many simultaneous FTP connections.

  • Uploads on hold, not failed. A lost connection (ECONNRESET, ETIMEDOUT, ENOTFOUND, EPIPE, "Not connected", "Client is closed", FTP 421, SFTP status 6/7…) is recognised as such in every layer at once. The interrupted upload and the ones still queued go back to pending with on hold: <reason>, the plan stays open, the sync index is not touched, and you get one warning per server and outage instead of a dialog per file. Commands report it once, with what was done, interrupted and not attempted. An FTP 426 data-connection abort is still retried as before.
  • Reconnection with a growing delay. Each connection remembers its failed attempts and holds new ones for 1 s, 2 s, 4 s… up to a minute (a minute at least after a 421 Too many connections); meanwhile nothing opens a socket. When the connection is back, the plans on hold resume on their own; failing that, they retry with that delay up to ten times and then wait in the Activity view.
  • Fewer FTP connections. An FTP connection idle for five minutes is closed and reopened by the next use; a command that dies with the socket reports the drop at once; switching profiles closes the previous profile's connection; a late close of a dead SSH client no longer tears down its replacement; the SSH connection error keeps its code.
  • Fewer false changes. .git, .svn and .hg are ignored by default at any depth (negate with "!.git" in ignore), and a watcher or save event on a file whose size and mtime (to the second) are the ones the index verified is not planned.

Docs: Connection loss and reconnection, FAQ entries for uploads "on hold" and 421 Too many connections. Test suite 786 → 859.

Full Changelog: v1.27.0...v1.28.0

v1.27.0

Choose a tag to compare

@jalexiscv jalexiscv released this 15 Sep 07:05

Born from a real project of more than 90,000 files that the extension left with 90,000 uploads pending and the extension host crawling.

  • A limit per upload plan — externalChanges.maxPlanItems (2000 by default, 0 for no limit). A scan, a polling tick or a watcher burst above it is not turned into a plan: a warning states the count and offers Mark all as uploaded and Manage upload exclusions; the automatic scans of that connection stay off until a manual scan, an index rebuild, a mark-as-uploaded or a reload of sftp.json. The collector drops such a burst before stat-ing a single file.
  • Paginated plan items in the Activity view: 200 per page and a N more file(s)… row.
  • Sync index saves are held while a plan runs (once a minute instead of once a second) and released when it ends.
  • Clean storage per version: the sync indexes and the activity log of the previous version are discarded the first time a new version activates in a workspace. The index starts empty and the notice to seed or rebuild it comes back, as on first use.

Test suite: 757 → 786. Details in CHANGELOG.md and docs/common_configuration.md#externalchangesmaxplanitems.

Full Changelog: v1.26.0...v1.27.0

v1.26.0

Choose a tag to compare

@jalexiscv jalexiscv released this 14 Sep 02:58

What's new

  • Mark as uploaded — the confirmation dialog of any upload plan gains a fourth button, Mark as uploaded: the files are recorded in the sync index as being on the server already, in their current version, without transferring anything, and are not proposed again until they change. Also per plan (Mark Plan as Uploaded) and per file (Mark as Uploaded) in the Activity view; items settled this way get their own assumed status, told apart from verified.
  • SFTP: Mark Local Files as Uploaded — seeds the sync index from the local tree alone, without listing the server: the way out when a scan finds tens of thousands of files the extension never uploaded itself (a site mirrored by hand or with uploadOnSave for years). Offered as Mark all as uploaded on the unbuilt-index notice too.
  • Upload exclusions edited from the interface — right-click a folder → SFTP: Exclude from Upload / SFTP: Include in Upload Again, SFTP: Manage Upload Exclusions, and a list with × in the Connection Manager. All of them write the uploadExclude list of sftp.json, keeping its formatting.
  • Security — the config at … line of the output channel no longer logs the password of each profile in clear text. If you shared a log of an earlier version that had profiles, rotate those passwords.

Test suite: 757 tests. Full details in CHANGELOG.md.

Install: code --install-extension sftp-1.26.0.vsix

Full Changelog: v1.25.0...v1.26.0

v1.25.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 18:00

Full Changelog: v1.24.0...v1.25.0