Merge pull request #1096 from ZyX-I/no-untracked-dirty

Add a way to not mark repo as dirty when it only has untracked files
This commit is contained in:
Nikolai Aleksandrovich Pavlov 2014-09-26 00:44:52 +04:00
commit a0a02bfb18
3 changed files with 142 additions and 64 deletions

View File

@ -2,32 +2,57 @@
from __future__ import (unicode_literals, division, absolute_import, print_function) from __future__ import (unicode_literals, division, absolute_import, print_function)
from powerline.lib.vcs import guess, tree_status from powerline.lib.vcs import guess, tree_status
from powerline.segments import Segment, with_docstring
from powerline.theme import requires_segment_info, requires_filesystem_watcher from powerline.theme import requires_segment_info, requires_filesystem_watcher
@requires_filesystem_watcher @requires_filesystem_watcher
@requires_segment_info @requires_segment_info
def branch(pl, segment_info, create_watcher, status_colors=False): class BranchSegment(Segment):
'''Return the current VCS branch. divider_highlight_group = None
:param bool status_colors: @staticmethod
determines whether repository status will be used to determine highlighting. Default: False. def get_directory(segment_info):
return segment_info['getcwd']()
Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``. def __call__(self, pl, segment_info, create_watcher, status_colors=False, ignore_statuses=()):
''' name = self.get_directory(segment_info)
name = segment_info['getcwd']() if name:
repo = guess(path=name, create_watcher=create_watcher) repo = guess(path=name, create_watcher=create_watcher)
if repo is not None: if repo is not None:
branch = repo.branch() branch = repo.branch()
scol = ['branch'] scol = ['branch']
if status_colors: if status_colors:
try: try:
status = tree_status(repo, pl) status = tree_status(repo, pl)
except Exception as e: except Exception as e:
pl.exception('Failed to compute tree status: {0}', str(e)) pl.exception('Failed to compute tree status: {0}', str(e))
status = '?' status = '?'
scol.insert(0, 'branch_dirty' if status and status.strip() else 'branch_clean') else:
return [{ status = status and status.strip()
'contents': branch, if status in ignore_statuses:
'highlight_group': scol, status = None
}] scol.insert(0, 'branch_dirty' if status else 'branch_clean')
return [{
'contents': branch,
'highlight_group': scol,
'divider_highlight_group': self.divider_highlight_group,
}]
branch = with_docstring(BranchSegment(),
'''Return the current VCS branch.
:param bool status_colors:
Determines whether repository status will be used to determine highlighting.
Default: False.
:param bool ignore_statuses:
List of statuses which will not result in repo being marked as dirty. Most
useful is setting this option to ``["U"]``: this will ignore repository
which has just untracked files (i.e. repository with modified, deleted or
removed files will be marked as dirty, while just untracked files will make
segment show clean repository). Only applicable if ``status_colors`` option
is True.
Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``.
''')

View File

