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

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 

13 

14logger = get_logger("clone") 

15 

16 

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") 

29 

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) 

34 

35 logger.info(f"📁 Cloning from '{self.repo_url}' into '{self.directory}'...") 

36 

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 

52 

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