diff --git a/erp5/util/testnode/Updater.py b/erp5/util/testnode/Updater.py index 8278113229f2406ed4a854da736e0d2eb7b2c71c..c2aede70955e50449ed595e5e8ce21ce61f5772e 100644 --- a/erp5/util/testnode/Updater.py +++ b/erp5/util/testnode/Updater.py @@ -103,7 +103,7 @@ class Updater(object): return self._git('update-server-info', '-f') def git_create_repository_link(self): - """ Create a link in depository to the ".git" directory. + """ Create a link in repository to the ".git" directory. ex: for "../erp5/.git" "../erp5/erp5.git"->"../erp5/.git" will be created. @@ -122,7 +122,10 @@ class Updater(object): except OSError: logger.error("Cannot create link from %s -> %s", git_repository_link_path, git_repository_path) - + + def git_gc_auto(self): + self._git("gc", "--auto") + def _git_find_rev(self, ref): try: return self._git_cache[ref] @@ -168,9 +171,12 @@ class Updater(object): if not os.path.exists(self.repository_path): parameter_list = ['clone', self.url] if self.branch is not None: - parameter_list.extend(['-b', self.branch]) + parameter_list += '-b', self.branch parameter_list.append(self.repository_path) self._git(*parameter_list, cwd=self.working_directory) + # Disable automatic GC because we're usually cloned in shared mode. + # We call 'gc auto' explicitly, when it's safe. + self._git("config", "gc.auto" , "0") def checkout(self, *path_list): self.checkRepository() diff --git a/erp5/util/testnode/testnode.py b/erp5/util/testnode/testnode.py index 42504cedbc61f8725c338bb9977061b1f84b9a33..4a89b6a7180954e98aef2e2280a0d11e88a943e0 100644 --- a/erp5/util/testnode/testnode.py +++ b/erp5/util/testnode/testnode.py @@ -200,6 +200,7 @@ shared = true node_test_suite.revision, test_result.revision) updater_kw = dict(git_binary=self.config['git_binary'], process_manager=self.process_manager) + updater_list = [] revision_list = [] for i, revision in enumerate(test_result.revision.split(',')): vcs_repository = node_test_suite.vcs_repository_list[i] @@ -213,7 +214,12 @@ shared = true updater.checkout() updater.git_update_server_info() updater.git_create_repository_link() + updater_list.append(updater) node_test_suite.revision_list = revision_list + def git_gc_auto(): + for updater in updater_list: + updater.git_gc_auto() + return git_gc_auto def _cleanupLog(self): log_directory = self.config['log_directory'] @@ -340,7 +346,7 @@ shared = true with self.suiteLog(node_test_suite) as suite_log_folder_name: test_result.reportStatus('LOG url', "%s/%s" % ( config.get('httpd_url'), suite_log_folder_name), '') - self.checkRevision(test_result,node_test_suite) + git_gc_auto = self.checkRevision(test_result, node_test_suite) node_test_suite.edit(test_result=test_result) # get cluster configuration for this test suite, this is needed to # know slapos parameters to user for creating instances @@ -355,6 +361,10 @@ shared = true self.constructProfile(node_test_suite, my_test_type, runner.getRelativePathUsage()) status_dict = runner.prepareSlapOSForTestSuite(node_test_suite) + # SR built successfully. Any cloned repository (with --shared) + # should be at the same revision, so it is safe to prune orphan + # objects now. + git_gc_auto() # Give some time so computer partitions may start # as partitions can be of any kind we have and likely will never have # a reliable way to check if they are up or not ...