diff.py
Go to the documentation of this file.
1 #!/usr/bin/python
2 
3 from ros_introspection.package import Package
4 from .terminal import color_header, color_diff
5 import collections
6 import tempfile
7 import shutil
8 import os
9 import difflib
10 from filecmp import dircmp
11 
12 
13 def get_diff_helper(dcmp, folder=''):
14  D = collections.defaultdict(list)
15  for name in dcmp.diff_files:
16  D['diff'].append(os.path.join(folder, name))
17  for name in dcmp.left_only:
18  D['deleted'].append(os.path.join(folder, name))
19  for name in dcmp.right_only:
20  D['added'].append(os.path.join(folder, name))
21 
22  for sub_dcmp in dcmp.subdirs.values():
23  sub_f = sub_dcmp.left.replace(dcmp.left, '')
24  if sub_f[0] == '/':
25  sub_f = sub_f[1:]
26  D2 = get_diff_helper(sub_dcmp, os.path.join(folder, sub_f))
27  for key in D2:
28  D[key] += D2[key]
29  return dict(D)
30 
31 
32 def get_diff(original_folder, new_folder):
33  dcmp = dircmp(original_folder, new_folder)
34  return get_diff_helper(dcmp)
35 
36 
37 def get_lines(folder, filename):
38  return open(os.path.join(folder, filename)).readlines()
39 
40 
41 def print_diff(filename, left_folder=None, right_folder=None):
42  if left_folder is None:
43  left = []
44  else:
45  left = get_lines(left_folder, filename)
46 
47  if right_folder is None:
48  right = []
49  else:
50  right = get_lines(right_folder, filename)
51 
52  diff = difflib.unified_diff(left, right, fromfile=filename, tofile='%s (modified)' % filename)
53  print(''.join(color_diff(diff)))
54 
55 
56 def preview_changes(package, fn_name, fne):
57  try:
58  temp_dir = tempfile.mkdtemp()
59  new_package_root = os.path.join(temp_dir, package.name)
60  shutil.copytree(package.root, new_package_root)
61  new_pkg = Package(new_package_root)
62  fne(new_pkg)
63  new_pkg.write()
64  the_diff = get_diff(package.root, new_package_root)
65  if len(the_diff) == 0:
66  return False
67 
68  print(color_header(fn_name))
69 
70  for filename in the_diff.get('diff', []):
71  print_diff(filename, package.root, new_package_root)
72  for filename in the_diff.get('deleted', []):
73  print_diff(filename, left_folder=package.root)
74  for filename in the_diff.get('added', []):
75  print_diff(filename, right_folder=new_package_root)
76  finally:
77  shutil.rmtree(new_package_root)
78  shutil.copytree(package.root, new_package_root)
79  shutil.rmtree(temp_dir)
80  return True
def get_diff_helper(dcmp, folder='')
Definition: diff.py:13
def color_diff(diff)
Definition: terminal.py:14
def preview_changes(package, fn_name, fne)
Definition: diff.py:56
def get_diff(original_folder, new_folder)
Definition: diff.py:32
def color_header(s, fore='WHITE', back='BLUE')
Definition: terminal.py:26
def get_lines(folder, filename)
Definition: diff.py:37
def print_diff(filename, left_folder=None, right_folder=None)
Definition: diff.py:41


roscompile
Author(s):
autogenerated on Wed Jun 19 2019 19:56:53