1
0
mirror of https://github.com/rclone/rclone.git synced 2026-01-28 15:23:26 +00:00

Compare commits

..

14 Commits

Author SHA1 Message Date
Nick Craig-Wood
db0560e295 docs: update making a new backend docs 2026-01-28 13:29:16 +00:00
Nick Craig-Wood
e75dbd6e91 docs: build overview page from the backend data 2026-01-28 13:29:16 +00:00
Nick Craig-Wood
8679bbce90 docs: add tiering to the documentation #8873 2026-01-28 13:29:16 +00:00
Nick Craig-Wood
c65d2383b2 docs: add data about each backend in YAML format 2026-01-28 13:29:16 +00:00
Nick Craig-Wood
d9c1a96071 docs: add bin/manage_backends.py for managing the backend data files 2026-01-28 12:19:22 +00:00
Nick Craig-Wood
824257583c protondrive: update to use forks of upstream modules
This updates rclone to use forks of the upstream proton drive modules
in preparation for making changes.

The go-proton-api modules has had changes from master merged so rclone
and Proton-API-Bridge are using the same version.
2026-01-28 11:38:38 +00:00
Nick Craig-Wood
cd857754c7 Add hyusap to contributors 2026-01-28 11:38:31 +00:00
Nick Craig-Wood
017d930dfc Add Nick Owens to contributors 2026-01-28 11:38:31 +00:00
Nick Craig-Wood
6ed68883fe Add Mikel Olasagasti Uranga to contributors 2026-01-28 11:38:31 +00:00
hyusap
2a5e0b28c9 docs: fix googlephotos custom client_id instructions
The Google Photos custom client_id documentation was incomplete - it
only mentioned changing the scopes but did not mention that you need
to enable the "Photos Library API" instead of the "Google Drive API"
in step 3 of the referenced Google Drive instructions.

This fixes the documentation to clearly state both differences from
the Google Drive setup:
- Enable "Photos Library API" instead of "Google Drive API"
- Use the Google Photos specific scopes

Co-authored-by: hyusap <paulayush@gmail.com>
2026-01-27 13:48:12 +00:00
Nick Owens
264e75d892 cmount: fix OpenBSD mount support.
this pulls in https://github.com/winfsp/cgofuse/pull/100 to fix OpenBSD
mount support.

part of #1727
2026-01-27 13:47:00 +00:00
Mikel Olasagasti Uranga
4553c3de7b fs: fix bwlimit: correctly report minutes
Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
2026-01-27 11:44:47 +00:00
Mikel Olasagasti Uranga
2e9e4a47a2 fs: fix bwlimit: use %d instead of %q for ints
Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
2026-01-27 11:44:47 +00:00
necaran
e44829a448 mega: reverts TLS workaround
The workaround to include the obsolete cipher suite is no longer needed because storage endpoints now support TLS1.3.
2026-01-24 12:35:02 +00:00
84 changed files with 2436 additions and 211 deletions

View File

