Repository navigation
Releases: jalexiscv/vscode-sftp
Release list
v1.30.2
- 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 manifestnamegoes fromsftptosftp-forge). Settings, commands, views and thesftp.jsonformat keep theirsftp.*names: nothing has to be reconfigured. Install it withcode --install-extension jalexiscv.sftp-forge; the vsix attached to the GitHub releases is nowsftp-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 uninstallsjalexiscv.sftpwhen it is there and offersReload 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
- 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 markedfailedin 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, withCould 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 itsECONNHOLDbookkeeping 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 refusedconnecttold 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
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(dailyby default,startuporoff), the extension asks GitHub for the latest release 15 s after activating and, when there is a newer one, offersInstall,Release notesandSkip this version. Nothing is installed unless asked.Installdownloads the vsix into the extension's global storage, verifies it against the.sha256published 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>.sha256next 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
Fix release.
- A folder command survives a lost connection —
Upload Folder,Upload Project,Sync…,Download Folderand the single-file commands ended at the first lost connection: the folder walk ranensureDir/liston the client the drop had closed, every call answeredClient 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
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__.pyo 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
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 IndexySFTP: Mark Local Files as Uploadedleen los archivos que registran (progresoN fingerprinted, cancelable), yMark as uploadedySkipen un plan hacen lo mismo con los suyos. externalChanges.compareContent. Clave nueva,truepor 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(oRebuild 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
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", FTP421, SFTP status 6/7…) is recognised as such in every layer at once. The interrupted upload and the ones still queued go back topendingwithon 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 FTP426data-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
closeof a dead SSH client no longer tears down its replacement; the SSH connection error keeps itscode. - Fewer false changes.
.git,.svnand.hgare ignored by default at any depth (negate with"!.git"inignore), 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
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,0for 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 offersMark all as uploadedandManage upload exclusions; the automatic scans of that connection stay off until a manual scan, an index rebuild, a mark-as-uploaded or a reload ofsftp.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
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 ownassumedstatus, told apart fromverified. 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 withuploadOnSavefor years). Offered asMark all as uploadedon 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 theuploadExcludelist ofsftp.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