Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/util.py @ 34096:1104718fb090
checknlink: use a random temp file name for checking
Previously, if `.hg/store/00manifest.d.hgtmp1` exists, hg will copy the
entire `00manifest.d` every time when appending new manifest revisions.
That could happen if Mercurial or the machine crashed when `.hgtmp1` was
just created but not deleted yet.
This patch changes the fixed name to a random generated name. To be
consistent with D468, `~` suffix was used.
Differential Revision: https://phab.mercurial-scm.org/D611
author | Jun Wu <quark@fb.com> |
---|---|
date | Fri, 01 Sep 2017 17:09:53 -0700 |
parents | 30535fe47e78 |
children | 6c5cdb02f2f9 |
comparison
equal
deleted
inserted
replaced
34095:b4b196092cc3 | 34096:1104718fb090 |
---|---|
1455 def checknlink(testfile): | 1455 def checknlink(testfile): |
1456 '''check whether hardlink count reporting works properly''' | 1456 '''check whether hardlink count reporting works properly''' |
1457 | 1457 |
1458 # testfile may be open, so we need a separate file for checking to | 1458 # testfile may be open, so we need a separate file for checking to |
1459 # work around issue2543 (or testfile may get lost on Samba shares) | 1459 # work around issue2543 (or testfile may get lost on Samba shares) |
1460 f1 = testfile + ".hgtmp1" | 1460 f1, f2, fd = None, None, None |
1461 if os.path.lexists(f1): | |
1462 return False | |
1463 try: | 1461 try: |
1464 posixfile(f1, 'w').close() | 1462 fd, f1 = tempfile.mkstemp(prefix='.%s-' % os.path.basename(testfile), |
1465 except IOError: | 1463 suffix='1~', dir=os.path.dirname(testfile)) |
1466 try: | 1464 os.close(fd) |
1467 os.unlink(f1) | 1465 fd = None |
1468 except OSError: | 1466 f2 = '%s2~' % f1[:-2] |
1469 pass | 1467 |
1470 return False | |
1471 | |
1472 f2 = testfile + ".hgtmp2" | |
1473 fd = None | |
1474 try: | |
1475 oslink(f1, f2) | 1468 oslink(f1, f2) |
1476 # nlinks() may behave differently for files on Windows shares if | 1469 # nlinks() may behave differently for files on Windows shares if |
1477 # the file is open. | 1470 # the file is open. |
1478 fd = posixfile(f2) | 1471 fd = posixfile(f2) |
1479 return nlinks(f2) > 1 | 1472 return nlinks(f2) > 1 |
1482 finally: | 1475 finally: |
1483 if fd is not None: | 1476 if fd is not None: |
1484 fd.close() | 1477 fd.close() |
1485 for f in (f1, f2): | 1478 for f in (f1, f2): |
1486 try: | 1479 try: |
1487 os.unlink(f) | 1480 if f is not None: |
1481 os.unlink(f) | |
1488 except OSError: | 1482 except OSError: |
1489 pass | 1483 pass |
1490 | 1484 |
1491 def endswithsep(path): | 1485 def endswithsep(path): |
1492 '''Check path ends with os.sep or os.altsep.''' | 1486 '''Check path ends with os.sep or os.altsep.''' |