diff --git a/git_config.py b/git_config.py index 282c080..914b292 100644 --- a/git_config.py +++ b/git_config.py @@ -145,6 +145,21 @@ class GitConfig(object): except ValueError: return None + def DumpConfigDict(self): + """Returns the current configuration dict. + + Configuration data is information only (e.g. logging) and + should not be considered a stable data-source. + + Returns: + dict of {, } for git configuration cache. + are strings converted by GetString. + """ + config_dict = {} + for key in self._cache: + config_dict[key] = self.GetString(key) + return config_dict + def GetBoolean(self, name): """Returns a boolean from the configuration file. None : The value was not defined, or is not a boolean. diff --git a/git_trace2_event_log.py b/git_trace2_event_log.py index fe34092..8c33d80 100644 --- a/git_trace2_event_log.py +++ b/git_trace2_event_log.py @@ -132,6 +132,21 @@ class EventLog(object): exit_event['code'] = result self._log.append(exit_event) + def DefParamRepoEvents(self, config): + """Append a 'def_param' event for each repo.* config key to the current log. + + Args: + config: Repo configuration dictionary + """ + # Only output the repo.* config parameters. + repo_config = {k: v for k, v in config.items() if k.startswith('repo.')} + + for param, value in repo_config.items(): + def_param_event = self._CreateEventDict('def_param') + def_param_event['param'] = param + def_param_event['value'] = value + self._log.append(def_param_event) + def _GetEventTargetPath(self): """Get the 'trace2.eventtarget' path from git configuration. diff --git a/main.py b/main.py index f638a67..ba5d9d2 100755 --- a/main.py +++ b/main.py @@ -297,6 +297,8 @@ class _Repo(object): cmd.event_log.FinishEvent(cmd_event, finish, result is None or result == 0) + git_trace2_event_log.DefParamRepoEvents( + cmd.manifest.manifestProject.config.DumpConfigDict()) git_trace2_event_log.ExitEvent(result) if gopts.event_log: diff --git a/tests/test_git_trace2_event_log.py b/tests/test_git_trace2_event_log.py index 8fb38db..3c5cb15 100644 --- a/tests/test_git_trace2_event_log.py +++ b/tests/test_git_trace2_event_log.py @@ -161,6 +161,55 @@ class EventLogTestCase(unittest.TestCase): self.assertIn('code', exit_event) self.assertEqual(exit_event['code'], 2) + def test_def_params_event_repo_config(self): + """Test 'def_params' event data outputs only repo config keys. + + Expected event log: + + + + """ + config = { + 'git.foo': 'bar', + 'repo.partialclone': 'true', + 'repo.partialclonefilter': 'blob:none', + } + self._event_log_module.DefParamRepoEvents(config) + + with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir: + log_path = self._event_log_module.Write(path=tempdir) + self._log_data = self.readLog(log_path) + + self.assertEqual(len(self._log_data), 3) + def_param_events = self._log_data[1:] + self.verifyCommonKeys(self._log_data[0], expected_event_name='version') + + for event in def_param_events: + self.verifyCommonKeys(event, expected_event_name='def_param') + # Check for 'def_param' event specific fields. + self.assertIn('param', event) + self.assertIn('value', event) + self.assertTrue(event['param'].startswith('repo.')) + + def test_def_params_event_no_repo_config(self): + """Test 'def_params' event data won't output non-repo config keys. + + Expected event log: + + """ + config = { + 'git.foo': 'bar', + 'git.core.foo2': 'baz', + } + self._event_log_module.DefParamRepoEvents(config) + + with tempfile.TemporaryDirectory(prefix='event_log_tests') as tempdir: + log_path = self._event_log_module.Write(path=tempdir) + self._log_data = self.readLog(log_path) + + self.assertEqual(len(self._log_data), 1) + self.verifyCommonKeys(self._log_data[0], expected_event_name='version') + def test_write_with_filename(self): """Test Write() with a path to a file exits with None.""" self.assertIsNone(self._event_log_module.Write(path='path/to/file'))