update_manager: extract and verify configurable git repo options

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Arksine 2021-01-20 15:02:50 -05:00
parent f3ae6da635
commit 0ad97fd9eb
1 changed files with 51 additions and 19 deletions

View File

@ -408,14 +408,47 @@ class GitUpdater:
self.execute_cmd = umgr.execute_cmd self.execute_cmd = umgr.execute_cmd
self.execute_cmd_with_response = umgr.execute_cmd_with_response self.execute_cmd_with_response = umgr.execute_cmd_with_response
self.notify_update_response = umgr.notify_update_response self.notify_update_response = umgr.notify_update_response
self.repo_info = config.get_options()
self.name = config.get_name().split()[-1] self.name = config.get_name().split()[-1]
self.repo_path = path self.repo_path = path
if path is None: if path is None:
self.repo_path = config.get('path') self.repo_path = config.get('path')
self.env = env self.env = config.get("env", env)
if env is None: dist_packages = None
self.env = config.get('env') if self.env is not None:
self.env = os.path.expanduser(self.env)
dist_packages = config.get('python_dist_packages', None)
self.python_reqs = os.path.join(
self.repo_path, config.get("requirements"))
self.origin = config.get("origin").lower()
self.install_script = config.get('install_script', None)
if self.install_script is not None:
self.install_script = os.path.abspath(os.path.join(
self.repo_path, self.install_script))
self.venv_args = config.get('venv_args', None)
self.python_dist_packages = None
self.python_dist_path = None
self.env_package_path = None
if dist_packages is not None:
self.python_dist_packages = [
p.strip() for p in dist_packages.split('\n')
if p.strip()]
self.python_dist_path = os.path.abspath(
config.get('python_dist_path'))
if not os.path.exists(self.python_dist_path):
raise config.error(
"Invalid path for option 'python_dist_path'")
self.env_package_path = os.path.abspath(os.path.join(
os.path.dirname(self.env), "..",
config.get('env_package_path')))
for opt in ["repo_path", "env", "python_reqs", "install_script",
"python_dist_path", "env_package_path"]:
val = getattr(self, opt)
if val is None:
continue
if not os.path.exists(val):
raise config.error("Invalid path for option '%s': %s"
% (val, opt))
self.version = self.cur_hash = "?" self.version = self.cur_hash = "?"
self.remote_version = self.remote_hash = "?" self.remote_version = self.remote_hash = "?"
self.init_evt = Event() self.init_evt = Event()
@ -562,7 +595,7 @@ class GitUpdater:
remote_url = remote_url.lower() remote_url = remote_url.lower()
if remote_url[-4:] != ".git": if remote_url[-4:] != ".git":
remote_url += ".git" remote_url += ".git"
if remote_url == self.repo_info['origin'].lower(): if remote_url == self.origin:
self.is_valid = True self.is_valid = True
self._log_info("Validity check for git repo passed") self._log_info("Validity check for git repo passed")
else: else:
@ -621,9 +654,10 @@ class GitUpdater:
self._notify_status("Update Finished...", is_complete=True) self._notify_status("Update Finished...", is_complete=True)
async def _install_packages(self): async def _install_packages(self):
if self.install_script is None:
return
# Open install file file and read # Open install file file and read
inst_script = self.repo_info['install_script'] inst_path = self.install_script
inst_path = os.path.join(self.repo_path, inst_script)
if not os.path.isfile(inst_path): if not os.path.isfile(inst_path):
self._log_info(f"Unable to open install script: {inst_path}") self._log_info(f"Unable to open install script: {inst_path}")
return return
@ -650,24 +684,24 @@ class GitUpdater:
return return
async def _update_virtualenv(self, rebuild_env=False): async def _update_virtualenv(self, rebuild_env=False):
if self.env is None:
return
# Update python dependencies # Update python dependencies
bin_dir = os.path.dirname(self.env) bin_dir = os.path.dirname(self.env)
env_path = os.path.normpath(os.path.join(bin_dir, "..")) env_path = os.path.normpath(os.path.join(bin_dir, ".."))
if rebuild_env: if rebuild_env:
env_args = self.repo_info['venv_args']
self._notify_status(f"Creating virtualenv at: {env_path}...") self._notify_status(f"Creating virtualenv at: {env_path}...")
if os.path.exists(env_path): if os.path.exists(env_path):
shutil.rmtree(env_path) shutil.rmtree(env_path)
try: try:
await self.execute_cmd( await self.execute_cmd(
f"virtualenv {env_args} {env_path}", timeout=300.) f"virtualenv {self.venv_args} {env_path}", timeout=300.)
except Exception: except Exception:
self._log_exc(f"Error creating virtualenv") self._log_exc(f"Error creating virtualenv")
return return
if not os.path.expanduser(self.env): if not os.path.exists(self.env):
raise self._log_exc("Failed to create new virtualenv", False) raise self._log_exc("Failed to create new virtualenv", False)
reqs = os.path.join( reqs = self.python_reqs
self.repo_path, self.repo_info['requirements'])
if not os.path.isfile(reqs): if not os.path.isfile(reqs):
self._log_exc(f"Invalid path to requirements_file '{reqs}'") self._log_exc(f"Invalid path to requirements_file '{reqs}'")
return return
@ -679,16 +713,14 @@ class GitUpdater:
retries=3) retries=3)
except Exception: except Exception:
self._log_exc("Error updating python requirements") self._log_exc("Error updating python requirements")
self._install_python_dist_requirements(env_path) self._install_python_dist_requirements()
def _install_python_dist_requirements(self, env_path): def _install_python_dist_requirements(self):
dist_reqs = self.repo_info.get('python_dist_packages', None) dist_reqs = self.python_dist_packages
if dist_reqs is None: if dist_reqs is None:
return return
dist_reqs = [r.strip() for r in dist_reqs.split("\n") dist_path = self.python_dist_path
if r.strip()] site_path = self.env_package_path
dist_path = self.repo_info['python_dist_path']
site_path = os.path.join(env_path, self.repo_info['env_package_path'])
for pkg in dist_reqs: for pkg in dist_reqs:
for f in os.listdir(dist_path): for f in os.listdir(dist_path):
if f.startswith(pkg): if f.startswith(pkg):