Coverage for kwasa\functions\_clone.py: 0%
46 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-14 18:06 +0300
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-14 18:06 +0300
1import os
2import subprocess
3import json
4import shutil
5from kwasa.libs.exceptions import (
6 CleanupFailedError,
7 CloneFailedError,
8 RepositoryAlreadyExistsError,
9)
10from kwasa.libs.helper import HelperUtility
11from kwasa.libs.permissions import on_rm_error
12from kwasa.logger.log import get_logger
14logger = get_logger("clone")
17class GitCloneProvider(HelperUtility):
18 def __init__(
19 self,
20 directory: str,
21 repo_url: str = "https://github.com/dlion4/django-quick-starter.git",
22 ):
23 self.directory = directory
24 self.repo_url = repo_url
25 self.full_path = os.path.abspath(directory)
26 self.git_dir = os.path.join(self.full_path, ".git")
27 self.kwasa_meta_dir = os.path.join(self.full_path, ".git", ".kwasa")
28 self.metadata_path = os.path.join(self.kwasa_meta_dir, "metadata.json")
30 def clone_repo(self) -> None:
31 if not os.path.exists(self.full_path):
32 logger.info(f"📂 Creating directory '{self.directory}'...")
33 os.makedirs(self.full_path)
35 logger.info(f"📁 Cloning from '{self.repo_url}' into '{self.directory}'...")
37 try:
38 if os.path.exists(self.git_dir):
39 raise RepositoryAlreadyExistsError(
40 f"{self.full_path} is already a git repository!"
41 )
42 else:
43 subprocess.run(
44 ["git", "clone", self.repo_url, self.full_path], check=True
45 )
46 shutil.rmtree(self.git_dir, ignore_errors=True)
47 subprocess.run(["git", "-C", self.full_path, "init"], check=True)
48 try:
49 self.manage_local_repository(True)
50 except Exception:
51 pass
53 os.makedirs(self.kwasa_meta_dir, exist_ok=True)
54 metadata = {"origin": self.repo_url}
55 with open(self.metadata_path, "w") as f:
56 json.dump(metadata, f)
57 logger.info("✅ Clone complete and git initialized.")
58 except (
59 subprocess.CalledProcessError,
60 RepositoryAlreadyExistsError,
61 CleanupFailedError,
62 CloneFailedError,
63 ) as e:
64 logger.error(f"❌ Failed to clone repository. {e}")
65 if os.path.exists(self.full_path):
66 logger.warning("🧹 Cleaning up failed clone directory...")
67 try:
68 shutil.rmtree(self.full_path, onexc=on_rm_error)
69 except Exception as cleanup_error:
70 logger.error(f"⚠️ Cleanup failed: {cleanup_error}")
71 raise e