mirror of
https://github.com/rclone/rclone.git
synced 2026-01-06 18:43:50 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
45032a2122 | ||
|
|
41296a972a | ||
|
|
22a14a8c98 | ||
|
|
07133b892d | ||
|
|
a8ca18165e | ||
|
|
8c4e71fc84 | ||
|
|
351e2db2ef | ||
|
|
2234feb23d | ||
|
|
fb5125ecee | ||
|
|
e8cbc54a06 | ||
|
|
00512e1303 | ||
|
|
fcfbd3153b | ||
|
|
9a8075b682 | ||
|
|
996037bee9 |
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -130,8 +130,12 @@ jobs:
|
||||
- name: Install Libraries on macOS
|
||||
shell: bash
|
||||
run: |
|
||||
brew untap homebrew/core homebrew/cask
|
||||
brew config
|
||||
brew update
|
||||
brew install --cask macfuse
|
||||
env:
|
||||
HOMEBREW_NO_INSTALL_FROM_API: # No value, so brew doesn't rely on homebrew-core / homebrew-cask
|
||||
if: matrix.os == 'macos-11'
|
||||
|
||||
- name: Install Libraries on Windows
|
||||
|
||||
@@ -74,6 +74,10 @@ const (
|
||||
tele2CloudTokenURL = "https://mittcloud-auth.tele2.se/auth/realms/comhem/protocol/openid-connect/token"
|
||||
tele2CloudAuthURL = "https://mittcloud-auth.tele2.se/auth/realms/comhem/protocol/openid-connect/auth"
|
||||
tele2CloudClientID = "desktop"
|
||||
|
||||
onlimeCloudTokenURL = "https://cloud-auth.onlime.dk/auth/realms/onlime_wl/protocol/openid-connect/token"
|
||||
onlimeCloudAuthURL = "https://cloud-auth.onlime.dk/auth/realms/onlime_wl/protocol/openid-connect/auth"
|
||||
onlimeCloudClientID = "desktop"
|
||||
)
|
||||
|
||||
// Register with Fs
|
||||
@@ -139,6 +143,9 @@ func Config(ctx context.Context, name string, m configmap.Mapper, config fs.Conf
|
||||
}, {
|
||||
Value: "tele2",
|
||||
Help: "Tele2 Cloud authentication.\nUse this if you are using Tele2 Cloud.",
|
||||
}, {
|
||||
Value: "onlime",
|
||||
Help: "Onlime Cloud authentication.\nUse this if you are using Onlime Cloud.",
|
||||
}})
|
||||
case "auth_type_done":
|
||||
// Jump to next state according to config chosen
|
||||
@@ -261,6 +268,21 @@ machines.`)
|
||||
RedirectURL: oauthutil.RedirectLocalhostURL,
|
||||
},
|
||||
})
|
||||
case "onlime": // onlime cloud config
|
||||
m.Set("configVersion", fmt.Sprint(configVersion))
|
||||
m.Set(configClientID, onlimeCloudClientID)
|
||||
m.Set(configTokenURL, onlimeCloudTokenURL)
|
||||
return oauthutil.ConfigOut("choose_device", &oauthutil.Options{
|
||||
OAuth2Config: &oauth2.Config{
|
||||
Endpoint: oauth2.Endpoint{
|
||||
AuthURL: onlimeCloudAuthURL,
|
||||
TokenURL: onlimeCloudTokenURL,
|
||||
},
|
||||
ClientID: onlimeCloudClientID,
|
||||
Scopes: []string{"openid", "jotta-default", "offline_access"},
|
||||
RedirectURL: oauthutil.RedirectLocalhostURL,
|
||||
},
|
||||
})
|
||||
case "choose_device":
|
||||
return fs.ConfigConfirm("choose_device_query", false, "config_non_standard", `Use a non-standard device/mountpoint?
|
||||
Choosing no, the default, will let you access the storage used for the archive
|
||||
|
||||
@@ -738,3 +738,6 @@ put them back in again.` >}}
|
||||
* Peter Fern <github@0xc0dedbad.com>
|
||||
* zzq <i@zhangzqs.cn>
|
||||
* mac-15 <usman.ilamdin@phpstudios.com>
|
||||
* Sawada Tsunayoshi <34431649+TsunayoshiSawada@users.noreply.github.com>
|
||||
* Dean Attali <daattali@gmail.com>
|
||||
* Fjodor42 <molgaard@gmail.com>
|
||||
|
||||
@@ -3,31 +3,42 @@ title: "Contact"
|
||||
description: "Contact the rclone project"
|
||||
---
|
||||
|
||||
# Contact the rclone project #
|
||||
# Contact the rclone project
|
||||
|
||||
## Forum ##
|
||||
## Forum
|
||||
|
||||
Forum for questions and general discussion:
|
||||
|
||||
* https://forum.rclone.org
|
||||
- https://forum.rclone.org
|
||||
|
||||
## GitHub repository ##
|
||||
## Business support
|
||||
|
||||
For business support or sponsorship enquiries please see:
|
||||
|
||||
- https://rclone.com/
|
||||
- sponsorship@rclone.com
|
||||
|
||||
## GitHub repository
|
||||
|
||||
The project's repository is located at:
|
||||
|
||||
* https://github.com/rclone/rclone
|
||||
- https://github.com/rclone/rclone
|
||||
|
||||
There you can file bug reports or contribute with pull requests.
|
||||
|
||||
## Twitter ##
|
||||
## Twitter
|
||||
|
||||
You can also follow me on twitter for rclone announcements:
|
||||
You can also follow Nick on twitter for rclone announcements:
|
||||
|
||||
* [@njcw](https://twitter.com/njcw)
|
||||
- [@njcw](https://twitter.com/njcw)
|
||||
|
||||
## Email ##
|
||||
## Email
|
||||
|
||||
Or if all else fails or you want to ask something private or
|
||||
confidential email [Nick Craig-Wood](mailto:nick@craig-wood.com).
|
||||
Please don't email me requests for help - those are better directed to
|
||||
the forum. Thanks!
|
||||
confidential
|
||||
|
||||
- info@rclone.com
|
||||
|
||||
Please don't email requests for help to this address - those are
|
||||
better directed to the forum unless you'd like to sign up for business
|
||||
support.
|
||||
|
||||
@@ -502,6 +502,6 @@ to be the same account as the Dropbox you want to access)
|
||||
|
||||
6. Switch to the `Permissions` tab. Enable at least the following permissions: `account_info.read`, `files.metadata.write`, `files.content.write`, `files.content.read`, `sharing.write`. The `files.metadata.read` and `sharing.read` checkboxes will be marked too. Click `Submit`
|
||||
|
||||
7. Switch to the `Settings` tab. Fill `OAuth2 - Redirect URIs` as `http://localhost:53682/`
|
||||
7. Switch to the `Settings` tab. Fill `OAuth2 - Redirect URIs` as `http://localhost:53682/` and click on `Add`
|
||||
|
||||
8. Find the `App key` and `App secret` values on the `Settings` tab. Use these values in rclone config to add a new remote or edit an existing remote. The `App key` setting corresponds to `client_id` in rclone config, the `App secret` corresponds to `client_secret`
|
||||
|
||||
@@ -367,7 +367,7 @@ all files on `remote:` excluding those in root directory `dir` and sub
|
||||
directories.
|
||||
|
||||
E.g. on Microsoft Windows `rclone ls remote: --exclude "*\[{JP,KR,HK}\]*"`
|
||||
lists the files in `remote:` with `[JP]` or `[KR]` or `[HK]` in
|
||||
lists the files in `remote:` without `[JP]` or `[KR]` or `[HK]` in
|
||||
their name. Quotes prevent the shell from interpreting the `\`
|
||||
characters.`\` characters escape the `[` and `]` so an rclone filter
|
||||
treats them literally rather than as a character-range. The `{` and `}`
|
||||
|
||||
@@ -14,6 +14,8 @@ it also provides white-label solutions to different companies, such as:
|
||||
* Telia Sky (sky.telia.no)
|
||||
* Tele2
|
||||
* Tele2 Cloud (mittcloud.tele2.se)
|
||||
* Onlime
|
||||
* Onlime Cloud Storage (onlime.dk)
|
||||
* Elkjøp (with subsidiaries):
|
||||
* Elkjøp Cloud (cloud.elkjop.no)
|
||||
* Elgiganten Sweden (cloud.elgiganten.se)
|
||||
@@ -84,6 +86,18 @@ Tele2 Cloud customers as no support for creating a CLI token exists, and additio
|
||||
authentication flow where the username is generated internally. To setup rclone to use Tele2 Cloud,
|
||||
choose Tele2 Cloud authentication in the setup. The rest of the setup is identical to the default setup.
|
||||
|
||||
### Onlime Cloud Storage authentication
|
||||
|
||||
Onlime has sold access to Jottacloud proper, while providing localized support to Danish Customers, but
|
||||
have recently set up their own hosting, transferring their customers from Jottacloud servers to their
|
||||
own ones.
|
||||
|
||||
This, of course, necessitates using their servers for authentication, but otherwise functionality and
|
||||
architecture seems equivalent to Jottacloud.
|
||||
|
||||
To setup rclone to use Onlime Cloud Storage, choose Onlime Cloud authentication in the setup. The rest
|
||||
of the setup is identical to the default setup.
|
||||
|
||||
## Configuration
|
||||
|
||||
Here is an example of how to make a remote called `remote` with the default setup. First run:
|
||||
@@ -127,6 +141,9 @@ Press Enter for the default (standard).
|
||||
/ Tele2 Cloud authentication.
|
||||
4 | Use this if you are using Tele2 Cloud.
|
||||
\ (tele2)
|
||||
/ Onlime Cloud authentication.
|
||||
5 | Use this if you are using Onlime Cloud.
|
||||
\ (onlime)
|
||||
config_type> 1
|
||||
Personal login token.
|
||||
Generate here: https://www.jottacloud.com/web/secure
|
||||
|
||||
57
docs/content/sponsor.md
Normal file
57
docs/content/sponsor.md
Normal file
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "Sponsor"
|
||||
description: "Sponsor the rclone project."
|
||||
type: page
|
||||
aliases:
|
||||
- donate
|
||||
---
|
||||
|
||||
# {{< icon "fa fa-heart heart" >}} Sponsor the rclone project
|
||||
|
||||
Rclone is a free open-source project with thousands of contributions
|
||||
from volunteers all round the world and I would like to thank all of
|
||||
you for donating your time to the project.
|
||||
|
||||
However, maintaining rclone is a lot of work - it is **my full time
|
||||
job**. Nothing stands still in the world of cloud storage. Rclone
|
||||
needs constant attention adapting to changes by cloud providers,
|
||||
adding new providers, adding new features, keeping the integration
|
||||
tests working, fixing bugs and many more things!
|
||||
|
||||
I love doing the work and I'd like to keep doing it - your support
|
||||
helps make rclone possible.
|
||||
|
||||
Thank you :-)
|
||||
|
||||
{{< nick >}}
|
||||
|
||||
## Business users
|
||||
|
||||
If your business or your customers rely on rclone then it would make
|
||||
sense to sponsor rclone to ensure that the open source project you
|
||||
need stays healthy and well maintained.
|
||||
|
||||
Sponsorship can include support contracts, advertising deals and
|
||||
consultancy.
|
||||
|
||||
Please see our business site [rclone.com](https://rclone.com) for
|
||||
details.
|
||||
|
||||
{{< bizbutton >}}
|
||||
|
||||
## Personal users
|
||||
|
||||
If you are a personal user and you would like to support the project
|
||||
with sponsorship as a way of saying thank you that would be most
|
||||
appreciated. {{< icon "fa fa-heart heart" >}}
|
||||
|
||||
{{< monthly_donations >}}
|
||||
|
||||
If you don't want to contribute monthly then of course we'd love a one
|
||||
off donation.
|
||||
|
||||
{{< one_off_donations >}}
|
||||
|
||||
## Current sponsors
|
||||
|
||||
...Will appear here...
|
||||
@@ -7,13 +7,7 @@
|
||||
<meta name="description" content="{{ .Description }}">
|
||||
<meta name="author" content="Nick Craig-Wood">
|
||||
<link rel="shortcut icon" type="image/png" href="/img/rclone-32x32.png"/>
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-51081799-1"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', 'UA-51081799-1');
|
||||
</script>
|
||||
<script defer data-domain="rclone.org" src="https://weblog.rclone.org/js/script.js"></script>
|
||||
<title>{{ block "title" . }}{{ .Title }}{{ end }}</title>
|
||||
<link rel="canonical" href="{{ .Permalink }}">
|
||||
<link href="/css/bootstrap.min.4.4.1.css" rel="stylesheet">
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<i class="fa fa-comments fa-fw" aria-hidden="true"></i> <a href="https://forum.rclone.org">Rclone forum</a><br />
|
||||
<i class="fab fa-github fa-fw" aria-hidden="true"></i> <a href="https://github.com/rclone/rclone">GitHub project</a><br />
|
||||
<i class="fa fa-book fa-fw" aria-hidden="true"></i> <a href="https://github.com/rclone/rclone/wiki">Rclone Wiki</a><br />
|
||||
<i class="fa fa-heart heart fa-fw" aria-hidden="true"></i> <a href="/donate/">Donate</a><br />
|
||||
<i class="fa fa-heart heart fa-fw" aria-hidden="true"></i> <a href="/sponsor/">Sponsor</a><br />
|
||||
<i class="fab fa-twitter fa-fw" aria-hidden="true"></i> <a href="https://twitter.com/njcw">@njcw</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -109,7 +109,12 @@
|
||||
<a class="nav-link" href="/contact/"><i class="fa fa-envelope fa-fw"></i> Contact</a>
|
||||
</li>
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" href="/donate/"><i class="fa fa-heart heart fa-fw"></i> Donate</a>
|
||||
<a class="nav-link" href="/sponsor/"><i class="fa fa-heart heart fa-fw"></i> Sponsor</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item active">
|
||||
<a href="https://rclone.com/" target="_blank" class="nav-link bizbutton" title="Click here for support and advertising contracts"><i class="fa fa-briefcase"></i> For Business</a>
|
||||
</li>
|
||||
</ul>
|
||||
<form class="form-inline" name="search_form" action="https://google.com/search" target="_blank" onsubmit="on_search();">
|
||||
|
||||
@@ -1 +1 @@
|
||||
v1.63.0
|
||||
v1.64.0
|
||||
1
docs/layouts/shortcodes/bizbutton.html
Normal file
1
docs/layouts/shortcodes/bizbutton.html
Normal file
@@ -0,0 +1 @@
|
||||
<a class="btn btn-primary" role="button" href="https://rclone.com/" target="_blank"><i class="fa fa-briefcase" aria-hidden="true"></i> For Business</a>
|
||||
@@ -6,9 +6,9 @@
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
||||
<span class="dropdown-item"><small class="text-muted">Please check the "monthly" box</small></span>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=B9JZV25DCP2SJ&source=url">Donate in $ USD</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RGRFXCDDHK3LW&source=url">Donate in £ GBP</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y2AMZXSALFBR4&source=url">Donate in € EUR</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=B9JZV25DCP2SJ&source=url">Sponsor in $ USD</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RGRFXCDDHK3LW&source=url">Sponsor in £ GBP</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y2AMZXSALFBR4&source=url">Sponsor in € EUR</a>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn btn-primary" role="button" href="https://patreon.com/njcw/" target="_blank"><i class="fab fa-patreon" aria-hidden="true"></i> Patreon</a>
|
||||
|
||||
@@ -1 +1 @@
|
||||
<p><img src="/img/nick.svg" width="80" alt="Nick"><br><small>Nick Craig-Wood</small></p>
|
||||
<p><img src="/img/nick.svg" width="60" alt="Nick"><br><small>Nick Craig-Wood</small></p>
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
<i class="fab fa-paypal" aria-hidden="true"></i> PayPal
|
||||
</a>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=B9JZV25DCP2SJ&source=url">Donate in $ USD</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RGRFXCDDHK3LW&source=url">Donate in £ GBP</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y2AMZXSALFBR4&source=url">Donate in € EUR</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=B9JZV25DCP2SJ&source=url">Sponsor in $ USD</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RGRFXCDDHK3LW&source=url">Sponsor in £ GBP</a>
|
||||
<a class="dropdown-item" target="_blank" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y2AMZXSALFBR4&source=url">Sponsor in € EUR</a>
|
||||
</div>
|
||||
</div>
|
||||
<a class="btn btn-primary" role="button" href="https://www.paypal.me/nickcw" target="_blank"><i class="fab fa-paypal" aria-hidden="true"></i> PayPal.Me</a>
|
||||
|
||||
11
docs/static/css/custom.css
vendored
11
docs/static/css/custom.css
vendored
@@ -171,6 +171,17 @@ a.badge-primary.focus, a.badge-primary:focus {
|
||||
outline: 0;
|
||||
box-shadow: 0 0 0 0.2rem rgba(112,202,242,.5);
|
||||
}
|
||||
.bizbutton {
|
||||
background-color:#fb7a20;
|
||||
border-radius: 15px;
|
||||
padding: 5px;
|
||||
}
|
||||
.bizbutton:hover {
|
||||
/* background-color:#f29870; */
|
||||
/* border-color:#f29870; */
|
||||
background-color: #70caf2;
|
||||
border-color: #70caf2;
|
||||
}
|
||||
nav#TableOfContents ul {
|
||||
list-style-type: none;
|
||||
padding: 0.0rem;
|
||||
|
||||
@@ -63,10 +63,12 @@ func (dt DirTree) AddEntry(entry fs.DirEntry) {
|
||||
panic("unknown entry type")
|
||||
}
|
||||
remoteParent := parentDir(entry.Remote())
|
||||
dt.CheckParent("", remoteParent)
|
||||
dt.checkParent("", remoteParent, nil)
|
||||
}
|
||||
|
||||
// Find returns the DirEntry for filePath or nil if not found
|
||||
//
|
||||
// None that Find does a O(N) search so can be slow
|
||||
func (dt DirTree) Find(filePath string) (parentPath string, entry fs.DirEntry) {
|
||||
parentPath = parentDir(filePath)
|
||||
for _, entry := range dt[parentPath] {
|
||||
@@ -77,23 +79,52 @@ func (dt DirTree) Find(filePath string) (parentPath string, entry fs.DirEntry) {
|
||||
return parentPath, nil
|
||||
}
|
||||
|
||||
// CheckParent checks that dirPath has a *Dir in its parent
|
||||
func (dt DirTree) CheckParent(root, dirPath string) {
|
||||
if dirPath == root {
|
||||
return
|
||||
// checkParent checks that dirPath has a *Dir in its parent
|
||||
//
|
||||
// If dirs is not nil it must contain entries for every *Dir found in
|
||||
// the tree. It is used to speed up the checking when calling this
|
||||
// repeatedly.
|
||||
func (dt DirTree) checkParent(root, dirPath string, dirs map[string]struct{}) {
|
||||
var parentPath string
|
||||
for {
|
||||
if dirPath == root {
|
||||
return
|
||||
}
|
||||
// Can rely on dirs to have all directories in it so
|
||||
// we don't need to call Find.
|
||||
if dirs != nil {
|
||||
if _, found := dirs[dirPath]; found {
|
||||
return
|
||||
}
|
||||
parentPath = parentDir(dirPath)
|
||||
} else {
|
||||
var entry fs.DirEntry
|
||||
parentPath, entry = dt.Find(dirPath)
|
||||
if entry != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
dt[parentPath] = append(dt[parentPath], fs.NewDir(dirPath, time.Now()))
|
||||
if dirs != nil {
|
||||
dirs[dirPath] = struct{}{}
|
||||
}
|
||||
dirPath = parentPath
|
||||
}
|
||||
parentPath, entry := dt.Find(dirPath)
|
||||
if entry != nil {
|
||||
return
|
||||
}
|
||||
dt[parentPath] = append(dt[parentPath], fs.NewDir(dirPath, time.Now()))
|
||||
dt.CheckParent(root, parentPath)
|
||||
}
|
||||
|
||||
// CheckParents checks every directory in the tree has *Dir in its parent
|
||||
func (dt DirTree) CheckParents(root string) {
|
||||
dirs := make(map[string]struct{})
|
||||
// Find all the directories and stick them in dirs
|
||||
for _, entries := range dt {
|
||||
for _, entry := range entries {
|
||||
if _, ok := entry.(fs.Directory); ok {
|
||||
dirs[entry.Remote()] = struct{}{}
|
||||
}
|
||||
}
|
||||
}
|
||||
for dirPath := range dt {
|
||||
dt.CheckParent(root, dirPath)
|
||||
dt.checkParent(root, dirPath, dirs)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package dirtree
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/rclone/rclone/fstest/mockdir"
|
||||
@@ -108,7 +109,7 @@ func TestDirTreeCheckParent(t *testing.T) {
|
||||
sausage
|
||||
`, dt.String())
|
||||
|
||||
dt.CheckParent("", "dir/subdir")
|
||||
dt.checkParent("", "dir/subdir", nil)
|
||||
|
||||
assert.Equal(t, `/
|
||||
dir/
|
||||
@@ -200,3 +201,21 @@ dir2/
|
||||
`, dt.String())
|
||||
|
||||
}
|
||||
|
||||
func BenchmarkCheckParents(b *testing.B) {
|
||||
for _, N := range []int{1e2, 1e3, 1e4, 1e5, 1e6} {
|
||||
b.Run(fmt.Sprintf("%d", N), func(b *testing.B) {
|
||||
b.StopTimer()
|
||||
dt := New()
|
||||
for i := 0; i < N; i++ {
|
||||
remote := fmt.Sprintf("dir%09d/file%09d.txt", i, 1)
|
||||
o := mockobject.New(remote)
|
||||
dt.Add(o)
|
||||
}
|
||||
b.StartTimer()
|
||||
for n := 0; n < b.N; n++ {
|
||||
dt.CheckParents("")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -926,10 +926,15 @@ func ListFn(ctx context.Context, f fs.Fs, fn func(fs.Object)) error {
|
||||
// StdoutMutex mutex for synchronized output on stdout
|
||||
var StdoutMutex sync.Mutex
|
||||
|
||||
// SyncPrintf is a global var holding the Printf function used in syncFprintf so that it can be overridden
|
||||
// Note, despite name, does not provide sync and should not be called directly
|
||||
// Call syncFprintf, which provides sync
|
||||
// SyncPrintf is a global var holding the Printf function so that it
|
||||
// can be overridden.
|
||||
//
|
||||
// This writes to stdout holding the StdoutMutex. If you are going to
|
||||
// override it and write to os.Stdout then you should hold the
|
||||
// StdoutMutex too.
|
||||
var SyncPrintf = func(format string, a ...interface{}) {
|
||||
StdoutMutex.Lock()
|
||||
defer StdoutMutex.Unlock()
|
||||
fmt.Printf(format, a...)
|
||||
}
|
||||
|
||||
@@ -937,14 +942,13 @@ var SyncPrintf = func(format string, a ...interface{}) {
|
||||
//
|
||||
// Ignores errors from Fprintf.
|
||||
//
|
||||
// Updated to print to terminal if no writer is defined
|
||||
// This special behavior is used to allow easier replacement of the print to terminal code by progress
|
||||
// Prints to stdout if w is nil
|
||||
func syncFprintf(w io.Writer, format string, a ...interface{}) {
|
||||
StdoutMutex.Lock()
|
||||
defer StdoutMutex.Unlock()
|
||||
if w == nil || w == os.Stdout {
|
||||
SyncPrintf(format, a...)
|
||||
} else {
|
||||
StdoutMutex.Lock()
|
||||
defer StdoutMutex.Unlock()
|
||||
_, _ = fmt.Fprintf(w, format, a...)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package fs
|
||||
|
||||
// VersionTag of rclone
|
||||
var VersionTag = "v1.63.0"
|
||||
var VersionTag = "v1.64.0"
|
||||
|
||||
10
go.mod
10
go.mod
@@ -50,12 +50,12 @@ require (
|
||||
github.com/rclone/ftp v0.0.0-20230327202000-dadc1f64e87d
|
||||
github.com/rfjakob/eme v1.1.2
|
||||
github.com/rivo/uniseg v0.4.4
|
||||
github.com/shirou/gopsutil/v3 v3.23.3
|
||||
github.com/shirou/gopsutil/v3 v3.23.5
|
||||
github.com/sirupsen/logrus v1.9.0
|
||||
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/stretchr/testify v1.8.2
|
||||
github.com/stretchr/testify v1.8.3
|
||||
github.com/t3rm1n4l/go-mega v0.0.0-20230228171823-a01a2cda13ca
|
||||
github.com/winfsp/cgofuse v1.5.1-0.20221118130120-84c0898ad2e0
|
||||
github.com/xanzy/ssh-agent v0.3.3
|
||||
@@ -67,7 +67,7 @@ require (
|
||||
golang.org/x/net v0.8.0
|
||||
golang.org/x/oauth2 v0.6.0
|
||||
golang.org/x/sync v0.1.0
|
||||
golang.org/x/sys v0.7.0
|
||||
golang.org/x/sys v0.8.0
|
||||
golang.org/x/text v0.8.0
|
||||
golang.org/x/time v0.3.0
|
||||
google.golang.org/api v0.115.0
|
||||
@@ -120,13 +120,13 @@ require (
|
||||
github.com/prometheus/common v0.37.0 // indirect
|
||||
github.com/prometheus/procfs v0.8.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/shoenig/go-m1cpu v0.1.4 // indirect
|
||||
github.com/shoenig/go-m1cpu v0.1.6 // indirect
|
||||
github.com/sony/gobreaker v0.5.0 // indirect
|
||||
github.com/spacemonkeygo/monkit/v3 v3.0.19 // indirect
|
||||
github.com/tklauser/go-sysconf v0.3.11 // indirect
|
||||
github.com/tklauser/numcpus v0.6.0 // indirect
|
||||
github.com/vivint/infectious v0.0.0-20200605153912-25a574ae18a3 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||
github.com/zeebo/blake3 v0.2.3 // indirect
|
||||
github.com/zeebo/errs v1.3.0 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
|
||||
24
go.sum
24
go.sum
@@ -428,12 +428,12 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||
github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
|
||||
github.com/shoenig/go-m1cpu v0.1.4 h1:SZPIgRM2sEF9NJy50mRHu9PKGwxyyTTJIWvCtgVbozs=
|
||||
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
|
||||
github.com/shoenig/test v0.6.3 h1:GVXWJFk9PiOjN0KoJ7VrJGH6uLPnqxR7/fe3HUPfE0c=
|
||||
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/shirou/gopsutil/v3 v3.23.5 h1:5SgDCeQ0KW0S4N0znjeM/eFHXXOKyv2dVNgRq/c9P6Y=
|
||||
github.com/shirou/gopsutil/v3 v3.23.5/go.mod h1:Ng3Maa27Q2KARVJ0SPZF5NdrQSC3XHKP8IIWrHgMeLY=
|
||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
||||
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
|
||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||
@@ -470,8 +470,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/t3rm1n4l/go-mega v0.0.0-20230228171823-a01a2cda13ca h1:I9rVnNXdIkij4UvMT7OmKhH9sOIvS8iXkxfPdnn9wQA=
|
||||
github.com/t3rm1n4l/go-mega v0.0.0-20230228171823-a01a2cda13ca/go.mod h1:suDIky6yrK07NnaBadCB4sS0CqFOvUK91lH7CR+JlDA=
|
||||
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
|
||||
@@ -496,8 +496,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yunify/qingstor-sdk-go/v3 v3.2.0 h1:9sB2WZMgjwSUNZhrgvaNGazVltoFUUfuS9f0uCWtTr8=
|
||||
github.com/yunify/qingstor-sdk-go/v3 v3.2.0/go.mod h1:KciFNuMu6F4WLk9nGwwK69sCGKLCdd9f97ac/wfumS4=
|
||||
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
|
||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
github.com/zeebo/assert v1.3.1 h1:vukIABvugfNMZMQO1ABsyQDJDTVQbn+LWSMy1ol1h6A=
|
||||
github.com/zeebo/assert v1.3.1/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
|
||||
@@ -691,8 +691,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
||||
Reference in New Issue
Block a user