[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