Home | History | Annotate | Download | only in python
      1 #!/usr/bin/env python2.7
      2 # Copyright 2015 gRPC authors.
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #     http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 
     16 from __future__ import print_function
     17 
     18 import argparse
     19 import os
     20 import os.path
     21 import shutil
     22 import subprocess
     23 import sys
     24 import tempfile
     25 
     26 parser = argparse.ArgumentParser()
     27 parser.add_argument(
     28     '--config',
     29     metavar='c',
     30     type=str,
     31     nargs=1,
     32     help='GRPC/GPR libraries build configuration',
     33     default='opt')
     34 parser.add_argument('--submit', action='store_true')
     35 parser.add_argument('--gh-user', type=str, help='GitHub user to push as.')
     36 parser.add_argument(
     37     '--gh-repo-owner',
     38     type=str,
     39     help=('Owner of the GitHub repository to be pushed; '
     40           'defaults to --gh-user.'))
     41 parser.add_argument('--doc-branch', type=str)
     42 args = parser.parse_args()
     43 
     44 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
     45 PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', '..'))
     46 
     47 CONFIG = args.config
     48 SETUP_PATH = os.path.join(PROJECT_ROOT, 'setup.py')
     49 REQUIREMENTS_PATH = os.path.join(PROJECT_ROOT, 'requirements.txt')
     50 DOC_PATH = os.path.join(PROJECT_ROOT, 'doc/build')
     51 INCLUDE_PATH = os.path.join(PROJECT_ROOT, 'include')
     52 LIBRARY_PATH = os.path.join(PROJECT_ROOT, 'libs/{}'.format(CONFIG))
     53 VIRTUALENV_DIR = os.path.join(SCRIPT_DIR, 'distrib_virtualenv')
     54 VIRTUALENV_PYTHON_PATH = os.path.join(VIRTUALENV_DIR, 'bin', 'python')
     55 VIRTUALENV_PIP_PATH = os.path.join(VIRTUALENV_DIR, 'bin', 'pip')
     56 
     57 environment = os.environ.copy()
     58 environment.update({
     59     'CONFIG': CONFIG,
     60     'CFLAGS': '-I{}'.format(INCLUDE_PATH),
     61     'LDFLAGS': '-L{}'.format(LIBRARY_PATH),
     62     'LD_LIBRARY_PATH': LIBRARY_PATH,
     63     'GRPC_PYTHON_BUILD_WITH_CYTHON': '1',
     64     'GRPC_PYTHON_ENABLE_DOCUMENTATION_BUILD': '1',
     65 })
     66 
     67 subprocess_arguments_list = [
     68     {
     69         'args': ['virtualenv', VIRTUALENV_DIR],
     70         'env': environment
     71     },
     72     {
     73         'args': [VIRTUALENV_PIP_PATH, 'install', '--upgrade', 'pip==10.0.1'],
     74         'env': environment
     75     },
     76     {
     77         'args': [VIRTUALENV_PIP_PATH, 'install', '-r', REQUIREMENTS_PATH],
     78         'env': environment
     79     },
     80     {
     81         'args': [VIRTUALENV_PYTHON_PATH, SETUP_PATH, 'build'],
     82         'env': environment
     83     },
     84     {
     85         'args': [VIRTUALENV_PYTHON_PATH, SETUP_PATH, 'doc'],
     86         'env': environment
     87     },
     88 ]
     89 
     90 for subprocess_arguments in subprocess_arguments_list:
     91     print('Running command: {}'.format(subprocess_arguments['args']))
     92     subprocess.check_call(**subprocess_arguments)
     93 
     94 if args.submit:
     95     assert args.gh_user
     96     assert args.doc_branch
     97     github_user = args.gh_user
     98     github_repository_owner = (args.gh_repo_owner
     99                                if args.gh_repo_owner else args.gh_user)
    100     # Create a temporary directory out of tree, checkout gh-pages from the
    101     # specified repository, edit it, and push it. It's up to the user to then go
    102     # onto GitHub and make a PR against grpc/grpc:gh-pages.
    103     repo_parent_dir = tempfile.mkdtemp()
    104     print('Documentation parent directory: {}'.format(repo_parent_dir))
    105     repo_dir = os.path.join(repo_parent_dir, 'grpc')
    106     python_doc_dir = os.path.join(repo_dir, 'python')
    107     doc_branch = args.doc_branch
    108 
    109     print('Cloning your repository...')
    110     subprocess.check_call(
    111         [
    112             'git', 'clone', 'https://{}@github.com/{}/grpc'.format(
    113                 github_user, github_repository_owner)
    114         ],
    115         cwd=repo_parent_dir)
    116     subprocess.check_call(
    117         ['git', 'remote', 'add', 'upstream', 'https://github.com/grpc/grpc'],
    118         cwd=repo_dir)
    119     subprocess.check_call(['git', 'fetch', 'upstream'], cwd=repo_dir)
    120     subprocess.check_call(
    121         ['git', 'checkout', 'upstream/gh-pages', '-b', doc_branch],
    122         cwd=repo_dir)
    123     print('Updating documentation...')
    124     shutil.rmtree(python_doc_dir, ignore_errors=True)
    125     shutil.copytree(DOC_PATH, python_doc_dir)
    126     print('Attempting to push documentation...')
    127     try:
    128         subprocess.check_call(['git', 'add', '--all'], cwd=repo_dir)
    129         subprocess.check_call(
    130             ['git', 'commit', '-m', 'Auto-update Python documentation'],
    131             cwd=repo_dir)
    132         subprocess.check_call(
    133             ['git', 'push', '--set-upstream', 'origin', doc_branch],
    134             cwd=repo_dir)
    135     except subprocess.CalledProcessError:
    136         print('Failed to push documentation. Examine this directory and push '
    137               'manually: {}'.format(repo_parent_dir))
    138         sys.exit(1)
    139     shutil.rmtree(repo_parent_dir)
    140