From 2a6690328860ebfc2f38dcd525cd6fefa611381e Mon Sep 17 00:00:00 2001
From: "r.jaepel" <r.jaepel@fz-juelich.de>
Date: Wed, 23 Aug 2023 20:54:01 +0200
Subject: [PATCH] Add: copy existing PROJECT code into OUTPUT repo on results
 commit

---
 cadetrdm/repositories.py  | 30 +++++++++++++++++++++++-------
 tests/test_git_adapter.py |  6 +++---
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/cadetrdm/repositories.py b/cadetrdm/repositories.py
index 67982d0..383c8ec 100644
--- a/cadetrdm/repositories.py
+++ b/cadetrdm/repositories.py
@@ -281,11 +281,11 @@ class ProjectRepo(BaseRepo):
         super().__init__(repository_path, search_parent_directories=search_parent_directories, *args, **kwargs)
 
         if output_folder is not None:
-            self._output_folder = output_folder
+            self.output_folder = output_folder
         elif output_folder is None:
-            self._output_folder = "output"
+            self.output_folder = "output"
 
-        self._output_repo = ResultsRepo(os.path.join(self.working_dir, self._output_folder))
+        self._output_repo = ResultsRepo(os.path.join(self.working_dir, self.output_folder))
         self._on_context_enter_commit_hash = None
         self._is_in_context_manager = False
 
@@ -302,7 +302,7 @@ class ProjectRepo(BaseRepo):
         """
         project_repo_hash = str(self.head.commit)
         timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S-%f")[:-4]
-        branch_name = "_".join([str(self.active_branch), project_repo_hash[:7], self._output_folder, timestamp])
+        branch_name = "_".join([str(self.active_branch), project_repo_hash[:7], self.output_folder, timestamp])
         return branch_name
 
     def check_results_master(self):
@@ -330,7 +330,7 @@ class ProjectRepo(BaseRepo):
 
         self._output_repo._git.checkout("master")
 
-        logs_folderpath = os.path.join(self.working_dir, self._output_folder, "logs")
+        logs_folderpath = os.path.join(self.working_dir, self.output_folder, "logs")
         if not os.path.exists(logs_folderpath):
             os.makedirs(logs_folderpath)
 
@@ -366,12 +366,28 @@ class ProjectRepo(BaseRepo):
 
         self.dump_package_list(logs_folderpath)
 
+        code_copy_folderpath = os.path.join(logs_folderpath, "code_backup")
+        if not os.path.exists(code_copy_folderpath):
+            os.makedirs(code_copy_folderpath)
+        self.copy_code(code_copy_folderpath)
+
         self._output_repo.add(".")
         self._output_repo._git.commit("-m", output_branch_name)
 
         self._output_repo._git.checkout(output_branch_name)
         self._most_recent_branch = output_branch_name
 
+    def copy_code(self, target_path):
+        for file in self._git.ls_files().split("\n"):
+            target_file_path = os.path.join(self.working_dir, target_path, file)
+            target_folder = os.path.split(target_file_path)[0]
+            if not os.path.exists(target_folder):
+                os.makedirs(target_folder)
+            shutil.copyfile(
+                os.path.join(self.working_dir, file),
+                target_file_path
+            )
+
     def load_external_repository(self, url, branch=None, commit=None, name=None, path=None, ):
         """
         Load an external git repository as a git submodule into this repository.
@@ -449,8 +465,8 @@ class ProjectRepo(BaseRepo):
         """
         Delete all previously cached results.
         """
-        if os.path.exists(self._output_folder + "_cached"):
-            shutil.rmtree(self._output_folder + "_cached")
+        if os.path.exists(self.output_folder + "_cached"):
+            shutil.rmtree(self.output_folder + "_cached")
 
     def enter_context(self, ):
         """
diff --git a/tests/test_git_adapter.py b/tests/test_git_adapter.py
index 061d2b5..ef8f91e 100644
--- a/tests/test_git_adapter.py
+++ b/tests/test_git_adapter.py
@@ -104,7 +104,7 @@ def try_commit_results_data(path_to_repo):
     repo = ProjectRepo(path_to_repo)
     current_commit_number = count_commit_number(repo.output_repo)
     with repo.track_results(results_commit_message="Add array"):
-        example_generate_results_array(path_to_repo, output_folder=repo._output_folder)
+        example_generate_results_array(path_to_repo, output_folder=repo.output_folder)
     updated_commit_number = count_commit_number(repo.output_repo)
     assert current_commit_number + 1 == updated_commit_number
     return str(repo.output_repo.active_branch)
@@ -115,7 +115,7 @@ def try_commit_results_with_uncommitted_code_changes(path_to_repo):
     modify_code(path_to_repo)
     with pytest.raises(Exception):
         with repo.track_results(results_commit_message="Add array"):
-            example_generate_results_array(path_to_repo, output_folder=repo._output_folder)
+            example_generate_results_array(path_to_repo, output_folder=repo.output_folder)
     repo.commit("add code to print random number", add_all=True)
 
 
@@ -126,7 +126,7 @@ def try_load_previous_result(path_to_repo, branch_name):
                                                        file_path="result.csv")
         previous_array = np.loadtxt(cached_array_path, delimiter=",")
         extended_array = np.concatenate([previous_array, previous_array])
-        extended_array_file_path = os.path.join(path_to_repo, repo._output_folder, "extended_result.csv")
+        extended_array_file_path = os.path.join(path_to_repo, repo.output_folder, "extended_result.csv")
         np.savetxt(extended_array_file_path,
                    extended_array,
                    delimiter=",")
-- 
GitLab