72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
|
import os
|
||
|
import subprocess
|
||
|
from ..utils import RepoStats, ThreadedSegment, get_subprocess_env
|
||
|
|
||
|
|
||
|
def _get_fossil_branch():
|
||
|
branches = os.popen("fossil branch 2>/dev/null").read().strip().split("\n")
|
||
|
return ''.join([
|
||
|
i.replace('*','').strip()
|
||
|
for i in branches
|
||
|
if i.startswith('*')
|
||
|
])
|
||
|
|
||
|
|
||
|
def parse_fossil_stats(status):
|
||
|
stats = RepoStats()
|
||
|
for line in status:
|
||
|
if line.startswith("ADDED"):
|
||
|
stats.staged += 1
|
||
|
elif line.startswith("EXTRA"):
|
||
|
stats.new += 1
|
||
|
elif line.startswith("CONFLICT"):
|
||
|
stats.conflicted += 1
|
||
|
else:
|
||
|
stats.changed += 1
|
||
|
return stats
|
||
|
|
||
|
|
||
|
def _get_fossil_status():
|
||
|
changes = os.popen("fossil changes 2>/dev/null").read().strip().split("\n")
|
||
|
extra = os.popen("fossil extras 2>/dev/null").read().strip().split("\n")
|
||
|
extra = ["EXTRA " + filename for filename in extra if filename != ""]
|
||
|
status = [line for line in changes + extra if line != '']
|
||
|
return status
|
||
|
|
||
|
|
||
|
def build_stats():
|
||
|
try:
|
||
|
subprocess.Popen(['fossil'], stdout=subprocess.PIPE,
|
||
|
stderr=subprocess.PIPE,
|
||
|
env=get_subprocess_env()).communicate()
|
||
|
except OSError:
|
||
|
# Popen will throw an OSError if fossil is not found
|
||
|
return (None, None)
|
||
|
branch = _get_fossil_branch()
|
||
|
if branch == "":
|
||
|
return (None, None)
|
||
|
status = _get_fossil_status()
|
||
|
if status == []:
|
||
|
return (RepoStats(), branch)
|
||
|
stats = parse_fossil_stats(status)
|
||
|
return stats, branch
|
||
|
|
||
|
|
||
|
class Segment(ThreadedSegment):
|
||
|
|
||
|
def add_to_powerline(self):
|
||
|
self.stats, self.branch = build_stats()
|
||
|
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["fossil"] + " "
|
||
|
else:
|
||
|
symbol = ""
|
||
|
self.powerline.append(" " + symbol + self.branch + " ", fg, bg)
|
||
|
self.stats.add_to_powerline(self.powerline)
|