summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--git_superproject.py32
-rw-r--r--subcmds/sync.py14
-rw-r--r--tests/fixtures/test.gitconfig4
-rw-r--r--tests/test_git_superproject.py2
4 files changed, 31 insertions, 21 deletions
diff --git a/git_superproject.py b/git_superproject.py
index c677924f..3613fb00 100644
--- a/git_superproject.py
+++ b/git_superproject.py
@@ -59,7 +59,7 @@ class CommitIdsResult(NamedTuple):
59class UpdateProjectsResult(NamedTuple): 59class UpdateProjectsResult(NamedTuple):
60 """Return the overriding manifest file and whether caller should exit.""" 60 """Return the overriding manifest file and whether caller should exit."""
61 61
62 # Path name of the overriding manfiest file if successful, otherwise None. 62 # Path name of the overriding manifest file if successful, otherwise None.
63 manifest_path: str 63 manifest_path: str
64 # Whether the caller should exit. 64 # Whether the caller should exit.
65 fatal: bool 65 fatal: bool
@@ -73,7 +73,7 @@ class Superproject(object):
73 is a dictionary with project/commit id entries. 73 is a dictionary with project/commit id entries.
74 """ 74 """
75 def __init__(self, manifest, repodir, git_event_log, 75 def __init__(self, manifest, repodir, git_event_log,
76 superproject_dir='exp-superproject', quiet=False): 76 superproject_dir='exp-superproject', quiet=False, print_messages=False):
77 """Initializes superproject. 77 """Initializes superproject.
78 78
79 Args: 79 Args:
@@ -83,11 +83,13 @@ class Superproject(object):
83 git_event_log: A git trace2 event log to log events. 83 git_event_log: A git trace2 event log to log events.
84 superproject_dir: Relative path under |repodir| to checkout superproject. 84 superproject_dir: Relative path under |repodir| to checkout superproject.
85 quiet: If True then only print the progress messages. 85 quiet: If True then only print the progress messages.
86 print_messages: if True then print error/warning messages.
86 """ 87 """
87 self._project_commit_ids = None 88 self._project_commit_ids = None
88 self._manifest = manifest 89 self._manifest = manifest
89 self._git_event_log = git_event_log 90 self._git_event_log = git_event_log
90 self._quiet = quiet 91 self._quiet = quiet
92 self._print_messages = print_messages
91 self._branch = self._GetBranch() 93 self._branch = self._GetBranch()
92 self._repodir = os.path.abspath(repodir) 94 self._repodir = os.path.abspath(repodir)
93 self._superproject_dir = superproject_dir 95 self._superproject_dir = superproject_dir
@@ -124,7 +126,8 @@ class Superproject(object):
124 126
125 def _LogMessage(self, message): 127 def _LogMessage(self, message):
126 """Logs message to stderr and _git_event_log.""" 128 """Logs message to stderr and _git_event_log."""
127 print(message, file=sys.stderr) 129 if self._print_messages:
130 print(message, file=sys.stderr)
128 self._git_event_log.ErrorEvent(message, '') 131 self._git_event_log.ErrorEvent(message, '')
129 132
130 def _LogError(self, message): 133 def _LogError(self, message):
@@ -172,7 +175,7 @@ class Superproject(object):
172 self._LogWarning(f'git fetch missing directory: {self._work_git}') 175 self._LogWarning(f'git fetch missing directory: {self._work_git}')
173 return False 176 return False
174 if not git_require((2, 28, 0)): 177 if not git_require((2, 28, 0)):
175 print('superproject requires a git version 2.28 or later', file=sys.stderr) 178 self._LogWarning('superproject requires a git version 2.28 or later')
176 return False 179 return False
177 cmd = ['fetch', url, '--depth', '1', '--force', '--no-tags', '--filter', 'blob:none'] 180 cmd = ['fetch', url, '--depth', '1', '--force', '--no-tags', '--filter', 'blob:none']
178 if self._branch: 181 if self._branch:
@@ -223,14 +226,13 @@ class Superproject(object):
223 Returns: 226 Returns:
224 SyncResult 227 SyncResult
225 """ 228 """
226 print('NOTICE: --use-superproject is in beta; report any issues to the '
227 'address described in `repo version`', file=sys.stderr)
228
229 if not self._manifest.superproject: 229 if not self._manifest.superproject:
230 self._LogWarning(f'superproject tag is not defined in manifest: ' 230 self._LogWarning(f'superproject tag is not defined in manifest: '
231 f'{self._manifest.manifestFile}') 231 f'{self._manifest.manifestFile}')
232 return SyncResult(False, False) 232 return SyncResult(False, False)
233 233
234 print('NOTICE: --use-superproject is in beta; report any issues to the '
235 'address described in `repo version`', file=sys.stderr)
234 should_exit = True 236 should_exit = True
235 url = self._manifest.superproject['remote'].url 237 url = self._manifest.superproject['remote'].url
236 if not url: 238 if not url:
@@ -258,8 +260,8 @@ class Superproject(object):
258 260
259 data = self._LsTree() 261 data = self._LsTree()
260 if not data: 262 if not data:
261 print('warning: git ls-tree failed to return data for superproject', 263 self._LogWarning(f'warning: git ls-tree failed to return data for manifest: '
262 file=sys.stderr) 264 f'{self._manifest.manifestFile}')
263 return CommitIdsResult(None, True) 265 return CommitIdsResult(None, True)
264 266
265 # Parse lines like the following to select lines starting with '160000' and 267 # Parse lines like the following to select lines starting with '160000' and
@@ -278,7 +280,7 @@ class Superproject(object):
278 self._project_commit_ids = commit_ids 280 self._project_commit_ids = commit_ids
279 return CommitIdsResult(commit_ids, False) 281 return CommitIdsResult(commit_ids, False)
280 282
281 def _WriteManfiestFile(self): 283 def _WriteManifestFile(self):
282 """Writes manifest to a file. 284 """Writes manifest to a file.
283 285
284 Returns: 286 Returns:
@@ -329,7 +331,6 @@ class Superproject(object):
329 commit_ids_result = self._GetAllProjectsCommitIds() 331 commit_ids_result = self._GetAllProjectsCommitIds()
330 commit_ids = commit_ids_result.commit_ids 332 commit_ids = commit_ids_result.commit_ids
331 if not commit_ids: 333 if not commit_ids:
332 print('warning: Cannot get project commit ids from manifest', file=sys.stderr)
333 return UpdateProjectsResult(None, commit_ids_result.fatal) 334 return UpdateProjectsResult(None, commit_ids_result.fatal)
334 335
335 projects_missing_commit_ids = [] 336 projects_missing_commit_ids = []
@@ -352,7 +353,7 @@ class Superproject(object):
352 if not self._SkipUpdatingProjectRevisionId(project): 353 if not self._SkipUpdatingProjectRevisionId(project):
353 project.SetRevisionId(commit_ids.get(project.relpath)) 354 project.SetRevisionId(commit_ids.get(project.relpath))
354 355
355 manifest_path = self._WriteManfiestFile() 356 manifest_path = self._WriteManifestFile()
356 return UpdateProjectsResult(manifest_path, False) 357 return UpdateProjectsResult(manifest_path, False)
357 358
358 359
@@ -360,7 +361,6 @@ class Superproject(object):
360def _UseSuperprojectFromConfiguration(): 361def _UseSuperprojectFromConfiguration():
361 """Returns the user choice of whether to use superproject.""" 362 """Returns the user choice of whether to use superproject."""
362 user_cfg = RepoConfig.ForUser() 363 user_cfg = RepoConfig.ForUser()
363 system_cfg = RepoConfig.ForSystem()
364 time_now = int(time.time()) 364 time_now = int(time.time())
365 365
366 user_value = user_cfg.GetBoolean('repo.superprojectChoice') 366 user_value = user_cfg.GetBoolean('repo.superprojectChoice')
@@ -375,6 +375,7 @@ def _UseSuperprojectFromConfiguration():
375 return user_value 375 return user_value
376 376
377 # We don't have an unexpired choice, ask for one. 377 # We don't have an unexpired choice, ask for one.
378 system_cfg = RepoConfig.ForSystem()
378 system_value = system_cfg.GetBoolean('repo.superprojectChoice') 379 system_value = system_cfg.GetBoolean('repo.superprojectChoice')
379 if system_value: 380 if system_value:
380 # The system configuration is proposing that we should enable the 381 # The system configuration is proposing that we should enable the
@@ -421,6 +422,11 @@ def _UseSuperprojectFromConfiguration():
421 return False 422 return False
422 423
423 424
425def PrintMessages(opt, manifest):
426 """Returns a boolean if error/warning messages are to be printed."""
427 return opt.use_superproject is not None or manifest.superproject
428
429
424def UseSuperproject(opt, manifest): 430def UseSuperproject(opt, manifest):
425 """Returns a boolean if use-superproject option is enabled.""" 431 """Returns a boolean if use-superproject option is enabled."""
426 432
diff --git a/subcmds/sync.py b/subcmds/sync.py
index ed656b8c..2a0de0a9 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -298,10 +298,12 @@ later is required to fix a server side protocol bug.
298 Returns: 298 Returns:
299 Returns path to the overriding manifest file instead of None. 299 Returns path to the overriding manifest file instead of None.
300 """ 300 """
301 print_messages = git_superproject.PrintMessages(opt, self.manifest)
301 superproject = git_superproject.Superproject(self.manifest, 302 superproject = git_superproject.Superproject(self.manifest,
302 self.repodir, 303 self.repodir,
303 self.git_event_log, 304 self.git_event_log,
304 quiet=opt.quiet) 305 quiet=opt.quiet,
306 print_messages=print_messages)
305 if opt.local_only: 307 if opt.local_only:
306 manifest_path = superproject.manifest_path 308 manifest_path = superproject.manifest_path
307 if manifest_path: 309 if manifest_path:
@@ -317,10 +319,11 @@ later is required to fix a server side protocol bug.
317 if manifest_path: 319 if manifest_path:
318 self._ReloadManifest(manifest_path, load_local_manifests) 320 self._ReloadManifest(manifest_path, load_local_manifests)
319 else: 321 else:
320 print('warning: Update of revisionId from superproject has failed, ' 322 if print_messages:
321 'repo sync will not use superproject to fetch the source. ', 323 print('warning: Update of revisionId from superproject has failed, '
322 'Please resync with the --no-use-superproject option to avoid this repo warning.', 324 'repo sync will not use superproject to fetch the source. ',
323 file=sys.stderr) 325 'Please resync with the --no-use-superproject option to avoid this repo warning.',
326 file=sys.stderr)
324 if update_result.fatal and opt.use_superproject is not None: 327 if update_result.fatal and opt.use_superproject is not None:
325 sys.exit(1) 328 sys.exit(1)
326 return manifest_path 329 return manifest_path
@@ -970,6 +973,7 @@ later is required to fix a server side protocol bug.
970 superproject_logging_data = { 973 superproject_logging_data = {
971 'superproject': use_superproject, 974 'superproject': use_superproject,
972 'haslocalmanifests': bool(self.manifest.HasLocalManifests), 975 'haslocalmanifests': bool(self.manifest.HasLocalManifests),
976 'hassuperprojecttag': bool(self.manifest.superproject),
973 } 977 }
974 if use_superproject: 978 if use_superproject:
975 manifest_name = self._UpdateProjectsRevisionId( 979 manifest_name = self._UpdateProjectsRevisionId(
diff --git a/tests/fixtures/test.gitconfig b/tests/fixtures/test.gitconfig
index d69e162c..90afff04 100644
--- a/tests/fixtures/test.gitconfig
+++ b/tests/fixtures/test.gitconfig
@@ -12,10 +12,10 @@
12 intm = 10m 12 intm = 10m
13 intg = 10g 13 intg = 10g
14[repo "syncstate.main"] 14[repo "syncstate.main"]
15 synctime = 2021-08-11T17:54:14.530286Z 15 synctime = 2021-08-13T18:37:43.928600Z
16 version = 1 16 version = 1
17[repo "syncstate.sys"] 17[repo "syncstate.sys"]
18 argv = ['/usr/bin/pytest-3', '-v'] 18 argv = ['/usr/bin/pytest-3']
19[repo "syncstate.superproject"] 19[repo "syncstate.superproject"]
20 test = false 20 test = false
21[repo "syncstate.options"] 21[repo "syncstate.options"]
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py
index 6ff81843..e9b824d6 100644
--- a/tests/test_git_superproject.py
+++ b/tests/test_git_superproject.py
@@ -203,7 +203,7 @@ class SuperprojectTestCase(unittest.TestCase):
203 project.SetRevisionId('ABCDEF') 203 project.SetRevisionId('ABCDEF')
204 # Create temporary directory so that it can write the file. 204 # Create temporary directory so that it can write the file.
205 os.mkdir(self._superproject._superproject_path) 205 os.mkdir(self._superproject._superproject_path)
206 manifest_path = self._superproject._WriteManfiestFile() 206 manifest_path = self._superproject._WriteManifestFile()
207 self.assertIsNotNone(manifest_path) 207 self.assertIsNotNone(manifest_path)
208 with open(manifest_path, 'r') as fp: 208 with open(manifest_path, 'r') as fp:
209 manifest_xml_data = fp.read() 209 manifest_xml_data = fp.read()