Log repo.* config variables in git trace2 logger.
Bug: [google internal] b/181758736
Testing:
- Unit tests
- Verified repo git trace2 logs had expected data
Change-Id: I9af8a574377bd91115f085808c1271e9dee16a36
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/299182
Tested-by: Ian Kasprzak <iankaz@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Raman Tenneti <rtenneti@google.com>
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 @@
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 {<key>, <value>} for git configuration cache.
+ <value> 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 @@
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 @@
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 @@
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:
+ <version event>
+ <def_param event>
+ <def_param event>
+ """
+ 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:
+ <version event>
+ """
+ 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'))