I've recently written a simple wrapper for Fossil with the goal of
providing an improved CLI experience and thought others might find it
useful.
The script is written in Tcl/Expect and provides the following
features:
* Command aliasing
* Output filtering
* A number of preconfigured aliases, filters for colouring output
Though still inchoate, you should be able to use it as you would
`fossil' on the command line.
If you're interested, feel free to clone from
http://fossil.0branch.com/fsl/**home
<http://fossil.0branch.com/fsl/home>or download `fsl' directly:
http://fossil.0branch.com/fsl/**artifact/**f57c7ecf8c4db2a9990b40ee21e763
**7a1374f45e<http://fossil.0branch.com/fsl/artifact/f57c7ecf8c4db2a9990b40ee21e7637a1374f45e>
.
The code is ISC licensed (likely overkill for such a simple script).
# Details
Out of the box, a number of filters and aliases are defined in
~/.fslrc (created on first run):
* Aliases ('->' indicates the expansion)
* '.' -> 'changes'
* 'd' -> 'diff'
* ',' -> 'ui'
* 'log' -> 'timeline'
* 'heads' -> 'leaves'
* Filters (all of which colour output)
* 'diff'
* 'fsl d'
* 'log_entry'
* 'fsl leaves', 'fsl timeline'
* 'status'
* 'fsl changes', 'fsl status', 'fsl timeline', 'fsl add',
'fsl rm', 'fsl addremove'
You can see a summary of these definitions using the `fsl wrapper'
pseudo-command:
$ fsl wrapper
Aliases: . d , log heads
Filters: changes status timeline add rm addremove leaves d
The configuration file is a Tcl script: you can define `proc's (for
helper functions) and employ them in your filters. Definitions will
end up in the `config::fslrc' namespace so you needn't worry about
clobbering predefined functions. Since the script makes heavy use of
dictionaries, it requires Tcl >= 8.5.
Alias declarations are trivial; their second argument can be a
bareword or quoted string, thereby allowing expansions to provide
switches if required, e.g.
alias log timeline
alias history {timeline -n 100}
Filters are named, allowing them to be referenced elsewhere in your
configuration script. Their structure is:
filter <internal name> <list of commands to filter> <body>
If you filter on a fossil command like `diff', aliases of this command
(by default, `d') will also be filtered. Conversely, filtering on an
alias (`d'), leaves its expansion (`diff') untouched. Also note that
more than one filter may apply to a given command: under the default
configuration, the timeline will be filtered by both `status' and
`log_entry'.
A filter body can reference the current output line via the implicitly
defined $line variable. By way of example, here's the `log_entry'
filter:
filter log_entry {leaves timeline} {
if {[regexp "^=== .* ===" $line]} {
coloured blue $line
} else {
regsub -all {\[[A-Fa-f0-9]+\]} $line [coloured yellow &]
}
}
Useful functions defined by the script are:
* `coloured' (for colouring output)
* `alias?'
* `filter?'
* `empty?' and `prefix?' (simple utility functions)
Patches, criticisms, suggestions etc. are welcome.
Best,
Marc