diff --git a/hassio/addons/git.py b/hassio/addons/git.py index 6f487d579..71f80160b 100644 --- a/hassio/addons/git.py +++ b/hassio/addons/git.py @@ -45,12 +45,13 @@ class GitRepo(CoreSysAttributes): async with self.lock: try: _LOGGER.info("Load addon %s repository", self.path) - self.repo = await self.sys_loop.run_in_executor( - None, git.Repo, str(self.path)) + self.repo = await self.sys_run_in_executor( + git.Repo, str(self.path)) except (git.InvalidGitRepositoryError, git.NoSuchPathError, git.GitCommandError) as err: _LOGGER.error("Can't load %s repo: %s.", self.path, err) + self._remove() return False return True @@ -62,7 +63,9 @@ class GitRepo(CoreSysAttributes): attribute: value for attribute, value in ( ('recursive', True), - ('branch', self.branch) + ('branch', self.branch), + ('depth', 1), + ('shallow-submodules', True) ) if value is not None } @@ -76,6 +79,7 @@ class GitRepo(CoreSysAttributes): except (git.InvalidGitRepositoryError, git.NoSuchPathError, git.GitCommandError) as err: _LOGGER.error("Can't clone %s repo: %s.", self.url, err) + self._remove() return False return True @@ -87,18 +91,43 @@ class GitRepo(CoreSysAttributes): return False async with self.lock: + _LOGGER.info("Update addon %s repository", self.url) + branch = self.repo.active_branch.name + try: - _LOGGER.info("Pull addon %s repository", self.url) - await self.sys_loop.run_in_executor( - None, self.repo.remotes.origin.pull) + # Download data + await self.sys_run_in_executor(ft.partial( + self.repo.remotes.origin.fetch, **{ + 'update-shallow': True, + 'depth': 1, + })) + + # Jump on top of that + await self.sys_run_in_executor(ft.partial( + self.repo.git.reset, f"origin/{branch}", hard=True)) + + # Cleanup old data + await self.sys_run_in_executor(ft.partial( + self.repo.git.clean, "-xdf")) except (git.InvalidGitRepositoryError, git.NoSuchPathError, git.GitCommandError) as err: - _LOGGER.error("Can't pull %s repo: %s.", self.url, err) + _LOGGER.error("Can't update %s repo: %s.", self.url, err) return False return True + def _remove(self): + """Remove a repository.""" + if not self.path.is_dir(): + return + + def log_err(funct, path, _): + """Log error.""" + _LOGGER.warning("Can't remove %s", path) + + shutil.rmtree(str(self.path), onerror=log_err) + class GitRepoHassIO(GitRepo): """HassIO addons repository.""" @@ -121,12 +150,6 @@ class GitRepoCustom(GitRepo): super().__init__(coresys, path, url) def remove(self): - """Remove a custom addon.""" - if self.path.is_dir(): - _LOGGER.info("Remove custom addon repository %s", self.url) - - def log_err(funct, path, _): - """Log error.""" - _LOGGER.warning("Can't remove %s", path) - - shutil.rmtree(str(self.path), onerror=log_err) + """Remove a custom repository.""" + _LOGGER.info("Remove custom addon repository %s", self.url) + self._remove()