diff --git a/docs/content/docs.md b/docs/content/docs.md index a23ec18f8..00545c613 100644 --- a/docs/content/docs.md +++ b/docs/content/docs.md @@ -1002,10 +1002,24 @@ To see a list of which features can be disabled use: --disable help +The features a remote has can be seen in JSON format with: + + rclone backend features remote: + See the overview [features](/overview/#features) and [optional features](/overview/#optional-features) to get an idea of which feature does what. +Note that some features can be set to `true` if they are `true`/`false` +feature flag features by prefixing them with `!`. For example the +`CaseInsensitive` feature can be forced to `false` with `--disable CaseInsensitive` +and forced to `true` with `--disable '!CaseInsensitive'`. In general +it isn't a good idea doing this but it may be useful in extremis. + +(Note that `!` is a shell command which you will +need to escape with single quotes or a backslash on unix like +platforms.) + This flag can be useful for debugging and in exceptional circumstances (e.g. Google Drive limiting the total volume of Server Side Copies to 100 GiB/day). diff --git a/fs/features.go b/fs/features.go index b8bbffc21..8a85c0226 100644 --- a/fs/features.go +++ b/fs/features.go @@ -172,6 +172,12 @@ type Features struct { // Disable nil's out the named feature. If it isn't found then it // will log a message. func (ft *Features) Disable(name string) *Features { + // Prefix boolean values with ! to set the feature + invert := false + if strings.HasPrefix(name, "!") { + name = name[1:] + invert = true + } v := reflect.ValueOf(ft).Elem() vType := v.Type() for i := 0; i < v.NumField(); i++ { @@ -181,9 +187,18 @@ func (ft *Features) Disable(name string) *Features { if !field.CanSet() { Errorf(nil, "Can't set Feature %q", name) } else { - zero := reflect.Zero(field.Type()) - field.Set(zero) - Debugf(nil, "Reset feature %q", name) + if invert { + if field.Type().Kind() == reflect.Bool { + field.Set(reflect.ValueOf(true)) + Debugf(nil, "Set feature %q", name) + } else { + Errorf(nil, "Can't set Feature %q to true", name) + } + } else { + zero := reflect.Zero(field.Type()) + field.Set(zero) + Debugf(nil, "Reset feature %q", name) + } } } }