##// END OF EJS Templates
upgrade_dir.py: skip junk files like *.pyc
vivainio -
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,94 +1,95 b''
1 1 #!/usr/bin/env python
2 2 """ A script/util to upgrade all files in a directory
3 3
4 4 This is rather conservative in its approach, only copying/overwriting
5 5 new and unedited files.
6 6
7 7 To be used by "upgrade" feature.
8 8 """
9 9 try:
10 10 from IPython.Extensions.path import path
11 11 except ImportError:
12 12 try:
13 13 from Extensions.path import path
14 14 except ImportError:
15 15 from path import path
16 16
17 17 import md5,pickle
18 18
19 19 def showdiff(old,new):
20 20 import difflib
21 21 d = difflib.Differ()
22 22 lines = d.compare(old.lines(),new.lines())
23 23 realdiff = False
24 24 for l in lines:
25 25 print l,
26 26 if not realdiff and not l[0].isspace():
27 27 realdiff = True
28 28 return realdiff
29 29
30 30 def upgrade_dir(srcdir, tgtdir):
31 31 """ Copy over all files in srcdir to tgtdir w/ native line endings
32 32
33 33 Creates .upgrade_report in tgtdir that stores md5sums of all files
34 34 to notice changed files b/w upgrades.
35 35 """
36 36
37 37 def pr(s):
38 38 print s
39 junk = ['.svn','ipythonrc*','*.pyc', '*~', '.hg']
39 40
40 41 def ignorable(p):
41 if p.lower().startswith('.svn') or p.startswith('ipythonrc'):
42 for pat in junk:
43 if p.startswith(pat) or p.fnmatch(pat):
42 44 return True
43 45 return False
44 46
45
46 47 modded = []
47 48 files = [path(srcdir).relpathto(p) for p in path(srcdir).walkfiles()]
48 49 #print files
49 50 rep = tgtdir / '.upgrade_report'
50 51 try:
51 52 rpt = pickle.load(rep.open())
52 53 except:
53 54 rpt = {}
54 55
55 56 for f in files:
56 57 if ignorable(f):
57 58 continue
58 59 src = srcdir / f
59 60 tgt = tgtdir / f
60 61 if not tgt.isfile():
61 62 pr("Creating %s" % str(tgt))
62 63
63 64 tgt.write_text(src.text())
64 65 rpt[str(tgt)] = md5.new(tgt.text()).hexdigest()
65 66 else:
66 67 cont = tgt.text()
67 68 sum = rpt.get(str(tgt), None)
68 69 #print sum
69 70 if sum and md5.new(cont).hexdigest() == sum:
70 pr("Unedited, installing new %s" % tgt)
71 pr("%s: Unedited, installing new version" % tgt)
71 72 tgt.write_text(src.text())
72 73 rpt[str(tgt)] = md5.new(tgt.text()).hexdigest()
73 74 else:
74 75 pr(' == Modified, skipping %s, diffs below == ' % tgt)
75 76 #rpt[str(tgt)] = md5.new(tgt.bytes()).hexdigest()
76 77 real = showdiff(tgt,src)
77 78 pr('') # empty line
78 79 if not real:
79 pr("(Ok, it wasn't that different at all, upgrading checksum)")
80 pr("(Ok, it was identical, only upgrading checksum)")
80 81 rpt[str(tgt)] = md5.new(tgt.text()).hexdigest()
81 82 else:
82 83 modded.append(tgt)
83 84
84 85 #print rpt
85 86 pickle.dump(rpt, rep.open('w'))
86 87 if modded:
87 88 print "\n\nDelete the following files manually (and rerun %upgrade)\nif you need a full upgrade:"
88 89 for m in modded:
89 90 print m
90 91
91 92
92 93 import sys
93 94 if __name__ == "__main__":
94 95 upgrade_dir(path(sys.argv[1]), path(sys.argv[2]))
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now