7from stat
import ST_MODE
13 python_interpreter = os.path.normcase(sys.executable).encode()
21 usage = (
'usage: %s -v -i /python_interpreter file-or-directory ...\n' % sys.argv[0])
24 opts, args = getopt.getopt(sys.argv[1:],
'i:v')
25 except getopt.GetoptError
as msg:
26 sys.stderr.write(str(msg) +
'\n')
27 sys.stderr.write(usage)
31 python_interpreter = a.encode()
35 if not python_interpreter
or not python_interpreter.startswith(b
'/'):
36 sys.stderr.write(
'-i interpreter option invalid (must be specified as a full path)\n')
37 sys.stderr.write(usage)
41 sys.stderr.write(
'file or directories not specified\n')
42 sys.stderr.write(usage)
46 if os.path.islink(arg):
48 if os.path.isfile(arg):
51 python_interpreter=python_interpreter):
53 if os.path.isdir(arg):
54 for root, subdirs, files
in os.walk(arg):
56 filename = os.path.join(root, f)
57 if os.path.islink(filename):
59 if os.path.isfile(filename):
62 python_interpreter=python_interpreter):
67def pathfix(filename=None, verbose=False, python_interpreter='/usr/bin/python'):
70 sys.stdout.write(
'filename not provided\n')
74 infile = open(filename,
'rb')
75 except IOError
as msg:
76 sys.stderr.write(
'%s: open failed: %r\n' % (filename, msg))
80 firstline = infile.readline()
81 except IOError
as msg:
82 sys.stderr.write(
'%s: read failed: %r\n' % (filename, msg))
85 except IOError
as msg:
86 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
88 if firstline.rstrip(b
'\n').
find(b
' -') != -1:
89 existingargs = firstline.rstrip(b
'\n')[firstline.rstrip(b
'\n').
find(b
' -'):]
92 newline = b
'#!' + python_interpreter + existingargs + b
'\n'
93 if (
not firstline.startswith(b
'#!'))
or (b
"python" not in firstline)
or (firstline == newline):
95 sys.stdout.write(
'%s: unchanged\n' % (filename))
98 except IOError
as msg:
99 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
102 head, tail = os.path.split(filename)
103 tempname = os.path.join(head,
'@' + tail)
105 outfile = open(tempname,
'wb')
106 except IOError
as msg:
107 sys.stderr.write(
'%s: create failed: %r\n' % (tempname, msg))
110 except IOError
as msg:
111 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
114 sys.stdout.write(
'%s: updating\n' % (filename))
117 outfile.write(newline)
118 except IOError
as msg:
119 sys.stderr.write(
'%s: write failed: %r\n' % (tempname, msg))
122 except IOError
as msg:
123 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
126 except IOError
as msg:
127 sys.stderr.write(
'%s: close failed: %r\n' % (tempname, msg))
132 chunk = infile.read(32678)
133 except IOError
as msg:
134 sys.stderr.write(
'%s: read failed: %r\n' % (filename, msg))
137 except IOError
as msg:
138 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
141 except IOError
as msg:
142 sys.stderr.write(
'%s: close failed: %r\n' % (tempname, msg))
145 except OSError
as msg:
146 sys.stderr.write(
'%s: remove failed: %r\n' % (tempname, msg))
152 except IOError
as msg:
153 sys.stderr.write(
'%s: write failed: %r\n' % (tempname, msg))
156 except IOError
as msg:
157 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
160 except IOError
as msg:
161 sys.stderr.write(
'%s: close failed: %r\n' % (tempname, msg))
164 except OSError
as msg:
165 sys.stderr.write(
'%s: remove failed: %r\n' % (tempname, msg))
170 except IOError
as msg:
171 sys.stderr.write(
'%s: close failed: %r\n' % (filename, msg))
174 except IOError
as msg:
175 sys.stderr.write(
'%s: close failed: %r\n' % (tempname, msg))
178 except OSError
as msg:
179 sys.stderr.write(
'%s: remove failed: %r\n' % (tempname, msg))
183 except IOError
as msg:
184 sys.stderr.write(
'%s: close failed: %r\n' % (tempname, msg))
187 except OSError
as msg:
188 sys.stderr.write(
'%s: remove failed: %r\n' % (tempname, msg))
192 statbuf = os.stat(filename)
193 os.chmod(tempname, statbuf[ST_MODE] & 0o7777)
194 except OSError
as msg:
195 sys.stderr.write(
'%s: warning, chmod failed: %r\n' % (tempname, msg))
199 except OSError
as msg:
200 sys.stderr.write(
'%s: remove failed: %r\n' % (filename, msg))
203 except OSError
as msg:
204 sys.stderr.write(
'%s: remove failed: %r\n' % (tempname, msg))
208 os.rename(tempname, filename)
209 except OSError
as msg:
210 sys.stderr.write(
'%s: rename failed: %r\n' % (filename, msg))
215if __name__ ==
'__main__':
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
def pathfix(filename=None, verbose=False, python_interpreter='/usr/bin/python')