Example #1
0
def check_api_calls(opts):
    # Returns True if no calls through API classes in implementation.

    temp_dir = tempfile.mkdtemp()

    # Extract API class files from jar
    jar_cmd = ['jar', 'xf', os.path.abspath(opts.api_jar)]
    build_utils.CheckOutput(jar_cmd, cwd=temp_dir)
    shutil.rmtree(os.path.join(temp_dir, 'META-INF'), ignore_errors=True)

    # Collect names of API classes
    api_classes = []
    for dirpath, _, filenames in os.walk(temp_dir):
        if not filenames:
            continue
        package = os.path.relpath(dirpath, temp_dir)
        for filename in filenames:
            if filename.endswith('.class'):
                classname = filename[:-len('.class')]
                api_classes += [
                    os.path.normpath(os.path.join(package, classname))
                ]

    shutil.rmtree(temp_dir)
    temp_dir = tempfile.mkdtemp()

    # Extract impl class files from jars
    for impl_jar in opts.impl_jar:
        jar_cmd = ['jar', 'xf', os.path.abspath(impl_jar)]
        build_utils.CheckOutput(jar_cmd, cwd=temp_dir)
    shutil.rmtree(os.path.join(temp_dir, 'META-INF'), ignore_errors=True)

    # Process classes
    bad_api_calls = []
    for dirpath, _, filenames in os.walk(temp_dir):
        if not filenames:
            continue
        # Dump classes
        dump_file = os.path.join(temp_dir, 'dump.txt')
        if os.system(
                'javap -c %s > %s' %
            (' '.join(os.path.join(dirpath, f)
                      for f in filenames).replace('$', '\\$'), dump_file)):
            print 'ERROR: javap failed on ' + ' '.join(filenames)
            return False
        # Process class dump
        with open(dump_file, 'r') as dump:
            find_api_calls(dump, api_classes, bad_api_calls)

    shutil.rmtree(temp_dir)

    if bad_api_calls:
        print 'ERROR: Found the following calls from implementation classes through'
        print '       API classes.  These could fail if older API is used that'
        print '       does not contain newer methods.  Please call through a'
        print '       wrapper class from VersionSafeCallbacks.'
        print '\n'.join(bad_api_calls)
    return not bad_api_calls
Example #2
0
def main():
    parser = optparse.OptionParser()
    build_utils.AddDepfileOption(parser)
    parser.add_option('--output-dir', help='Directory to put javadoc')
    parser.add_option('--input-dir', help='Root of cronet source')
    parser.add_option('--input-src-jar', help='Cronet api source jar')
    parser.add_option('--overview-file', help='Path of the overview page')
    parser.add_option('--readme-file', help='Path of the README.md')
    parser.add_option('--lib-java-dir', help='Directory containing java libs')

    options, _ = parser.parse_args()
    # A temporary directory to put the output of cronet api source jar files.
    unzipped_jar_path = tempfile.mkdtemp(dir=options.output_dir)
    if os.path.exists(options.input_src_jar):
        jar_cmd = ['jar', 'xf', os.path.abspath(options.input_src_jar)]
        build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path)
    else:
        raise Exception('Jar file does not exist: %s' % options.input_src_jar)

    net_docs.ProcessDocs([options.readme_file],
                         options.input_dir,
                         options.output_dir,
                         extensions=[CronetExtension()])

    GenerateJavadoc(options, os.path.abspath(unzipped_jar_path))

    if options.depfile:
        input_paths = []
        for root, _, filenames in os.walk(options.input_dir):
            input_paths.extend(os.path.join(root, f) for f in filenames)
        build_utils.WriteDepfile(
            options.depfile, input_paths + build_utils.GetPythonDependencies())
    # Clean up temporary output directory.
    build_utils.DeleteDirectory(unzipped_jar_path)
Example #3
0
def JarSources(src_dir, jar_path):
  # The paths of the files in the jar will be the same as they are passed in to
  # the command. Because of this, the command should be run in
  # options.src_dir so the .java file paths in the jar are correct.
  jar_path = os.path.abspath(jar_path)
  jar_cmd = ['jar', 'cf', jar_path, '-C', src_dir, '.']
  build_utils.CheckOutput(jar_cmd)
