from .base import Base import re import os URL_PATTERN = re.compile('^(https?|git)://(github.com/)?') REF_PATTERN = re.compile('^ref: (refs/heads/(.*))$') class Source(Base): def __init__(self, vim): Base.__init__(self, vim) self.name = 'dein' self.kind = 'directory' self.default_action = 'cd' def gather_candidates(self, context): return [ _build_candidate(plugin_context) for plugin_context in self.vim.eval('values(dein#get())') ] def _build_candidate(plugin_context): name = URL_PATTERN.sub('', plugin_context['repo']) path = plugin_context['path'] # Find git revision try: revision, branch = _resolve_ref(os.path.join(path, '.git'), 'HEAD') except Exception: # Fail silently revision = '' branch = None rev = revision if branch is None else '%s (%s)' % (branch, revision[:7]) return { 'word': name.strip(), 'abbr': name.strip() if not rev else '%s -- %s' % (name.strip(), rev.strip()), 'action__path': path, } def _resolve_ref(git, ref, branch=None): with open(os.path.join(git, ref)) as fi: content = fi.readline() m = REF_PATTERN.match(content) if not m: return (content, branch) return _resolve_ref(git, m.group(1), m.group(2))