Provided by: syncthing_1.27.7~ds1-5_amd64 bug

NAME

       syncthing-versioning - Keep automatic backups of deleted files by other nodes

       Syncthing supports archiving the old version of a file when it is deleted or replaced with
       a newer version from the cluster. This is called “file versioning” and  uses  one  of  the
       available versioning strategies described below. File versioning is configured per folder,
       on a per-device basis, and defaults to “no file versioning”, i.e. no old copies  of  files
       are kept.

       NOTE:
          Versioning  applies  to  changes  received  from  other  devices. That is, if Alice has
          versioning turned on and Bob changes a file,  the  old  version  will  be  archived  on
          Alice’s  computer  when that change is synced from Bob. If Alice changes a file locally
          on her own computer Syncthing will not and can not archive the old version.

       The applicable configuration options for each versioning  strategy  are  described  below.
       For  most of them it’s possible to specify where the versions are stored, with the default
       being the .stversions folder inside the shared folder path.  If you set a  custom  version
       path,  please  ensure  that it’s on the same partition or filesystem as the regular folder
       path, as moving files there may otherwise fail.

TRASH CAN FILE VERSIONING

       This versioning strategy emulates the common “trash can” approach. When a file is  deleted
       or  replaced  due  to  a  change  on  a remote device, it is moved to the trash can in the
       .stversions folder. If a file with the same name was  already  in  the  trash  can  it  is
       replaced.

       A  configuration  option  is  available  to  clean  the  trash can from files older than a
       specified number of days.  If this is set to a positive number  of  days,  files  will  be
       removed when they have been in the trash can that long.  Setting this to zero prevents any
       files from being removed from the trash can automatically.

SIMPLE FILE VERSIONING

       With “Simple File Versioning” files are moved to the .stversions folder when  replaced  or
       deleted  on  a  remote device.  In addition to the cleanoutDays option, this strategy also
       takes a value in an input titled “Keep  Versions”  which  tells  Syncthing  how  many  old
       versions  of  the file it should keep.  For example, if you set this value to 5, if a file
       is replaced 5 times on a remote device, you will see 5 time-stamped versions on that  file
       in the .stversions folder on the other devices sharing the same folder.

STAGGERED FILE VERSIONING

       With  “Staggered  File  Versioning”  files  are  also moved to the .stversions folder when
       replaced or deleted on a remote device (just  like  “Simple  File  Versioning”),  however,
       versions  are  automatically  deleted if they are older than the maximum age or exceed the
       number of files allowed in an interval.

       The following intervals are used and they each have a maximum number of files that will be
       kept for each.

       1 Hour For the first hour, the oldest version in every 30-seconds interval is kept.

       1 Day  For the first day, the oldest version in every hour is kept.

       30 Days
              For the first 30 days, the oldest version in every day is kept.

       Until Maximum Age
              Until maximum age, the oldest version in every week is kept.

       Maximum Age
              The  maximum  time  to  keep  a  version  in days. For example, to keep replaced or
              deleted files in the .stversions folder for an entire year, use 365. If only for 10
              days,  use  10.  Corresponds to the maxAge option.  Note: Set to 0 to keep versions
              forever.

       This means that there is only one version in each interval and as files age they  will  be
       deleted  unless  when  the  interval  they  are  entering  is empty. By keeping the oldest
       versions this versioning scheme preserves the file if it is overwritten.

       For        more        info,        check        the        unit         test         file
       <https://github.com/syncthing/syncthing/blob/main/lib/versioner/staggered_test.go#L32>
       that shows which versions are deleted for a specific run.

