Source code

Revision control

Other Tools

#!/usr/bin/env python
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
diff two profile summaries
"""
from __future__ import absolute_import, print_function
import difflib
import profile
import optparse
import os
import sys
__all__ = ["diff", "diff_profiles"]
def diff(profile1, profile2, diff_function=difflib.unified_diff):
profiles = (profile1, profile2)
parts = {}
parts_dict = {}
for index in (0, 1):
prof = profiles[index]
# first part, the path, isn't useful for diffing
parts[index] = prof.summary(return_parts=True)[1:]
parts_dict[index] = dict(parts[index])
# keys the first profile is missing
first_missing = [i for i in parts_dict[1] if i not in parts_dict[0]]
parts[0].extend([(i, "") for i in first_missing])
# diffs
retval = []
for key, value in parts[0]:
other = parts_dict[1].get(key, "")
value = value.strip()
other = other.strip()
if key == "Files":
# first line of files is the path; we don't care to diff that
value = "\n".join(value.splitlines()[1:])
if other:
other = "\n".join(other.splitlines()[1:])
value = value.splitlines()
other = other.splitlines()
section_diff = list(
diff_function(value, other, profile1.profile, profile2.profile)
)
if section_diff:
retval.append((key, "\n".join(section_diff)))
return retval
def diff_profiles(args=sys.argv[1:]):
# parse command line
usage = "%prog [options] profile1 profile2"
parser = optparse.OptionParser(usage=usage, description=__doc__)
options, args = parser.parse_args(args)
if len(args) != 2:
parser.error("Must give two profile paths")
missing = [arg for arg in args if not os.path.exists(arg)]
if missing:
parser.error("Profile not found: %s" % (", ".join(missing)))
# get the profile differences
diffs = diff(*([profile.Profile(arg) for arg in args]))
# display them
while diffs:
key, value = diffs.pop(0)
print("[%s]:\n" % key)
print(value)
if diffs:
print("-" * 4)
if __name__ == "__main__":
diff_profiles()