Compare commits

...

133 Commits
v1.0 ... master

Author SHA1 Message Date
22c293eb58 run under python2 for now 2016-12-04 15:28:36 -05:00
8e10d8aefb fix log subcommand error for missing lines_text attribute of LogEntry 2016-08-11 16:29:16 -04:00
3c100af8d2 commit: end "Aborting commit" message with a newline 2016-01-04 15:08:41 -05:00
0ccc15089b clean: properly handle removing symbolic links 2015-12-01 13:11:26 -05:00
ab839658ba add a "commit" handler to rstrip commit messages 2015-09-30 17:11:25 -04:00
a970a6ef8a ignore "Updated external to revision XXX" lines if they are the only ones present 2015-09-14 16:46:49 -04:00
Mike_Zwagerman
146bdc347b Stripped the trailing forward slash(s) '/' from the end of the checkout url before checking for 'trunk$' 2015-08-25 20:58:02 -04:00
3456e95135 add a checkout handler that defaults the working copy path to the last directory component before "/trunk" 2015-08-17 12:24:21 -04:00
40b987911c update "add" to be aware of "ignore_symlinks" 2015-03-11 15:18:51 -04:00
3107b78aa0 add "ignore_symlinks" configuration flag 2015-03-11 15:15:40 -04:00
030c1c519f revert directories added by copying recursively 2014-10-08 11:52:40 -04:00
127815dd1f revert: revert files with "C"onflicts 2014-08-13 16:23:47 -04:00
3fbec5ea29 update: handle "Removed external '...'" messages better 2014-08-08 08:35:48 -04:00
9fd1b4bfed log: add error message for unknown --pretty option 2014-03-18 09:36:58 -04:00
4fa19ce27a revert bugfix: revert deleted items in order by status but added/modified items in reverse order 2013-10-24 10:30:52 -04:00
efdad72708 add v1.7 release notes 2013-08-16 15:23:06 -04:00
5955385e9c also apply "revert" to deleted items 2013-08-16 15:21:16 -04:00
f94756e615 add "clean" subcommand handler 2013-07-29 14:34:11 -04:00
00bbb51384 v1.6 2013-07-24 15:48:49 -04:00
20e2498f39 handle OSErrors possibly raised when kill()ing subprocess 2013-05-23 10:22:01 -04:00
a23c74a70a revert: do smart revert on items with modified properties as well 2013-03-20 10:11:06 -04:00
941f487292 revert: revert items in reverse-order to handle added directories 2013-03-20 10:08:28 -04:00
8bc64da119 stash: remove added directories when stashing if they are empty 2013-03-15 16:32:41 -04:00
4ad99b6707 stash: revert on save in reverse order to handle nested added directories 2013-03-15 16:24:40 -04:00
c5df97ebe8 stash: recreate added directories on pop; handle in show as well 2013-03-15 16:22:44 -04:00
b81aed66b6 stash: annotate stashes with created directories 2013-03-15 16:15:48 -04:00
77f1965113 stash: bugfix: respect options that follow operation (ex: --pop -k) 2013-03-15 15:42:42 -04:00
122e16b697 Merge branch 'stash-rework' 2013-03-11 22:36:31 -04:00
a34b0f5edf stash: add info for file name changed or # of files changed 2013-03-11 22:34:44 -04:00
32574bdd23 stash: re-add # of insertions/deletions to stash info 2013-03-11 22:25:30 -04:00
d6f74de034 stash: add --noexternals option, stash_externals configuration flag 2013-03-11 22:21:05 -04:00
821d27863d stash: update README for stash rework 2013-03-11 22:12:36 -04:00
f2678b5f88 stash: add -e/--externals option to also stash externals 2013-03-11 22:06:18 -04:00
a215aac2f6 stash: color the patch prompt line 2013-03-11 21:31:05 -04:00
6d547299cd stash: colorize Index line while patch-prompting 2013-03-11 21:26:03 -04:00
40aeec7bea stash: properly display new Index line when file skipped 2013-03-11 21:24:42 -04:00
e8fe0efcdb stash: rework bugfixes 2013-03-11 21:22:03 -04:00
6f4a88737d stash: respect -k flag again 2013-03-11 20:51:56 -04:00
0587d73472 stash: rework to do per-hunk processing 2013-03-11 20:49:11 -04:00
3c0375891a stash: add --keep, -p, --patch options 2013-03-11 13:50:42 -04:00
ee592451b5 change stash subcommands to require "--" prefix 2013-03-11 13:24:52 -04:00
cec02602a0 status: use relative paths for items in externals 2013-02-28 10:14:04 -05:00
f9c474a53f break up stash subcommand handlers into their own functions 2013-02-12 16:30:24 -05:00
9ffbd09477 revert: support smart recursive reversion for externals 2013-02-12 15:40:02 -05:00
cc95b79447 add "revert" subcommand handler 2012-12-04 15:33:22 -05:00
adeabcec6b update documentation for url subcommand 2012-11-08 16:25:22 -05:00
f4a568c3ca add v1.5 notes to README 2012-11-08 16:19:09 -05:00
b1df2f7a12 add -v (verbose) flag to tag subcommand 2012-11-08 16:16:13 -05:00
3b7bf12da8 allow optional source argument to "branch" 2012-08-30 11:35:26 -04:00
8dc3cc969e remove repository prefix URL from diff --summarize output 2012-08-24 10:56:20 -04:00
Mike D. Lowis
d8e31f8b46 Added .exe extension to svn binary name if the platform is Windows 2012-08-24 09:47:41 -04:00
9c79bacbe6 add v1.4 release notes 2012-08-23 16:43:53 -04:00
03fe7d9c7e terminate child svn log -v process when the common ancestor revision has been determined 2012-08-23 16:15:14 -04:00
33f5a85079 bugfix: properly limit diff output when "..." range specifier used 2012-08-23 16:07:25 -04:00
406a01cdf5 tag: allow optional source reference/revision - close #17
also check if a tag exists already before creating it
2012-08-17 11:32:13 -04:00
45f2a199f9 allow ctrl+c to terminate watch-lock 2012-07-23 15:20:32 -04:00
e20f843d25 remove automatically-added svn:executable property from files with certain configurable extensions 2012-07-11 12:40:41 -04:00
33b79e2930 append "_h" to subcommand handler function names 2012-07-11 12:14:00 -04:00
638137518d pass user configuration to subcommand handler functions 2012-07-11 12:09:02 -04:00
59544d30a6 log bugfix: avoid stack dump if "log" produces no entries, the correct way 2012-07-03 09:43:57 -04:00
d004741a96 log bugfix: avoid stack dump if "log" produces no entries 2012-07-03 09:40:11 -04:00
280f81d2c3 ignore SIGINT in jsvn
this way ctrl+c gets propagated to svn but does not kill python
so the shell still shows the pager instead of going back to the prompt
with a non-functioning terminal in need of "reset"
2012-06-29 13:24:39 -04:00
1eb5292502 add github URL to README 2012-06-29 13:06:28 -04:00
84dc998e11 Revert "launch the pager process in its own process group so that it isn't killed with ctrl+c"
This reverts commit 49656998be7686ab6d157028c4615c95c9f0327d.
2012-06-29 13:04:14 -04:00
49656998be launch the pager process in its own process group so that it isn't killed with ctrl+c 2012-06-29 12:28:26 -04:00
c08d497127 log: show as much of the commit message as fits on a single line for 'oneline' pretty display mode 2012-06-29 12:08:49 -04:00
671cf7e00c log: support --pretty formatting option
move logic of displaying a log entry into LogEntry class
2012-06-29 11:52:31 -04:00
d191a944d8 enable log filtering on "user" and "msg" log attributes - close #14 2012-06-29 11:15:18 -04:00
780e8b6692 add LogEntry class to build up objects from a svn log 2012-06-29 10:54:08 -04:00
07080d34a7 bugfix: allow diffing/log from common ancestor to work in either direction 2012-06-27 13:53:34 -04:00
d425d7ae14 avoid modifying array as iterating through it 2012-06-27 13:36:36 -04:00
34ed003e51 log -v: only colorized changed path if path starts with "/" 2012-06-27 13:28:02 -04:00
4755cbfd50 log: resolve single reference to branch/tag URL 2012-06-27 13:17:29 -04:00
b97d1a4d1c stash show bugfix: hide "#info:" lines 2012-06-27 12:58:16 -04:00
37bff0ad69 add v1.3 release notes 2012-06-27 12:52:19 -04:00
4c470ec5c2 colorize diff --summarize output 2012-06-27 12:18:22 -04:00
cd5bab7f57 fix getting common ancestor revision of two refs where the svn repository root URL is not one level up from trunk/tags/branches 2012-06-27 12:03:22 -04:00
bc7785fb82 README: order documented subcommands alphabetically 2012-06-27 11:22:39 -04:00
0f4def92e4 Merge branch 'smart-ref-spec' 2012-06-27 11:19:10 -04:00
a989cf6fd7 README: document ../... reference syntax for diff/log 2012-06-27 11:19:01 -04:00
1150cede62 log: allow ".." syntax for specifying references 2012-06-27 11:12:53 -04:00
ac52eabb09 diff: allow "..." syntax for specifying references 2012-06-27 11:06:32 -04:00
e2ccd9c7cb diff: allow ".." syntax for specifying references 2012-06-27 10:45:33 -04:00
d71715961d add resolve_reference() 2012-06-27 10:37:08 -04:00
c395cc3521 branch: add -s option to immediately switch to newly-created branch 2012-06-27 09:39:49 -04:00
d3a0208d12 branch: error out when attempting to create a branch that already exists 2012-06-27 09:34:39 -04:00
225db4f5ce use getopt in branch() 2012-06-27 09:32:33 -04:00
c43a3bd5e9 add -k to stash pop to allow keeping stash object - close #13 2012-06-27 09:16:42 -04:00
fd8702af29 #13 - add -k option to stash save to allow stashing without reverting wc 2012-06-27 09:08:59 -04:00
daa68953f9 url subcommand takes an optional path argument to work on 2012-06-18 16:15:35 -04:00
6fd5ad2615 allow ctrl+c to interrupt any subcommand
Revert "allow ctrl+c to interrupt watch-lock without printing a python stack dump"
This reverts commit bbe6d71a0a8d196bdf7a5d96f483b4df7cd3cec4.
2012-06-18 15:55:25 -04:00
c60698cd04 binaries: do not query unversioned directory entries 2012-06-06 16:07:03 -04:00
31dcb06078 unmodified directory and file externals do not cause a containing external to be shown 2012-06-05 15:55:07 -04:00
bbe6d71a0a allow ctrl+c to interrupt watch-lock without printing a python stack dump 2012-05-23 15:36:09 -04:00
55eee0d6ac status: omit blank line before external if no non-external files have been modified 2012-05-14 13:01:48 -04:00
04929df15a v1.2 2012-05-11 08:47:00 -04:00
c89fc40d1a update README with documentation for user-defined alias functions 2012-05-10 17:32:32 -04:00
1c8bbc40ae move default subversion aliases out of the user default configuration and apply them after applying user aliases 2012-05-10 17:21:13 -04:00
70e1f4edb5 provide 'do', 'Popen', and 'PIPE' to user-defined functions in configuration files - closes #11 2012-05-10 17:13:41 -04:00
761d26a5c6 ignore errors finding working copy root if you are not in a working copy 2012-05-10 17:00:00 -04:00
be4cbdb8cb refactor in preparation for #11 2012-05-10 16:58:12 -04:00
9b32db482a use consistent function naming style 2012-05-10 15:42:29 -04:00
7250ab18aa README update 2012-05-10 15:11:43 -04:00
d1e2fb3ab3 pager setting in configuration file overrides $PAGER environment variable 2012-05-10 15:10:57 -04:00
f311c8fa61 update README for working-copy-local configuration files 2012-05-10 14:02:31 -04:00
ee49bfe4dd support working-copy-local jsvn configuration files - close #12 2012-05-10 13:54:45 -04:00
eb735d60a1 show property update in same color as file update 2012-04-20 09:58:35 -04:00
7bbf0ef4e2 change status colors to match update: modified items in cyan 2012-04-18 11:25:22 -04:00
b485f8c752 fix stash documentation 2012-04-17 12:49:14 -04:00
3de05f6759 add v1.1 history 2012-04-16 16:39:00 -04:00
e7fcb59e96 add documentation for shell command aliases 2012-04-16 16:13:51 -04:00
bc02a338c8 allow launching arbitrary shell commands from an alias - close #3 2012-04-16 16:04:25 -04:00
c604c82e5e bugfix - omit alias lookup if no subcommand provided 2012-04-16 15:51:31 -04:00
3fecd9c800 remove usage information and documentation from jsvn
just keep one copy of this in README
2012-04-16 15:39:48 -04:00
676f098e42 bug fix: use rstrip() instead of strip() to preserve leading whitespace 2012-04-11 09:57:22 -04:00
2f069625d1 add "bisect" operation - close #10 2012-04-09 10:53:31 -04:00
2b2589369f remove trailing blank line on colorized output piped to less 2012-04-07 18:35:01 -04:00
ae0b02ea02 stash: display colorized stash info in "list" output 2012-04-07 18:19:59 -04:00
2198f91b41 stash: write info to stash files, not displaying in "list" yet 2012-04-07 17:51:33 -04:00
28fb4fa1e1 stash: handle newly-added files and directories 2012-04-07 17:21:42 -04:00
5f4a4c5a96 stash: abort creating stash file if changes to binary files are present 2012-04-07 16:54:34 -04:00
50115bb998 detect when there is nothing to stash - fix #9 2012-04-05 11:32:14 -04:00
09a6f91f49 make stash ID argument to "stash show" optional 2012-03-26 15:33:29 -04:00
3b4944f6f7 add stash drop documentation 2012-03-26 15:30:36 -04:00
0af0ce1ce6 stash pop accepts optional <id> argument - close #4 2012-03-26 15:29:22 -04:00
f04a4d0827 add stash drop functionality - close #7 2012-03-26 15:25:17 -04:00
92078344bc add stash show documentation 2012-03-26 15:21:44 -04:00
8f3bfbbe3c stash: always create and apply stash from WC root directory 2012-03-26 14:18:04 -04:00
8723d0e74e add stash "show" subcommand - close #5 2012-03-26 13:57:30 -04:00
55e8a8ddde colorize "stash pop" output 2012-03-26 13:51:42 -04:00
7def1721f4 color update output for "U"pdated items cyan
also change merGed to magenta
2012-03-26 13:44:41 -04:00
ce8b679910 add "stash" subcommand - fix #1 2012-03-26 11:38:18 -04:00
40775d6d72 implement subcommand shortcuts as default aliases in the user configuration 2012-03-22 14:23:38 -04:00
2 changed files with 1624 additions and 368 deletions

