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/.
8 List mozbase package dependencies or generate changelogs
12 from collections
import Iterable
13 from distutils
.version
import StrictVersion
19 import setup_development
21 here
= os
.path
.abspath(os
.path
.dirname(__file__
))
25 if not isinstance(command
, Iterable
):
26 command
= command
.split()
27 command
.insert(0, 'hg')
29 output
= subprocess
.check_output(command
, cwd
=here
)
30 except subprocess
.CalledProcessError
:
36 setup
= os
.path
.join(args
.module
, 'setup.py')
38 def get_version_rev(v
=None):
39 revisions
= run_hg(['log', setup
, '--template={rev},']).split(',')[:-1]
41 diff
= run_hg(['diff', '-c', rev
, setup
, '-U0'])
44 for line
in diff
.splitlines():
45 if line
.startswith('-PACKAGE_VERSION'):
46 minus_version
= StrictVersion(line
.split()[-1].strip('"\''))
47 elif line
.startswith('+PACKAGE_VERSION'):
48 plus_version
= StrictVersion(line
.split()[-1].strip('"\''))
50 # make sure the change isn't a backout
51 if not minus_version
or plus_version
> minus_version
:
55 if StrictVersion(v
) == plus_version
:
57 print("Could not find %s revision for version %s." % (args
.module
, v
or 'latest'))
60 from_ref
= args
.from_ref
or get_version_rev()
61 to_ref
= args
.to_ref
or 'tip'
64 from_ref
= get_version_rev(from_ref
)
66 to_ref
= get_version_rev(to_ref
)
68 delim
= '\x12\x59\x52\x99\x05'
69 changelog
= run_hg(['log', '-r', '%s:children(%s)' % (to_ref
, from_ref
), '--template={desc}%s' % delim
, '-M', args
.module
]).split(delim
)[:-1]
72 lines
= desc
.splitlines()
73 lines
= [('* %s' if i
== 0 else ' %s') % l
for i
, l
in enumerate(lines
)]
74 return '\n'.join(lines
)
76 changelog
= map(prettify
, changelog
)
77 print '\n'.join(changelog
)
80 def dependencies(args
):
81 # get package information
84 for package
in setup_development
.mozbase_packages
:
85 directory
= os
.path
.join(setup_development
.here
, package
)
86 info
[directory
] = setup_development
.info(directory
)
87 name
, _dependencies
= setup_development
.get_dependencies(directory
)
88 assert name
== info
[directory
]['Name']
89 dependencies
[name
] = _dependencies
91 # print package version information
92 for value
in info
.values():
93 print '%s %s : %s' % (value
['Name'], value
['Version'],
94 ', '.join(dependencies
[value
['Name']]))
97 def main(args
=sys
.argv
[1:]):
98 parser
= argparse
.ArgumentParser()
99 subcommands
= parser
.add_subparsers(help="Sub-commands")
101 p_deps
= subcommands
.add_parser('dependencies', help="Print dependencies.")
102 p_deps
.set_defaults(func
=dependencies
)
104 p_changelog
= subcommands
.add_parser('changelog', help="Print a changelog.")
105 p_changelog
.add_argument('module', help="Module to get changelog from.")
106 p_changelog
.add_argument('--from', dest
='from_ref', default
=None,
107 help="Starting version or revision to list changes from. [defaults to latest version]")
108 p_changelog
.add_argument('--to', dest
='to_ref', default
=None,
109 help="Ending version or revision to list changes to. [defaults to tip]")
110 p_changelog
.set_defaults(func
=changelog
)
112 # default to showing dependencies
114 args
.append('dependencies')
115 args
= parser
.parse_args(args
)
119 if __name__
== '__main__':