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
16 from collections
.abc
import Iterable
18 from packaging
.version
import Version
20 here
= os
.path
.abspath(os
.path
.dirname(__file__
))
21 sys
.path
.insert(0, here
)
23 import setup_development
28 if not isinstance(command
, Iterable
):
29 command
= command
.split()
30 command
.insert(0, "hg")
32 output
= subprocess
.check_output(command
, cwd
=here
, universal_newlines
=True)
33 except subprocess
.CalledProcessError
:
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]
44 diff
= run_hg(["diff", "-c", rev
, setup
, "-U0"])
47 for line
in diff
.splitlines():
48 if line
.startswith("-PACKAGE_VERSION"):
50 minus_version
= Version(line
.split()[-1].strip("\"'"))
53 elif line
.startswith("+PACKAGE_VERSION"):
55 plus_version
= Version(line
.split()[-1].strip("\"'"))
59 # make sure the change isn't a backout
60 if not minus_version
or plus_version
> minus_version
:
64 if Version(v
) == plus_version
:
68 "Could not find %s revision for version %s." % (args
.module
, v
or "latest")
72 from_ref
= args
.from_ref
or get_version_rev()
73 to_ref
= args
.to_ref
or "tip"
76 from_ref
= get_version_rev(from_ref
)
78 to_ref
= get_version_rev(to_ref
)
80 delim
= "\x12\x59\x52\x99\x05"
85 "%s:children(%s)" % (to_ref
, from_ref
),
86 "--template={desc}%s" % delim
,
93 lines
= desc
.splitlines()
94 lines
= [("* %s" if i
== 0 else " %s") % l
for i
, l
in enumerate(lines
)]
95 return "\n".join(lines
)
97 # pylint --py3k: W1636
98 changelog
= list(map(prettify
, changelog
))
99 print("\n".join(changelog
))
102 def dependencies(args
):
103 # get package information
106 for package
in setup_development
.mozbase_packages
:
107 directory
= os
.path
.join(setup_development
.here
, package
)
108 info
[directory
] = setup_development
.info(directory
)
109 name
, _dependencies
= setup_development
.get_dependencies(directory
)
110 assert name
== info
[directory
]["Name"]
111 dependencies
[name
] = _dependencies
113 # print package version information
114 for value
in info
.values():
117 % (value
["Name"], value
["Version"], ", ".join(dependencies
[value
["Name"]]))
121 def main(args
=sys
.argv
[1:]):
122 parser
= argparse
.ArgumentParser()
123 subcommands
= parser
.add_subparsers(help="Sub-commands")
125 p_deps
= subcommands
.add_parser("dependencies", help="Print dependencies.")
126 p_deps
.set_defaults(func
=dependencies
)
128 p_changelog
= subcommands
.add_parser("changelog", help="Print a changelog.")
129 p_changelog
.add_argument("module", help="Module to get changelog from.")
130 p_changelog
.add_argument(
134 help="Starting version or revision to list "
135 "changes from. [defaults to latest version]",
137 p_changelog
.add_argument(
141 help="Ending version or revision to list " "changes to. [defaults to tip]",
143 p_changelog
.set_defaults(func
=changelog
)
145 # default to showing dependencies
147 args
.append("dependencies")
148 args
= parser
.parse_args(args
)
152 if __name__
== "__main__":