dotfiles/config/powerline-shell/segments/svn.py

71 lines
2.2 KiB
Python
Raw Permalink Normal View History

2021-04-20 11:12:35 +00:00
import subprocess
from ..utils import ThreadedSegment, RepoStats, get_subprocess_env
def _get_svn_revision():
p = subprocess.Popen(["svn", "info", "--xml"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=get_subprocess_env())
for line in p.communicate()[0].decode("utf-8").splitlines():
if "revision" in line:
revision = line.split("=")[1].split('"')[1]
break
return revision
def parse_svn_stats(status):
stats = RepoStats()
for line in status:
if line[0] == "?":
stats.new += 1
elif line[0] == "C":
stats.conflicted += 1
elif line[0] in ["A", "D", "I", "M", "R", "!", "~"]:
stats.changed += 1
return stats
def _get_svn_status(output):
"""This function exists to enable mocking the `svn status` output in tests.
"""
return output[0].decode("utf-8").splitlines()
def build_stats():
try:
p = subprocess.Popen(['svn', 'status'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
env=get_subprocess_env())
except OSError:
# Popen will throw an OSError if svn is not found
return None, None
pdata = p.communicate()
if p.returncode != 0 or pdata[1][:22] == b'svn: warning: W155007:':
return None, None
status = _get_svn_status(pdata)
stats = parse_svn_stats(status)
revision = _get_svn_revision()
return stats, revision
class Segment(ThreadedSegment):
def run(self):
self.stats, self.revision = build_stats()
def add_to_powerline(self):
self.join()
if not self.stats:
return
bg = self.powerline.theme.REPO_CLEAN_BG
fg = self.powerline.theme.REPO_CLEAN_FG
if self.stats.dirty:
bg = self.powerline.theme.REPO_DIRTY_BG
fg = self.powerline.theme.REPO_DIRTY_FG
if self.powerline.segment_conf("vcs", "show_symbol"):
symbol = " " + RepoStats().symbols["svn"]
else:
symbol = ""
self.powerline.append(symbol + " rev " + self.revision + " ", fg, bg)
self.stats.add_to_powerline(self.powerline)