Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
| Artifact ID: | 9904cbb81d6a2999b59e5d9ec8df9935998fb5f64a7b5c865457e02ea6694f15 |
|---|---|
| Page Name: | branch/double-dash-flag |
| Date: | 2019-09-28 12:46:31 |
| Original User: | stephan |
| Mimetype: | text/x-markdown |
| Parent: | b5450b8c3d9f6e52acdbd4ba768de7fb886093a9897fe7a334977852921bd066 (diff) |
| Next | 8f44d523c3bdf06a027ce5db3c5628c690605215a0d67465ff6767268f2682bb |
Management Summary
The double-dash-flag branch aims to add support for the conventional interpretation of a -- flag: all arguments after the first instance of -- are to be treated as non-flag arguments (e.g. file/wiki/branch/whatever names).
This feature request is from: https://fossil-scm.org/forum/forumpost/64acc6b653
The implementation is not 100% compliant with POSIX/Unix conventions because it cannot be without Breaking Stuff, but it "should" be close enough to be useful/conventional for the contexts where using -- makes sense in Fossil. For example, uv add treats a filename of - as stdin by default (and has valid use cases enabled by that), and -- could be used to make uv add treat - as a filename (that's the original use case for which conventional -- support was proposed).
Compatibility vs. Historical Behaviour
Fossil's historical handling of -- is really weird: the first time find_option() encounters --, it removes that flag and stops processing arguments. Subsequent calls to find_option() then never see -- and thus treat all arguments as potential flags (even those after the prior position of --). Since that behaviour was never useful, and potentially confusing, it is unexpected that the changes made in this branch will break any historical usage of the CLI commands.
For example:
fossil foo -- -a -b -c
The current (trunk, as of this writing) interpretation of -a -b -c, because of the "one-time-swallowing" of --, depends on what order those flags are checked for via find_option(). It seems highly unlikely that anyone could have reliably depended on that, and therefore seems unlikely that this change will break anyone's scripts.
Commands which accept a filename as the value of a flag are unaffected by these changes, provided the flag comes before --:
fossil foo -R - -- -a -b -c
Would (both before and after this change) treat - as a repository file name, but this change will cause the subsequent -a -b -c flags to be interpreted as non-flags (it's then up to the foo command to deal with them).
This Implementation's Behaviour
find_option()and its variants always stop looking for flags when they encounter--.verify_all_options()triggers a fatal error if--is found in the argument list.verify_all_options2()consumes the first instance of--and records theg.argvindex where--was found ing.argDashDashIndex, so that commands which need to can determine whether, e.g., an argument of-should be treated as an alias forstdin/stdoutor as a literal filename (the latter only applies if--precedes the-argument). The utility functionget_dash_filename_arg()makes that particular use case trivial to implement.
It seems, after having migrated many of the commands, that it would be harmless/risk-free, and probably desirable, to eliminate verify_all_options2() and have verify_all_options() adopt that function's behaviour. That would make a stray -- flag at the end of a command a harmless no-op for commands which don't/can't make any special use of it, whereas it would "hide" flags (treating them as non-flags) if it's used before the end of such a command (indeed, that's its whole intention).
List of commands/subcommands extended to support --
(Alphabetized by command/subcommand name.)
3-way-mergeaddannotateartifactbranch new: you might recall Johnny Cash's song The Branch Named --Sue.catchanges/statuscleanclonecommitdiff/gdiffextrasfinfogreplsmv/renamenew/initopenrevertrm/delete/forgetstash save | snapshotsqlartarballuv add | cat | edit | export | rm(noting thatexporthas one pathological(?) corner case which we can't 100% accommodate: double-dashing the UVFILE name without applying double-dash to the output file name).wiki commit | create | exportzip
The Obligatory Exceptions
diff -tkandstash diff -tk:diff_tk()does not useverify_all_options(), so it has historically silently ignored unknown flags. To avoid breaking existing user behaviour, it was not modified. Ideally it should be updated to callverify_all_options2().stash gdiff|show|gshow|cat|gcatdo not currently callverify_all_options(), but probably should.searchdoes not useverify_all_options(), instead treating all unconsumed flag arguments as a search pattern. It can easily be made to treat--as the other commands, but doing so may break existing expectations, so that command was left unmodified.tagdoes not useverify_all_options(), instead using strictly positional arguments, thus it supports tags with leading dashes as-is.