Index: make_relative_solution |
diff --git a/make_relative_solution b/make_relative_solution |
deleted file mode 100755 |
index d12159e1b247cd2dfc46ae05959b526aae8d6c7b..0000000000000000000000000000000000000000 |
--- a/make_relative_solution |
+++ /dev/null |
@@ -1,207 +0,0 @@ |
-#!/usr/bin/python |
-# |
-# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Generates a pinned solutions file with relative git repository URLs. |
- |
-make_relative_solution reads a pinned solution file generated by |
-'gclient revinfo --snapshot' and writes to stdout a pinned solution file |
-with relative git repository URLs. |
- |
- |
-The resulting solution file can be used to check out a fixed version of |
-a gclient set of repositories. The base URL to fetch from can be changed |
-by editing one line in the generated solution file. |
-""" |
- |
-import optparse |
-import sys |
- |
- |
-def ReadSnapshot(filename): |
- """Reads a gclient revinfo snapshot file. |
- |
- Minimal verification of the structure of the file is performed. |
- |
- Args: |
- filename: The name of a snapshot file to read. |
- |
- Returns: |
- The solutions array parsed from the snapshot file. |
- """ |
- |
- env = {} |
- execfile(filename, env) |
- |
- assert 'solutions' in env |
- assert env['solutions'] |
- |
- return env['solutions'] |
- |
- |
-def BaseRepository(url): |
- """Finds the base repository path. |
- |
- This only works if the top level repository is not in a subdirectory relative |
- to the other repositories on the server. |
- |
- Args: |
- url: git repository url |
- |
- Returns: |
- The prefix of the URL that does not contain the repository name and SHA. |
- """ |
- |
- base, versioned_repository = url.rsplit('/', 1) |
- |
- assert base and versioned_repository |
- return base |
- |
- |
-def WriteBaseURL(base, solution): |
- print ' "%s": "%s",' % (solution['name'], base) |
- |
- |
-def IsRelativeRepository(base, url): |
- return url.startswith(base) |
- |
- |
-def RelativeRepository(base, url): |
- if IsRelativeRepository(base, url): |
- return url[len(base):] |
- else: |
- return url |
- |
- |
-def RelativeDep(base, dep): |
- path, repository = dep |
- |
- return (path, |
- RelativeRepository(base, repository), |
- IsRelativeRepository(base, repository)) |
- |
- |
-def RelativeDeps(base, solution): |
- return [RelativeDep(base, dep) for dep in solution['custom_deps'].items()] |
- |
- |
-def WritePinnedDep(name, dep, indent): |
- """Writes a pinned dep. |
- |
- The output is indented so that the URLs all line up for ease of reading. If |
- the dep is for a relative git repository then we emit the base_url lookup as |
- well. |
- |
- Args: |
- name: The name of the solution that is being written out. |
- dep: The relative dep that is to be written out. |
- indent: The total number of characters to use for the path component. |
- |
- Returns: |
- Nothing |
- """ |
- |
- path, repository, relative = dep |
- remainder = path.partition('/')[2] |
- spaces = indent - len(path) |
- |
- if remainder == 'deps': |
- return |
- |
- if relative: |
- print ' "%s": %*sbase_url["%s"] + "%s",' % (path, |
- spaces, '', |
- name, |
- repository) |
- else: |
- print ' "%s": %*s"%s",' % (path, |
- spaces, '', |
- repository) |
- |
- |
-def WritePinnedSolution(solution): |
- """Writes out a pinned and solution file with relative repository paths. |
- |
- The relative repository paths make it easier for a user to modify where |
- they are pulling source from. |
- |
- Args: |
- solution: gclient solution object. |
- |
- Returns: |
- Nothing |
- """ |
- |
- base = BaseRepository(solution['url']) |
- url = RelativeRepository(base, solution['url']) |
- deps = RelativeDeps(base, solution) |
- indent = max(len(dep[0]) for dep in deps) |
- |
- deps.sort(key=lambda dep: dep[1]) |
- |
- print (' { "name" : "%s",\n' |
- ' "url" : base_url["%s"] + "%s",\n' |
- ' "custom_deps" : {') % (solution['name'], |
- solution['name'], |
- url) |
- |
- for dep in deps: |
- WritePinnedDep(solution['name'], dep, indent) |
- |
- print (' },\n' |
- ' },') |
- |
- |
-def main(argv): |
- usage = 'Usage: %prog [options] filename' |
- option_parser = optparse.OptionParser(usage=usage) |
- option_parser.disable_interspersed_args() |
- option_parser.add_option('-s', '--substitute', |
- action='store_true', |
- dest='substitute', |
- default=False, |
- help='substitute a new base git URL') |
- option_parser.add_option('-b', '--base', |
- dest='base', |
- default='http://src.chromium.org/git', |
- metavar='URL', |
- help='base git URL to substitute [%default]') |
- |
- options, args = option_parser.parse_args(argv[1:]) |
- |
- if len(args) != 1: |
- option_parser.print_help() |
- return 1 |
- |
- filename = args.pop(0) |
- solutions = ReadSnapshot(filename) |
- |
- print ('#\n' |
- '# Autogenerated pinned gclient solution file. This file was\n' |
- '# created by running make_relative_solution.\n' |
- '#\n' |
- '\n' |
- 'base_url = {') |
- |
- for solution in solutions: |
- if options.substitute: |
- base = options.base |
- else: |
- base = BaseRepository(solution['url']) |
- |
- WriteBaseURL(base, solution) |
- |
- print ('}\n' |
- '\n' |
- 'solutions = [') |
- |
- for solution in solutions: |
- WritePinnedSolution(solution) |
- |
- print ']\n' |
- |
- |
-if __name__ == '__main__': |
- main(sys.argv) |