#!/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
"""
import difflib
import optparse
import os
import profile
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()