From b401a727f761a5bbb94742b0b37683be81d58e25 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Thu, 6 Aug 2020 17:59:26 +0100 Subject: [PATCH] onedrive: add --onedrive-no-versions flag to remove old versions - fixes #4106 --- backend/onedrive/onedrive.go | 33 ++++++++++++++++++++++++ docs/content/onedrive.md | 49 +++++++++++++++++++++++++----------- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go index 13cb10aa0..d9543a4d2 100755 --- a/backend/onedrive/onedrive.go +++ b/backend/onedrive/onedrive.go @@ -287,6 +287,23 @@ different Onedrives. Note that this isn't enabled by default because it isn't easy to tell if it will work between any two configurations.`, Advanced: true, + }, { + Name: "no_versions", + Default: false, + Help: `Remove all versions on modifying operations + +Onedrive for business creates versions when rclone uploads new files +overwriting an existing one and when it sets the modification time. + +These versions take up space out of the quota. + +This flag checks for versions after file upload and setting +modification time and removes all but the last version. + +**NB** Onedrive personal can't currently delete versions so don't use +this flag there. +`, + Advanced: true, }, { Name: config.ConfigEncoding, Help: config.ConfigEncodingHelp, @@ -344,6 +361,7 @@ type Options struct { DriveType string `config:"drive_type"` ExposeOneNoteFiles bool `config:"expose_onenote_files"` ServerSideAcrossConfigs bool `config:"server_side_across_configs"` + NoVersions bool `config:"no_versions"` Enc encoder.MultiEncoder `config:"encoding"` } @@ -1508,6 +1526,13 @@ func (o *Object) setModTime(ctx context.Context, modTime time.Time) (*api.Item, resp, err := o.fs.srv.CallJSON(ctx, &opts, &update, &info) return shouldRetry(resp, err) }) + // Remove versions if required + if o.fs.opt.NoVersions { + err := o.deleteVersions(ctx) + if err != nil { + fs.Errorf(o, "Failed to remove versions: %v", err) + } + } return info, err } @@ -1814,6 +1839,14 @@ func (o *Object) Update(ctx context.Context, in io.Reader, src fs.ObjectInfo, op return err } + // If updating the file then remove versions + if o.fs.opt.NoVersions && o.hasMetaData { + err = o.deleteVersions(ctx) + if err != nil { + fs.Errorf(o, "Failed to remove versions: %v", err) + } + } + return o.setMetaData(info) } diff --git a/docs/content/onedrive.md b/docs/content/onedrive.md index ab91acb18..36ecf5909 100644 --- a/docs/content/onedrive.md +++ b/docs/content/onedrive.md @@ -324,26 +324,45 @@ list files: UnknownError:`. See An official document about the limitations for different types of OneDrive can be found [here](https://support.office.com/en-us/article/invalid-file-names-and-file-types-in-onedrive-onedrive-for-business-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa). -### Versioning issue ### +### Versions -Every change in OneDrive causes the service to create a new version. -This counts against a users quota. -For example changing the modification time of a file creates a second -version, so the file is using twice the space. +Every change in a file OneDrive causes the service to create a new +version of the the file. This counts against a users quota. For +example changing the modification time of a file creates a second +version, so the file apparently uses twice the space. -You can use the `rclone cleanup` command (see below) to remove old versions. +For example the `copy` command is affected by this as rclone copies +the file and then afterwards sets the modification time to match the +source file which uses another version. -The `copy` is the only rclone command affected by this as we copy -the file and then afterwards set the modification time to match the -source file. +You can use the `rclone cleanup` command (see below) to remove all old +versions. -**Note**: Starting October 2018, users will no longer be able to disable versioning by default. This is because Microsoft has brought an [update](https://techcommunity.microsoft.com/t5/Microsoft-OneDrive-Blog/New-Updates-to-OneDrive-and-SharePoint-Team-Site-Versioning/ba-p/204390) to the mechanism. To change this new default setting, a PowerShell command is required to be run by a SharePoint admin. If you are an admin, you can run these commands in PowerShell to change that setting: +Or you can set the `no_versions` parameter to `true` and rclone will +remove versions after operations which create new versions. This takes +extra transactions so only enable it if you need it. + +**Note** At the time of writing Onedrive Personal creates versions +(but not for setting the modification time) but the API for removing +them returns "API not found" so cleanup and `no_versions` should not +be used on Onedrive Personal. + +### Disabling versioning + +Starting October 2018, users will no longer be able to +disable versioning by default. This is because Microsoft has brought +an +[update](https://techcommunity.microsoft.com/t5/Microsoft-OneDrive-Blog/New-Updates-to-OneDrive-and-SharePoint-Team-Site-Versioning/ba-p/204390) +to the mechanism. To change this new default setting, a PowerShell +command is required to be run by a SharePoint admin. If you are an +admin, you can run these commands in PowerShell to change that +setting: 1. `Install-Module -Name Microsoft.Online.SharePoint.PowerShell` (in case you haven't installed this already) -1. `Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking` -1. `Connect-SPOService -Url https://YOURSITE-admin.sharepoint.com -Credential YOU@YOURSITE.COM` (replacing `YOURSITE`, `YOU`, `YOURSITE.COM` with the actual values; this will prompt for your credentials) -1. `Set-SPOTenant -EnableMinimumVersionRequirement $False` -1. `Disconnect-SPOService` (to disconnect from the server) +2. `Import-Module Microsoft.Online.SharePoint.PowerShell -DisableNameChecking` +3. `Connect-SPOService -Url https://YOURSITE-admin.sharepoint.com -Credential YOU@YOURSITE.COM` (replacing `YOURSITE`, `YOU`, `YOURSITE.COM` with the actual values; this will prompt for your credentials) +4. `Set-SPOTenant -EnableMinimumVersionRequirement $False` +5. `Disconnect-SPOService` (to disconnect from the server) *Below are the steps for normal users to disable versioning. If you don't see the "No Versioning" option, make sure the above requirements are met.* @@ -373,6 +392,8 @@ is a great way to see what it would do. rclone cleanup -i remote:path/subdir # interactively remove all old version for path/subdir rclone cleanup remote:path/subdir # unconditionally remove all old version for path/subdir +**NB** Onedrive personal can't currently delete versions + ### Troubleshooting ### #### Unexpected file size/hash differences on Sharepoint ####