@ -17,9 +17,11 @@ from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption,
list_tabpage_buffers_segment_info) list_tabpage_buffers_segment_info)
from powerline.theme import requires_segment_info, requires_filesystem_watcher from powerline.theme import requires_segment_info, requires_filesystem_watcher
from powerline.lib import add_divider_highlight_group from powerline.lib import add_divider_highlight_group
from powerline.lib.vcs import guess, tree_status from powerline.lib.vcs import guess
from powerline.lib.humanize_bytes import humanize_bytes from powerline.lib.humanize_bytes import humanize_bytes
from powerline.lib import wraps_saveargs as wraps from powerline.lib import wraps_saveargs as wraps
from powerline.segments.common.vcs import BranchSegment
from powerline.segments import with_docstring
try: try:
from __builtin__ import xrange as range from __builtin__ import xrange as range
@ -480,31 +482,34 @@ def modified_buffers(pl, text='+ ', join_str=','):
@requires_filesystem_watcher @requires_filesystem_watcher
@requires_segment_info @requires_segment_info
def branch(pl, segment_info, create_watcher, status_colors=False): class VimBranchSegment(BranchSegment):
'''Return the current working branch. divider_highlight_group = 'branch:divider'
:param bool status_colors: @staticmethod
determines whether repository status will be used to determine highlighting. Default: False. def get_directory(segment_info):
if vim_getbufoption(segment_info, 'buftype'):
return None
return buffer_name(segment_info)
Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``.
Divider highlight group used: ``branch:divider``. branch = with_docstring(VimBranchSegment(),
''' '''Return the current working branch.
name = buffer_name(segment_info)
skip = not (name and (not vim_getbufoption(segment_info, 'buftype'))) :param bool status_colors:
if not skip: Determines whether repository status will be used to determine highlighting.
repo = guess(path=name, create_watcher=create_watcher) Default: False.
if repo is not None: :param bool ignore_statuses:
branch = repo.branch() List of statuses which will not result in repo being marked as dirty. Most
scol = ['branch'] useful is setting this option to ``["U"]``: this will ignore repository
if status_colors: which has just untracked files (i.e. repository with modified, deleted or
status = tree_status(repo, pl) removed files will be marked as dirty, while just untracked files will make
scol.insert(0, 'branch_dirty' if status and status.strip() else 'branch_clean') segment show clean repository). Only applicable if ``status_colors`` option
return [{ is True.
'contents': branch,
'highlight_group': scol, Highlight groups used: ``branch_clean``, ``branch_dirty``, ``branch``.
'divider_highlight_group': 'branch:divider',
}] Divider highlight group used: ``branch:divider``.
''')
@requires_filesystem_watcher @requires_filesystem_watcher

View File

