- Notifications
You must be signed in to change notification settings - Fork 31.8k
/
Copy pathmkreal.py
executable file
·66 lines (57 loc) · 1.59 KB
/
mkreal.py
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
#! /usr/bin/env python
# mkreal
#
# turn a symlink to a directory into a real directory
importsys
importos
fromstatimport*
join=os.path.join
error='mkreal error'
BUFSIZE=32*1024
defmkrealfile(name):
st=os.stat(name) # Get the mode
mode=S_IMODE(st[ST_MODE])
linkto=os.readlink(name) # Make sure again it's a symlink
f_in=open(name, 'r') # This ensures it's a file
os.unlink(name)
f_out=open(name, 'w')
while1:
buf=f_in.read(BUFSIZE)
ifnotbuf: break
f_out.write(buf)
delf_out# Flush data to disk before changing mode
os.chmod(name, mode)
defmkrealdir(name):
st=os.stat(name) # Get the mode
mode=S_IMODE(st[ST_MODE])
linkto=os.readlink(name)
files=os.listdir(name)
os.unlink(name)
os.mkdir(name, mode)
os.chmod(name, mode)
linkto=join(os.pardir, linkto)
#
forfilenameinfiles:
iffilenamenotin (os.curdir, os.pardir):
os.symlink(join(linkto, filename), join(name, filename))
defmain():
sys.stdout=sys.stderr
progname=os.path.basename(sys.argv[0])
ifprogname=='-c': progname='mkreal'
args=sys.argv[1:]
ifnotargs:
print'usage:', progname, 'path ...'
sys.exit(2)
status=0
fornameinargs:
ifnotos.path.islink(name):
printprogname+':', name+':', 'not a symlink'
status=1
else:
ifos.path.isdir(name):
mkrealdir(name)
else:
mkrealfile(name)
sys.exit(status)
if__name__=='__main__':
main()