Example #4
0
def GenerateJavadoc(options, src_dir, output_dir):
    working_dir = os.path.join(options.input_dir, 'android', 'api')
    overview_file = os.path.abspath(options.overview_file)

    android_sdk_jar = os.path.abspath(options.android_sdk_jar)
    if not android_sdk_jar:
        android_sdk_jar = os.path.join(SDK_DIR, 'platforms', 'android-27',
                                       'android.jar')

    build_utils.DeleteDirectory(output_dir)
    build_utils.MakeDirectory(output_dir)
    javadoc_cmd = [
        'javadoc',
        '-d',
        output_dir,
        '-overview',
        overview_file,
        '-doclet',
        'com.google.doclava.Doclava',
        '-docletpath',
        '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'),
                   os.path.join(DOCLAVA_DIR, 'doclava.jar')),
        '-title',
        'Cronet API',
        '-federate',
        'Android',
        'https://developer.android.com/',
        '-federationapi',
        'Android',
        os.path.join(DOCLAVA_DIR, 'current.txt'),
        '-bootclasspath',
        '%s:%s' %
        (android_sdk_jar,
         os.path.join(SDK_DIR, 'extras', 'android', 'support', 'annotations',
                      'android-support-annotations.jar')),
    ]
    for subdir, _, files in os.walk(src_dir):
        for filename in files:
            if filename.endswith(".java"):
                javadoc_cmd += [os.path.join(subdir, filename)]
    try:
        build_utils.CheckOutput(javadoc_cmd,
                                cwd=working_dir,
                                fail_func=lambda ret, stderr:
                                (ret != 0 or not stderr is ''))
    except build_utils.CalledProcessError:
        build_utils.DeleteDirectory(output_dir)
        raise

    # Create an index.html file at the root as this is the accepted format.
    # Do this by copying reference/index.html and adjusting the path.
    with open(os.path.join(output_dir, 'reference', 'index.html'), 'r') as \
        old_index, open(os.path.join(output_dir, 'index.html'), 'w') as new_index:
        for line in old_index:
            new_index.write(
                line.replace('classes.html',
                             os.path.join('reference', 'classes.html')))
Example #5
0
def GenerateJavadoc(options):
  output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc'))
  working_dir = os.path.join(options.input_dir, 'android/java')
  overview_file = os.path.abspath(options.overview_file)

  build_utils.DeleteDirectory(output_dir)
  build_utils.MakeDirectory(output_dir)
  javadoc_cmd = ['ant', '-Dsource.dir=src', '-Ddoc.dir=' + output_dir,
             '-Doverview=' + overview_file, 'doc']
  build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
def ExtractJars(options):
    # The paths of the files in the jar will be the same as they are passed in to
    # the command. Because of this, the command should be run in
    # options.classes_dir so the .class file paths in the jar are correct.
    jar_cwd = options.classes_dir
    build_utils.DeleteDirectory(jar_cwd)
    build_utils.MakeDirectory(jar_cwd)
    for jar in build_utils.ParseGnList(options.jars):
        jar_path = os.path.abspath(jar)
        jar_cmd = ['jar', 'xf', jar_path]
        build_utils.CheckOutput(jar_cmd, cwd=jar_cwd)
Example #7
0
def GenerateJavadoc(options):
    source_dir = options.source_dir
    output_dir = options.output_dir
    working_dir = options.working_dir

    build_utils.DeleteDirectory(output_dir)
    build_utils.MakeDirectory(output_dir)
    javadoc_cmd = [
        'ant', '-Dsource.dir=' + source_dir,
        '-Ddoc.dir=' + os.path.abspath(output_dir), 'doc'
    ]
    build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
