def update(self): if not self.is_local: raise NotInstalled('{} is not installed'.format(self.name)) git = Git(self.path) with git_to_msm_exceptions(): sha_before = git.rev_parse('HEAD') modified_files = git.status(porcelain=True, untracked='no') if modified_files != '': raise SkillModified('Uncommitted changes:\n' + modified_files) git.fetch() current_branch = git.rev_parse('--abbrev-ref', 'HEAD').strip() if self.sha and current_branch in SWITCHABLE_BRANCHES: # Check out correct branch git.checkout(self._find_sha_branch()) git.merge(self.sha or 'origin/HEAD', ff_only=True) sha_after = git.rev_parse('HEAD') if sha_before != sha_after: self.update_deps() LOG.info('Updated ' + self.name) # Trigger reload by modifying the timestamp os.utime(join(self.path, '__init__.py')) return True else: LOG.info('Nothing new for ' + self.name) return False
def is_dirty(self): """True if different from the version in the mycroft-skills repo. Considers a skill dirty if - the checkout sha doesn't match the mycroft-skills repo - the skill doesn't exist in the mycroft-skills repo - the skill is not a git repo - has local modifications """ if not exists(self.path): return False try: checkout = Git(self.path) mod = checkout.status(porcelain=True, untracked_files='no') != '' current_sha = checkout.rev_parse('HEAD') except GitCommandError: # Not a git checkout return True skill_shas = {d[0]: d[3] for d in self.msm.repo.get_skill_data()} return (self.name not in skill_shas or current_sha != skill_shas[self.name] or mod)