Add bzr support
This commit is contained in:
parent
20639494c0
commit
c70d3b38b6
|
@ -3,8 +3,11 @@ import os
|
||||||
from powerline.lib.memoize import memoize
|
from powerline.lib.memoize import memoize
|
||||||
|
|
||||||
|
|
||||||
vcs_props = (('git', '.git', os.path.exists),
|
vcs_props = (
|
||||||
('mercurial', '.hg', os.path.isdir))
|
('git', '.git', os.path.exists),
|
||||||
|
('mercurial', '.hg', os.path.isdir),
|
||||||
|
('bzr', '.bzr', os.path.isdir),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate_directories(path):
|
def generate_directories(path):
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
from __future__ import absolute_import, unicode_literals, division, print_function
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from io import StringIO
|
||||||
|
|
||||||
|
from bzrlib import (branch, workingtree, status, library_state, trace, ui)
|
||||||
|
|
||||||
|
|
||||||
|
class CoerceIO(StringIO):
|
||||||
|
def write(self, arg):
|
||||||
|
if isinstance(arg, bytes):
|
||||||
|
arg = arg.decode('utf-8', 'replace')
|
||||||
|
return super(CoerceIO, self).write(arg)
|
||||||
|
|
||||||
|
|
||||||
|
class Repository(object):
|
||||||
|
def __init__(self, directory):
|
||||||
|
if isinstance(directory, bytes):
|
||||||
|
directory = directory.decode(sys.getfilesystemencoding() or sys.getdefaultencoding() or 'utf-8')
|
||||||
|
self.directory = directory
|
||||||
|
self.state = library_state.BzrLibraryState(ui=ui.SilentUIFactory, trace=trace.DefaultConfig())
|
||||||
|
|
||||||
|
def status(self, path=None):
|
||||||
|
'''Return status of repository or file.
|
||||||
|
|
||||||
|
Without file argument: returns status of the repository:
|
||||||
|
|
||||||
|
:"D?": dirty (tracked modified files: added, removed, deleted, modified),
|
||||||
|
:"?U": untracked-dirty (added, but not tracked files)
|
||||||
|
:None: clean (status is empty)
|
||||||
|
|
||||||
|
With file argument: returns status of this file: The status codes are
|
||||||
|
those returned by bzr status -S
|
||||||
|
'''
|
||||||
|
try:
|
||||||
|
return self._status(path)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _status(self, path):
|
||||||
|
buf = CoerceIO()
|
||||||
|
w = workingtree.WorkingTree.open(self.directory)
|
||||||
|
status.show_tree_status(w, specific_files=[path] if path else None, to_file=buf, short=True)
|
||||||
|
raw = buf.getvalue()
|
||||||
|
if not raw.strip():
|
||||||
|
return
|
||||||
|
if path:
|
||||||
|
return raw[:2]
|
||||||
|
dirtied = untracked = ' '
|
||||||
|
for line in raw.splitlines():
|
||||||
|
if len(line) > 1 and line[1] in 'ACDMRIN':
|
||||||
|
dirtied = 'D'
|
||||||
|
elif line and line[0] == '?':
|
||||||
|
untracked = 'U'
|
||||||
|
return dirtied + untracked
|
||||||
|
|
||||||
|
def branch(self):
|
||||||
|
try:
|
||||||
|
b = branch.Branch.open(self.directory)
|
||||||
|
return b.nick or None
|
||||||
|
except:
|
||||||
|
pass
|
|
@ -2,7 +2,7 @@
|
||||||
pip install .
|
pip install .
|
||||||
if python -c 'import sys; sys.exit(1 * (sys.version_info[0] != 2))' ; then
|
if python -c 'import sys; sys.exit(1 * (sys.version_info[0] != 2))' ; then
|
||||||
# Python 2
|
# Python 2
|
||||||
pip install mercurial
|
pip install mercurial bzr
|
||||||
if python -c 'import sys; sys.exit(1 * (sys.version_info[1] >= 7))' ; then
|
if python -c 'import sys; sys.exit(1 * (sys.version_info[1] >= 7))' ; then
|
||||||
# Python 2.6
|
# Python 2.6
|
||||||
pip install unittest2
|
pip install unittest2
|
||||||
|
|
|
@ -39,7 +39,7 @@ class TestLib(TestCase):
|
||||||
self.assertEqual(humanize_bytes(1000000000, si_prefix=False), '953.7 MiB')
|
self.assertEqual(humanize_bytes(1000000000, si_prefix=False), '953.7 MiB')
|
||||||
|
|
||||||
|
|
||||||
use_mercurial = sys.version_info < (3, 0)
|
use_mercurial = use_bzr = sys.version_info < (3, 0)
|
||||||
|
|
||||||
|
|
||||||
class TestVCS(TestCase):
|
class TestVCS(TestCase):
|
||||||
|
@ -78,6 +78,27 @@ class TestVCS(TestCase):
|
||||||
self.assertEqual(repo.status('file'), 'A')
|
self.assertEqual(repo.status('file'), 'A')
|
||||||
os.remove(os.path.join('hg_repo', 'file'))
|
os.remove(os.path.join('hg_repo', 'file'))
|
||||||
|
|
||||||
|
if use_bzr:
|
||||||
|
def test_bzr(self):
|
||||||
|
repo = guess(path='bzr_repo')
|
||||||
|
self.assertNotEqual(repo, None, 'No bzr repo found. Do you have bzr installed?')
|
||||||
|
self.assertEqual(repo.branch(), 'test_powerline')
|
||||||
|
self.assertEqual(repo.status(), None)
|
||||||
|
with open(os.path.join('bzr_repo', 'file'), 'w') as f:
|
||||||
|
f.write('abc')
|
||||||
|
self.assertEqual(repo.status(), ' U')
|
||||||
|
self.assertEqual(repo.status('file'), '? ')
|
||||||
|
call(['bzr', 'add', '.'], cwd='bzr_repo', stdout=PIPE)
|
||||||
|
self.assertEqual(repo.status(), 'D ')
|
||||||
|
self.assertEqual(repo.status('file'), '+N')
|
||||||
|
call(['bzr', 'commit', '-m', 'initial commit'], cwd='bzr_repo', stdout=PIPE, stderr=PIPE)
|
||||||
|
self.assertEqual(repo.status(), None)
|
||||||
|
with open(os.path.join('bzr_repo', 'file'), 'w') as f:
|
||||||
|
f.write('def')
|
||||||
|
self.assertEqual(repo.status(), 'D ')
|
||||||
|
self.assertEqual(repo.status('file'), ' M')
|
||||||
|
self.assertEqual(repo.status('notexist'), None)
|
||||||
|
os.remove(os.path.join('bzr_repo', 'file'))
|
||||||
|
|
||||||
old_HGRCPATH = None
|
old_HGRCPATH = None
|
||||||
old_cwd = None
|
old_cwd = None
|
||||||
|
@ -99,12 +120,17 @@ def setUpModule():
|
||||||
with open(os.path.join('hg_repo', '.hg', 'hgrc'), 'w') as hgrc:
|
with open(os.path.join('hg_repo', '.hg', 'hgrc'), 'w') as hgrc:
|
||||||
hgrc.write('[ui]\n')
|
hgrc.write('[ui]\n')
|
||||||
hgrc.write('username = Foo <bar@example.org>\n')
|
hgrc.write('username = Foo <bar@example.org>\n')
|
||||||
|
if use_bzr:
|
||||||
|
call(['bzr', 'init', '--quiet', 'bzr_repo'])
|
||||||
|
call(['bzr', 'config', 'email=Foo <bar@example.org>'], cwd='bzr_repo')
|
||||||
|
call(['bzr', 'config', 'nickname=test_powerline'], cwd='bzr_repo')
|
||||||
|
call(['bzr', 'config', 'create_signatures=0'], cwd='bzr_repo')
|
||||||
|
|
||||||
|
|
||||||
def tearDownModule():
|
def tearDownModule():
|
||||||
global old_cwd
|
global old_cwd
|
||||||
global old_HGRCPATH
|
global old_HGRCPATH
|
||||||
for repo_dir in ['git_repo'] + (['hg_repo'] if use_mercurial else []):
|
for repo_dir in (['git_repo'] + (['hg_repo'] if use_mercurial else []) + (['bzr_repo'] if use_bzr else [])):
|
||||||
for root, dirs, files in list(os.walk(repo_dir, topdown=False)):
|
for root, dirs, files in list(os.walk(repo_dir, topdown=False)):
|
||||||
for file in files:
|
for file in files:
|
||||||
os.remove(os.path.join(root, file))
|
os.remove(os.path.join(root, file))
|
||||||
|
|
Loading…
Reference in New Issue