Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(687)

Unified Diff: src/scripts/make_relative_solution

Issue 2112003: Create a tool to save a pinned dep file for the current sync. (Closed) Base URL: ssh://git@chromiumos-git/chromeos
Patch Set: Fix repository reset and verify that we are in a git repo. Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « DEPS ('k') | src/scripts/save_pinned_deps » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/scripts/make_relative_solution
diff --git a/src/scripts/make_relative_solution b/src/scripts/make_relative_solution
new file mode 100755
index 0000000000000000000000000000000000000000..d12159e1b247cd2dfc46ae05959b526aae8d6c7b
--- /dev/null
+++ b/src/scripts/make_relative_solution
@@ -0,0 +1,207 @@
+#!/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)
« no previous file with comments | « DEPS ('k') | src/scripts/save_pinned_deps » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698