Towards a more rational shelving-with-checkpoints CLI.

  svn shelf-{save,shelve,unshelve,shelves,log,drop,diff}
    [SHELF_SPEC...] [PATH...]

SHELF_SPEC:

  --shelf=[SHELF][.VERSION]
  @[SHELF][.VERSION]

    Specify shelf SHELF (name, 'all', 'newest'), version VERSION
    (number, date, 'all', 'newest'). Defaults are per command.

  --version=VERSION

    Specify the default version for shelf specs in the command.

Aliases:

  svn save            -> svn shelf-save
  svn shelve          -> svn shelf-shelve
  svn unshelve        -> svn shelf-unshelve
  svn shelves         -> svn shelf-shelves

Main commands:

  svn save | shelf-save      [@SHELF] [PATH...]    # save only
  svn shelve | shelf-shelve  [@SHELF] [PATH...]    # save & revert

    defaults: SHELF:newest; PATH:'.'
    Save/Shelve to shelf SHELF the changes within a PATH.

  svn unshelve | shelf-unshelve  [@[SHELF][.VERSION]...] [PATH...]

    defaults: SHELF:newest; VERSION:newest; PATH:'.'
    Unshelve each shelf-version SHELF.VERSION
    just the paths within PATH...
    (Warn if that omits other paths in the shelf-version.)

Ancillary commands:

  svn shelves | shelf-shelves  [@SHELF...] [PATH...]

    defaults: SHELF:all; PATH:'.'
    List each shelf SHELF that has changes within a PATH.
    Same as 'shelf-log --version=newest ...'.

  svn shelf-log      [@[SHELF][.VERSION]...] [PATH...]

    defaults: SHELF:newest; VERSION:all; PATH:'.'
    List each version in a shelf SHELF that has changes inside a PATH.

  svn shelf-drop     [@SHELF...]

    defaults: SHELF:newest
    Delete each shelf SHELF.

  svn shelf-diff     [@[SHELF][.VERSION]...] [PATH...]

    defaults: SHELF:newest; VERSION:newest; PATH:'.'
    Print a diff of the changes inside PATH... in each shelf-version.
    (Note: not the difference between two shelves or versions.)


Thoughts:

The use of a distinctive shelf specifier is intended to avoid the ambiguity in the first optional argument to a syntax like "svn shelve [NAME] [PATH...]". There are some other possible ways to resolve the ambiguity, such as interpreting the first optional argument as NAME unless it contains a '/' or '\' (if we don't allow '/' or '\' in NAME).

Using one-word subcommands like "shelf-drop" rather than "shelf drop" or "shelf --delete" is intended to be better for consistency, for the help system, and for extending existing scripting that assumes one-word subcommands (the bash-completion script is one example). But note the ugly repetition in "shelf-shelve", "shelve-unshelve", and "shelf-shelves".

A common syntax for referring to a particular shelved change is helpful. "--shelf=" is OK for a start but the repetition of "shelf" here after the subcommand name is ugly again, hence suggestion of "@" instead, although using "@" to introduce the name rather than the version is inconsistent with peg revision specifiers.

Perhaps we can take this further and achieve a syntax like "svn log --shelf=NAME" and "svn diff --shelf=NAME[@VERSION]" in which a shelf-spec is used with a regular existing subcommand, eliminating the repetition in those commands. Then 'svn shelve' and 'unshelve' and 'shelves' become primary subcommands, but they still need a shelf specifier.


- Julian

Reply via email to