mirror of
https://github.com/rclone/rclone.git
synced 2024-12-22 23:22:08 +01:00
fs: allow boolean features to be enabled with --disable !Feature
This commit is contained in:
parent
d808c3848a
commit
bad8a01850
@ -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).
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user