commit: 037527cdea703840f4108b7a909ba2775a19a756 Author: Michał Górny <mgorny <AT> gentoo <DOT> org> AuthorDate: Sat Jan 17 11:49:19 2015 +0000 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> CommitDate: Sun Jan 18 18:04:25 2015 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=037527cd
sync: support sync-depth for DVCS-es (git --depth) Support sync-depth with the default set to 1. This allows the user to reduce the number of historical commits fetched along with the repository (git --depth). --- man/portage.5 | 6 +++++- pym/portage/repository/config.py | 4 ++++ pym/portage/sync/modules/git/__init__.py | 28 +++++++++++++++++++++++++++- pym/portage/sync/modules/git/git.py | 6 +++++- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/man/portage.5 b/man/portage.5 index f0b0e20..5d0e7c0 100644 --- a/man/portage.5 +++ b/man/portage.5 @@ -1,4 +1,4 @@ -.TH "PORTAGE" "5" "Jan 2015" "Portage VERSION" "Portage" +TH "PORTAGE" "5" "Jan 2015" "Portage VERSION" "Portage" .SH NAME portage \- the heart of Gentoo .SH "DESCRIPTION" @@ -906,6 +906,10 @@ Specifies priority of given repository. .B sync\-cvs\-repo Specifies CVS repository. .TP +.B sync\-depth +Specifies clone depth to use for DVCS repositories. Defaults to 1 (only +the newest commit). If set to 0, the depth is unlimited. +.TP .B sync\-type Specifies type of synchronization performed by `emerge \-\-sync`. .br diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index 7e17e02..f80742e 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -86,6 +86,7 @@ class RepoConfig(object): 'main_repo', 'manifest_hashes', 'masters', 'missing_repo_name', 'name', 'portage1_profiles', 'portage1_profiles_compat', 'priority', 'profile_formats', 'sign_commit', 'sign_manifest', 'sync_cvs_repo', + 'sync_depth', 'sync_type', 'sync_umask', 'sync_uri', 'sync_user', 'thin_manifest', 'update_changelog', 'user_location', '_eapis_banned', '_eapis_deprecated', '_masters_orig') @@ -176,6 +177,8 @@ class RepoConfig(object): auto_sync = auto_sync.strip().lower() self.auto_sync = auto_sync + self.sync_depth = repo_opts.get('sync-depth') + # Not implemented. format = repo_opts.get('format') if format is not None: @@ -488,6 +491,7 @@ class RepoConfigLoader(object): # repos.conf is allowed to override. for k in ('aliases', 'auto_sync', 'eclass_overrides', 'force', 'masters', 'priority', 'sync_cvs_repo', + 'sync_depth', 'sync_type', 'sync_umask', 'sync_uri', 'sync_user', ): v = getattr(repos_conf_opts, k, None) diff --git a/pym/portage/sync/modules/git/__init__.py b/pym/portage/sync/modules/git/__init__.py index 833b389..a372881 100644 --- a/pym/portage/sync/modules/git/__init__.py +++ b/pym/portage/sync/modules/git/__init__.py @@ -5,7 +5,33 @@ doc = """Git plug-in module for portage. Performs a git pull on repositories.""" __doc__ = doc[:] +from portage.localization import _ from portage.sync.config_checks import CheckSyncConfig +from portage.util import writemsg_level + + +class CheckGitConfig(CheckSyncConfig): + def __init__(self, repo, logger): + CheckSyncConfig.__init__(self, repo, logger) + self.checks.append('check_depth') + + def check_depth(self): + d = self.repo.sync_depth + # default + self.repo.sync_depth = 1 + + if d is not None: + try: + d = int(d) + except ValueError: + writemsg_level("!!! %s\n" % + _("sync-depth value is not a number: '%s'") + % (d), + level=self.logger.ERROR, noiselevel=-1) + else: + if d == 0: + d = None + self.repo.sync_depth = d module_spec = { @@ -23,7 +49,7 @@ module_spec = { 'exists': 'Returns a boolean of whether the specified dir ' + 'exists and is a valid Git repository', }, - 'validate_config': CheckSyncConfig, + 'validate_config': CheckGitConfig, } } } diff --git a/pym/portage/sync/modules/git/git.py b/pym/portage/sync/modules/git/git.py index 35943dd..d4f2cc1 100644 --- a/pym/portage/sync/modules/git/git.py +++ b/pym/portage/sync/modules/git/git.py @@ -63,9 +63,13 @@ class GitSync(SyncBase): sync_uri = self.repo.sync_uri if sync_uri.startswith("file://"): sync_uri = sync_uri[6:] - exitcode = portage.process.spawn_bash("cd %s ; %s clone %s ." % \ + depth_arg = '' + if self.repo.sync_depth is not None: + depth_arg = '--depth %d ' % self.repo.sync_depth + exitcode = portage.process.spawn_bash("cd %s ; %s clone %s%s ." % \ (portage._shell_quote(self.repo.location), self.bin_command, + depth_arg, portage._shell_quote(sync_uri)), **portage._native_kwargs(self.spawn_kwargs)) if exitcode != os.EX_OK: