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:

Reply via email to