diff --git a/modules/core/git.py b/modules/core/git.py new file mode 100644 index 0000000..468d174 --- /dev/null +++ b/modules/core/git.py @@ -0,0 +1,81 @@ +# pylint: disable=C0111,R0903 + +"""Print the branch and git status for the +currently focused window. + +Requires: + * xcwd + * Python module 'pygit2' +""" + +import os +import string +import logging +try: + import pygit2 +except ImportError: + pass + +import bumblebee.input +import bumblebee.output +import bumblebee.engine +import bumblebee.util + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + widgets = [] + super(Module, self).__init__(engine, config, widgets) + self._engine = engine + self._error = False + self.update(self.widgets()) + + def hidden(self): + return self._error + + def update(self, widgets): + state = {} + new_widgets = [] + try: + directory = bumblebee.util.execute("xcwd").strip() + directory = self._get_git_root(directory) + repo = pygit2.Repository(directory) + + new_widgets.append(bumblebee.output.Widget(name='git.main', full_text=repo.head.shorthand)) + + for filepath, flags in repo.status().items(): + if flags == pygit2.GIT_STATUS_WT_NEW or \ + flags == pygit2.GIT_STATUS_INDEX_NEW: + state['new'] = True + if flags == pygit2.GIT_STATUS_WT_DELETED or \ + flags == pygit2.GIT_STATUS_INDEX_DELETED: + state['deleted'] = True + if flags == pygit2.GIT_STATUS_WT_MODIFIED or \ + flags == pygit2.GIT_STATUS_INDEX_MODIFIED: + state['modified'] = True + self._error = False + if 'new' in state: + new_widgets.append(bumblebee.output.Widget(name='git.new')) + if 'modified' in state: + new_widgets.append(bumblebee.output.Widget(name='git.modified')) + if 'deleted' in state: + new_widgets.append(bumblebee.output.Widget(name='git.deleted')) + + while len(widgets) > 0: + del widgets[0] + for widget in new_widgets: + widgets.append(widget) + + except Exception as e: + self._error = True + + def state(self, widget): + return widget.name.split('.')[1] + + def _get_git_root(self, directory): + while len(directory) > 1: + if os.path.exists(os.path.join(directory, ".git")): + return directory + directory = "/".join(directory.split("/")[0:-1]) + return "/" + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4