summaryrefslogtreecommitdiffstats
path: root/testing/mozbase/mozprofile/mozprofile/diff.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/mozbase/mozprofile/mozprofile/diff.py')
-rw-r--r--testing/mozbase/mozprofile/mozprofile/diff.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/testing/mozbase/mozprofile/mozprofile/diff.py b/testing/mozbase/mozprofile/mozprofile/diff.py
new file mode 100644
index 0000000000..f8376e4d7b
--- /dev/null
+++ b/testing/mozbase/mozprofile/mozprofile/diff.py
@@ -0,0 +1,86 @@
+#!/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()