EXTERNAL FILE VERSIONING

       This versioning strategy delegates the decision on what to do to an external command (e.g.
       a  program  or  a  command line script).  Just prior to a file being replaced, the command
       will be executed.  The file needs to be  removed  from  the  folder  in  the  process,  or
       otherwise  Syncthing  will  report  an error.  The command can use the following templated
       arguments:

       %FOLDER_PATH%
              Path to the folder

       %FILE_PATH%
              Path to the file within the folder

       Note that the former expands to the path of the actual Syncthing folder, and the latter to
       the  path inside that folder. For instance, if you use the default Sync folder in Windows,
       and the full path to the file is C:\Users\User\Sync\Family photos\IMG_2021-03-01.jpg, then
       the  %FOLDER_PATH%  will  be  C:\Users\User\Sync,  and  the  %FILE_PATH%  will  be  Family
       photos\IMG_2021-03-01.jpg.

   Example for Unixes
       Let’s say I want to keep the latest version of each file as they are replaced or  removed;
       essentially  I  want  a “trash can”-like behavior. For this, I create the following script
       and store it as /Users/jb/bin/onlylatest.sh (i.e. the bin directory in my home directory):

          #!/bin/sh
          set -eu

          # Where I want my versions stored
          versionspath=~/.trashcan

          # The parameters we get from Syncthing
          folderpath="$1"
          filepath="$2"

          # First ensure the dir where we need to store the file exists
          outpath=$(dirname "$versionspath/$filepath")
          mkdir -p "$outpath"
          # Then move the file there
          mv -f "$folderpath/$filepath" "$versionspath/$filepath"

       I must ensure that the script has execute  permissions  (chmod  755  onlylatest.sh),  then
       configure Syncthing with command /Users/jb/bin/onlylatest.sh %FOLDER_PATH% %FILE_PATH%

       Let’s  assume  I have a folder “default” in ~/Sync, and that within that folder there is a
       file docs/letter.txt that is being replaced or deleted. The script will be called as if  I
       ran this from the command line:

          $ /Users/jb/bin/onlylatest.sh /Users/jb/Sync docs/letter.txt

       The  script  will then move the file in question to ~/.trashcan/docs/letter.txt, replacing
       any previous version of that letter that may already have been there.

   Examples for Windows
   Move to a given folder using the command prompt (CMD)
       On Windows we can use a batch script to perform the  same  “trash  can”-like  behavior  as
       mentioned    above.    I    created    the    following    script    and   saved   it   as
       C:\Users\mfrnd\Scripts\onlylatest.bat.

          @echo off

          rem Enable UTF-8 encoding to deal with multilingual folder and file names
          chcp 65001

          rem We need command extensions for md to create intermediate folders in one go
          setlocal enableextensions

          rem Where I want my versions stored
          set "versions_path=%USERPROFILE%\.trashcan"

          rem The parameters we get from Syncthing, '~' removes quotes if any
          set "folder_path=%~1"
          set "file_path=%~2"

          rem First ensure the dir where we need to store the file exists
          for %%f in ("%versions_path%\%file_path%") do set "output_path=%%~dpf"
          if not exist "%output_path%" md "%output_path%" || exit /b

          rem Finally move the file, overwrite existing file if any
          move /y "%folder_path%\%file_path%" "%versions_path%\%file_path%"

       Finally, I set "C:\Users\mfrnd\Scripts\onlylatest.bat"  "%FOLDER_PATH%"  "%FILE_PATH%"  as
       the command name in Syncthing.

   Move to the Recycle Bin using PowerShell
       We  can  use  PowerShell  to  send  files  directly  to  the Recycle Bin, which mimics the
       behaviour of deleting them using the Windows  Explorer.   Firstly,  create  the  following
       script      and      save      it      in      your      preferred      location,     e.g.
       C:\Users\User\Scripts\SendToRecycleBin.ps1.

          # PowerShell has no native method to recycle files, so we use Visual
          # Basic to perform the operation. If succeeded, we also include the
          # recycled file in the Syncthing's DEBUG output.
          Add-Type -AssemblyName Microsoft.VisualBasic
          [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,'OnlyErrorDialogs','SendToRecycleBin')
          if ($?) {
            Write-Output ("Recycled " + $args + ".")
          }

       Alternatively, the script can be expanded to send only deleted files to the  Recycle  Bin,
       and permanently delete modified ones, which makes it more consistent with how the Explorer
       works.

          # PowerShell has no native method to recycle files, so we use Visual
          # Basic to perform the operation.
          Add-Type -AssemblyName Microsoft.VisualBasic

          # We need to test if a Syncthing .tmp file exists. If it does, we assume
          # a modification and delete the existing file. If if does not, we assume
          # a deletion and recycle the current file. If succeeded, we also include
          # the deleted/recycled file in the Syncthing's DEBUG output.
          if (Test-Path -LiteralPath ((Split-Path -Path $args) + "\~syncthing~" + (Split-Path -Path $args -Leaf) + ".tmp")) {
            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,'OnlyErrorDialogs','DeletePermanently')
            if ($?) {
              Write-Output ("Deleted " + $args + ".")
            }
          } else {
            [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,'OnlyErrorDialogs','SendToRecycleBin')
            if ($?) {
              Write-Output ("Recycled " + $args + ".")
            }
          }

       Finally, we set the command name in Syncthing to  powershell.exe  -ExecutionPolicy  Bypass
       -File "C:\Users\User\Scripts\SendToRecycleBin.ps1" "%FOLDER_PATH%\%FILE_PATH%".

       The only caveat that you should be aware of is that if your Syncthing folder is located on
       a portable storage, such as a USB stick, or if you have the Recycle Bin disabled, then the
       script will end up deleting all files permanently.

