• Binbin's avatar
    redis-server command line arguments support take one bulk string with spaces... · bfbb15f7
    Binbin authored
    redis-server command line arguments support take one bulk string with spaces for MULTI_ARG configs parsing. And allow options value to use the -- prefix (#10660)
    
    ## Take one bulk string with spaces for MULTI_ARG configs parsing
    Currently redis-server looks for arguments that start with `--`,
    and anything in between them is considered arguments for the config.
    like: `src/redis-server --shutdown-on-sigint nosave force now --port 6380`
    
    MULTI_ARG configs behave differently for CONFIG command, vs the command
    line argument for redis-server.
    i.e. CONFIG command takes one bulk string with spaces in it, while the
    command line takes an argv array with multiple values.
    
    In this PR, in config.c, if `argc > 1` we can take them as is,
    and if the config is a `MULTI_ARG` and `argc == 1`, we will split it by spaces.
    
    So both of these will be the same:
    ```
    redis-server --shutdown-on-sigint nosave force now --shutdown-on-sigterm nosave force
    redis-server --shutdown-on-sigint nosave "force now" --shutdown-on-sigterm nosave force
    redis-server --shutdown-on-sigint nosave "force now" --shutdown-on-sigterm "nosave force"
    ```
    
    ## Allow options value to use the `--` prefix
    Currently it decides to switch to the next config, as soon as it sees `--`, 
    even if there was not a single value provided yet to the last config,
    this makes it impossible to define a config value that has `--` prefix in it.
    
    For instance, if we want to set the logfile to `--my--log--file`,
    like `redis-server --logfile --my--log--file --loglevel verbose`,
    current code will handle that incorrectly.
    
    In this PR, now we allow a config value that has `--` prefix in it.
    **But note that** something like `redis-server --some-config --config-value1 --config-value2 --loglevel debug`
    would not work, because if you want to pass a value to a config starting with `--`, it can only be a single value.
    like: `redis-server --some-config "--config-value1 --config-value2" --loglevel debug`
    
    An example (using `--` prefix config value):
    ```
    redis-server --logfile --my--log--file --loglevel verbose
    redis-cli config get logfile loglevel
    1) "loglevel"
    2) "verbose"
    3) "logfile"
    4) "--my--log--file"
    ```
    
    ### Potentially breaking change
    `redis-server --save --loglevel verbose` used to work the same as `redis-server --save "" --loglevel verbose`
    now, it'll error!
    bfbb15f7
introspection.tcl 22.6 KB