71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
|
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)
|