mirror of
https://git.yoctoproject.org/poky
synced 2026-04-04 14:02:22 +02:00
bitbake: fetch/git: support per-branch/per-url depths for shallow
Allow the user to explicitly adjust the depth for named urls/branches. The
un-suffixed BB_GIT_SHALLOW_DEPTH is used as the default.
Example usage:
BB_GIT_SHALLOW_DEPTH = "1"
BB_GIT_SHALLOW_DEPTH_doc = "0"
BB_GIT_SHALLOW_DEPTH_meta = "0"
(Bitbake rev: 9dfc517e5bcc6dd203a0ad685cc884676d2984c4)
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
27d56982c7
commit
bf87c5cd19
@@ -70,6 +70,7 @@ Supported SRC_URI options are:
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
import collections
|
||||
import errno
|
||||
import os
|
||||
import re
|
||||
@@ -178,12 +179,43 @@ class Git(FetchMethod):
|
||||
if ud.bareclone:
|
||||
ud.cloneflags += " --mirror"
|
||||
|
||||
ud.shallow = d.getVar("BB_GIT_SHALLOW") == "1"
|
||||
|
||||
depth_default = d.getVar("BB_GIT_SHALLOW_DEPTH")
|
||||
if depth_default is not None:
|
||||
try:
|
||||
depth_default = int(depth_default or 0)
|
||||
except ValueError:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % depth_default)
|
||||
else:
|
||||
if depth_default < 0:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % depth_default)
|
||||
else:
|
||||
depth_default = 1
|
||||
ud.shallow_depths = collections.defaultdict(lambda: depth_default)
|
||||
|
||||
ud.branches = {}
|
||||
for pos, name in enumerate(ud.names):
|
||||
branch = branches[pos]
|
||||
ud.branches[name] = branch
|
||||
ud.unresolvedrev[name] = branch
|
||||
|
||||
shallow_depth = d.getVar("BB_GIT_SHALLOW_DEPTH_%s" % name)
|
||||
if shallow_depth is not None:
|
||||
try:
|
||||
shallow_depth = int(shallow_depth or 0)
|
||||
except ValueError:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH_%s: %s" % (name, shallow_depth))
|
||||
else:
|
||||
if shallow_depth < 0:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH_%s: %s" % (name, shallow_depth))
|
||||
ud.shallow_depths[name] = shallow_depth
|
||||
|
||||
if (ud.shallow and
|
||||
all(ud.shallow_depths[n] == 0 for n in ud.names)):
|
||||
# Shallow disabled for this URL
|
||||
ud.shallow = False
|
||||
|
||||
if ud.usehead:
|
||||
ud.unresolvedrev['default'] = 'HEAD'
|
||||
|
||||
@@ -222,23 +254,6 @@ class Git(FetchMethod):
|
||||
mirrortarball = 'git2_%s.tar.gz' % gitsrcname
|
||||
ud.fullmirror = os.path.join(dl_dir, mirrortarball)
|
||||
ud.mirrortarballs = [mirrortarball]
|
||||
|
||||
ud.shallow = d.getVar("BB_GIT_SHALLOW") == "1"
|
||||
if ud.shallow:
|
||||
ud.shallow_depth = d.getVar("BB_GIT_SHALLOW_DEPTH")
|
||||
if ud.shallow_depth is not None:
|
||||
try:
|
||||
ud.shallow_depth = int(ud.shallow_depth or 0)
|
||||
except ValueError:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % ud.shallow_depth)
|
||||
else:
|
||||
if not ud.shallow_depth:
|
||||
ud.shallow = False
|
||||
elif ud.shallow_depth < 0:
|
||||
raise bb.fetch2.FetchError("Invalid depth for BB_GIT_SHALLOW_DEPTH: %s" % ud.shallow_depth)
|
||||
else:
|
||||
ud.shallow_depth = 1
|
||||
|
||||
if ud.shallow:
|
||||
tarballname = gitsrcname
|
||||
if ud.bareclone:
|
||||
@@ -246,10 +261,12 @@ class Git(FetchMethod):
|
||||
|
||||
for name, revision in sorted(ud.revisions.items()):
|
||||
tarballname = "%s_%s" % (tarballname, ud.revisions[name][:7])
|
||||
if not ud.nobranch:
|
||||
tarballname = "%s-%s" % (tarballname, ud.branches[name])
|
||||
depth = ud.shallow_depths[name]
|
||||
if depth:
|
||||
tarballname = "%s-%s" % (tarballname, depth)
|
||||
|
||||
tarballname = "%s-%s" % (tarballname, ud.shallow_depth)
|
||||
if not ud.nobranch:
|
||||
tarballname = "%s_%s" % (tarballname, "_".join(sorted(ud.branches.values())).replace('/', '.'))
|
||||
|
||||
fetcher = self.__class__.__name__.lower()
|
||||
ud.shallowtarball = '%sshallow_%s.tar.gz' % (fetcher, tarballname)
|
||||
@@ -370,7 +387,9 @@ class Git(FetchMethod):
|
||||
to_parse, shallow_branches = [], []
|
||||
for name in ud.names:
|
||||
revision = ud.revisions[name]
|
||||
to_parse.append('%s~%d^{}' % (revision, ud.shallow_depth - 1))
|
||||
depth = ud.shallow_depths[name]
|
||||
if depth:
|
||||
to_parse.append('%s~%d^{}' % (revision, depth - 1))
|
||||
|
||||
# For nobranch, we need a ref, otherwise the commits will be
|
||||
# removed, and for non-nobranch, we truncate the branch to our
|
||||
|
||||
@@ -1122,6 +1122,27 @@ class GitShallowTest(FetcherTest):
|
||||
self.fetch_shallow(disabled=True)
|
||||
self.assertRevCount(2)
|
||||
|
||||
def test_shallow_depth_default_override(self):
|
||||
self.add_empty_file('a')
|
||||
self.add_empty_file('b')
|
||||
self.assertRevCount(2, cwd=self.srcdir)
|
||||
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '1')
|
||||
self.fetch_shallow()
|
||||
self.assertRevCount(1)
|
||||
|
||||
def test_shallow_depth_default_override_disable(self):
|
||||
self.add_empty_file('a')
|
||||
self.add_empty_file('b')
|
||||
self.add_empty_file('c')
|
||||
self.assertRevCount(3, cwd=self.srcdir)
|
||||
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '2')
|
||||
self.fetch_shallow()
|
||||
self.assertRevCount(2)
|
||||
|
||||
def test_current_shallow_out_of_date_clone(self):
|
||||
# Create initial git repo
|
||||
self.add_empty_file('a')
|
||||
@@ -1206,13 +1227,15 @@ class GitShallowTest(FetcherTest):
|
||||
uri = self.d.getVar('SRC_URI', True).split()[0]
|
||||
uri = '%s;branch=master,a_branch;name=master,a_branch' % uri
|
||||
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH', '2')
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH', '0')
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH_master', '3')
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH_a_branch', '1')
|
||||
self.d.setVar('SRCREV_master', '${AUTOREV}')
|
||||
self.d.setVar('SRCREV_a_branch', '${AUTOREV}')
|
||||
|
||||
self.fetch_shallow(uri)
|
||||
|
||||
self.assertRevCount(3, ['--all'])
|
||||
self.assertRevCount(4, ['--all'])
|
||||
self.assertRefs(['master', 'origin/master', 'origin/a_branch'])
|
||||
|
||||
def test_shallow_clone_preferred_over_shallow(self):
|
||||
@@ -1262,6 +1285,14 @@ class GitShallowTest(FetcherTest):
|
||||
with self.assertRaises(bb.fetch2.FetchError):
|
||||
self.fetch()
|
||||
|
||||
def test_shallow_invalid_depth_default(self):
|
||||
self.add_empty_file('a')
|
||||
self.add_empty_file('b')
|
||||
|
||||
self.d.setVar('BB_GIT_SHALLOW_DEPTH_default', '-12')
|
||||
with self.assertRaises(bb.fetch2.FetchError):
|
||||
self.fetch()
|
||||
|
||||
if os.environ.get("BB_SKIP_NETTESTS") == "yes":
|
||||
print("Unset BB_SKIP_NETTESTS to run network tests")
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user