225
README
View File

@ -1,9 +1,10 @@
Josh's SVN wrapper script
https://github.com/holtrop/jsvn
This wrapper script to Subversion supplements normal svn behavior by
adding additional functionality or modifying the output of the default
svn subcommands. Much of the functionality implemented here was inspired
by the way that git works.
svn subcommands (simplification and colorization). Much of the functionality
implemented here was inspired by the way that git works.
It is recommended to put this script in your $PATH as 'jsvn' or something
other than 'svn' and to make an alias svn='jsvn'.
@ -16,47 +17,113 @@ path and automatically alias 'svn' to it if so:
Implemented subcommands:
add <file>...
- add files as usual; add recursive contents of directories
branch[es] [[-d] <branch_name>]
- with no arguments, list branches with '*' by the current one
- with -d, delete <branch>
- otherwise, create a new branch from the current one
tag[s] [[-d] <tag_name>] | [-m <old_tag_name> <new_tag_name>]
- with no arguments, list tags
- with -d, delete <tag>
- with -m, rename <old_tag_name> to <new_tag_name>
- otherwise, create a new tag from the current branch
switch <short_name>
- switch to 'trunk', branch name, or tag name without having to specify
the full URL
- falls back to Subversion "switch" if <short_name> doesn't exist
merge <branch>
- merge branch <branch> into the current WC path
- falls back to Subversion "merge" if <branch> doesn't exist
root
- output root URL (for use on shell such as "svn log $(svn root)/tags")
url
- output repository URL of current working directory
watch-lock
- block until the lock on a file/URL is released
users
- show a list of contributing users to a SVN path
binaries [--set-lock]
- show a list of versioned binary files under the current path, with
a prepended '*' for those with svn:needs-lock set
- with --set-lock, set svn:needs-lock to '*' for binaries
bisect <operation>
operations:
- init initialize a new bisect operation
- bad mark the current revision as bad - containing the change sought
- good mark the current revision as good - older than the change sought
- reset terminate the bisect operation and return to the original revision
branch[es]
- branch: list branches with '*' by the current one
- branch -d name: delete branch <name>
- branch [-s] name [source[@rev]]: create branch <name>
- if <source> is given it is resolved as a reference name (can be 'trunk',
or a tag or branch name)
- if <source> is not given the HEAD of the current working-copy URL is used.
- also switch to the new branch if -s is given
checkout [options] [url] [wc_path]
- if a URL is given that ends with /trunk and no working copy path is given,
then the last directory component before "/trunk" is used as the working
copy path
clean [-x] {-n|-f} [path...]
- remove (or list) unversioned items
options:
-x, --ignore-ignores
- remove/list unversioned items that are ignored by Subversion
-n, --dry-run
- perform a dry-run, i.e. list files that would be removed but do not
actually remove them
-f, --force
- perform the actual removal of unversioned files
commit
- removes trailing whitespace (including end-of-line characters) from commit
messages before committing if neither -m nor -F arguments are given
diff
- allow specifying ref1..ref2 syntax to show the diff between two references
- references can be tag names, branch names, or 'trunk'
- allow specifying ref1...ref2 syntax to show the diff between the common
ancestor of ref1 and ref2 and ref2's HEAD
externals
- print a list of the externals in the repository
lockable [--remove] | [--status] <file[s]>
- with no switches, set svn:needs-lock to '*' for file[s]
- with --remove, remove svn:needs-lock' for file[s]
- with --status, prepended '*' for those with svn:needs-lock set
externals
- print a list of the externals in the repository
The following subcommands are executed using their native handler, but
have their output simplified and/or colorized:
- diff
- log
- status
- update
log
- allow specifying ref1..ref2 syntax to show the log entries for
ref2 which are not a part of ref1
merge <branch>
- merge branch <branch> into the current WC path
- falls back to Subversion "merge" if <branch> doesn't exist
revert <path[s]>
- revert all affected files under given target path(s)
root
- output root URL (for use on shell such as "svn log $(svn root)/tags")
stash [options] [file...]
- allow temporarily saving changes to the working copy without committing
- the stashes behaves as a "stack" where stashing pushes a new stash object
and popping removes the newest one from the top of the stack
- binary files are ignored (a warning is printed) and not stashed
options:
-e, --externals
- also stash changes in externals (if no explicit targets given)
- this option is implicitly on if the configuration value
'stash_externals' is set to True
--noexternals
- reverse --externals (or the configuration value 'stash_externals')
-k, --keep
- create the stash object, but keep the changes locally as well
- with --pop, do not remove the stash object after reapplying it
-p, --patch
- interactively prompt for whether to stash each hunk
--list
- show a list of all stash objects
--pop [id]
- apply the stash object <id> back to the working copy
- the stash object is removed unless -k (keep) given
- <id> defaults to the newest stash object created
--show [id]
- display the diff stored in stash with ID <id>
- <id> defaults to the newest stash object created
--drop [id]
- delete stash object <id>
- <id> defaults to the newest stash object created
- if none of --list, --pop, --show, or --drop is given, a new stash object
is created containing the chosen differences
- if file is given, only the changes from the listed files will be stashed
switch <short_name>
- switch to 'trunk', branch name, or tag name without having to specify
the full URL
- falls back to Subversion "switch" if <short_name> doesn't exist
tag[s]
- tag [-v]: list tags
- with -v (verbose), lists tag origin and creation date
- tag -d name: delete tag <name>
- tag -m old new: rename tag <old> to <new>
- tag name [source[@rev]]: create tag <name>
- if <source> is given it is resolved as a reference name (can be 'trunk',
or another tag or a branch name)
- if <source> is not given the HEAD of the current working-copy URL is used.
url [file]
- output repository URL of file [default: '.' (current working directory)]
users
- show a list of contributing users to a SVN path
watch-lock
- block until the lock on a file/URL is released
If the subcommand name begins with two leading underscores ("__"), the
underscores will be stripped and the command will be handled by native
@ -64,9 +131,14 @@ Subversion without any jsvn processing.
Configuration:
jsvn will execute the file ~/.jsvn, if it exists, as a Python script.
Variables written to will be used as configuration directives.
Available configuration directives:
jsvn will execute the files "~/.jsvn", and "$WCROOT/.svn/jsvn", in that
order, if they exist, as Python scripts for the user to locally configure
jsvn. Variables written to from within configuration scripts will be used
as configuration directives to control jsvn's execution. jsvn's default
settings or even user-specified settings can thus be overridden for a
particular working copy by creating a "$WCROOT/.svn/jsvn" script.
Available configuration variables:
use_color: True or False to enable/disable colorization of svn output
use_pager: True or False to enable/disable automatic piping of svn
output to a pager program
@ -74,14 +146,89 @@ Available configuration directives:
aliases['XXX']: A string or list defining the alias 'XXX'. A string
can be used if the alias expands to a single argument. A
list must be used to pass multiple arguments to svn.
An arbitrary shell command can be specified by beginning the
alias definition with a '!' character. In this case, the shell
variable $0 will contain the subcommand specified by the user
on the command line, and $1, $2, ... will contain any positional
parameters specified on the command line.
Starting with jsvn v1.2, user configuration scripts may define
python functions to be used as aliases. The execution
environment for these user-defined functions is limited but
does provide the following symbols:
- Popen, PIPE: passed from the subprocess module for arbitrary
command execution
- do(cmd, expand=True): the do() function allows the alias
function to execute a command within jsvn. 'cmd' should be
either a string if the command has no arguments, or a list
containing the command and all arguments. 'expand' is a
boolean flag determining whether user-defined aliases should
be used to expand the command. If an alias function invokes
do() with the same command that the alias function itself is
bound to, and expand is not set to False, then the alias
function will be called recursively!
svn: Specify the path to the native Subversion executable. If not
specified, the first 'svn' in $PATH will be used.
ignore_executable_extensions: A list of extensions (including the '.')
for newly added files which should not automatically have the
svn:executable property added for them even if the files are
executable. The default value is ['.c', '.cc', '.h', '.txt'].
ignore_symlinks: True or False to hide unversioned symlinks from appearing
in status output (default: False)
stash_externals: True or False to enable/disable whether '-e' is implicitly
on for 'stash' subcommand. Defaults to False.
Configuration Examples:
pager = 'less -FRXi' # enable case-insensitive searching in less
aliases['revert'] = ['revert', '-R'] # default to recursive reverts
aliases['s'] = ['status', '--ignore-externals']
aliases['status'] = '__status' # ignore jsvn processing of status command
aliases['init'] = '!svnadmin create $1'
def up_and_ctags(args):
do(args, expand=False) # do the actual update command
Popen(['ctags', '-R']).wait()
aliases['up'] = up_and_ctags
Author: Josh Holtrop
History:
v1.0 - functional release on github
v1.7 - 2013-08-16
- add "clean" subcommand handler
- bugfix: revert subcommand handler: revert deleted items
v1.6 - 2013-07-24
- rework 'stash' subcommand to operate on individual hunks
- add 'revert' subcommand handler
v1.5 - 2012-11-08
- add -v (verbose) flag to 'tag' subcommand
- allow optional source argument to 'branch' subcommand
- remove repository prefix URL from diff --summarize output
- Add .exe extension to svn binary name if platform is Windows (not cygwin)
v1.4 - 2012-08-23
- allow optional source/revision argument when creating a tag
- handle ctrl+c better when interacting with a pager
- add configurable functionality to work around svn automatically adding svn:executable property
- bugfix for diff "..." range syntax to show correct diff
- improved performance for diff/log "..." syntax
- minor stash show bugfix
v1.3 - 2012-06-27
- colorize diff --summarize output
- log: support ref1..ref2 syntax for showing ref2 history not in ref1
- diff: support ref1..ref2 syntax for diffing branches/tags
- diff: support ref1...ref2 syntax for diffing from common ancestor
- branch: add -s option to immediately switch to newly-created branch
- bugfix: branch: throw error when creating a branch that already exists
- stash save: add -k option to keep the working copy intact
- stash pop: add -k option to keep the stash after applying it
- url subcommand can take an optional path argument to operate on
- various minor tweaks and improvements
v1.2 - 2012-05-11
- support working-copy-local jsvn configuration files ($WCROOT/.svn/jsvn)
- support python functions as user-implemented aliases
- bugfix: pager setting in config file overrides $PAGER environment
variable instead of other way around
v1.1 - 2012-04-16
- add stash subcommand
- add bisect subcommand
- add support for aliases expanding to arbitrary shell commands
- bugfix: remove trailing blank lines on colorized output sent to pager
v1.0 - 2012-03-22
- functional release on github

1767
jsvn

File diff suppressed because it is too large Load Diff