[PATCH 1 of 2 issue3059 v2] util: add progress callback support to copyfiles
Augie Fackler
raf at durin42.com
Tue Mar 24 15:42:18 CDT 2015
On Thu, Mar 19, 2015 at 1:34 PM, Martin von Zweigbergk
<martinvonz at google.com> wrote:
>
>
> On Thu, Mar 19, 2015 at 10:07 AM Augie Fackler <raf at durin42.com> wrote:
>>
>> # HG changeset patch
>> # User Augie Fackler <augie at google.com>
>> # Date 1426775062 14400
>> # Thu Mar 19 10:24:22 2015 -0400
>> # Node ID 56319892a54a2694762861f22be751fd28a25813
>> # Parent 5cb459dc32d209653a3e5d77749cf989ab9a51e4
>> util: add progress callback support to copyfiles
>>
>> diff --git a/mercurial/hg.py b/mercurial/hg.py
>> --- a/mercurial/hg.py
>> +++ b/mercurial/hg.py
>> @@ -258,8 +258,8 @@ def copystore(ui, srcrepo, destpath):
>> lockfile = os.path.join(dstbase, "lock")
>> # lock to avoid premature writing to the target
>> destlock = lock.lock(dstvfs, lockfile)
>> - hardlink, n = util.copyfiles(srcvfs.join(f),
>> dstvfs.join(f),
>> - hardlink)
>> + hardlink, n, topic = util.copyfiles(
>> + srcvfs.join(f), dstvfs.join(f), hardlink)
>> num += n
>> if hardlink:
>> ui.debug("linked %d files\n" % num)
>> diff --git a/mercurial/util.py b/mercurial/util.py
>> --- a/mercurial/util.py
>> +++ b/mercurial/util.py
>> @@ -739,20 +739,36 @@ def copyfile(src, dest, hardlink=False):
>> except shutil.Error, inst:
>> raise Abort(str(inst))
>>
>> -def copyfiles(src, dst, hardlink=None):
>> - """Copy a directory tree using hardlinks if possible"""
>> +def copyfiles(src, dst, hardlink=None,
>> + progress=lambda t, pos: None, poffset=None):
>> + """Copy a directory tree using hardlinks if possible.
>> +
>> + If progress could be split across multiple copyfiles calls,
>> + poffset. Otherwise, copyfiles() will close its progress topic.
>> + """
>> + if poffset is None:
>> + closeprog = True
>> + poffset = 0
>> + else:
>> + closeprog = False
>> + num = 0
>>
>> if hardlink is None:
>> hardlink = (os.stat(src).st_dev ==
>> os.stat(os.path.dirname(dst)).st_dev)
>> + if hardlink:
>> + topic = _('linking')
>> + else:
>> + topic = _('copying')
>>
>> - num = 0
>> if os.path.isdir(src):
>> os.mkdir(dst)
>> for name, kind in osutil.listdir(src):
>> srcname = os.path.join(src, name)
>> dstname = os.path.join(dst, name)
>> - hardlink, n = copyfiles(srcname, dstname, hardlink)
>> + hardlink, n, junk_topic = copyfiles(srcname, dstname,
>> hardlink,
>> + progress=progress,
>> + poffset=poffset + num)
>
>
> Dropping the poffset and closeprog stuff and passing something like the
> following in the recursive call seems simpler, but I don't know if it's
> noticeably slower.
I like this. Sending a v3.
>
> def subprogress(topic, pos):
> if pos is not None:
> progress(topic, num + pos)
>
>
>>
>> num += n
>> else:
>> if hardlink:
>> @@ -764,8 +780,12 @@ def copyfiles(src, dst, hardlink=None):
>> else:
>> shutil.copy(src, dst)
>> num += 1
>> + progress(topic, poffset + num)
>>
>> - return hardlink, num
>> + if closeprog:
>> + progress(topic, None)
>> +
>> + return hardlink, num, topic
>>
>> _winreservednames = '''con prn aux nul
>> com1 com2 com3 com4 com5 com6 com7 com8 com9
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at selenic.com
>> http://selenic.com/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list