CONFIGURATION PARAMETER REFERENCE

       The  versioning  settings  are  grouped  into  their  own  section  of  each folder in the
       configuration file.  The following shows an example of such a section in the XML:

          <folder id="...">
              <versioning type="simple">
                  <cleanupIntervalS>3600</cleanupIntervalS>
                  <fsPath></fsPath>
                  <fsType>basic</fsType>
                  <param key="cleanoutDays" val="0"></param>
                  <param key="keep" val="5"></param>
              </versioning>
          </folder>

       versioning.type
              Selects one of the versioning strategies: trashcan, simple, staggered, external  or
              leave empty to disable versioning completely.

       versioning.fsPath
              Overrides  the  path  where  old  versions  of  files  are  stored  and defaults to
              .stversions if left empty.  An absolute or relative path  can  be  specified.   The
              latter  is  interpreted  relative  to  the  shared  folder  path,  if the fsType is
              configured as basic.  Ignored for the external versioning strategy.

              This option used to be stored under the keys fsPath or versionsPath in  the  params
              element.

       versioning.fsType
              The  internal file system implementation used to access this versions folder.  Only
              applies if fsPath is also set non-empty,  otherwise  the  filesystemType  from  the
              folder  element  is  used  instead.   Refer to that option description for possible
              values.  Ignored for the external versioning strategy.

              This option used to be stored under the key fsType in the params element.

       versioning.cleanupIntervalS
              The interval, in seconds, for running cleanup in  the  versions  folder.   Zero  to
              disable  periodic  cleaning.   Limited to one year (31536000 seconds).  Ignored for
              the external versioning strategy.

              This option used to be stored under the key cleanInterval in the params element.

       versioning.params
              Each  versioning  strategy  can  have  configuration  parameters  specific  to  its
              implementation under this element.

       versioning.params.cleanoutDays
              The  number  of  days  to  keep  files  in the versions folder.  Zero means to keep
              forever.  Older elements encountered during cleanup are removed.

       versioning.params.keep
              The number of old versions to keep, per file.

       versioning.params.maxAge
              The maximum time to keep a version, in seconds.  Zero means to keep forever.

       versioning.params.command
              External command to execute for storing a file version  about  to  be  replaced  or
              deleted.  If the path to the application contains spaces, it should be quoted.

AUTHOR

       The Syncthing Authors

COPYRIGHT

       2014-2019, The Syncthing Authors