Example #8
0
def JarSources(src_dir, src_files, jar_path):
    # The paths of the files in the jar will be the same as they are passed in to
    # the command. Because of this, the command should be run in
    # options.src_dir so the .java file paths in the jar are correct.
    jar_cwd = src_dir
    jar_path = os.path.abspath(jar_path)
    if os.path.exists(jar_path):
        jar_cmd = ['jar', 'uf', jar_path]
    else:
        jar_cmd = ['jar', 'cf', jar_path]

    jar_cmd.extend(src_files)
    build_utils.CheckOutput(jar_cmd, cwd=jar_cwd)
Example #9
0
def GenerateJavadoc(options):
  output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc'))
  working_dir = os.path.join(options.input_dir, 'android/api')
  overview_file = os.path.abspath(options.overview_file)

  build_utils.DeleteDirectory(output_dir)
  build_utils.MakeDirectory(output_dir)
  javadoc_cmd = ['ant', '-Dsource.dir=src', '-Ddoc.dir=' + output_dir,
             '-Doverview=' + overview_file, 'doc']
  stdout = build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
  if " error: " in stdout or "warning" in stdout:
    build_utils.DeleteDirectory(output_dir)
    raise build_utils.CalledProcessError(working_dir, javadoc_cmd, stdout)
Example #10
0
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--classpath',
                        required=True,
                        action='append',
                        help='What to use as javadoc\'s classpath. Can be '
                        'specified multiple times.')
    parser.add_argument('--input-srcjar',
                        help='Source JAR containing more files to process.')
    parser.add_argument('--java-files',
                        required=True,
                        help='Java files to process.')
    parser.add_argument('--output-dir',
                        required=True,
                        help='Directory to store the documentation.')
    parser.add_argument('--srcjar-files',
                        help='When specified, only process the given files '
                        'inside the srcjar set via --input-srcjar.')
    parser.add_argument('--stamp',
                        required=True,
                        help='File to touch on success.')

    options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:]))
    options.java_files = build_utils.ParseGypList(options.java_files)

    if options.srcjar_files and options.input_srcjar is None:
        print '--srcjar-files specified without --input-srcjar. Ignoring files.'

    with build_utils.TempDir() as temp_dir:
        java_files = options.java_files
        if options.input_srcjar:
            if options.srcjar_files:
                pattern = lambda f: f in options.srcjar_files
                java_files += [
                    os.path.join(temp_dir, f)
                    for f in build_utils.ParseGypList(options.srcjar_files)
                ]
            else:
                pattern = None
                java_files += [os.path.join(temp_dir, '*.java')]
            build_utils.ExtractAll(options.input_srcjar, path=temp_dir)

        classpath = ':'.join(options.classpath)
        javadoc_cmd = [
            'javadoc', '-d', options.output_dir, '-classpath', classpath
        ]
        javadoc_cmd.extend(java_files)

        build_utils.CheckOutput(javadoc_cmd, print_stderr=True)

    build_utils.Touch(options.stamp)
Example #11
0
def GenerateJavadoc(options, src_dir):
    output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc'))
    working_dir = os.path.join(options.input_dir, 'android', 'api')
    overview_file = os.path.abspath(options.overview_file)

    android_sdk_jar = os.path.abspath(options.android_sdk_jar)
    if not android_sdk_jar:
        android_sdk_jar = os.path.join(SDK_DIR, 'platforms', 'android-27',
                                       'android.jar')

    build_utils.DeleteDirectory(output_dir)
    build_utils.MakeDirectory(output_dir)
    javadoc_cmd = [
        'javadoc',
        '-d',
        output_dir,
        '-overview',
        overview_file,
        '-doclet',
        'com.google.doclava.Doclava',
        '-docletpath',
        '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'),
                   os.path.join(DOCLAVA_DIR, 'doclava.jar')),
        '-title',
        'Cronet API',
        '-federate',
        'Android',
        'https://developer.android.com/',
        '-federationapi',
        'Android',
        os.path.join(DOCLAVA_DIR, 'current.txt'),
        '-bootclasspath',
        '%s:%s' %
        (android_sdk_jar,
         os.path.join(SDK_DIR, 'extras', 'android', 'support', 'annotations',
                      'android-support-annotations.jar')),
    ]
    for subdir, _, files in os.walk(src_dir):
        for filename in files:
            if filename.endswith(".java"):
                javadoc_cmd += [os.path.join(subdir, filename)]
    try:
        build_utils.CheckOutput(javadoc_cmd,
                                cwd=working_dir,
                                fail_func=lambda ret, stderr:
                                (ret != 0 or not stderr is ''))
    except build_utils.CalledProcessError:
        build_utils.DeleteDirectory(output_dir)
        raise
