Bug 1568157 - Part 5: Move the NodePicker initialization into a getter. r=yulia
[gecko.git] / testing / mozbase / versioninfo.py
blob91d1a0473254c82c9e32e6d56e07aee8eaeabd91
1 #!/usr/bin/env python
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 # You can obtain one at http://mozilla.org/MPL/2.0/.
7 """
8 List mozbase package dependencies or generate changelogs
9 from commit messages.
10 """
12 from __future__ import absolute_import, print_function
14 from collections import Iterable
15 from distutils.version import StrictVersion
16 import argparse
17 import os
18 import subprocess
19 import sys
21 import setup_development
23 here = os.path.abspath(os.path.dirname(__file__))
26 def run_hg(command):
27 command = command[:]
28 if not isinstance(command, Iterable):
29 command = command.split()
30 command.insert(0, 'hg')
31 try:
32 output = subprocess.check_output(command, cwd=here)
33 except subprocess.CalledProcessError:
34 sys.exit(1)
35 return output
38 def changelog(args):
39 setup = os.path.join(args.module, 'setup.py')
41 def get_version_rev(v=None):
42 revisions = run_hg(['log', setup, '--template={rev},']).split(',')[:-1]
43 for rev in revisions:
44 diff = run_hg(['diff', '-c', rev, setup, '-U0'])
45 minus_version = None
46 plus_version = None
47 for line in diff.splitlines():
48 if line.startswith('-PACKAGE_VERSION'):
49 try:
50 minus_version = StrictVersion(line.split()[-1].strip('"\''))
51 except ValueError:
52 pass
53 elif line.startswith('+PACKAGE_VERSION'):
54 try:
55 plus_version = StrictVersion(line.split()[-1].strip('"\''))
56 except ValueError:
57 break
59 # make sure the change isn't a backout
60 if not minus_version or plus_version > minus_version:
61 if not v:
62 return rev
64 if StrictVersion(v) == plus_version:
65 return rev
67 print("Could not find %s revision for version %s." % (args.module, v or 'latest'))
68 sys.exit(1)
70 from_ref = args.from_ref or get_version_rev()
71 to_ref = args.to_ref or 'tip'
73 if '.' in from_ref:
74 from_ref = get_version_rev(from_ref)
75 if '.' in to_ref:
76 to_ref = get_version_rev(to_ref)
78 delim = '\x12\x59\x52\x99\x05'
79 changelog = run_hg(['log', '-r', '%s:children(%s)' % (to_ref, from_ref),
80 '--template={desc}%s' % delim,
81 '-M', args.module]).split(delim)[:-1]
83 def prettify(desc):
84 lines = desc.splitlines()
85 lines = [('* %s' if i == 0 else ' %s') % l for i, l in enumerate(lines)]
86 return '\n'.join(lines)
88 changelog = map(prettify, changelog)
89 print('\n'.join(changelog))
92 def dependencies(args):
93 # get package information
94 info = {}
95 dependencies = {}
96 for package in setup_development.mozbase_packages:
97 directory = os.path.join(setup_development.here, package)
98 info[directory] = setup_development.info(directory)
99 name, _dependencies = setup_development.get_dependencies(directory)
100 assert name == info[directory]['Name']
101 dependencies[name] = _dependencies
103 # print package version information
104 for value in info.values():
105 print('%s %s : %s' % (value['Name'], value['Version'],
106 ', '.join(dependencies[value['Name']])))
109 def main(args=sys.argv[1:]):
110 parser = argparse.ArgumentParser()
111 subcommands = parser.add_subparsers(help="Sub-commands")
113 p_deps = subcommands.add_parser('dependencies', help="Print dependencies.")
114 p_deps.set_defaults(func=dependencies)
116 p_changelog = subcommands.add_parser('changelog', help="Print a changelog.")
117 p_changelog.add_argument('module', help="Module to get changelog from.")
118 p_changelog.add_argument('--from', dest='from_ref', default=None,
119 help="Starting version or revision to list "
120 "changes from. [defaults to latest version]")
121 p_changelog.add_argument('--to', dest='to_ref', default=None,
122 help="Ending version or revision to list "
123 "changes to. [defaults to tip]")
124 p_changelog.set_defaults(func=changelog)
126 # default to showing dependencies
127 if args == []:
128 args.append('dependencies')
129 args = parser.parse_args(args)
130 args.func(args)
133 if __name__ == '__main__':
134 main()