scm: Clone git submodules
If the repo contains .gitmodules file, run the commands to clone all submodules. Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com> (cherry picked from commit 6d1428ab89de6ffa5c18466a469606887a0300b8)
This commit is contained in:
parent
755004af02
commit
f8932bc1f4
@ -198,6 +198,17 @@ class GitWrapper(ScmBase):
|
|||||||
copy_all(destdir, debugdir)
|
copy_all(destdir, debugdir)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
if os.path.exists(os.path.join(destdir, ".gitmodules")):
|
||||||
|
try:
|
||||||
|
self.log_debug("Cloning submodules")
|
||||||
|
run(["git", "submodule", "init"], workdir=destdir)
|
||||||
|
run(["git", "submodule", "update"], workdir=destdir)
|
||||||
|
except RuntimeError as e:
|
||||||
|
self.log_error(
|
||||||
|
"Failed to clone submodules: %s %s", e, getattr(e, "output", "")
|
||||||
|
)
|
||||||
|
# Ignore the error here, there may just be no submodules.
|
||||||
|
|
||||||
def get_temp_repo_path(self, scm_root, scm_branch):
|
def get_temp_repo_path(self, scm_root, scm_branch):
|
||||||
scm_repo = scm_root.split("/")[-1]
|
scm_repo = scm_root.split("/")[-1]
|
||||||
process_id = os.getpid()
|
process_id = os.getpid()
|
||||||
|
@ -7,6 +7,8 @@ import random
|
|||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
|
import http.server
|
||||||
|
import threading
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
@ -303,9 +305,9 @@ class GitSCMTestCase(SCMBaseTest):
|
|||||||
self.assertCalls(run, "git://example.com/git/repo.git", "master", "make")
|
self.assertCalls(run, "git://example.com/git/repo.git", "master", "make")
|
||||||
|
|
||||||
|
|
||||||
class GitSCMTestCaseReal(SCMBaseTest):
|
class GitSCMTestCaseRealBase(SCMBaseTest):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(GitSCMTestCaseReal, self).setUp()
|
super(GitSCMTestCaseRealBase, self).setUp()
|
||||||
self.compose = mock.Mock(conf={})
|
self.compose = mock.Mock(conf={})
|
||||||
self.gitRepositoryLocation = tempfile.mkdtemp()
|
self.gitRepositoryLocation = tempfile.mkdtemp()
|
||||||
git_dir = os.path.join(self.gitRepositoryLocation, ".git")
|
git_dir = os.path.join(self.gitRepositoryLocation, ".git")
|
||||||
@ -358,9 +360,11 @@ class GitSCMTestCaseReal(SCMBaseTest):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(GitSCMTestCaseReal, self).tearDown()
|
super(GitSCMTestCaseRealBase, self).tearDown()
|
||||||
shutil.rmtree(self.gitRepositoryLocation)
|
shutil.rmtree(self.gitRepositoryLocation)
|
||||||
|
|
||||||
|
|
||||||
|
class GitSCMTestCaseReal(GitSCMTestCaseRealBase):
|
||||||
def test_get_file_function(self):
|
def test_get_file_function(self):
|
||||||
sourceFileLocation = random.choice(list(self.files.keys()))
|
sourceFileLocation = random.choice(list(self.files.keys()))
|
||||||
sourceFilename = os.path.basename(sourceFileLocation)
|
sourceFilename = os.path.basename(sourceFileLocation)
|
||||||
@ -416,6 +420,91 @@ class GitSCMTestCaseReal(SCMBaseTest):
|
|||||||
self.assertEqual(sourceFileContent, destinationFileContent)
|
self.assertEqual(sourceFileContent, destinationFileContent)
|
||||||
|
|
||||||
|
|
||||||
|
class GitSCMTestCaseRealSubmodule(GitSCMTestCaseRealBase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# This gets a little complicated. The test sets up a git repo with a
|
||||||
|
# submodule and tries to obtain a file from the submodule. However,
|
||||||
|
# submodules over file:// are restricted for security reasons. The test
|
||||||
|
# should not modify any global configuration file, so to avoid the
|
||||||
|
# issues we instead start a one-off HTTP server to serve the repository
|
||||||
|
# on localhost.
|
||||||
|
# The server runs in a separate thread.
|
||||||
|
super(GitSCMTestCaseRealSubmodule, self).setUp()
|
||||||
|
self.main_repo_path = tempfile.mkdtemp()
|
||||||
|
submodule_path = self.gitRepositoryLocation
|
||||||
|
|
||||||
|
run(["git", "update-server-info"], workdir=submodule_path)
|
||||||
|
|
||||||
|
class MyHandler(http.server.SimpleHTTPRequestHandler):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(MyHandler, self).__init__(
|
||||||
|
*args, directory=submodule_path, **kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
self.httpd = http.server.HTTPServer(("", 0), MyHandler)
|
||||||
|
self.httpd.timeout = 1
|
||||||
|
self.url = "http://localhost:%s/.git" % self.httpd.server_port
|
||||||
|
|
||||||
|
self.thread_done = False
|
||||||
|
|
||||||
|
def runner():
|
||||||
|
# Repeatedly handle a request until the flag is set. The timeout is
|
||||||
|
# configured on the self.httpd object.
|
||||||
|
while not self.thread_done:
|
||||||
|
self.httpd.handle_request()
|
||||||
|
|
||||||
|
self.t = threading.Thread(target=runner)
|
||||||
|
self.t.start()
|
||||||
|
|
||||||
|
cmds = [
|
||||||
|
["git", "-c", "init.defaultBranch=master", "init"],
|
||||||
|
["git", "submodule", "add", "-b", "master", self.url, "submodule"],
|
||||||
|
[
|
||||||
|
"git",
|
||||||
|
"-c",
|
||||||
|
"user.name=Pungi Test Engineer",
|
||||||
|
"-c",
|
||||||
|
"user.email=ptestengineer@example.com",
|
||||||
|
"commit",
|
||||||
|
"-am",
|
||||||
|
"Add submodule",
|
||||||
|
],
|
||||||
|
]
|
||||||
|
for cmd in cmds:
|
||||||
|
run(cmd, workdir=self.main_repo_path)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
super(GitSCMTestCaseRealSubmodule, self).tearDown()
|
||||||
|
self.thread_done = True
|
||||||
|
self.t.join()
|
||||||
|
shutil.rmtree(self.main_repo_path)
|
||||||
|
|
||||||
|
def test_get_file(self):
|
||||||
|
sourceFileLocation = random.choice(list(self.files.keys()))
|
||||||
|
sourceFilename = os.path.basename(sourceFileLocation)
|
||||||
|
destinationFileLocation = os.path.join(self.destdir, "other_file.txt")
|
||||||
|
destinationFileActualLocation = scm.get_file(
|
||||||
|
{
|
||||||
|
"scm": "git",
|
||||||
|
"repo": self.main_repo_path,
|
||||||
|
"file": os.path.join("submodule", sourceFilename),
|
||||||
|
},
|
||||||
|
destinationFileLocation,
|
||||||
|
compose=self.compose,
|
||||||
|
)
|
||||||
|
self.assertEqual(destinationFileActualLocation, destinationFileLocation)
|
||||||
|
self.assertTrue(os.path.isfile(destinationFileActualLocation))
|
||||||
|
|
||||||
|
# Reading the contents of both files to compare later.
|
||||||
|
with open(sourceFileLocation) as sourceFileHandle:
|
||||||
|
sourceFileContent = sourceFileHandle.read()
|
||||||
|
with open(destinationFileActualLocation) as destinationFileHandle:
|
||||||
|
destinationFileContent = destinationFileHandle.read()
|
||||||
|
# Comparing the contents of source to the destination file.
|
||||||
|
self.assertEqual(sourceFileContent, destinationFileContent)
|
||||||
|
|
||||||
|
|
||||||
class RpmSCMTestCase(SCMBaseTest):
|
class RpmSCMTestCase(SCMBaseTest):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(RpmSCMTestCase, self).setUp()
|
super(RpmSCMTestCase, self).setUp()
|
||||||
|
Loading…
Reference in New Issue
Block a user