Example #12
0
def main():
    parser = optparse.OptionParser()
    build_utils.AddDepfileOption(parser)
    parser.add_option('--output-dir', help='Directory to put javadoc')
    parser.add_option('--input-dir', help='Root of cronet source')
    parser.add_option('--input-src-jar', help='Cronet api source jar')
    parser.add_option('--overview-file', help='Path of the overview page')
    parser.add_option('--readme-file', help='Path of the README.md')
    parser.add_option('--zip-file', help='Path to ZIP archive of javadocs.')
    parser.add_option('--android-sdk-jar', help='Path to android.jar')

    options, _ = parser.parse_args()
    # A temporary directory to put the output of cronet api source jar files.
    unzipped_jar_path = tempfile.mkdtemp(dir=options.output_dir)
    if os.path.exists(options.input_src_jar):
        jar_cmd = ['jar', 'xf', os.path.abspath(options.input_src_jar)]
        build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path)
    else:
        raise Exception('Jar file does not exist: %s' % options.input_src_jar)

    net_docs.ProcessDocs([options.readme_file],
                         options.input_dir,
                         options.output_dir,
                         extensions=[CronetExtension()])

    output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc'))
    GenerateJavadoc(options, os.path.abspath(unzipped_jar_path), output_dir)

    if options.zip_file:
        assert options.zip_file.endswith('.zip')
        shutil.make_archive(options.zip_file[:-4], 'zip', output_dir)
    if options.depfile:
        assert options.zip_file
        deps = []
        for root, _, filenames in os.walk(options.input_dir):
            # Ignore .pyc files here, it might be re-generated during build.
            deps.extend(
                os.path.join(root, f) for f in filenames
                if not f.endswith('.pyc'))
        build_utils.WriteDepfile(options.depfile, options.zip_file, deps)
    # Clean up temporary output directory.
    build_utils.DeleteDirectory(unzipped_jar_path)
def GenerateJavadoc(options, src_dir):
    output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc'))
    working_dir = os.path.join(options.input_dir, 'android/api')
    overview_file = os.path.abspath(options.overview_file)
    lib_java_dir = os.path.abspath(options.lib_java_dir)

    build_utils.DeleteDirectory(output_dir)
    build_utils.MakeDirectory(output_dir)
    javadoc_cmd = [
        'ant', '-Dsource.dir=' + src_dir, '-Ddoc.dir=' + output_dir,
        '-Dlib.java.dir=' + lib_java_dir, '-Doverview=' + overview_file, 'doc'
    ]
    stdout = build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
    for line in stdout.splitlines():
        if " error: " in line or "javadoc: error " in line:
            build_utils.DeleteDirectory(output_dir)
            raise build_utils.CalledProcessError(working_dir, javadoc_cmd,
                                                 stdout)
        # TODO(crbug.com/655666): remove compiler  suppression warning once fixed.
        if ("warning" in line and not line.endswith('warnings')
                and not "the highest major version" in line):
            build_utils.DeleteDirectory(output_dir)
            raise build_utils.CalledProcessError(working_dir, javadoc_cmd,
                                                 stdout)
Example #14
0
def UnzipSourceJar(jar, unzipped_jar_path):
    if os.path.exists(jar):
        jar_cmd = ['jar', 'xf', os.path.abspath(jar)]
        build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path)
    else:
        raise Exception('Jar file does not exist %s' % jar)
def BuildWithGradle(options):
    gradle_path = os.path.join(REPOSITORY_ROOT, 'third_party',
                               'gradle_wrapper', 'gradlew')
    gradle_cmd = [gradle_path, 'assembleDebug', 'assembleAndroidTest']
    build_utils.CheckOutput(gradle_cmd, cwd=options.project_dir)