def _check_repo_and_getcommit(self): #TODO improve this logic. I would like to retrain not only for new commits but also fo new data. # Also add tests repo = Repo(search_parent_directories=True) if not repo.is_dirty() or True: return repo.head.object.hexsha else: raise ValueError('working directory is not clean! please commit before running the server')
def update(options, error, debug, info): path = getcwd() repo = Repo(path) if not repo.is_dirty(): update_from_remote(debug, info, repo, 'origin') update_from_remote(debug, info, repo, 'upstream') else: error('Please commit or stash your changes before continuing.')
class GitArchiver(BaseArchiver): """Gitpython implementation of the base archiver.""" name = "git" def __init__(self, config): """ Instantiate a new Git Archiver. :param config: The wily configuration :type config: :class:`wily.config.WilyConfig` """ try: self.repo = Repo(config.path) except git.exc.InvalidGitRepositoryError as e: raise InvalidGitRepositoryError from e self.config = config if self.repo.head.is_detached: self.current_branch = self.repo.head.object.hexsha else: self.current_branch = self.repo.active_branch assert not self.repo.bare, "Not a Git repository" def revisions(self, path: str, max_revisions: int) -> List[Revision]: """ Get the list of revisions. :param path: the path to target. :type path: ``str`` :param max_revisions: the maximum number of revisions. :type max_revisions: ``int`` :return: A list of revisions. :rtype: ``list`` of :class:`Revision` """ if self.repo.is_dirty(): raise DirtyGitRepositoryError(self.repo.untracked_files) revisions = [] for commit in self.repo.iter_commits(self.current_branch, max_count=max_revisions, reverse=True): tracked_files, tracked_dirs = get_tracked_files_dirs( self.repo, commit) if not commit.parents or not revisions: added_files = tracked_files modified_files = [] deleted_files = [] else: added_files, modified_files, deleted_files = whatchanged( commit, self.repo.commit(commit.hexsha + "~1")) logger.debug( f"For revision {commit.name_rev.split(' ')[0]} found:") logger.debug(f"Tracked files: {tracked_files}") logger.debug(f"Tracked directories: {tracked_dirs}") logger.debug(f"Added files: {added_files}") logger.debug(f"Modified files: {modified_files}") logger.debug(f"Deleted files: {deleted_files}") rev = Revision( key=commit.name_rev.split(" ")[0], author_name=commit.author.name, author_email=commit.author.email, date=commit.committed_date, message=commit.message, tracked_files=tracked_files, tracked_dirs=tracked_dirs, added_files=added_files, modified_files=modified_files, deleted_files=deleted_files, ) revisions.append(rev) return revisions[::-1] def checkout(self, revision: Revision, options: Dict): """ Checkout a specific revision. :param revision: The revision identifier. :type revision: :class:`Revision` :param options: Any additional options. :type options: ``dict`` """ rev = revision.key self.repo.git.checkout(rev) def finish(self): """ Clean up any state if processing completed/failed. For git, will checkout HEAD on the original branch when finishing """ self.repo.git.checkout(self.current_branch) self.repo.close() def find(self, search: str) -> Revision: """ Search a string and return a single revision. :param search: The search term. :type search: ``str`` :return: An instance of revision. :rtype: Instance of :class:`Revision` """ commit = self.repo.commit(search) tracked_files, tracked_dirs = get_tracked_files_dirs(self.repo, commit) if not commit.parents: added_files = tracked_files modified_files = [] deleted_files = [] else: added_files, modified_files, deleted_files = whatchanged( commit, self.repo.commit(commit.hexsha + "~1")) return Revision( key=commit.name_rev.split(" ")[0], author_name=commit.author.name, author_email=commit.author.email, date=commit.committed_date, message=commit.message, tracked_files=tracked_files, tracked_dirs=tracked_dirs, added_files=added_files, modified_files=modified_files, deleted_files=deleted_files, )