Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c7f1d854bd | ||
|
|
f877dfed4e | ||
|
|
4ba01b05a1 | ||
|
|
14c4ad3af2 | ||
|
|
08036b1d87 |
@@ -21,7 +21,6 @@ jobs:
|
|||||||
name: Build and push Docker images
|
name: Build and push Docker images
|
||||||
if: github.repository_owner == 'syncthing'
|
if: github.repository_owner == 'syncthing'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: docker
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
pkg:
|
pkg:
|
||||||
|
|||||||
@@ -9,6 +9,11 @@ on:
|
|||||||
workflow_call:
|
workflow_call:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
pull-requests: read
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# The go version to use for builds. We set check-latest to true when
|
# The go version to use for builds. We set check-latest to true when
|
||||||
# installing, so we get the latest patch version that matches the
|
# installing, so we get the latest patch version that matches the
|
||||||
@@ -229,7 +234,6 @@ jobs:
|
|||||||
codesign-windows:
|
codesign-windows:
|
||||||
name: Codesign for Windows
|
name: Codesign for Windows
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
needs:
|
needs:
|
||||||
- package-windows
|
- package-windows
|
||||||
@@ -402,7 +406,6 @@ jobs:
|
|||||||
package-macos:
|
package-macos:
|
||||||
name: Package for macOS
|
name: Package for macOS
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
needs:
|
needs:
|
||||||
- facts
|
- facts
|
||||||
@@ -500,7 +503,6 @@ jobs:
|
|||||||
notarize-macos:
|
notarize-macos:
|
||||||
name: Notarize for macOS
|
name: Notarize for macOS
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
needs:
|
needs:
|
||||||
- package-macos
|
- package-macos
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
@@ -641,7 +643,6 @@ jobs:
|
|||||||
sign-for-upgrade:
|
sign-for-upgrade:
|
||||||
name: Sign for upgrade
|
name: Sign for upgrade
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
needs:
|
needs:
|
||||||
- codesign-windows
|
- codesign-windows
|
||||||
- package-linux
|
- package-linux
|
||||||
@@ -788,7 +789,6 @@ jobs:
|
|||||||
publish-nightly:
|
publish-nightly:
|
||||||
name: Publish nightly build
|
name: Publish nightly build
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && startsWith(github.ref, 'refs/heads/release-nightly')
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && startsWith(github.ref, 'refs/heads/release-nightly')
|
||||||
environment: release
|
|
||||||
needs:
|
needs:
|
||||||
- sign-for-upgrade
|
- sign-for-upgrade
|
||||||
- facts
|
- facts
|
||||||
@@ -837,7 +837,6 @@ jobs:
|
|||||||
publish-release-files:
|
publish-release-files:
|
||||||
name: Publish release files
|
name: Publish release files
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
id-token: write
|
id-token: write
|
||||||
@@ -948,7 +947,6 @@ jobs:
|
|||||||
publish-apt:
|
publish-apt:
|
||||||
name: Publish APT
|
name: Publish APT
|
||||||
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
|
||||||
environment: release
|
|
||||||
needs:
|
needs:
|
||||||
- package-debian
|
- package-debian
|
||||||
- facts
|
- facts
|
||||||
@@ -1020,6 +1018,7 @@ jobs:
|
|||||||
VERSION: ${{ needs.facts.outputs.version }}
|
VERSION: ${{ needs.facts.outputs.version }}
|
||||||
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
|
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
pkg:
|
pkg:
|
||||||
- syncthing
|
- syncthing
|
||||||
@@ -1138,7 +1137,6 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
- docker-ghcr
|
- docker-ghcr
|
||||||
environment: docker
|
|
||||||
env:
|
env:
|
||||||
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ name: Mirrors
|
|||||||
|
|
||||||
on: [push, delete]
|
on: [push, delete]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
codeberg:
|
codeberg:
|
||||||
name: Mirror to Codeberg
|
name: Mirror to Codeberg
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ jobs:
|
|||||||
name: Create release tag
|
name: Create release tag
|
||||||
if: github.repository_owner == 'syncthing'
|
if: github.repository_owner == 'syncthing'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: release
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ on:
|
|||||||
# Run nightly build at 01:00 UTC
|
# Run nightly build at 01:00 UTC
|
||||||
- cron: '00 01 * * *'
|
- cron: '00 01 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
trigger-nightly:
|
trigger-nightly:
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: '42 3 * * 1'
|
- cron: '42 3 * * 1'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
update_transifex_docs:
|
update_transifex_docs:
|
||||||
|
|||||||
@@ -111,7 +111,9 @@ replace github.com/gobwas/glob v0.2.3 => github.com/calmh/glob v0.0.0-2022061508
|
|||||||
replace github.com/jackpal/gateway v1.1.1 => github.com/marbens-arch/gateway v1.1.2-0.20260308173556-c567cc04e7d4
|
replace github.com/jackpal/gateway v1.1.1 => github.com/marbens-arch/gateway v1.1.2-0.20260308173556-c567cc04e7d4
|
||||||
|
|
||||||
// https://github.com/mattn/go-sqlite3/pull/1338
|
// https://github.com/mattn/go-sqlite3/pull/1338
|
||||||
replace github.com/mattn/go-sqlite3 v1.14.44 => github.com/calmh/go-sqlite3 v1.14.35-0.20260509063420-822b4765116d
|
// https://github.com/mattn/go-sqlite3/pull/1399
|
||||||
|
// https://github.com/mattn/go-sqlite3/pull/1400
|
||||||
|
replace github.com/mattn/go-sqlite3 v1.14.44 => github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65
|
||||||
|
|
||||||
tool (
|
tool (
|
||||||
github.com/calmh/xdr/cmd/genxdr
|
github.com/calmh/xdr/cmd/genxdr
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
|||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b h1:Fjm4GuJ+TGMgqfGHN42IQArJb77CfD/mAwLbDUoJe6g=
|
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b h1:Fjm4GuJ+TGMgqfGHN42IQArJb77CfD/mAwLbDUoJe6g=
|
||||||
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b/go.mod h1:91K7jfEsgJSyfSrX+gmrRfZMtntx6JsHolWubGXDopg=
|
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b/go.mod h1:91K7jfEsgJSyfSrX+gmrRfZMtntx6JsHolWubGXDopg=
|
||||||
github.com/calmh/go-sqlite3 v1.14.35-0.20260509063420-822b4765116d h1:liVtRMlDBqDyR4qKkMRIFTdUK6+aoG6Oh97DKnhrCHc=
|
github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65 h1:4tbv1D+AkdxV4si6cdT3+8lr/c/gJqBdW6yGi8I7z3E=
|
||||||
github.com/calmh/go-sqlite3 v1.14.35-0.20260509063420-822b4765116d/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
|
github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
|
||||||
github.com/calmh/incontainer v1.0.0 h1:g2cTUtZuFGmMGX8GoykPkN1Judj2uw8/3/aEtq4Z/rg=
|
github.com/calmh/incontainer v1.0.0 h1:g2cTUtZuFGmMGX8GoykPkN1Judj2uw8/3/aEtq4Z/rg=
|
||||||
github.com/calmh/incontainer v1.0.0/go.mod h1:eOhqnw15c9X+4RNBe0W3HlUZFfX16O0EDsCOInTndHY=
|
github.com/calmh/incontainer v1.0.0/go.mod h1:eOhqnw15c9X+4RNBe0W3HlUZFfX16O0EDsCOInTndHY=
|
||||||
github.com/calmh/xdr v1.2.0 h1:GaGSNH4ZDw9kNdYqle6+RcAENiaQ8/611Ok+jQbBEeU=
|
github.com/calmh/xdr v1.2.0 h1:GaGSNH4ZDw9kNdYqle6+RcAENiaQ8/611Ok+jQbBEeU=
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
"Automatically create or share folders that this device advertises at the default path.": "Automatiquement créer dans le chemin par défaut les partages auxquels cet appareil vous propose de participer, ou accepter leur partage s'ils pré-existent.",
|
"Automatically create or share folders that this device advertises at the default path.": "Automatiquement créer dans le chemin par défaut les partages auxquels cet appareil vous propose de participer, ou accepter leur partage s'ils pré-existent.",
|
||||||
"Available debug logging facilities:": "Outils de débogage disponibles :",
|
"Available debug logging facilities:": "Outils de débogage disponibles :",
|
||||||
"Be careful!": "Faites attention !",
|
"Be careful!": "Faites attention !",
|
||||||
"Block Indexing": "Indexation de blocs",
|
"Block Indexing": "Indexation des blocs",
|
||||||
"Body:": "Corps du message :",
|
"Body:": "Corps du message :",
|
||||||
"Bugs": "Bogues",
|
"Bugs": "Bogues",
|
||||||
"Cancel": "Annuler",
|
"Cancel": "Annuler",
|
||||||
@@ -252,7 +252,7 @@
|
|||||||
"Log tailing paused. Scroll to the bottom to continue.": "Le défilement du journal est en pause. Faites défiler jusqu'en bas pour continuer.",
|
"Log tailing paused. Scroll to the bottom to continue.": "Le défilement du journal est en pause. Faites défiler jusqu'en bas pour continuer.",
|
||||||
"Login failed, see Syncthing logs for details.": "Échec de connexion, consultez les journaux de Syncthing pour les détails.",
|
"Login failed, see Syncthing logs for details.": "Échec de connexion, consultez les journaux de Syncthing pour les détails.",
|
||||||
"Logs": "Journaux",
|
"Logs": "Journaux",
|
||||||
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Entretient un index de tous les blocs du répertoire pour permettre leur réutilisation depuis d'autres fichiers lors de changements dans la synchronisation. Désactivez pour diminuer la taille de la base de donnée, au prix de téléchargements potentiellement plus long.",
|
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Entretient un index de tous les blocs du répertoire pour permettre leur réutilisation depuis d'autres fichiers lors de changements dans la synchronisation. Désactivez pour diminuer la taille de la base de donnée, au prix de téléchargements potentiellement plus longs.",
|
||||||
"Major Upgrade": "Mise à jour majeure",
|
"Major Upgrade": "Mise à jour majeure",
|
||||||
"Mass actions": "Actions multiples",
|
"Mass actions": "Actions multiples",
|
||||||
"Maximum Age": "Ancienneté maximum",
|
"Maximum Age": "Ancienneté maximum",
|
||||||
|
|||||||
@@ -410,7 +410,7 @@
|
|||||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing ожидает подключения от других устройств на следующих сетевых адресах:",
|
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing ожидает подключения от других устройств на следующих сетевых адресах:",
|
||||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing не ожидает попыток подключения ни на каких адресах. Только исходящие подключения могут работать на этом устройстве.",
|
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing не ожидает попыток подключения ни на каких адресах. Только исходящие подключения могут работать на этом устройстве.",
|
||||||
"Syncthing is restarting.": "Перезапуск Syncthing.",
|
"Syncthing is restarting.": "Перезапуск Syncthing.",
|
||||||
"Syncthing is saving changes.": "Синхронизация это сохранение изменений.",
|
"Syncthing is saving changes.": "Syncthing сохраняет изменения.",
|
||||||
"Syncthing is upgrading.": "Обновление Syncthing.",
|
"Syncthing is upgrading.": "Обновление Syncthing.",
|
||||||
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing теперь поддерживает автоматическую отправку отчетов о сбоях разработчикам. Эта функция включена по умолчанию.",
|
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing теперь поддерживает автоматическую отправку отчетов о сбоях разработчикам. Эта функция включена по умолчанию.",
|
||||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Кажется, Syncthing не запущен или есть проблемы с подключением к Интернету. Переподключаюсь…",
|
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Кажется, Syncthing не запущен или есть проблемы с подключением к Интернету. Переподключаюсь…",
|
||||||
|
|||||||
@@ -1017,9 +1017,6 @@
|
|||||||
</div> <!-- /row -->
|
</div> <!-- /row -->
|
||||||
|
|
||||||
</div> <!-- /container -->
|
</div> <!-- /container -->
|
||||||
<footer class="container text-center text-muted small" aria-label="Custom build marker">
|
|
||||||
it syncs .stignore now!
|
|
||||||
</footer>
|
|
||||||
</div> <!-- /ng-cloak -->
|
</div> <!-- /ng-cloak -->
|
||||||
|
|
||||||
<ng-include src="'syncthing/core/networkErrorDialogView.html'"></ng-include>
|
<ng-include src="'syncthing/core/networkErrorDialogView.html'"></ng-include>
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
// Copyright (C) 2026 The Syncthing Authors.
|
|
||||||
//
|
|
||||||
// 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/.
|
|
||||||
|
|
||||||
package auto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"compress/gzip"
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
const customBuildMarker = "it syncs .stignore now!"
|
|
||||||
|
|
||||||
func TestCustomBuildMarkerIsEmbedded(t *testing.T) {
|
|
||||||
asset, ok := Assets()["default/index.html"]
|
|
||||||
if !ok {
|
|
||||||
t.Fatal("default/index.html is missing from embedded GUI assets")
|
|
||||||
}
|
|
||||||
|
|
||||||
content := asset.Content
|
|
||||||
if asset.Gzipped {
|
|
||||||
reader, err := gzip.NewReader(strings.NewReader(asset.Content))
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer reader.Close()
|
|
||||||
|
|
||||||
data, err := io.ReadAll(reader)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
content = string(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !strings.Contains(content, customBuildMarker) {
|
|
||||||
t.Fatalf("embedded GUI assets do not contain custom build marker %q", customBuildMarker)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -284,8 +284,8 @@ func NewFilesystem(fsType FilesystemType, uri string, opts ...Option) Filesystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fs cannot import config or versioner, so we hard code .stfolder
|
// fs cannot import config or versioner, so we hard code .stfolder
|
||||||
// (config.DefaultMarkerName) and .stversions (versioner.DefaultPath).
|
// (config.DefaultMarkerName) and .stversions (versioner.DefaultPath)
|
||||||
var internals = []string{".stfolder", ".stversions"}
|
var internals = []string{".stfolder", ".stignore", ".stversions"}
|
||||||
|
|
||||||
// IsInternal returns true if the file, as a path relative to the folder
|
// IsInternal returns true if the file, as a path relative to the folder
|
||||||
// root, represents an internal file that should always be ignored. The file
|
// root, represents an internal file that should always be ignored. The file
|
||||||
|
|||||||
@@ -21,8 +21,10 @@ func TestIsInternal(t *testing.T) {
|
|||||||
internal bool
|
internal bool
|
||||||
}{
|
}{
|
||||||
{".stfolder", true},
|
{".stfolder", true},
|
||||||
|
{".stignore", true},
|
||||||
{".stversions", true},
|
{".stversions", true},
|
||||||
{".stfolder/foo", true},
|
{".stfolder/foo", true},
|
||||||
|
{".stignore/foo", true},
|
||||||
{".stversions/foo", true},
|
{".stversions/foo", true},
|
||||||
|
|
||||||
{".stfolderfoo", false},
|
{".stfolderfoo", false},
|
||||||
@@ -32,8 +34,6 @@ func TestIsInternal(t *testing.T) {
|
|||||||
{"foo.stignore", false},
|
{"foo.stignore", false},
|
||||||
{"foo.stversions", false},
|
{"foo.stversions", false},
|
||||||
{"foo/.stfolder", false},
|
{"foo/.stfolder", false},
|
||||||
{".stignore", false},
|
|
||||||
{".stignore/foo", false},
|
|
||||||
{"foo/.stignore", false},
|
{"foo/.stignore", false},
|
||||||
{"foo/.stversions", false},
|
{"foo/.stversions", false},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,15 +60,15 @@ func TestRecvOnlyRevertDeletes(t *testing.T) {
|
|||||||
|
|
||||||
must(t, m.ScanFolder("ro"))
|
must(t, m.ScanFolder("ro"))
|
||||||
|
|
||||||
// We should now have three files and two directories, with global state unchanged.
|
// We should now have two files and two directories, with global state unchanged.
|
||||||
|
|
||||||
size = mustV(m.GlobalSize("ro"))
|
size = mustV(m.GlobalSize("ro"))
|
||||||
if size.Files != 1 || size.Directories != 1 {
|
if size.Files != 1 || size.Directories != 1 {
|
||||||
t.Fatalf("Global: expected 1 file and 1 directory: %+v", size)
|
t.Fatalf("Global: expected 1 file and 1 directory: %+v", size)
|
||||||
}
|
}
|
||||||
size = mustV(m.LocalSize("ro", protocol.LocalDeviceID))
|
size = mustV(m.LocalSize("ro", protocol.LocalDeviceID))
|
||||||
if size.Files != 3 || size.Directories != 2 {
|
if size.Files != 2 || size.Directories != 2 {
|
||||||
t.Fatalf("Local: expected 3 files and 2 directories: %+v", size)
|
t.Fatalf("Local: expected 2 files and 2 directories: %+v", size)
|
||||||
}
|
}
|
||||||
size = mustV(m.ReceiveOnlySize("ro"))
|
size = mustV(m.ReceiveOnlySize("ro"))
|
||||||
if size.Files+size.Directories == 0 {
|
if size.Files+size.Directories == 0 {
|
||||||
|
|||||||
@@ -974,15 +974,13 @@ func TestIgnoreDeleteUnignore(t *testing.T) {
|
|||||||
file := "foobar"
|
file := "foobar"
|
||||||
contents := []byte("test file contents\n")
|
contents := []byte("test file contents\n")
|
||||||
|
|
||||||
basicCheck := func(fs []protocol.FileInfo) protocol.FileInfo {
|
basicCheck := func(fs []protocol.FileInfo) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
for _, f := range fs {
|
if len(fs) != 1 {
|
||||||
if f.Name == file {
|
t.Fatal("expected a single index entry, got", len(fs))
|
||||||
return f
|
} else if fs[0].Name != file {
|
||||||
}
|
t.Fatalf("expected a index entry for %v, got one for %v", file, fs[0].Name)
|
||||||
}
|
}
|
||||||
t.Fatalf("expected an index entry for %v, got %v", file, fs)
|
|
||||||
return protocol.FileInfo{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done := make(chan struct{})
|
done := make(chan struct{})
|
||||||
@@ -1003,7 +1001,8 @@ func TestIgnoreDeleteUnignore(t *testing.T) {
|
|||||||
|
|
||||||
done = make(chan struct{})
|
done = make(chan struct{})
|
||||||
fc.setIndexFn(func(_ context.Context, folder string, fs []protocol.FileInfo) error {
|
fc.setIndexFn(func(_ context.Context, folder string, fs []protocol.FileInfo) error {
|
||||||
f := basicCheck(fs)
|
basicCheck(fs)
|
||||||
|
f := fs[0]
|
||||||
if !f.IsInvalid() {
|
if !f.IsInvalid() {
|
||||||
t.Errorf("Received non-invalid index update")
|
t.Errorf("Received non-invalid index update")
|
||||||
}
|
}
|
||||||
@@ -1023,7 +1022,8 @@ func TestIgnoreDeleteUnignore(t *testing.T) {
|
|||||||
|
|
||||||
done = make(chan struct{})
|
done = make(chan struct{})
|
||||||
fc.setIndexFn(func(_ context.Context, folder string, fs []protocol.FileInfo) error {
|
fc.setIndexFn(func(_ context.Context, folder string, fs []protocol.FileInfo) error {
|
||||||
f := basicCheck(fs)
|
basicCheck(fs)
|
||||||
|
f := fs[0]
|
||||||
if f.IsInvalid() {
|
if f.IsInvalid() {
|
||||||
t.Errorf("Received invalid index update")
|
t.Errorf("Received invalid index update")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ type testfile struct {
|
|||||||
type testfileList []testfile
|
type testfileList []testfile
|
||||||
|
|
||||||
var testdata = testfileList{
|
var testdata = testfileList{
|
||||||
{".stignore", 48, "f60db5c36f642f8a6c1a636024330cd4dba6ab965083542f3629ff7d8c547911"},
|
|
||||||
{"afile", 4, "b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c"},
|
{"afile", 4, "b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c"},
|
||||||
{"dir1", 128, ""},
|
{"dir1", 128, ""},
|
||||||
{filepath.Join("dir1", "dfile"), 5, "49ae93732fcf8d63fe1cce759664982dbd5b23161f007dba8561862adc96d063"},
|
{filepath.Join("dir1", "dfile"), 5, "49ae93732fcf8d63fe1cce759664982dbd5b23161f007dba8561862adc96d063"},
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "STDISCOSRV" "1" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "STDISCOSRV" "1" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
stdiscosrv \- Syncthing Discovery Server
|
stdiscosrv \- Syncthing Discovery Server
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "STRELAYSRV" "1" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "STRELAYSRV" "1" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
strelaysrv \- Syncthing Relay Server
|
strelaysrv \- Syncthing Relay Server
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
+1
-1
@@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-BEP" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-BEP" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-bep \- Block Exchange Protocol v1
|
syncthing-bep \- Block Exchange Protocol v1
|
||||||
.SH INTRODUCTION AND DEFINITIONS
|
.SH INTRODUCTION AND DEFINITIONS
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-CONFIG" "5" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-CONFIG" "5" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-config \- Syncthing Configuration
|
syncthing-config \- Syncthing Configuration
|
||||||
.SH OVERVIEW
|
.SH OVERVIEW
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-DEVICE-IDS" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-device-ids \- Understanding Device IDs
|
syncthing-device-ids \- Understanding Device IDs
|
||||||
.sp
|
.sp
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-EVENT-API" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-EVENT-API" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-event-api \- Event API
|
syncthing-event-api \- Event API
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-FAQ" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-FAQ" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-faq \- Frequently Asked Questions
|
syncthing-faq \- Frequently Asked Questions
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-GLOBALDISCO" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-globaldisco \- Global Discovery Protocol v3
|
syncthing-globaldisco \- Global Discovery Protocol v3
|
||||||
.SH ANNOUNCEMENTS
|
.SH ANNOUNCEMENTS
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-LOCALDISCO" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-LOCALDISCO" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-localdisco \- Local Discovery Protocol v4
|
syncthing-localdisco \- Local Discovery Protocol v4
|
||||||
.SH MODE OF OPERATION
|
.SH MODE OF OPERATION
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-NETWORKING" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-NETWORKING" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-networking \- Firewall Setup
|
syncthing-networking \- Firewall Setup
|
||||||
.SH ROUTER SETUP
|
.SH ROUTER SETUP
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-RELAY" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-RELAY" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-relay \- Relay Protocol v1
|
syncthing-relay \- Relay Protocol v1
|
||||||
.SH WHAT IS A RELAY?
|
.SH WHAT IS A RELAY?
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-REST-API" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-REST-API" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-rest-api \- REST API
|
syncthing-rest-api \- REST API
|
||||||
.sp
|
.sp
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-SECURITY" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-SECURITY" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-security \- Security Principles
|
syncthing-security \- Security Principles
|
||||||
.sp
|
.sp
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-STIGNORE" "5" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-STIGNORE" "5" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-stignore \- Prevent files from being synchronized to other nodes
|
syncthing-stignore \- Prevent files from being synchronized to other nodes
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING-VERSIONING" "7" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING-VERSIONING" "7" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing-versioning \- Keep automatic backups of deleted files by other nodes
|
syncthing-versioning \- Keep automatic backups of deleted files by other nodes
|
||||||
.sp
|
.sp
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "SYNCTHING" "1" "Apr 30, 2026" "v2.0.0" "Syncthing"
|
.TH "SYNCTHING" "1" "May 13, 2026" "v2.1.0" "Syncthing"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
syncthing \- Syncthing
|
syncthing \- Syncthing
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|||||||
Reference in New Issue
Block a user