@@ -632,14 +632,22 @@ Add your backend to the docs - you'll need to pick an icon for it from
alphabetical order of full name of remote (e.g. `drive` is ordered as
`Google Drive`) but with the local file system last.
First add a data file about your backend in
`docs/data/backends/remote.yaml` - this is used to build the overview
tables and the tiering info.
- Create it with: `bin/manage_backends.py create docs/data/backends/remote.yaml`
- Edit it to fill in the blanks. Look at the [tiers docs](https://rclone.org/tiers/).
- Run this command to fill in the features: `bin/manage_backends.py features docs/data/backends/remote.yaml`
Next edit these files:
- `README.md` - main GitHub page
- `docs/content/remote.md` - main docs page (note the backend options are
automatically added to this file with `make backenddocs`)
- make sure this has the `autogenerated options` comments in (see your
reference backend docs)
- update them in your backend with `bin/make_backend_docs.py remote`
- `docs/content/overview.md` - overview docs - add an entry into the Features
table and the Optional Features table.
- `docs/content/docs.md` - list of remotes in config section
- `docs/content/_index.md` - front page of rclone.org
- `docs/layouts/chrome/navbar.html` - add it to the website navigation

View File

@@ -17,12 +17,10 @@ Improvements:
import (
"context"
"crypto/tls"
"encoding/base64"
"errors"
"fmt"
"io"
"net/http"
"path"
"slices"
"strings"
@@ -256,25 +254,7 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e
defer megaCacheMu.Unlock()
srv := megaCache[opt.User]
if srv == nil {
// srv = mega.New().SetClient(fshttp.NewClient(ctx))
// Workaround for Mega's use of insecure cipher suites which are no longer supported by default since Go 1.22.
// Relevant issues:
// https://github.com/rclone/rclone/issues/8565
// https://github.com/meganz/webclient/issues/103
clt := fshttp.NewClient(ctx)
clt.Transport = fshttp.NewTransportCustom(ctx, func(t *http.Transport) {
var ids []uint16
// Read default ciphers
for _, cs := range tls.CipherSuites() {
ids = append(ids, cs.ID)
}
// Insecure but Mega uses TLS_RSA_WITH_AES_128_GCM_SHA256 for storage endpoints
// (e.g. https://gfs302n114.userstorage.mega.co.nz) as of June 18, 2025.
t.TLSClientConfig.CipherSuites = append(ids, tls.TLS_RSA_WITH_AES_128_GCM_SHA256)
})
srv = mega.New().SetClient(clt)
srv = mega.New().SetClient(fshttp.NewClient(ctx))
srv.SetRetries(ci.LowLevelRetries) // let mega do the low level retries
srv.SetHTTPS(opt.UseHTTPS)
srv.SetLogger(func(format string, v ...any) {

View File

@@ -10,8 +10,8 @@ import (
"strings"
"time"
protonDriveAPI "github.com/henrybear327/Proton-API-Bridge"
"github.com/henrybear327/go-proton-api"
protonDriveAPI "github.com/rclone/Proton-API-Bridge"
"github.com/rclone/go-proton-api"
"github.com/pquerna/otp/totp"

300
bin/manage_backends.py Executable file
View File

@@ -0,0 +1,300 @@
#!/usr/bin/env python3
"""
Manage the backend yaml files in docs/data/backends
usage: manage_backends.py [-h] {create,features,update,help} [files ...]
Manage rclone backend YAML files.
positional arguments:
{create,features,update,help}
Action to perform
files List of YAML files to operate on
options:
-h, --help show this help message and exit
"""
import argparse
import sys
import os
import yaml
import json
import subprocess
import time
import socket
from contextlib import contextmanager
from pprint import pprint
# --- Configuration ---
# The order in which keys should appear in the YAML file
CANONICAL_ORDER = [
"backend",
"name",
"tier",
"maintainers",
"features_score",
"integration_tests",
"data_integrity",
"performance",
"adoption",
"docs",
"security",
"virtual",
"remote",
"features",
"hashes",
"precision"
]
# Default values for fields when creating/updating
DEFAULTS = {
"tier": None,
"maintainers": None,
"features_score": None,
"integration_tests": None,
"data_integrity": None,
"performance": None,
"adoption": None,
"docs": None,
"security": None,
"virtual": False,
"remote": None,
"features": [],
"hashes": [],
"precision": None
}
# --- Test server management ---
def wait_for_tcp(address_str, delay=1, timeout=2, tries=60):
"""
Blocks until the specified TCP address (e.g., '172.17.0.3:21') is reachable.
"""
host, port = address_str.split(":")
port = int(port)
print(f"Waiting for {host}:{port}...")
for tri in range(tries):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
if result == 0:
print(f"Connected to {host}:{port} successfully!")
break
else:
print(f"Failed to connect to {host}:{port} try {tri} !")
time.sleep(delay)
def parse_init_output(binary_input):
"""
Parse the output of the init script
"""
decoded_str = binary_input.decode('utf-8')
result = {}
for line in decoded_str.splitlines():
if '=' in line:
key, value = line.split('=', 1)
result[key.strip()] = value.strip()
return result
@contextmanager
def test_server(remote):
"""Start the test server for remote if needed"""
remote_name = remote.split(":",1)[0]
init_script = "fstest/testserver/init.d/" + remote_name
if not os.path.isfile(init_script):
yield
return
print(f"--- Starting {init_script} ---")
out = subprocess.check_output([init_script, "start"])
out = parse_init_output(out)
pprint(out)
# Configure the server with environment variables
env_keys = []
for key, value in out.items():
env_key = f"RCLONE_CONFIG_{remote_name.upper()}_{key.upper()}"
env_keys.append(env_key)
os.environ[env_key] = value
for key,var in os.environ.items():
if key.startswith("RCLON"):
print(key, var)
if "_connect" in out:
wait_for_tcp(out["_connect"])
try:
yield
finally:
print(f"--- Stopping {init_script} ---")
subprocess.run([init_script, "stop"], check=True)
# Remove the env vars
for env_key in env_keys:
del os.environ[env_key]
# --- Helper Functions ---
def load_yaml(filepath):
if not os.path.exists(filepath):
return {}
with open(filepath, 'r', encoding='utf-8') as f:
return yaml.safe_load(f) or {}
def save_yaml(filepath, data):
# Reconstruct dictionary in canonical order
ordered_data = {}
# Add known keys in order
for key in CANONICAL_ORDER:
if key in data:
ordered_data[key] = data[key]
# Add any other keys that might exist (custom fields)
for key in data:
if key not in CANONICAL_ORDER:
ordered_data[key] = data[key]
# Ensure features are a sorted list (if present)
if 'features' in ordered_data and isinstance(ordered_data['features'], list):
ordered_data['features'].sort()
with open(filepath, 'w', encoding='utf-8') as f:
yaml.dump(ordered_data, f, default_flow_style=False, sort_keys=False, allow_unicode=True)
print(f"Saved {filepath}")
def get_backend_name_from_file(filepath):
"""
s3.yaml -> S3
azureblob.yaml -> Azureblob
"""
basename = os.path.basename(filepath)
name, _ = os.path.splitext(basename)
return name.title()
def fetch_rclone_features(remote_str):
"""
Runs `rclone backend features remote:` and returns the JSON object.
"""
cmd = ["rclone", "backend", "features", remote_str]
try:
with test_server(remote_str):
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
return json.loads(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error running rclone: {e.stderr}")
return None
except FileNotFoundError:
print("Error: 'rclone' command not found in PATH.")
sys.exit(1)
# --- Verbs ---
def do_create(files):
for filepath in files:
if os.path.exists(filepath):
print(f"Skipping {filepath} (already exists)")
continue
data = DEFAULTS.copy()
# Set a default name based on filename
data['name'] = get_backend_name_from_file(filepath)
save_yaml(filepath, data)
def do_update(files):
for filepath in files:
if not os.path.exists(filepath):
print(f"Warning: {filepath} does not exist. Use 'create' first.")
continue
data = load_yaml(filepath)
modified = False
# Inject the filename as the 'backend'
file_backend = os.path.splitext(os.path.basename(filepath))[0]
if data.get('backend') != file_backend:
data['backend'] = file_backend
modified = True
print(f"[{filepath}] Updated backend to: {file_backend}")
# Add missing default fields
for key, default_val in DEFAULTS.items():
if key not in data:
data[key] = default_val
modified = True
print(f"[{filepath}] Added missing field: {key}")
# Special handling for 'name' if it was just added as None or didn't exist
if data.get('name') is None:
data['name'] = get_backend_name_from_file(filepath)
modified = True
print(f"[{filepath}] Set default name: {data['name']}")
if modified:
save_yaml(filepath, data)
else:
# We save anyway to enforce canonical order if the file was messy
save_yaml(filepath, data)
def do_features(files):
for filepath in files:
if not os.path.exists(filepath):
print(f"Error: {filepath} not found.")
continue
data = load_yaml(filepath)
remote = data.get('remote')
if not remote:
print(f"Error: [{filepath}] 'remote' field is missing or empty. Cannot fetch features.")
continue
print(f"[{filepath}] Fetching features for remote: '{remote}'...")
rclone_data = fetch_rclone_features(remote)
if not rclone_data:
print(f"Failed to fetch data for {filepath}")
continue
# Process Features (Dict -> Sorted List of True keys)
features_dict = rclone_data.get('Features', {})
# Filter only true values and sort keys
feature_list = sorted([k for k, v in features_dict.items() if v])
# Process Hashes
hashes_list = rclone_data.get('Hashes', [])
# Process Precision
precision = rclone_data.get('Precision')
# Update data
data['features'] = feature_list
data['hashes'] = hashes_list
data['precision'] = precision
save_yaml(filepath, data)
# --- Main CLI ---
def main():
parser = argparse.ArgumentParser(description="Manage rclone backend YAML files.")
parser.add_argument("verb", choices=["create", "features", "update", "help"], help="Action to perform")
parser.add_argument("files", nargs="*", help="List of YAML files to operate on")
args = parser.parse_args()
if args.verb == "help":
parser.print_help()
sys.exit(0)
if not args.files:
print("Error: No files specified.")
parser.print_help()
sys.exit(1)
if args.verb == "create":
do_create(args.files)
elif args.verb == "update":
do_update(args.files)
elif args.verb == "features":
do_features(args.files)
if __name__ == "__main__":
main()

View File

@@ -1067,3 +1067,6 @@ put them back in again. -->
- Qingwei Li <332664203@qq.com>
- yy <yhymmt37@gmail.com>
- Marc-Philip <marc-philip.werner@sap.com>
- Mikel Olasagasti Uranga <mikel@olasagasti.info>
- Nick Owens <mischief@offblast.org>
- hyusap <paulayush@gmail.com>

View File

@@ -659,8 +659,14 @@ second that each client_id can do set by Google.
If there is a problem with this client_id (eg quota too low or the
client_id stops working) then you can make your own.
Please follow the steps in [the google drive docs](https://rclone.org/drive/#making-your-own-client-id).
You will need these scopes instead of the drive ones detailed:
Please follow the steps in [the google drive docs](https://rclone.org/drive/#making-your-own-client-id)
with the following differences:
- At step 3, instead of enabling the "Google Drive API", search for and
enable the "Photos Library API".
- At step 5, you will need to add different scopes. Use these scopes
instead of the drive ones:
```text
https://www.googleapis.com/auth/photoslibrary.appendonly

View File

@@ -14,105 +14,7 @@ show through.
Here is an overview of the major features of each cloud storage system.
| Name | Hash | ModTime | Case Insensitive | Duplicate Files | MIME Type | Metadata |
| ---------------------------- |:-----------------:|:-------:|:----------------:|:---------------:|:---------:|:--------:|
| 1Fichier | Whirlpool | - | No | Yes | R | - |
| Akamai Netstorage | MD5, SHA256 | R/W | No | No | R | - |
| Amazon S3 (or S3 compatible) | MD5 | R/W | No | No | R/W | RWU |
| Backblaze B2 | SHA1 | R/W | No | No | R/W | - |
| Box | SHA1 | R/W | Yes | No | - | - |
| Citrix ShareFile | MD5 | R/W | Yes | No | - | - |
| Cloudinary | MD5 | R | No | Yes | - | - |
| Drime | - | - | No | No | R/W | - |
| Dropbox | DBHASH ¹ | R | Yes | No | - | - |
| Enterprise File Fabric | - | R/W | Yes | No | R/W | - |
| FileLu Cloud Storage | MD5 | R/W | No | Yes | R | - |
| Filen | Blake3 | R/W | Yes | No | R/W | - |
| Files.com | MD5, CRC32 | DR/W | Yes | No | R | - |
| FTP | - | R/W ¹⁰ | No | No | - | - |
| Gofile | MD5 | DR/W | No | Yes | R | - |
| Google Cloud Storage | MD5 | R/W | No | No | R/W | - |
| Google Drive | MD5, SHA1, SHA256 | DR/W | No | Yes | R/W | DRWU |
| Google Photos | - | - | No | Yes | R | - |
| HDFS | - | R/W | No | No | - | - |
| HiDrive | HiDrive ¹² | R/W | No | No | - | - |
| HTTP | - | R | No | No | R | R |
| iCloud Drive | - | R | No | No | - | - |
| Internet Archive | MD5, SHA1, CRC32 | R/W ¹¹ | No | No | - | RWU |
| Jottacloud | MD5 | R/W | Yes | No | R | RW |
| Koofr | MD5 | - | Yes | No | - | - |
| Linkbox | - | R | No | No | - | - |
| Mail.ru Cloud | Mailru ⁶ | R/W | Yes | No | - | - |
| Mega | - | - | No | Yes | - | - |
| Memory | MD5 | R/W | No | No | - | - |
| Microsoft Azure Blob Storage | MD5 | R/W | No | No | R/W | - |
| Microsoft Azure Files Storage | MD5 | R/W | Yes | No | R/W | - |
| Microsoft OneDrive | QuickXorHash ⁵ | DR/W | Yes | No | R | DRW |
| OpenDrive | MD5 | R/W | Yes | Partial ⁸ | - | - |
| OpenStack Swift | MD5 | R/W | No | No | R/W | - |
| Oracle Object Storage | MD5 | R/W | No | No | R/W | RU |
| pCloud | MD5, SHA1 ⁷ | R/W | No | No | W | - |
| PikPak | MD5 | R | No | No | R | - |
| Pixeldrain | SHA256 | R/W | No | No | R | RW |
| premiumize.me | - | - | Yes | No | R | - |
| put.io | CRC-32 | R/W | No | Yes | R | - |
| Proton Drive | SHA1 | R/W | No | No | R | - |
| QingStor | MD5 | - ⁹ | No | No | R/W | - |
| Quatrix by Maytech | - | R/W | No | No | - | - |
| Seafile | - | - | No | No | - | - |
| SFTP | MD5, SHA1 ² | DR/W | Depends | No | - | - |
| Shade | - | - | Yes | No | - | - |
| Sia | - | - | No | No | - | - |
| SMB | - | R/W | Yes | No | - | - |
| SugarSync | - | - | No | No | - | - |
| Storj | - | R | No | No | - | - |
| Uloz.to | MD5, SHA256 ¹³ | - | No | Yes | - | - |
| WebDAV | MD5, SHA1 ³ | R ⁴ | Depends | No | - | - |
| Yandex Disk | MD5 | R/W | No | No | R | - |
| Zoho WorkDrive | - | - | No | No | - | - |
| The local filesystem | All | DR/W | Depends | No | - | DRWU |
¹ Dropbox supports [its own custom
hash](https://www.dropbox.com/developers/reference/content-hash).
This is an SHA256 sum of all the 4 MiB block SHA256s.
² SFTP supports checksums if the same login has shell access and
`md5sum` or `sha1sum` as well as `echo` are in the remote's PATH.
³ WebDAV supports hashes when used with Fastmail Files, Owncloud and Nextcloud only.
⁴ WebDAV supports modtimes when used with Fastmail Files, Owncloud and Nextcloud
only.
⁵ [QuickXorHash](https://docs.microsoft.com/en-us/onedrive/developer/code-snippets/quickxorhash)
is Microsoft's own hash.
⁶ Mail.ru uses its own modified SHA1 hash
⁷ pCloud only supports SHA1 (not MD5) in its EU region
⁸ Opendrive does not support creation of duplicate files using
their web client interface or other stock clients, but the underlying
storage platform has been determined to allow duplicate files, and it
is possible to create them with `rclone`. It may be that this is a
mistake or an unsupported feature.
⁹ QingStor does not support SetModTime for objects bigger than 5 GiB.
¹⁰ FTP supports modtimes for the major FTP servers, and also others
if they advertised required protocol extensions. See [this](/ftp/#modification-times)
for more details.
¹¹ Internet Archive requires option `wait_archive` to be set to a non-zero value
for full modtime support.
¹² HiDrive supports [its own custom
hash](https://static.hidrive.com/dev/0001).
It combines SHA1 sums for each 4 KiB block hierarchically to a single
top-level sum.
¹³ Uloz.to provides server-calculated MD5 hash upon file upload. MD5 and SHA256
hashes are client-calculated and stored as metadata fields.
{{< features-table >}}
### Hash
@@ -508,74 +410,7 @@ See [the metadata docs](/docs/#metadata) for more info.
All rclone remotes support a base command set. Other features depend
upon backend-specific capabilities.
| Name | Purge | Copy | Move | DirMove | CleanUp | ListR | StreamUpload | MultithreadUpload | LinkSharing | About | EmptyDir |
| ---------------------------- |:-----:|:----:|:----:|:-------:|:-------:|:-----:|:------------:|:------------------|:------------:|:-----:|:--------:|
| 1Fichier | No | Yes | Yes | No | No | No | No | No | Yes | No | Yes |
| Akamai Netstorage | Yes | No | No | No | No | Yes | Yes | No | No | No | Yes |
| Amazon S3 (or S3 compatible) | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No |
| Backblaze B2 | No | Yes | No | No | Yes | Yes | Yes | Yes | Yes | No | No |
| Box | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes |
| Citrix ShareFile | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes |
| Drime | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | No | Yes |
| Dropbox | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Cloudinary | No | No | No | No | No | No | Yes | No | No | No | No |
| Enterprise File Fabric | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes |
| Filen | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes |
| Files.com | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes |
| FTP | No | No | Yes | Yes | No | No | Yes | No | No | No | Yes |
| Gofile | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Google Cloud Storage | Yes | Yes | No | No | No | No | Yes | No | No | No | No |
| Google Drive | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes |
| Google Photos | No | No | No | No | No | No | No | No | No | No | No |
| HDFS | Yes | No | Yes | Yes | No | No | Yes | No | No | Yes | Yes |
| HiDrive | Yes | Yes | Yes | Yes | No | No | Yes | No | No | No | Yes |
| HTTP | No | No | No | No | No | No | No | No | No | No | Yes |
| iCloud Drive | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes |
| ImageKit | Yes | No | Yes | No | No | No | No | No | No | No | Yes |
| Internet Archive | No | Yes | No | No | Yes | Yes | No | No | Yes | Yes | No |
| Jottacloud | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | Yes | Yes |
| Koofr | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| Mail.ru Cloud | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Mega | Yes | No | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Memory | No | Yes | No | No | No | Yes | Yes | No | No | No | No |
| Microsoft Azure Blob Storage | Yes | Yes | No | No | No | Yes | Yes | Yes | No | No | No |
| Microsoft Azure Files Storage | No | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes |
| Microsoft OneDrive | Yes | Yes | Yes | Yes | Yes | Yes ⁵ | No | No | Yes | Yes | Yes |
| OpenDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| OpenStack Swift | Yes ¹ | Yes | No | No | No | Yes | Yes | No | No | Yes | No |
| Oracle Object Storage | No | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No |
| pCloud | Yes | Yes | Yes | Yes | Yes | Yes | No | No | Yes | Yes | Yes |
| PikPak | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes |
| Pixeldrain | Yes | No | Yes | Yes | No | No | Yes | No | Yes | Yes | Yes |
| premiumize.me | Yes | No | Yes | Yes | No | No | No | No | Yes | Yes | Yes |
| put.io | Yes | No | Yes | Yes | Yes | No | Yes | No | No | Yes | Yes |
| Proton Drive | Yes | No | Yes | Yes | Yes | No | No | No | No | Yes | Yes |
| QingStor | No | Yes | No | No | Yes | Yes | No | No | No | No | No |
| Quatrix by Maytech | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| Seafile | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes |
| SFTP | No | Yes ⁴| Yes | Yes | No | No | Yes | No | No | Yes | Yes |
| Sia | No | No | No | No | No | No | Yes | No | No | No | Yes |
| SMB | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes |
| SugarSync | Yes | Yes | Yes | Yes | No | No | Yes | No | Yes | No | Yes |
| Storj | Yes ² | Yes | Yes | No | No | Yes | Yes | No | Yes | No | No |
| Uloz.to | No | No | Yes | Yes | No | No | No | No | No | No | Yes |
| WebDAV | Yes | Yes | Yes | Yes | No | No | Yes ³ | No | No | Yes | Yes |
| Yandex Disk | Yes | Yes | Yes | Yes | Yes | No | Yes | No | Yes | Yes | Yes |
| Zoho WorkDrive | Yes | Yes | Yes | Yes | No | No | No | No | No | Yes | Yes |
| The local filesystem | No | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes |
¹ Note Swift implements this in order to delete directory markers but
it doesn't actually have a quicker way of deleting files other than
deleting them individually.
² Storj implements this efficiently only for entire buckets. If
purging a directory inside a bucket, files are deleted individually.
³ StreamUpload is not supported with Nextcloud
⁴ Use the `--sftp-copy-is-hardlink` flag to enable.
⁵ Use the `--onedrive-delta` flag to enable.
{{< optional-features-table >}}
### Purge

58
docs/content/tiers.md Normal file
View File

@@ -0,0 +1,58 @@
---
title: "Backend Support Tiers"
description: "A complete list of supported backends and their stability tiers."
---
# Tiers
Rclone backends are divided into tiers to give users an idea of the stability of each backend.
| Tier | Label | Intended meaning |
|--------|---------------|------------------|
| Tier 1 | Core | Production-grade, first-class |
| Tier 2 | Stable | Well-supported, minor gaps |
| Tier 3 | Supported | Works for many uses; known caveats |
| Tier 4 | Experimental | Use with care; expect gaps/changes |
| Tier 5 | Deprecated | No longer maintained or supported |
## Overview
Here is a summary of all backends:
{{< tiers-table >}}
## Scoring
Here is how the backends are scored.
### Features
These are useful optional features a backend should have in rough
order of importance. Each one of these scores a point for the Features
column.
- F1: Hash(es)
- F2: Modtime
- F3: Stream upload
- F4: Copy/Move
- F5: DirMove
- F6: Metadata
- F7: MultipartUpload
### Tier
The tier is decided after determining these attributes. Some discretion is allowed in tiering as some of these attributes are more important than others.
| Attr | T1: Core | T2: Stable | T3: Supported | T4: Experimental | T5: Incubator |
|------|----------|------------|---------------|------------------|---------------|
| Maintainers | >=2 | >=1 | >=1 | >=0 | >=0 |
| API source | Official | Official | Either | Either | Either |
| Features (F1-F7) | >=5/7 | >=4/7 | >=3/7 | >=2/7 | N/A |
| Integration tests | All Green | All green | Nearly all green | Some Flaky | N/A |
| Error handling | Pacer | Pacer | Retries | Retries | N/A |
| Data integrity | Hashes, alt, modtime | Hashes or alt | Hash OR modtime | Best-effort | N/A |
| Perf baseline | Bench within 2x S3 | Bench doc | Anecdotal OK | Optional | N/A |
| Adoption | widely used | often used | some use | N/A | N/A |
| Docs completeness | Full | Full | Basic | Minimal | Minimal |
| Security | Principle-of-least-privilege | Reasonable scopes | Basic auth | Works | Works |

View File

@@ -0,0 +1,16 @@
backend: alias
name: Alias
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: true
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,43 @@
backend: archive
name: Archive
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestArchive:'
features:
- About
- CanHaveEmptyDirectories
- DirMove
- Move
- OpenWriterAt
- Overlay
- PartialUploads
- PutStream
- ReadMetadata
- SetWrapper
- UnWrap
- UserMetadata
- WrapFs
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1000000000

View File

@@ -0,0 +1,34 @@
backend: azureblob
name: Azure Blob
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestAzureBlob:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- DoubleSlash
- GetTier
- ListP
- ListR
- OpenChunkWriter
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- ServerSideAcrossConfigs
- SetTier
- UserMetadata
- WriteMetadata
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,30 @@
backend: azurefiles
name: Azure Files
tier: Tier 2
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestAzureFiles:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirMove
- ListP
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- ReadMimeType
- SlowHash
- WriteMimeType
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,31 @@
backend: b2
name: B2
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestB2:'
features:
- BucketBased
- BucketBasedRootOK
- ChunkWriterDoesntSeek
- CleanUp
- Command
- Copy
- ListP
- ListR
- OpenChunkWriter
- PublicLink
- Purge
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- sha1
precision: 1000000

View File

@@ -0,0 +1,32 @@
backend: box
name: Box
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestBox:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- ListP
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- Shutdown
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,40 @@
backend: cache
name: Cache
tier: Tier 5
maintainers: None
features_score: 7
integration_tests: Passing
data_integrity: Full
performance: High
adoption: Some use
docs: Full
security: High
virtual: true
remote: 'TestCache:'
features:
- About
- CanHaveEmptyDirectories
- Command
- DirCacheFlush
- DirMove
- Move
- Overlay
- PutStream
- SetWrapper
- UnWrap
- WrapFs
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,16 @@
backend: chunker
name: Chunker
tier: Tier 4
maintainers: None
features_score: 7
integration_tests: Passing
data_integrity: Full
performance: High
adoption: null
docs: null
security: null
virtual: true
remote: 'TestChunkerLocal:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,18 @@
backend: cloudinary
name: Cloudinary
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestCloudinary:'
features:
- CanHaveEmptyDirectories
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,49 @@
backend: combine
name: Combine
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: true
remote: TestCombine:dir1
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- OpenWriterAt
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,39 @@
backend: compress
name: Compress
tier: Tier 4
maintainers: Core
features_score: null
integration_tests: Failing
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: true
remote: 'TestCompress:'
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- SetWrapper
- UnWrap
- UserDirMetadata
- UserMetadata
- WrapFs
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,16 @@
backend: crypt
name: Crypt
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: High
performance: High
adoption: Widely used
docs: Full
security: High
virtual: true
remote: 'TestCryptLocal:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,16 @@
backend: doi
name: Doi
tier: Tier 2
maintainers: External
features_score: null
integration_tests: null
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,27 @@
backend: drime
name: Drime
tier: Tier 1
maintainers: Core
features_score: null
integration_tests: Passing
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: 'TestDrime:'
features:
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- OpenChunkWriter
- Purge
- PutStream
- PutUnchecked
- ReadMimeType
- WriteMimeType
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,48 @@
backend: drive
name: Drive
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestDrive:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- CleanUp
- Command
- Copy
- DirCacheFlush
- DirMove
- DirSetModTime
- DuplicateFiles
- FilterAware
- ListP
- ListR
- MergeDirs
- MkdirMetadata
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
- WriteMimeType
hashes:
- md5
- sha1
- sha256
precision: 1000000

View File

@@ -0,0 +1,29 @@
backend: dropbox
name: Dropbox
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestDropbox:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- Copy
- DirMove
- ListP
- Move
- PublicLink
- Purge
- PutStream
- Shutdown
hashes:
- dropbox
precision: 1000000000

View File

@@ -0,0 +1,26 @@
backend: fichier
name: Fichier
tier: Tier 3
maintainers: Core
features_score: 2
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFichier:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirMove
- DuplicateFiles
- Move
- PublicLink
- PutUnchecked
- ReadMimeType
hashes:
- whirlpool
precision: 3153600000000000000

View File

@@ -0,0 +1,26 @@
backend: filefabric
name: Filefabric
tier: Tier 4
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFileFabric:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
- ReadMimeType
- WriteMimeType
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,21 @@
backend: filelu
name: Filelu
tier: Tier 1
maintainers: Core
features_score: null
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestFileLu:'
features:
- About
- CanHaveEmptyDirectories
- Move
- Purge
- SlowHash
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: filen
name: Filen
tier: Tier 1
maintainers: External
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestFilen:'
features:
- About
- CanHaveEmptyDirectories
- ChunkWriterDoesntSeek
- CleanUp
- DirMove
- ListR
- Move
- OpenChunkWriter
- Purge
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- blake3
precision: 1000000

View File

@@ -0,0 +1,29 @@
backend: filescom
name: Filescom
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestFilesCom:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- Move
- PublicLink
- Purge
- PutStream
- ReadMimeType
hashes:
- md5
- crc32
precision: 1000000000

View File

@@ -0,0 +1,22 @@
backend: ftp
name: FTP
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestFTPProftpd:'
features:
- CanHaveEmptyDirectories
- DirMove
- Move
- PartialUploads
- PutStream
- Shutdown
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,34 @@
backend: gofile
name: Gofile
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestGoFile:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- DuplicateFiles
- ListR
- MergeDirs
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
- ReadMimeType
- WriteDirSetModTime
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,26 @@
backend: googlecloudstorage
name: Google Cloud Storage
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestGoogleCloudStorage:'
features:
- BucketBased
- BucketBasedRootOK
- CanHaveEmptyDirectories
- Copy
- ListP
- ListR
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,20 @@
backend: googlephotos
name: Google Photos
tier: Tier 5
maintainers: None
features_score: 0
integration_tests: Failing
data_integrity: Other
performance: Low
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestGooglePhotos:'
features:
- Disconnect
- ReadMimeType
- Shutdown
- UserInfo
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,16 @@
backend: hasher
name: Hasher
tier: Tier 4
maintainers: Core
features_score: null
integration_tests: Passing
data_integrity: Full
performance: High
adoption: null
docs: null
security: null
virtual: true
remote: null
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,22 @@
backend: hdfs
name: Hdfs
tier: Tier 2
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestHdfs:'
features:
- About
- CanHaveEmptyDirectories
- DirMove
- Move
- Purge
- PutStream
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: hidrive
name: Hidrive
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestHiDrive:'
features:
- CanHaveEmptyDirectories
- Copy
- DirMove
- Move
- Purge
- PutStream
- PutUnchecked
- Shutdown
hashes:
- hidrive
precision: 1000000000

View File

@@ -0,0 +1,20 @@
backend: http
name: Http
tier: Tier 3
maintainers: Core
features_score: null
integration_tests: Disabled
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: ':http,url=''http://downloads.rclone.org'':'
features:
- CanHaveEmptyDirectories
- Command
- PutStream
- ReadMetadata
hashes: []
precision: 1000000000

View File

@@ -0,0 +1,16 @@
backend: iclouddrive
name: Iclouddrive
tier: Tier 4
maintainers: External
features_score: 3
integration_tests: Flakey
data_integrity: Modtime
performance: Low
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestICloudDrive:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,23 @@
backend: imagekit
name: Imagekit
tier: Tier 1
maintainers: External
features_score: null
integration_tests: Passing
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: 'TestImageKit:'
features:
- CanHaveEmptyDirectories
- FilterAware
- PublicLink
- Purge
- ReadMetadata
- ReadMimeType
- SlowHash
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,28 @@
backend: internetarchive
name: Internet Archive
tier: Tier 3
maintainers: Core
features_score: 5
integration_tests: Failing
data_integrity: Hash
performance: Medium
adoption: Widely used
docs: Full
security: High
virtual: false
remote: TestIA:rclone-integration-test
features:
- About
- BucketBased
- CleanUp
- Copy
- ListR
- PublicLink
- ReadMetadata
- UserMetadata
- WriteMetadata
hashes:
- md5
- sha1
- crc32
precision: 1

View File

@@ -0,0 +1,32 @@
backend: jottacloud
name: Jottacloud
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Flakey
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestJottacloud:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirMove
- ListR
- Move
- PublicLink
- Purge
- ReadMetadata
- ReadMimeType
- Shutdown
- UserInfo
- WriteMetadata
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: koofr
name: Koofr
tier: Tier 2
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestKoofr:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirMove
- Move
- PublicLink
- PutStream
hashes:
- md5
precision: 1000000

View File

@@ -0,0 +1,20 @@
backend: linkbox
name: Linkbox
tier: Tier 5
maintainers: Core
features_score: 2
integration_tests: Failing
data_integrity: Modtime
performance: High
adoption: Often used
docs: Basic
security: High
virtual: false
remote: 'TestLinkbox:'
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- DirCacheFlush
- Purge
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,50 @@
backend: local
name: Local
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: .
features:
- About
- CanHaveEmptyDirectories
- Command
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- FilterAware
- IsLocal
- MkdirMetadata
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,27 @@
backend: mailru
name: Mailru
tier: Tier 1
maintainers: External
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestMailru:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- CleanUp
- Copy
- DirMove
- Move
- PublicLink
- Purge
- ServerSideAcrossConfigs
hashes:
- mailru
precision: 1000000000

View File

@@ -0,0 +1,27 @@
backend: mega
name: Mega
tier: Tier 2
maintainers: Core
features_score: 3
integration_tests: Flakey
data_integrity: Other
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestMega:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- DirCacheFlush
- DirMove
- DuplicateFiles
- MergeDirs
- Move
- PublicLink
- Purge
- PutUnchecked
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,25 @@
backend: memory
name: Memory
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: ':memory:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- ListP
- ListR
- PutStream
- ReadMimeType
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,22 @@
backend: netstorage
name: Netstorage
tier: Tier 1
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: Often used
adoption: Full
docs: High
security: null
virtual: false
remote: 'TestnStorage:'
features:
- CanHaveEmptyDirectories
- Command
- ListR
- Purge
- PutStream
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,38 @@
backend: onedrive
name: Onedrive
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Flakey
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestOneDrive:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- ChangeNotify
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- DirSetModTime
- ListP
- MkdirMetadata
- Move
- PublicLink
- Purge
- ReadDirMetadata
- ReadMetadata
- ReadMimeType
- Shutdown
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- quickxor
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: opendrive
name: Opendrive
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestOpenDrive:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
hashes:
- md5
precision: 1000000000

View File

@@ -0,0 +1,32 @@
backend: oracleobjectstorage
name: Oracle Object Storage
tier: Tier 1
maintainers: Core
features_score: 6
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestOracleObjectStorage:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Command
- Copy
- GetTier
- ListP
- ListR
- OpenChunkWriter
- PutStream
- ReadMetadata
- ReadMimeType
- SetTier
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 1000000

View File

@@ -0,0 +1,31 @@
backend: pcloud
name: Pcloud
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestPcloud:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- Copy
- DirCacheFlush
- DirMove
- ListP
- ListR
- Move
- PartialUploads
- PublicLink
- Purge
- Shutdown
hashes:
- sha1
- sha256
precision: 1000000000

View File

@@ -0,0 +1,30 @@
backend: pikpak
name: Pikpak
tier: Tier 1
maintainers: External
features_score: 5
integration_tests: Hash
data_integrity: High
performance: Often used
adoption: Full
docs: High
security: null
virtual: false
remote: 'TestPikPak:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Command
- Copy
- DirCacheFlush
- DirMove
- Move
- NoMultiThreading
- PublicLink
- Purge
- ReadMimeType
- UserInfo
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: pixeldrain
name: Pixeldrain
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Hash
data_integrity: High
performance: Widely used
adoption: Full
docs: High
security: null
virtual: false
remote: 'TestPixeldrain:'
features:
- About
- CanHaveEmptyDirectories
- ChangeNotify
- DirMove
- DirSetModTime
- Move
- PublicLink
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- WriteMetadata
hashes:
- sha256
precision: 1000000

View File

@@ -0,0 +1,27 @@
backend: premiumizeme
name: Premiumizeme
tier: Tier 3
maintainers: Core
features_score: 2
integration_tests: Passing
data_integrity: Other
performance: High
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestPremiumizeMe:'
features:
- About
- CanHaveEmptyDirectories
- CaseInsensitive
- DirCacheFlush
- DirMove
- Move
- PublicLink
- Purge
- PutUnchecked
- ReadMimeType
- Shutdown
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,27 @@
backend: protondrive
name: Proton Drive
tier: Tier 5
maintainers: None
features_score: 4
integration_tests: Failing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestProtonDrive:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- DirCacheFlush
- DirMove
- Disconnect
- Move
- NoMultiThreading
- Purge
- ReadMimeType
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,28 @@
backend: putio
name: Putio
tier: Tier 2
maintainers: Core
features_score: 5
integration_tests: Flakey
data_integrity: Hash
performance: Low
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestPutio:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirCacheFlush
- DirMove
- DuplicateFiles
- Move
- Purge
- PutUnchecked
- ReadMimeType
hashes:
- crc32
precision: 1000000000

View File

@@ -0,0 +1,25 @@
backend: qingstor
name: Qingstor
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Disabled
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestQingStor:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Copy
- ListR
- ReadMimeType
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 3153600000000000000

View File

@@ -0,0 +1,24 @@
backend: quatrix
name: Quatrix
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestQuatrix:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- PartialUploads
- Purge
hashes: []
precision: 1000

View File

@@ -0,0 +1,37 @@
backend: s3
name: S3
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestS3:'
features:
- BucketBased
- BucketBasedRootOK
- CleanUp
- Command
- Copy
- DoubleSlash
- GetTier
- ListP
- ListR
- OpenChunkWriter
- PublicLink
- Purge
- PutStream
- ReadMetadata
- ReadMimeType
- SetTier
- SlowModTime
- UserMetadata
- WriteMetadata
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,28 @@
backend: seafile
name: Seafile
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Basic
security: High
virtual: false
remote: 'TestSeafile:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirMove
- ListR
- Move
- PublicLink
- Purge
- PutStream
- Shutdown
- UserInfo
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,29 @@
backend: sftp
name: SFTP
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestSFTPOpenssh:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- Move
- PartialUploads
- PutStream
- Shutdown
- SlowHash
hashes:
- md5
- sha1
precision: 1000000000

View File

@@ -0,0 +1,20 @@
backend: shade
name: Shade
tier: Tier 1
maintainers: External
features_score: null
integration_tests: Passing
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: 'TestShade:'
features:
- CanHaveEmptyDirectories
- DirMove
- Move
- OpenChunkWriter
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,16 @@
backend: sharefile
name: Sharefile
tier: Tier 5
maintainers: Core
features_score: null
integration_tests: Disabled
data_integrity: High
performance: null
adoption: null
docs: null
security: null
virtual: false
remote: 'TestSharefile:'
features: null
hashes: null
precision: null

View File

@@ -0,0 +1,18 @@
backend: sia
name: Sia
tier: Tier 4
maintainers: Core
features_score: 1
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: 'TestSia:'
features:
- CanHaveEmptyDirectories
- PutStream
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,26 @@
backend: smb
name: SMB
tier: Tier 2
maintainers: External
features_score: 5
integration_tests: Passing
data_integrity: Modtime
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: TestSMB:rclone
features:
- About
- BucketBased
- CanHaveEmptyDirectories
- CaseInsensitive
- DirMove
- Move
- OpenWriterAt
- PartialUploads
- PutStream
- Shutdown
hashes: []
precision: 1000000

View File

@@ -0,0 +1,24 @@
backend: storj
name: Storj
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Modtime
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestStorj:'
features:
- BucketBased
- BucketBasedRootOK
- Copy
- ListR
- Move
- PublicLink
- Purge
- PutStream
hashes: []
precision: 1

View File

@@ -0,0 +1,26 @@
backend: sugarsync
name: Sugarsync
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Passing
data_integrity: Other
performance: Medium
adoption: Some use
docs: Full
security: High
virtual: false
remote: TestSugarSync:Test
features:
- CanHaveEmptyDirectories
- CaseInsensitive
- Copy
- DirCacheFlush
- DirMove
- Move
- PublicLink
- Purge
- PutStream
- PutUnchecked
hashes: []
precision: 3153600000000000000

View File

@@ -0,0 +1,28 @@
backend: swift
name: Swift
tier: Tier 1
maintainers: Core
features_score: 4
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestSwiftAIO:'
features:
- About
- BucketBased
- BucketBasedRootOK
- Copy
- ListP
- ListR
- Purge
- PutStream
- ReadMimeType
- SlowModTime
- WriteMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,25 @@
backend: ulozto
name: Ulozto
tier: Tier 3
maintainers: Core
features_score: 3
integration_tests: Failing
data_integrity: Hash
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestUlozto:'
features:
- About
- CanHaveEmptyDirectories
- DirCacheFlush
- DirMove
- DuplicateFiles
- Move
- PutUnchecked
hashes:
- md5
- sha256
precision: 1000

View File

@@ -0,0 +1,47 @@
backend: union
name: Union
tier: Tier 1
maintainers: Core
features_score: 7
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: true
remote: 'TestUnion:'
features:
- About
- CanHaveEmptyDirectories
- DirModTimeUpdatesOnWrite
- DirMove
- DirSetModTime
- MkdirMetadata
- Move
- Overlay
- PartialUploads
- PutStream
- ReadDirMetadata
- ReadMetadata
- SlowHash
- UserDirMetadata
- UserMetadata
- WriteDirMetadata
- WriteDirSetModTime
- WriteMetadata
hashes:
- md5
- sha1
- whirlpool
- crc32
- sha256
- sha512
- blake3
- xxh3
- xxh128
- dropbox
- hidrive
- mailru
- quickxor
precision: 1

View File

@@ -0,0 +1,24 @@
backend: webdav
name: WebDAV
tier: Tier 1
maintainers: Core
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: Low
adoption: Widely used
docs: Full
security: High
virtual: false
remote: 'TestWebdavNextcloud:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirMove
- ListP
- Move
- Purge
hashes:
- sha1
precision: 1000000000

View File

@@ -0,0 +1,27 @@
backend: yandex
name: Yandex
tier: Tier 1
maintainers: External
features_score: 5
integration_tests: Passing
data_integrity: Hash
performance: High
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestYandex:'
features:
- About
- CanHaveEmptyDirectories
- CleanUp
- Copy
- DirMove
- Move
- PublicLink
- Purge
- PutStream
- ReadMimeType
hashes:
- md5
precision: 1

View File

@@ -0,0 +1,23 @@
backend: zoho
name: Zoho
tier: Tier 3
maintainers: External
features_score: 2
integration_tests: Failing
data_integrity: Other
performance: Medium
adoption: Often used
docs: Full
security: High
virtual: false
remote: 'TestZoho:'
features:
- About
- CanHaveEmptyDirectories
- Copy
- DirCacheFlush
- DirMove
- Move
- Purge
hashes: []
precision: 3153600000000000000

View File

@@ -44,6 +44,11 @@
<span class="badge badge-pill badge-danger float-right" style="margin-top: 30px; font-size: 100%" title="{{ $statusMessage }}">{{ $statusCode }}</span>
{{ end }}
{{ if .Page.File }}
{{ $backendName := .Page.File.TranslationBaseName }}
{{ partial "tier.html" (dict "name" $backendName "align" true) }}
{{ end }}
{{ block "main" . }}
{{ end }}
</div>

View File

@@ -0,0 +1,27 @@
{{/* Expect the context (.) to be the backend name string as .name and whether to align as .align */}}
{{ $backendName := .name | lower }}
{{ $data := index site.Data.backends $backendName }}
{{ $tierColors := dict
"Tier 1" "success"
"Tier 2" "success"
"Tier 3" "warning"
"Tier 4" "danger"
"Tier 5" "danger"
}}
{{ $tierMessages := dict
"Tier 1" "Core: Production-grade, first-class"
"Tier 2" "Stable: Well-supported, minor gaps"
"Tier 3" "Supported: Works for many uses; known caveats"
"Tier 4" "Experimental: Use with care; expect gaps/changes"
"Tier 5" "Deprecated: No longer maintained or supported"
}}
{{ if $data }}
{{ $color := index $tierColors $data.tier | default "secondary" }}
{{ $message := index $tierMessages $data.tier | default "" }}
<a href="/tiers/" class="badge badge-pill badge-{{ $color }} {{ if .align }}float-right{{ end }}" style="{{ if .align }}margin-top: 30px; {{ end }}font-size: 100%" title="{{ $message }}">
{{ $data.tier }}
</a>
{{ end }}

View File

@@ -0,0 +1,120 @@
<table>
<thead>
<tr>
<th>Name</th>
<th>Tier</th>
<th>Hash</th>
<th>ModTime</th>
<th>Case Insensitive</th>
<th>Duplicate Files</th>
<th>MIME Type</th>
<th>Metadata</th>
</tr>
</thead>
<tbody>
{{ range sort site.Data.backends "name" "asc" }}
{{ if .virtual }}{{ continue }} {{ end }}
<tr>
<td style="font-weight: bold;">
<a href="/{{ .backend | urlize }}">{{ .name }}</a>
</td>
{{/* Tier Column */}}
<td>
{{ partial "tier.html" (dict "name" .backend "align" false) }}
</td>
{{/* Hash Column */}}
<td>
{{ $local := in .features "IsLocal" }}
{{ if $local }}
<b>ALL</b>
{{ else }}
{{ with .hashes }}
{{ delimit . ", " }}
{{ else }}
-
{{ end }}
{{ end }}
</td>
{{/* ModTime */}}
<td>
{{ $d := or (in .features "MkdirMetadata") (in .features "DirSetModTime") }}
{{ $r := true }} {{/* FIXME don't have a way of reading this from the features */}}
{{ $w := and (isset . "precision") (le .precision 1000000000) }}
{{- if $d -}}
D
{{- end -}}
{{ if and $r $w -}}
R/W
{{- else if $r -}}
R
{{- else if $w -}}
W
{{- else -}}
-
{{- end -}}
</td>
{{/* Case Insensitive */}}
<td>
{{ if in .features "CaseInsensitive" }}Yes{{ else }}No{{ end }}
</td>
{{/* Duplicate Files */}}
<td>
{{ if in .features "DuplicateFiles" }}Yes{{ else }}No{{ end }}
</td>
{{/* MIME Type Synthesis */}}
<td>
{{ $r := in .features "ReadMimeType" }}
{{ $w := in .features "WriteMimeType" }}
{{ if and $r $w }}
R/W
{{ else if $r }}
R
{{ else if $w }}
W
{{ else }}
-
{{ end }}
</td>
{{/* Metadata Synthesis */}}
<td>
{{ $meta := "" }}
{{/* Check Directory Metadata Support */}}
{{ if or (in .features "ReadDirMetadata") (in .features "WriteDirMetadata") }}
{{ $meta = "D" }}
{{ end }}
{{/* Check System Metadata Read */}}
{{ if in .features "ReadMetadata" }}
{{ $meta = print $meta "R" }}
{{ end }}
{{/* Check System Metadata Write */}}
{{ if in .features "WriteMetadata" }}
{{ $meta = print $meta "W" }}
{{ end }}
{{/* Check User Metadata Support */}}
{{ if in .features "UserMetadata" }}
{{ $meta = print $meta "U" }}
{{ end }}
{{/* Output result or hyphen if empty */}}
{{ if eq $meta "" }}
-
{{ else }}
{{ $meta }}
{{ end }}
</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -0,0 +1,40 @@
<table>
<thead>
<tr>
<th align="left">Name</th>
<th align="center">Purge</th>
<th align="center">Copy</th>
<th align="center">Move</th>
<th align="center">DirMove</th>
<th align="center">CleanUp</th>
<th align="center">ListR</th>
<th align="center">StreamUpload</th>
<th align="left">MultithreadUpload</th>
<th align="center">LinkSharing</th>
<th align="center">About</th>
<th align="center">EmptyDir</th>
</tr>
</thead>
<tbody>
{{ range sort site.Data.backends "name" "asc" }}
{{ if .virtual }}{{ continue }} {{ end }}
<tr>
<td align="left" style="font-weight: bold;">
<a href="/{{ .backend | urlize }}">{{ .name }}</a>
</td>
<td align="center">{{ if in .features "Purge" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "Copy" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "Move" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "DirMove" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "CleanUp" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "ListR" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "PutStream" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if or (in .features "OpenChunkWriter") (in .features "OpenWriterAt") }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "PublicLink" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "About" }}Yes{{ else }}No{{ end }}</td>
<td align="center">{{ if in .features "CanHaveEmptyDirectories" }}Yes{{ else }}No{{ end }}</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -0,0 +1,36 @@
<table>
<thead>
<tr>
<th>Backend</th>
<th>Tier</th>
<th>Maintainers</th>
<th>Features</th>
<th>Tests</th>
<th>Integrity</th>
<th>Perf</th>
<th>Adoption</th>
<th>Docs</th>
<th>Security</th>
</tr>
</thead>
<tbody>
{{ range $name, $data := site.Data.backends }}
<tr>
<td style="font-weight: bold;">
<a href="/{{ $name | urlize }}">{{ $name | title }}</a>
</td>
<td>
{{ partial "tier.html" (dict "name" $name "align" false) }}
</td>
<td>{{ $data.maintainers | default "-" }}</td>
<td>{{ $data.features_score | default "-" }}</td>
<td>{{ $data.integration_tests | default "-" }}</td>
<td>{{ $data.data_integrity | default "-" }}</td>
<td>{{ $data.performance | default "-" }}</td>
<td>{{ $data.adoption | default "-" }}</td>
<td>{{ $data.docs | default "-" }}</td>
<td>{{ $data.security | default "-" }}</td>
</tr>
{{ end }}
</tbody>
</table>

View File

@@ -90,14 +90,14 @@ func validateHour(HHMM string) error {
return fmt.Errorf("invalid hour in time specification %q: %v", HHMM, err)
}
if hh < 0 || hh > 23 {
return fmt.Errorf("invalid hour (must be between 00 and 23): %q", hh)
return fmt.Errorf("invalid hour (must be between 00 and 23): %d", hh)
}
mm, err := strconv.Atoi(HHMM[3:])
if err != nil {
return fmt.Errorf("invalid minute in time specification: %q: %v", HHMM, err)
}
if mm < 0 || mm > 59 {
return fmt.Errorf("invalid minute (must be between 00 and 59): %q", hh)
return fmt.Errorf("invalid minute (must be between 00 and 59): %d", mm)
}
return nil
}

View File

@@ -15,7 +15,6 @@ import (
"time"
"github.com/rclone/rclone/fs"
"github.com/rclone/rclone/lib/errcount"
"golang.org/x/sync/errgroup"
"golang.org/x/text/unicode/norm"
)
@@ -627,7 +626,6 @@ func (f *Filter) MakeListR(ctx context.Context, NewObject func(ctx context.Conte
remotes = make(chan string, checkers)
g, gCtx = errgroup.WithContext(ctx)
)
ec := errcount.New()
for range checkers {
g.Go(func() (err error) {
var entries = make(fs.DirEntries, 1)
@@ -636,8 +634,7 @@ func (f *Filter) MakeListR(ctx context.Context, NewObject func(ctx context.Conte
if err == fs.ErrorObjectNotFound {
// Skip files that are not found
} else if err != nil {
fs.Errorf(remote, "--files-from failed to find file: %v", err)
ec.Add(err)
return err
} else {
err = callback(entries)
if err != nil {
@@ -657,8 +654,7 @@ func (f *Filter) MakeListR(ctx context.Context, NewObject func(ctx context.Conte
}
}
close(remotes)
ec.Add(g.Wait())
return ec.Err("failed to read --files-from files")
return g.Wait()
}
}

View File

@@ -394,7 +394,7 @@ func TestNewFilterMakeListR(t *testing.T) {
// Now check an error is returned from NewObject
require.NoError(t, f.AddFile("error"))
err = listR(context.Background(), "", listRcallback)
require.EqualError(t, err, "failed to read --files-from files: assert.AnError general error for testing")
require.EqualError(t, err, assert.AnError.Error())
// The checker will exit by the error above
ci := fs.GetConfig(context.Background())
@@ -403,7 +403,7 @@ func TestNewFilterMakeListR(t *testing.T) {
// Now check an error is returned from NewObject
require.NoError(t, f.AddFile("error"))
err = listR(context.Background(), "", listRcallback)
require.EqualError(t, err, "failed to read --files-from files: assert.AnError general error for testing")
require.EqualError(t, err, assert.AnError.Error())
}
func TestNewFilterMinSize(t *testing.T) {

6
go.mod
View File

@@ -44,8 +44,6 @@ require (
github.com/go-git/go-billy/v5 v5.6.2
github.com/google/uuid v1.6.0
github.com/hanwen/go-fuse/v2 v2.9.0
github.com/henrybear327/Proton-API-Bridge v1.0.0
github.com/henrybear327/go-proton-api v1.0.0
github.com/jcmturner/gokrb5/v8 v8.4.4
github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3
github.com/josephspurrier/goversioninfo v1.5.0
@@ -69,6 +67,8 @@ require (
github.com/prometheus/client_golang v1.23.2
github.com/putdotio/go-putio/putio v0.0.0-20200123120452-16d982cac2b8
github.com/quasilyte/go-ruleguard/dsl v0.3.23
github.com/rclone/Proton-API-Bridge v1.0.1-0.20260127174007-77f974840d11
github.com/rclone/go-proton-api v1.0.1-0.20260127173028-eb465cac3b18
github.com/rclone/gofakes3 v0.0.4
github.com/rfjakob/eme v1.1.2
github.com/rivo/uniseg v0.4.7
@@ -81,7 +81,7 @@ require (
github.com/t3rm1n4l/go-mega v0.0.0-20251031123324-a804aaa87491
github.com/unknwon/goconfig v1.0.0
github.com/willscott/go-nfs v0.0.3
github.com/winfsp/cgofuse v1.6.1-0.20250813110601-7d90b0992471
github.com/winfsp/cgofuse v1.6.1-0.20260126094232-f2c4fccdb286
github.com/wk8/go-ordered-map/v2 v2.1.8
github.com/xanzy/ssh-agent v0.3.3
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78

10
go.sum
View File

@@ -420,10 +420,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/henrybear327/Proton-API-Bridge v1.0.0 h1:gjKAaWfKu++77WsZTHg6FUyPC5W0LTKWQciUm8PMZb0=
github.com/henrybear327/Proton-API-Bridge v1.0.0/go.mod h1:gunH16hf6U74W2b9CGDaWRadiLICsoJ6KRkSt53zLts=
github.com/henrybear327/go-proton-api v1.0.0 h1:zYi/IbjLwFAW7ltCeqXneUGJey0TN//Xo851a/BgLXw=
github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMXYafI8H74D77AxytOBc=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
@@ -590,6 +586,10 @@ github.com/quic-go/quic-go v0.53.0 h1:QHX46sISpG2S03dPeZBgVIZp8dGagIaiu2FiVYvpCZ
github.com/quic-go/quic-go v0.53.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93 h1:UVArwN/wkKjMVhh2EQGC0tEc1+FqiLlvYXY5mQ2f8Wg=
github.com/rasky/go-xdr v0.0.0-20170124162913-1a41d1a06c93/go.mod h1:Nfe4efndBz4TibWycNE+lqyJZiMX4ycx+QKV8Ta0f/o=
github.com/rclone/Proton-API-Bridge v1.0.1-0.20260127174007-77f974840d11 h1:4MI2alxM/Ye2gIRBlYf28JGWTipZ4Zz7yAziPKrttjs=
github.com/rclone/Proton-API-Bridge v1.0.1-0.20260127174007-77f974840d11/go.mod h1:3HLX7dwZgvB7nt+Yl/xdzVPcargQ1yBmJEUg3n+jMKM=
github.com/rclone/go-proton-api v1.0.1-0.20260127173028-eb465cac3b18 h1:Lc+d3ISfQaMJKWZOE7z4ZSY4RVmdzbn1B0IM8xN18qM=
github.com/rclone/go-proton-api v1.0.1-0.20260127173028-eb465cac3b18/go.mod h1:LB2kCEaZMzNn3ocdz+qYfxXmuLxxN0ka62KJd2x53Bc=
github.com/rclone/gofakes3 v0.0.4 h1:LswpC49VY/UJ1zucoL5ktnOEX6lq3qK7e1aFIAfqCbk=
github.com/rclone/gofakes3 v0.0.4/go.mod h1:j/UoS+2/Mr7xAlfKhyVC58YyFQmh9uoQA5YZQXQUqmg=
github.com/relvacode/iso8601 v1.7.0 h1:BXy+V60stMP6cpswc+a93Mq3e65PfXCgDFfhvNNGrdo=
@@ -683,6 +683,8 @@ github.com/willscott/go-nfs-client v0.0.0-20251022144359-801f10d98886 h1:DtrBtkg
github.com/willscott/go-nfs-client v0.0.0-20251022144359-801f10d98886/go.mod h1:Tq++Lr/FgiS3X48q5FETemXiSLGuYMQT2sPjYNPJSwA=
github.com/winfsp/cgofuse v1.6.1-0.20250813110601-7d90b0992471 h1:aSOo0k+aLWdhUQiUxzv4cZ7cUp3OLP+Qx7cjs6OUxME=
github.com/winfsp/cgofuse v1.6.1-0.20250813110601-7d90b0992471/go.mod h1:uxjoF2jEYT3+x+vC2KJddEGdk/LU8pRowXmyVMHSV5I=
github.com/winfsp/cgofuse v1.6.1-0.20260126094232-f2c4fccdb286 h1:tw5GqRXqExB/xghPoPLtVujBe9w9Pg1G78tvXCJNJAA=
github.com/winfsp/cgofuse v1.6.1-0.20260126094232-f2c4fccdb286/go.mod h1:uxjoF2jEYT3+x+vC2KJddEGdk/LU8pRowXmyVMHSV5I=
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=