comparison mercurial/util.py @ 31724:456efd1b51fd

hardlink: duplicate hardlink detection for copying files and directories A later patch will change one of them so they diverge.
author Jun Wu <quark@fb.com>
date Wed, 29 Mar 2017 12:26:46 -0700
parents bf64449b2779
children dea2a17cbfd0
comparison
equal deleted inserted replaced
31723:bf64449b2779 31724:456efd1b51fd
1124 1124
1125 def copyfiles(src, dst, hardlink=None, progress=lambda t, pos: None): 1125 def copyfiles(src, dst, hardlink=None, progress=lambda t, pos: None):
1126 """Copy a directory tree using hardlinks if possible.""" 1126 """Copy a directory tree using hardlinks if possible."""
1127 num = 0 1127 num = 0
1128 1128
1129 if hardlink is None:
1130 hardlink = (os.stat(src).st_dev ==
1131 os.stat(os.path.dirname(dst)).st_dev)
1132
1133 gettopic = lambda: hardlink and _('linking') or _('copying') 1129 gettopic = lambda: hardlink and _('linking') or _('copying')
1134 topic = gettopic()
1135 1130
1136 if os.path.isdir(src): 1131 if os.path.isdir(src):
1132 if hardlink is None:
1133 hardlink = (os.stat(src).st_dev ==
1134 os.stat(os.path.dirname(dst)).st_dev)
1135 topic = gettopic()
1137 os.mkdir(dst) 1136 os.mkdir(dst)
1138 for name, kind in osutil.listdir(src): 1137 for name, kind in osutil.listdir(src):
1139 srcname = os.path.join(src, name) 1138 srcname = os.path.join(src, name)
1140 dstname = os.path.join(dst, name) 1139 dstname = os.path.join(dst, name)
1141 def nprog(t, pos): 1140 def nprog(t, pos):
1142 if pos is not None: 1141 if pos is not None:
1143 return progress(t, pos + num) 1142 return progress(t, pos + num)
1144 hardlink, n = copyfiles(srcname, dstname, hardlink, progress=nprog) 1143 hardlink, n = copyfiles(srcname, dstname, hardlink, progress=nprog)
1145 num += n 1144 num += n
1146 else: 1145 else:
1146 if hardlink is None:
1147 hardlink = (os.stat(src).st_dev ==
1148 os.stat(os.path.dirname(dst)).st_dev)
1149 topic = gettopic()
1150
1147 if hardlink: 1151 if hardlink:
1148 try: 1152 try:
1149 oslink(src, dst) 1153 oslink(src, dst)
1150 except (IOError, OSError): 1154 except (IOError, OSError):
1151 hardlink = False 1155 hardlink = False