diff --git a/src/snek/app.py b/src/snek/app.py index 7e5e2c4..83dcc03 100644 --- a/src/snek/app.py +++ b/src/snek/app.py @@ -183,7 +183,7 @@ class Application(BaseApplication): self.router.add_view("/settings/repositories/index.html", RepositoriesIndexView) self.router.add_view("/settings/repositories/create.html", RepositoriesCreateView) self.router.add_view("/settings/repositories/repository/{name}/update.html", RepositoriesUpdateView) - self.router.add_view("/settings/repositories/respository/{name}/delete.html", RepositoriesDeleteView) + self.router.add_view("/settings/repositories/repository/{name}/delete.html", RepositoriesDeleteView) self.webdav = WebdavApplication(self) self.git = GitApplication(self) self.add_subapp("/webdav", self.webdav) diff --git a/src/snek/service/repository.py b/src/snek/service/repository.py index 93bba77..120c232 100644 --- a/src/snek/service/repository.py +++ b/src/snek/service/repository.py @@ -1,9 +1,21 @@ from snek.system.service import BaseService import asyncio +import shutil class RepositoryService(BaseService): mapper_name = "repository" + async def delete(self, user_uid, name): + loop = asyncio.get_event_loop() + repository_path = (await self.services.user.get_repository_path(user_uid)).joinpath(name) + try: + await loop.run_in_executor(None, shutil.rmtree, repository_path) + except Exception as ex: + print(ex) + + await super().delete(user_uid=user_uid, name=name) + + async def exists(self, user_uid, name, **kwargs): kwargs["user_uid"] = user_uid kwargs["name"] = name @@ -14,6 +26,9 @@ class RepositoryService(BaseService): if not repository_path.exists(): repository_path.mkdir(parents=True) repository_path = repository_path.joinpath(name) + repository_path = str(repository_path) + if not repository_path.endswith(".git"): + repository_path += ".git" command = ['git', 'init', '--bare', repository_path] process = await asyncio.subprocess.create_subprocess_exec( *command, diff --git a/src/snek/system/mapper.py b/src/snek/system/mapper.py index 3b6c7c6..4a59024 100644 --- a/src/snek/system/mapper.py +++ b/src/snek/system/mapper.py @@ -64,7 +64,7 @@ class BaseMapper: for record in self.db.query(sql, *args): yield dict(record) - async def delete(self, kwargs=None) -> int: + async def delete(self, **kwargs) -> int: if not kwargs or not isinstance(kwargs, dict): raise Exception("Can't execute delete with no filter.") return self.table.delete(**kwargs) diff --git a/src/snek/templates/settings/repositories/delete.html b/src/snek/templates/settings/repositories/delete.html index af2a906..5ba6c5b 100644 --- a/src/snek/templates/settings/repositories/delete.html +++ b/src/snek/templates/settings/repositories/delete.html @@ -1,20 +1,10 @@ - - - - - Delete Repository +{% extends 'settings/index.html' %} + +{% block header_text %}

Delete Repository

{% endblock %} + +{% block main %} - -
-

Delete Repository

-
-
- -

Are you sure you want to delete the following repository?

-
my-first-repo
-
- +
{{ repository.name }}
+ +
- Cancel +
-
- - - +{% endblock %} diff --git a/src/snek/templates/settings/repositories/index.html b/src/snek/templates/settings/repositories/index.html index a160736..a8d7c2f 100644 --- a/src/snek/templates/settings/repositories/index.html +++ b/src/snek/templates/settings/repositories/index.html @@ -92,7 +92,7 @@ Edit - + Delete diff --git a/src/snek/view/settings/repositories.py b/src/snek/view/settings/repositories.py index 1b652e6..0c25c1d 100644 --- a/src/snek/view/settings/repositories.py +++ b/src/snek/view/settings/repositories.py @@ -61,8 +61,24 @@ class RepositoriesDeleteView(BaseFormView): login_required = True async def get(self): - - return await self.render_template("settings/repositories/delete.html") - + + repository = await self.services.repository.get( + user_uid=self.session.get("uid"), name=self.request.match_info["name"] + ) + if not repository: + return web.HTTPNotFound() + + return await self.render_template("settings/repositories/delete.html", {"repository": repository.record}) + + async def post(self): + user_uid = self.session.get("uid") + name = self.request.match_info["name"] + repository = await self.services.repository.get( + user_uid=user_uid, name=name + ) + if not repository: + return web.HTTPNotFound() + await self.services.repository.delete(user_uid=user_uid, name=name) + return web.HTTPFound("/settings/repositories/index.html")