source: icXML/icXML-devel/scripts/fix_icxml_imports.py @ 2747

Last change on this file since 2747 was 2733, checked in by cameron, 7 years ago

More path fixes.

File size: 3.8 KB
Line 
1#
2# fix_icxml_imports.py - Replace xerces-c imports with
3# ICXML overrides.
4#
5# Licensed under Open Source License, 3.0.
6#
7import sys, re, os, shutil, optparse
8
9icxml_override_dir = "icxercesc"
10
11backup_extension = ".orig"
12
13overridable = re.compile("\.(h|c|hpp|cpp|hxx|cxx)$")
14
15def read_overrides(root, subpath):
16        overrides = []
17        path = os.path.join(root, subpath)
18        for f in os.listdir(path):
19                newsubpath = os.path.join(subpath, f)
20                newpath = os.path.join(path, f)
21                if os.path.isdir(newpath):
22                        overrides += read_overrides(root, newsubpath)
23                else:
24                        if overridable.search(newpath):
25                                overrides.append(newsubpath)
26        return overrides
27
28xercesc_include_RE = re.compile(r"(#\s*include\s+)<xercesc/([^>]*)>")
29
30xercesc_makefile_RE = re.compile("(\\s)xercesc/([^\\s]*)(\\s)")
31
32
33def fix1_path_in_source(matchobj):
34        if matchobj.group(2) in override_set:
35          return "%s<%s/%s>" % (matchobj.group(1), icxml_override_dir, matchobj.group(2))
36        else: return matchobj.group(0)
37
38def icxml_source_fixer(s):
39        s = re.sub(xercesc_include_RE, fix1_path_in_source, s)
40        return s
41
42fixable_source = re.compile("\.(h|c|hpp|cpp|hxx|cxx)$")
43
44def fix1_path_in_makefile(matchobj):
45        if matchobj.group(2) in override_set:
46          return matchobj.group(1) + icxml_override_dir + "/" + matchobj.group(2) + matchobj.group(3)
47        else: return matchobj.group(0)
48
49def icxml_makefile_fixer(s):
50        s = re.sub(xercesc_makefile_RE, fix1_path_in_makefile, s)
51        return s
52
53makefile = re.compile("Makefile.am$|Makefile.in$|Makefile$")
54
55def fix_file(path):
56        if fixable_source.search(path) or makefile.search(path):
57                infile = open(path)
58                indata = infile.read()
59                infile.close()
60                if makefile.search(path): outdata = icxml_makefile_fixer(indata)
61                else: outdata = icxml_source_fixer(indata)
62                if outdata != indata:
63                        print("Modifying %s" % (path))
64                        if not os.path.exists(path + backup_extension): shutil.move(path, path + backup_extension)
65                        outfile = open(path, 'w')
66                        outfile.write(outdata)
67                        outfile.close()
68
69def fix_directory(path, do_recursive = False):
70        for f in os.listdir(path):
71                subpath = os.path.join(path, f)
72                if os.path.isdir(subpath):
73                        if do_recursive: fix_directory(subpath, do_recursive)
74                else:
75                        fix_file(subpath)
76                               
77def unfix_file(path):
78        if (fixable_source.search(path) or makefile.search(path)):
79                if os.path.exists(path + backup_extension):
80                        shutil.move(path + backup_extension, path)
81                        print "Restoring %s from %s" % (path, path + backup_extension)
82
83def unfix_directory(path, do_recursive = False):
84        for f in os.listdir(path):
85                subpath = os.path.join(path, f)
86                if os.path.isdir(subpath):
87                        if do_recursive: unfix_directory(subpath, do_recursive)
88                else:
89                        unfix_file(subpath)
90               
91if __name__ == '__main__':
92
93        option_parser = optparse.OptionParser(usage='python %prog [options] <path>', version='1.0')
94        option_parser.add_option('-r', '--recursive', 
95                          dest = 'do_recursive', action='store_true', default=False,
96                          help = 'Process subdirectories recursively.')
97        option_parser.add_option('-u', '--undo', 
98                          dest = 'undo', action='store_true', default=False,
99                          help = 'Restore from %s files.' % backup_extension)
100        options, args = option_parser.parse_args(sys.argv[1:])
101        if len(args) != 1:
102                option_parser.print_usage()
103                sys.exit()
104       
105        if not os.path.exists(icxml_override_dir):
106          print "Expecting icXML overrides directory: %s.  Please cd to src." % icxml_override_dir
107          exit()
108         
109        override_set = read_overrides(icxml_override_dir, '')
110       
111        fix_path = args[0]
112       
113        if os.path.isdir(fix_path):
114                if options.undo: 
115                        unfix_directory(fix_path, options.do_recursive)
116                else: fix_directory(fix_path, options.do_recursive)
117        else: 
118                if options.undo: 
119                        unfix_file(fix_path)
120                else: fix_file(fix_path)
121
Note: See TracBrowser for help on using the repository browser.