A Powerline segment for showing the status of a Subversion working directory. Inspired by Jasper N. Brouwer's Powerline Gitstatus segment.
It includes a segment for the Subversion trunk/branch/tag you're working on, as well as individual segments that summarize the status of your current working directory. For example, if you have a clean working copy, you'll just see a segment with the trunk/branch/tag name as its text; if you create a new untracked file, you'll see an additional segment with the text ? 1 (signifying 1 untracked file); if you stage that file for addition, you'll see a different segment in its place with the text A 1 (signifying 1 added file).
Once you have Powerline set up and running, you can install this segment via Pip:
pip install powerline-svnstatus
Then add the powerline_status.svnstatus segment to your Powerline configuration; this is what I use in my ~/.config/powerline/themes/shell/default_leftonly.json:
{
"function": "powerline_svnstatus.svnstatus",
"priority": 40
},You can adjust what this segment displays for a "branch". By default, it runs the following regular expression against the URL returned by the svn info command, and concatenates the matching groups from the regular expression: /(trunk)(?:/|$)|/(?:tags|branch(?:es)?)/([^/]+). So for example, if the URL of your working copy was https://repo.example.com/svn/foo/trunk, it would display trunk as the "branch"; if the URL was https://repo.example.com/svn/foo/branches/xyz, it would display xyz as the "branch".
You can use the branch_re argument in this segment's configuration to customize the branch regular expression. So for example, if you wanted to also show the "project" that the branch was a part of (so as to show foo/trunk for an URL like https://repo.example.com/svn/foo/trunk, or foo/1.2.3 for an URL like https://repo.example.com/svn/foo/tags/1.2.3), you could adjust your segment configuration to this:
{
"function": "powerline_svnstatus.svnstatus",
"args": {
"branch_re": "([^/]+)(?:(/trunk)(?:/|$)|/(?:tags|branch(?:es)?)(/[^/]+))"
},
"priority": 40
},By default, the segment will display a branch symbol () followed by the matched groups from the regular expression. You can change this using the branch_format option. This is expected to be a format string, in which %s is replaced by the matched groups from the banch_re regular expression. You can override the default %s in the same manner shown above.
Finally, if you would like to display information coming from a different line of svn info output than the URL, you can change the line to extract by specifying the line_start option. The branch_re regular expression is run on the line of svn info output that starts with this string, after the string has been removed from it. It defaults to URL: , as you might expect. Thus, if one line of the svn info would be Repository Root: https://repo.example.com/svn/foo, you could specify that you are interested in it by setting "line_start": "Repository Root: ". The branch_re expression would then be run on https://repo.example.com/svn/foo.
You can use the above options to display the current revision in the segment, instead of a branch, as follows:
{
"function": "powerline_svnstatus.svnstatus",
"args": {
"branch_format": "r%s",
"branch_re": "(\\d+)",
"line_start": "Revision: "
},
"priority": 40
},As you can see, this specifies that we are interested in the revision (line_start), parses out the revision number (branch_re) and finally displays it prefixed with a lowercase r (branch_format). Your segment could now display r42, for example.
You can customize this segment's colors. By default, it uses Powerline's vcs branch_clean highlight group to show segments when your working directory is clean, and branch_dirty when your working directory is dirty (with branch:divider to show dividers between segments). But you can also define custom svnstatus_clean and svn_status_dirty groups for the same purpose, plus a svnstatus_[character] for each individual status code for the counting segments (like svnstatus_A for the added file count, svnstatus_? for the untracked file count, etc). You can also define svnstatus_unknown as a fallback for segments with a status character you haven't explicitly defined.
So for example, these are the colors for various highlight groups I use, defined in my ~/.config/powerline/colorschemes/default.json:
"svnstatus_clean": { "bg": "brightgreen", "fg": "black", "attrs": [] },
"svnstatus_dirty": { "bg": "brightorange", "fg": "black", "attrs": [] },
"svnstatus_unknown": { "bg": "brightred", "fg": "white", "attrs": [] },
"svnstatus_A": { "bg": "brightgreen", "fg": "black", "attrs": [] },
"svnstatus_A+": { "bg": "mediumgreen", "fg": "black", "attrs": [] },
"svnstatus_C": { "bg": "brightestred", "fg": "black", "attrs": [] },
"svnstatus_D": { "bg": "mediumorange", "fg": "white", "attrs": [] },
"svnstatus_I": { "bg": "gray9", "fg": "black", "attrs": [] },
"svnstatus_M": { "bg": "brightyellow", "fg": "black", "attrs": [] },
"svnstatus_R": { "bg": "mediumgreen", "fg": "black", "attrs": [] },
"svnstatus_S": { "bg": "mediumcyan", "fg": "black", "attrs": [] },
"svnstatus_X": { "bg": "mediumpurple", "fg": "black", "attrs": [] },
"svnstatus_?": { "bg": "brightestorange", "fg": "black", "attrs": [] },The svnstatus_unknown group will apply to statuses I haven't defined, like ! or ~. And the svnstatus_A+ group applies to files with added with a history (I could have omitted this group, and A+ segments would simply use the svnstatus_A group).
