File: issue8140.diff

package info (click to toggle)
python2.6 2.6.6-8%2Bdeb6u3
  • links: PTS, VCS
  • area: main
  • in suites: squeeze-lts
  • size: 65,368 kB
  • ctags: 106,965
  • sloc: ansic: 389,033; python: 375,783; asm: 9,734; sh: 4,934; makefile: 4,120; lisp: 2,933; objc: 775; xml: 62
file content (195 lines) | stat: -rw-r--r-- 7,021 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# DP: Issue #8140: extend compileall to compile single files. Add -i option.

Index: python2.6-2.6.5+20100521/Lib/compileall.py
===================================================================
--- python2.6-2.6.5+20100521.orig/Lib/compileall.py	2010-05-21 17:41:12.980711947 +0200
+++ python2.6-2.6.5+20100521/Lib/compileall.py	2010-05-21 17:41:21.403711729 +0200
@@ -16,7 +16,7 @@
 import sys
 import py_compile
 
-__all__ = ["compile_dir","compile_path"]
+__all__ = ["compile_dir","compile_file","compile_path"]
 
 def compile_dir(dir, maxlevels=10, ddir=None,
                 force=0, rx=None, quiet=0):
@@ -47,35 +47,9 @@
             dfile = os.path.join(ddir, name)
         else:
             dfile = None
-        if rx is not None:
-            mo = rx.search(fullname)
-            if mo:
-                continue
-        if os.path.isfile(fullname):
-            head, tail = name[:-3], name[-3:]
-            if tail == '.py':
-                cfile = fullname + (__debug__ and 'c' or 'o')
-                ftime = os.stat(fullname).st_mtime
-                try: ctime = os.stat(cfile).st_mtime
-                except os.error: ctime = 0
-                if (ctime > ftime) and not force: continue
-                if not quiet:
-                    print 'Compiling', fullname, '...'
-                try:
-                    ok = py_compile.compile(fullname, None, dfile, True)
-                except KeyboardInterrupt:
-                    raise KeyboardInterrupt
-                except py_compile.PyCompileError,err:
-                    if quiet:
-                        print 'Compiling', fullname, '...'
-                    print err.msg
-                    success = 0
-                except IOError, e:
-                    print "Sorry", e
-                    success = 0
-                else:
-                    if ok == 0:
-                        success = 0
+        if not os.path.isdir(fullname):
+            if not compile_file(fullname, ddir, force, rx, quiet):
+                success = 0
         elif maxlevels > 0 and \
              name != os.curdir and name != os.pardir and \
              os.path.isdir(fullname) and \
@@ -84,6 +58,53 @@
                 success = 0
     return success
 
+def compile_file(fullname, ddir=None, force=0, rx=None, quiet=0):
+    """Byte-compile file.
+    file:      the file to byte-compile
+    ddir:      if given, purported directory name (this is the
+               directory name that will show up in error messages)
+    force:     if 1, force compilation, even if timestamps are up-to-date
+    quiet:     if 1, be quiet during compilation
+
+    """
+
+    success = 1
+    name = os.path.basename(fullname)
+    if ddir is not None:
+        dfile = os.path.join(ddir, name)
+    else:
+        dfile = None
+    if rx is not None:
+        mo = rx.search(fullname)
+        if mo:
+            return success
+    if os.path.isfile(fullname):
+        head, tail = name[:-3], name[-3:]
+        if tail == '.py':
+            cfile = fullname + (__debug__ and 'c' or 'o')
+            ftime = os.stat(fullname).st_mtime
+            try: ctime = os.stat(cfile).st_mtime
+            except os.error: ctime = 0
+            if (ctime > ftime) and not force: return success
+            if not quiet:
+                print 'Compiling', fullname, '...'
+            try:
+                ok = py_compile.compile(fullname, None, dfile, True)
+            except KeyboardInterrupt:
+                raise KeyboardInterrupt
+            except py_compile.PyCompileError,err:
+                if quiet:
+                    print 'Compiling', fullname, '...'
+                print err.msg
+                success = 0
+            except IOError, e:
+                print "Sorry", e
+                success = 0
+            else:
+                if ok == 0:
+                    success = 0
+    return success
+
 def compile_path(skip_curdir=1, maxlevels=0, force=0, quiet=0):
     """Byte-compile all module on sys.path.
 
@@ -104,15 +125,34 @@
                                               force, quiet=quiet)
     return success
 
+def expand_args(args, flist):
+    """read names in flist and append to args"""
+    expanded = args[:]
+    if flist:
+        try:
+            if flist == '-':
+                fd = sys.stdin
+            else:
+                fd = open(flist)
+            while 1:
+                line = fd.readline()
+                if not line:
+                    break
+                expanded.append(line[:-1])
+        except IOError:
+            print "Error reading file list %s" % flist
+            raise
+    return expanded
+
 def main():
     """Script main program."""
     import getopt
     try:
-        opts, args = getopt.getopt(sys.argv[1:], 'lfqd:x:')
+        opts, args = getopt.getopt(sys.argv[1:], 'lfqd:x:i:')
     except getopt.error, msg:
         print msg
         print "usage: python compileall.py [-l] [-f] [-q] [-d destdir] " \
-              "[-x regexp] [directory ...]"
+              "[-x regexp] [-i list] [directory|file ...]"
         print "-l: don't recurse down"
         print "-f: force rebuild even if timestamps are up-to-date"
         print "-q: quiet operation"
@@ -120,12 +160,14 @@
         print "   if no directory arguments, -l sys.path is assumed"
         print "-x regexp: skip files matching the regular expression regexp"
         print "   the regexp is searched for in the full path of the file"
+        print "-i list: expand list with its content (file and directory names)"
         sys.exit(2)
     maxlevels = 10
     ddir = None
     force = 0
     quiet = 0
     rx = None
+    flist = None
     for o, a in opts:
         if o == '-l': maxlevels = 0
         if o == '-d': ddir = a
@@ -134,17 +176,28 @@
         if o == '-x':
             import re
             rx = re.compile(a)
+        if o == '-i': flist = a
     if ddir:
-        if len(args) != 1:
+        if len(args) != 1 and not os.path.isdir(args[0]):
             print "-d destdir require exactly one directory argument"
             sys.exit(2)
     success = 1
     try:
-        if args:
-            for dir in args:
-                if not compile_dir(dir, maxlevels, ddir,
-                                   force, rx, quiet):
-                    success = 0
+        if args or flist:
+            try:
+                if flist:
+                    args = expand_args(args, flist)
+            except IOError:
+                success = 0
+            if success:
+                for arg in args:
+                    if os.path.isdir(arg):
+                        if not compile_dir(arg, maxlevels, ddir,
+                                           force, rx, quiet):
+                            success = 0
+                    else:
+                        if not compile_file(arg, ddir, force, rx, quiet):
+                            success = 0
         else:
             success = compile_path()
     except KeyboardInterrupt: