Mercurial > public > mercurial-scm > hg
comparison mercurial/win32.py @ 11992:ccd8e592c3c5 stable
win32: remove useless lstat() fallback in nlinks()
The fallback was introduced by 3b4f05ff3130 at the same time than
nlinks(). Apparently it only handles the case where target path
does not exist. Just raise IOError directly.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Thu, 19 Aug 2010 22:51:09 +0200 |
parents | 50523b4407f6 |
children | 4f8067c94729 |
comparison
equal
deleted
inserted
replaced
11991:50523b4407f6 | 11992:ccd8e592c3c5 |
---|---|
32 """Return number of hardlinks for the given file.""" | 32 """Return number of hardlinks for the given file.""" |
33 try: | 33 try: |
34 fh = win32file.CreateFile(pathname, | 34 fh = win32file.CreateFile(pathname, |
35 win32file.GENERIC_READ, win32file.FILE_SHARE_READ, | 35 win32file.GENERIC_READ, win32file.FILE_SHARE_READ, |
36 None, win32file.OPEN_EXISTING, 0, None) | 36 None, win32file.OPEN_EXISTING, 0, None) |
37 try: | |
38 return win32file.GetFileInformationByHandle(fh) | |
39 finally: | |
40 fh.Close() | |
41 except pywintypes.error: | 37 except pywintypes.error: |
42 return None | 38 raise OSError(errno.ENOENT, 'The system cannot find the file specified') |
39 try: | |
40 return win32file.GetFileInformationByHandle(fh) | |
41 finally: | |
42 fh.Close() | |
43 | 43 |
44 def nlinks(pathname): | 44 def nlinks(pathname): |
45 """Return number of hardlinks for the given file.""" | 45 """Return number of hardlinks for the given file.""" |
46 res = _getfileinfo(pathname) | 46 links = _getfileinfo(pathname)[7] |
47 if res is not None: | |
48 links = res[7] | |
49 else: | |
50 links = os.lstat(pathname).st_nlink | |
51 if links < 2: | 47 if links < 2: |
52 # Known to be wrong for most network drives | 48 # Known to be wrong for most network drives |
53 dirname = os.path.dirname(pathname) | 49 dirname = os.path.dirname(pathname) |
54 if not dirname: | 50 if not dirname: |
55 dirname = '.' | 51 dirname = '.' |
62 def samefile(fpath1, fpath2): | 58 def samefile(fpath1, fpath2): |
63 """Returns whether fpath1 and fpath2 refer to the same file. This is only | 59 """Returns whether fpath1 and fpath2 refer to the same file. This is only |
64 guaranteed to work for files, not directories.""" | 60 guaranteed to work for files, not directories.""" |
65 res1 = _getfileinfo(fpath1) | 61 res1 = _getfileinfo(fpath1) |
66 res2 = _getfileinfo(fpath2) | 62 res2 = _getfileinfo(fpath2) |
67 if res1 is not None and res2 is not None: | 63 # Index 4 is the volume serial number, and 8 and 9 contain the file ID |
68 # Index 4 is the volume serial number, and 8 and 9 contain the file ID | 64 return res1[4] == res2[4] and res1[8] == res2[8] and res1[9] == res2[9] |
69 return res1[4] == res2[4] and res1[8] == res2[8] and res1[9] == res2[9] | |
70 else: | |
71 return False | |
72 | 65 |
73 def samedevice(fpath1, fpath2): | 66 def samedevice(fpath1, fpath2): |
74 """Returns whether fpath1 and fpath2 are on the same device. This is only | 67 """Returns whether fpath1 and fpath2 are on the same device. This is only |
75 guaranteed to work for files, not directories.""" | 68 guaranteed to work for files, not directories.""" |
76 res1 = _getfileinfo(fpath1) | 69 res1 = _getfileinfo(fpath1) |
77 res2 = _getfileinfo(fpath2) | 70 res2 = _getfileinfo(fpath2) |
78 if res1 is not None and res2 is not None: | 71 return res1[4] == res2[4] |
79 return res1[4] == res2[4] | |
80 else: | |
81 return False | |
82 | 72 |
83 def testpid(pid): | 73 def testpid(pid): |
84 '''return True if pid is still running or unable to | 74 '''return True if pid is still running or unable to |
85 determine, False otherwise''' | 75 determine, False otherwise''' |
86 try: | 76 try: |