@ -600,25 +600,57 @@ class TestVcs(TestCommon):
branch = partial(common.branch, pl=pl, create_watcher=create_watcher) branch = partial(common.branch, pl=pl, create_watcher=create_watcher)
with replace_attr(self.module, 'guess', get_dummy_guess(status=lambda: None, directory='/tmp/tests')): with replace_attr(self.module, 'guess', get_dummy_guess(status=lambda: None, directory='/tmp/tests')):
with replace_attr(self.module, 'tree_status', lambda repo, pl: None): with replace_attr(self.module, 'tree_status', lambda repo, pl: None):
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [ self.assertEqual(branch(segment_info=segment_info, status_colors=False), [{
{'highlight_group': ['branch'], 'contents': 'tests'} 'highlight_group': ['branch'],
]) 'contents': 'tests',
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [ 'divider_highlight_group': None
{'contents': 'tests', 'highlight_group': ['branch_clean', 'branch']} }])
]) self.assertEqual(branch(segment_info=segment_info, status_colors=True), [{
'contents': 'tests',
'highlight_group': ['branch_clean', 'branch'],
'divider_highlight_group': None
}])
with replace_attr(self.module, 'guess', get_dummy_guess(status=lambda: 'D ', directory='/tmp/tests')): with replace_attr(self.module, 'guess', get_dummy_guess(status=lambda: 'D ', directory='/tmp/tests')):
with replace_attr(self.module, 'tree_status', lambda repo, pl: 'D '): with replace_attr(self.module, 'tree_status', lambda repo, pl: 'D '):
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [ self.assertEqual(branch(segment_info=segment_info, status_colors=False), [{
{'highlight_group': ['branch'], 'contents': 'tests'} 'highlight_group': ['branch'],
]) 'contents': 'tests',
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [ 'divider_highlight_group': None
{'contents': 'tests', 'highlight_group': ['branch_dirty', 'branch']} }])
]) self.assertEqual(branch(segment_info=segment_info, status_colors=True), [{
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [ 'contents': 'tests',
{'highlight_group': ['branch'], 'contents': 'tests'} 'highlight_group': ['branch_dirty', 'branch'],
]) 'divider_highlight_group': None
}])
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [{
'highlight_group': ['branch'],
'contents': 'tests',
'divider_highlight_group': None
}])
with replace_attr(self.module, 'guess', lambda path, create_watcher: None): with replace_attr(self.module, 'guess', lambda path, create_watcher: None):
self.assertEqual(branch(segment_info=segment_info, status_colors=False), None) self.assertEqual(branch(segment_info=segment_info, status_colors=False), None)
with replace_attr(self.module, 'guess', get_dummy_guess(status=lambda: 'U')):
with replace_attr(self.module, 'tree_status', lambda repo, pl: 'U'):
self.assertEqual(branch(segment_info=segment_info, status_colors=False, ignore_statuses=['U']), [{
'highlight_group': ['branch'],
'contents': 'tests',
'divider_highlight_group': None
}])
self.assertEqual(branch(segment_info=segment_info, status_colors=True, ignore_statuses=['DU']), [{
'highlight_group': ['branch_dirty', 'branch'],
'contents': 'tests',
'divider_highlight_group': None
}])
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [{
'highlight_group': ['branch_dirty', 'branch'],
'contents': 'tests',
'divider_highlight_group': None
}])
self.assertEqual(branch(segment_info=segment_info, status_colors=True, ignore_statuses=['U']), [{
'highlight_group': ['branch_clean', 'branch'],
'contents': 'tests',
'divider_highlight_group': None
}])
class TestTime(TestCommon): class TestTime(TestCommon):
@ -1057,22 +1089,36 @@ class TestVim(TestCase):
create_watcher = get_fallback_create_watcher() create_watcher = get_fallback_create_watcher()
branch = partial(self.vim.branch, pl=pl, create_watcher=create_watcher) branch = partial(self.vim.branch, pl=pl, create_watcher=create_watcher)
with vim_module._with('buffer', '/foo') as segment_info: with vim_module._with('buffer', '/foo') as segment_info:
with replace_attr(self.vim, 'guess', get_dummy_guess(status=lambda: None)): with replace_attr(self.vcs, 'guess', get_dummy_guess(status=lambda: None)):
with replace_attr(self.vim, 'tree_status', lambda repo, pl: None): with replace_attr(self.vcs, 'tree_status', lambda repo, pl: None):
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [ self.assertEqual(branch(segment_info=segment_info, status_colors=False), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch'], 'contents': 'foo'} {'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch'], 'contents': 'foo'}
]) ])
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [ self.assertEqual(branch(segment_info=segment_info, status_colors=True), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_clean', 'branch'], 'contents': 'foo'} {'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_clean', 'branch'], 'contents': 'foo'}
]) ])
with replace_attr(self.vim, 'guess', get_dummy_guess(status=lambda: 'DU')): with replace_attr(self.vcs, 'guess', get_dummy_guess(status=lambda: 'DU')):
with replace_attr(self.vim, 'tree_status', lambda repo, pl: 'DU'): with replace_attr(self.vcs, 'tree_status', lambda repo, pl: 'DU'):
self.assertEqual(branch(segment_info=segment_info, status_colors=False), [ self.assertEqual(branch(segment_info=segment_info, status_colors=False), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch'], 'contents': 'foo'} {'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch'], 'contents': 'foo'}
]) ])
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [ self.assertEqual(branch(segment_info=segment_info, status_colors=True), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_dirty', 'branch'], 'contents': 'foo'} {'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_dirty', 'branch'], 'contents': 'foo'}
]) ])
with replace_attr(self.vcs, 'guess', get_dummy_guess(status=lambda: 'U')):
with replace_attr(self.vcs, 'tree_status', lambda repo, pl: 'U'):
self.assertEqual(branch(segment_info=segment_info, status_colors=False, ignore_statuses=['U']), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch'], 'contents': 'foo'}
])
self.assertEqual(branch(segment_info=segment_info, status_colors=True, ignore_statuses=['DU']), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_dirty', 'branch'], 'contents': 'foo'}
])
self.assertEqual(branch(segment_info=segment_info, status_colors=True), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_dirty', 'branch'], 'contents': 'foo'}
])
self.assertEqual(branch(segment_info=segment_info, status_colors=True, ignore_statuses=['U']), [
{'divider_highlight_group': 'branch:divider', 'highlight_group': ['branch_clean', 'branch'], 'contents': 'foo'}
])
def test_file_vcs_status(self): def test_file_vcs_status(self):
pl = Pl() pl = Pl()
@ -1155,6 +1201,8 @@ class TestVim(TestCase):
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'path'))) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'path')))
from powerline.segments import vim from powerline.segments import vim
cls.vim = vim cls.vim = vim
from powerline.segments.common import vcs
cls.vcs = vcs
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):