| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/env python3
- # Copyright 2023 The Effcee Authors.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- import os
- import subprocess
- def run(cmd, directory, fail_ok=False, verbose=False):
- """Runs a command in a directory and returns its standard output stream.
- Captures and returns the standard error stream.
- Raises a RuntimeError if the command fails to launch or otherwise fails.
- """
- if verbose:
- print(cmd)
- p = subprocess.Popen(cmd,
- cwd=directory,
- stdout=subprocess.PIPE)
- (stdout, _) = p.communicate()
- if p.returncode != 0 and not fail_ok:
- raise RuntimeError('Failed to run {} in {}'.format(cmd, directory))
- return stdout
- # This is needed for interpreting the contents of the DEPS file.
- def Var(key):
- """Returns the value for the given key in the 'vars' dictionary"""
- return vars[key]
- # Get deps dictionary from the DEPS file
- with open('DEPS', mode='r', encoding='utf-8') as f:
- exec(''.join(f.readlines()))
- # Now 'deps' is a dictionary mapping relative subdirectory name
- # to a repo-and-commit string such as 'https://github.com/google/[email protected]'
- for d in sorted(deps.keys()):
- (repo,commit) = deps[d].split('@')
- print("{} <-- {} {}".format(d,repo,commit))
- os.makedirs(d, exist_ok=True)
- # Clone afresh if needed
- if not os.path.exists(os.path.join(d, '.git')):
- run(['git', 'clone', '--single-branch', repo,'.'], d, verbose=True)
- # Ensure there is a known-good remote
- if len(run(['git', 'remote', 'get-url', 'known-good'], d, fail_ok=True)) == 0:
- run(['git', 'remote', 'add', 'known-good', repo], d)
- # And it has the right remote URL
- run(['git', 'remote', 'set-url', 'known-good', repo], d)
- # Fetch if the commit isn't yet present
- if len(run(['git', 'rev-parse', '--verify', '--quiet', commit + '^{commit}'],
- d,
- fail_ok=True)) == 0:
- run(['git', 'fetch', 'known-good'], d, verbose=True)
- # Checkout the commit
- run(['git', 'checkout', commit], d)
- print()
- # vim: expandtab ts=4 sw=4
|