2012-03-30 01:08:58 +04:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
"""
|
|
|
|
Imports a test suite from a remote repository. Takes one argument, a file in
|
|
|
|
the format described in README.
|
|
|
|
Note: removes both source and destination directory before starting. Do not
|
|
|
|
use with outstanding changes in either directory.
|
|
|
|
"""
|
|
|
|
|
2012-11-04 12:00:06 +04:00
|
|
|
from __future__ import print_function, unicode_literals
|
|
|
|
|
2012-03-30 01:08:58 +04:00
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
|
|
|
|
import parseManifest
|
2012-07-18 14:36:07 +04:00
|
|
|
import writeMakefile
|
2012-03-30 01:08:58 +04:00
|
|
|
|
2012-11-13 02:20:19 +04:00
|
|
|
HEADERS_SUFFIX = "^headers^"
|
|
|
|
|
2012-03-30 01:08:58 +04:00
|
|
|
def parseManifestFile(dest, dir):
|
|
|
|
subdirs, mochitests, _, __, supportfiles = parseManifest.parseManifestFile("hg-%s/%s/MANIFEST" % (dest, dir))
|
|
|
|
return subdirs, mochitests, supportfiles
|
|
|
|
|
|
|
|
def getData(confFile):
|
|
|
|
"""This function parses a file of the form
|
|
|
|
URL of remote repository|Name of the destination directory
|
|
|
|
First directory of tests
|
|
|
|
...
|
|
|
|
Last directory of tests"""
|
|
|
|
repo = ""
|
|
|
|
dest = ""
|
|
|
|
directories = []
|
|
|
|
try:
|
2012-11-04 12:00:06 +04:00
|
|
|
fp = open(confFile, "r")
|
2012-03-30 01:08:58 +04:00
|
|
|
first = True
|
|
|
|
for line in fp:
|
|
|
|
if first:
|
|
|
|
idx = line.index("|")
|
|
|
|
repo = line[:idx].strip()
|
|
|
|
dest = line[idx + 1:].strip()
|
|
|
|
first = False
|
|
|
|
else:
|
|
|
|
directories.append(line.strip())
|
|
|
|
finally:
|
|
|
|
fp.close()
|
|
|
|
return repo, dest, directories
|
|
|
|
|
2012-05-20 15:12:41 +04:00
|
|
|
def makePath(a, b):
|
|
|
|
if not b:
|
|
|
|
# Empty directory, i.e., the repository root.
|
|
|
|
return a
|
|
|
|
return "%s/%s" % (a, b)
|
|
|
|
|
2012-11-13 02:20:19 +04:00
|
|
|
def copyTest(source, dest):
|
|
|
|
"""Copy the file at source to dest, as well as any ^headers^ file associated
|
|
|
|
with it."""
|
|
|
|
shutil.copy(source, dest)
|
|
|
|
if os.path.exists(source + HEADERS_SUFFIX):
|
|
|
|
shutil.copy(source + HEADERS_SUFFIX, dest + HEADERS_SUFFIX)
|
|
|
|
|
2012-03-30 01:08:58 +04:00
|
|
|
def copy(thissrcdir, dest, directories):
|
|
|
|
"""Copy mochitests and support files from the external HG directory to their
|
|
|
|
place in mozilla-central.
|
|
|
|
"""
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Copying %s..." % directories)
|
2012-03-30 01:08:58 +04:00
|
|
|
for d in directories:
|
|
|
|
subdirs, mochitests, supportfiles = parseManifestFile(dest, d)
|
2012-05-20 15:12:41 +04:00
|
|
|
sourcedir = makePath("hg-%s" % dest, d)
|
|
|
|
destdir = makePath(dest, d)
|
2012-04-14 17:05:33 +04:00
|
|
|
os.makedirs(destdir)
|
|
|
|
|
2012-03-30 01:08:58 +04:00
|
|
|
for mochitest in mochitests:
|
2012-11-13 02:20:19 +04:00
|
|
|
copyTest("%s/%s" % (sourcedir, mochitest), "%s/test_%s" % (destdir, mochitest))
|
2012-03-30 01:08:58 +04:00
|
|
|
for support in supportfiles:
|
2012-11-13 02:20:19 +04:00
|
|
|
copyTest("%s/%s" % (sourcedir, support), "%s/%s" % (destdir, support))
|
2012-03-30 01:08:58 +04:00
|
|
|
|
|
|
|
if len(subdirs):
|
2012-05-08 10:14:40 +04:00
|
|
|
if d:
|
|
|
|
importDirs(thissrcdir, dest, ["%s/%s" % (d, subdir) for subdir in subdirs])
|
|
|
|
else:
|
|
|
|
# Empty directory, i.e., the repository root
|
|
|
|
importDirs(thissrcdir, dest, subdirs)
|
2012-03-30 01:08:58 +04:00
|
|
|
|
|
|
|
def printMakefile(dest, directories):
|
|
|
|
"""Create a .mk file to be included into the main Makefile.in, which lists the
|
|
|
|
directories with tests.
|
|
|
|
"""
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Creating .mk...")
|
2012-03-30 01:08:58 +04:00
|
|
|
path = dest + ".mk"
|
2012-11-04 12:00:06 +04:00
|
|
|
fp = open(path, "w")
|
2012-03-30 01:08:58 +04:00
|
|
|
fp.write("DIRS += \\\n")
|
2012-07-18 14:36:07 +04:00
|
|
|
fp.write(writeMakefile.makefileString([makePath(dest, d) for d in directories]))
|
2012-05-20 15:12:41 +04:00
|
|
|
fp.write("\n")
|
2012-03-30 01:08:58 +04:00
|
|
|
fp.close()
|
|
|
|
subprocess.check_call(["hg", "add", path])
|
|
|
|
|
|
|
|
def printMakefiles(thissrcdir, dest, directories):
|
|
|
|
"""Create Makefile.in files for each directory that contains tests we import.
|
|
|
|
"""
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Creating Makefile.ins...")
|
2012-03-30 01:08:58 +04:00
|
|
|
for d in directories:
|
2012-11-04 12:00:06 +04:00
|
|
|
path = makePath(dest, d)
|
|
|
|
print("Creating Makefile.in in %s..." % path)
|
2012-03-30 01:08:58 +04:00
|
|
|
|
|
|
|
subdirs, mochitests, supportfiles = parseManifestFile(dest, d)
|
|
|
|
|
2012-07-18 14:36:07 +04:00
|
|
|
files = ["test_%s" % (mochitest, ) for mochitest in mochitests]
|
|
|
|
files.extend(supportfiles)
|
2012-11-13 02:20:19 +04:00
|
|
|
files.extend(f for f in os.listdir(path) if f.endswith(HEADERS_SUFFIX))
|
2012-07-18 14:36:07 +04:00
|
|
|
|
2012-09-06 11:14:48 +04:00
|
|
|
result = writeMakefile.substMakefile("importTestsuite.py", subdirs, files)
|
2012-03-30 01:08:58 +04:00
|
|
|
|
2012-11-04 12:00:06 +04:00
|
|
|
fp = open(path + "/Makefile.in", "w")
|
2012-03-30 01:08:58 +04:00
|
|
|
fp.write(result)
|
|
|
|
fp.close()
|
|
|
|
|
|
|
|
def hgadd(dest, directories):
|
|
|
|
"""Inform hg of the files in |directories|."""
|
2012-11-04 12:00:06 +04:00
|
|
|
print("hg addremoving...")
|
2012-03-30 01:08:58 +04:00
|
|
|
for d in directories:
|
2012-04-14 17:05:33 +04:00
|
|
|
subprocess.check_call(["hg", "addremove", "%s/%s" % (dest, d)])
|
2012-03-30 01:08:58 +04:00
|
|
|
|
|
|
|
def importDirs(thissrcdir, dest, directories):
|
|
|
|
copy(thissrcdir, dest, directories)
|
|
|
|
printMakefiles(thissrcdir, dest, directories)
|
|
|
|
|
|
|
|
def importRepo(confFile, thissrcdir):
|
|
|
|
try:
|
|
|
|
repo, dest, directories = getData(confFile)
|
|
|
|
hgdest = "hg-%s" % (dest, )
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Going to clone %s to %s..." % (repo, hgdest))
|
|
|
|
print("Removing %s..." % dest)
|
2012-03-30 01:08:58 +04:00
|
|
|
subprocess.check_call(["rm", "--recursive", "--force", dest])
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Removing %s..." % hgdest)
|
2012-03-30 01:08:58 +04:00
|
|
|
subprocess.check_call(["rm", "--recursive", "--force", hgdest])
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Cloning %s to %s..." % (repo, hgdest))
|
2012-03-30 01:08:58 +04:00
|
|
|
subprocess.check_call(["hg", "clone", repo, hgdest])
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Going to import %s..." % directories)
|
2012-03-30 01:08:58 +04:00
|
|
|
importDirs(thissrcdir, dest, directories)
|
|
|
|
printMakefile(dest, directories)
|
|
|
|
hgadd(dest, directories)
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Removing %s again..." % hgdest)
|
2012-03-30 01:08:58 +04:00
|
|
|
subprocess.check_call(["rm", "--recursive", "--force", hgdest])
|
2012-11-04 12:00:06 +04:00
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
print(e.returncode)
|
2012-03-30 01:08:58 +04:00
|
|
|
finally:
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Done")
|
2012-03-30 01:08:58 +04:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2012-04-14 17:05:33 +04:00
|
|
|
if len(sys.argv) != 2:
|
2012-11-04 12:00:06 +04:00
|
|
|
print("Need one argument.")
|
2012-03-30 01:08:58 +04:00
|
|
|
else:
|
2012-05-05 18:00:30 +04:00
|
|
|
importRepo(sys.argv[1], "dom/imptests")
|