mercurial/upgrade_utils/engine.py
changeset 50487 0935b9db21b6
parent 50486 2eb7f0b5a499
child 50488 5f636e0fec4a
equal deleted inserted replaced
50486:2eb7f0b5a499 50487:0935b9db21b6
    45             replace=True,
    45             replace=True,
    46         )
    46         )
    47     return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata)
    47     return sidedatamod.get_sidedata_helpers(srcrepo, dstrepo._wanted_sidedata)
    48 
    48 
    49 
    49 
    50 def _revlogfrompath(repo, rl_type, path):
    50 def _revlog_from_store_entry(repo, entry):
    51     """Obtain a revlog from a repo path.
    51     """Obtain a revlog from a repo store entry.
    52 
    52 
    53     An instance of the appropriate class is returned.
    53     An instance of the appropriate class is returned.
    54     """
    54     """
       
    55     rl_type = entry.revlog_type
       
    56     path = entry.unencoded_path
    55     if rl_type & store.FILEFLAGS_CHANGELOG:
    57     if rl_type & store.FILEFLAGS_CHANGELOG:
    56         return changelog.changelog(repo.svfs)
    58         return changelog.changelog(repo.svfs)
    57     elif rl_type & store.FILEFLAGS_MANIFESTLOG:
    59     elif rl_type & store.FILEFLAGS_MANIFESTLOG:
    58         mandir = b''
    60         mandir = b''
    59         if b'/' in path:
    61         if b'/' in path:
    70             raise error.Abort(msg)
    72             raise error.Abort(msg)
    71         path = path_part[1]
    73         path = path_part[1]
    72         return filelog.filelog(repo.svfs, path)
    74         return filelog.filelog(repo.svfs, path)
    73 
    75 
    74 
    76 
    75 def _copyrevlog(tr, destrepo, oldrl, rl_type, unencodedname):
    77 def _copyrevlog(tr, destrepo, oldrl, entry):
    76     """copy all relevant files for `oldrl` into `destrepo` store
    78     """copy all relevant files for `oldrl` into `destrepo` store
    77 
    79 
    78     Files are copied "as is" without any transformation. The copy is performed
    80     Files are copied "as is" without any transformation. The copy is performed
    79     without extra checks. Callers are responsible for making sure the copied
    81     without extra checks. Callers are responsible for making sure the copied
    80     content is compatible with format of the destination repository.
    82     content is compatible with format of the destination repository.
    81     """
    83     """
    82     oldrl = getattr(oldrl, '_revlog', oldrl)
    84     oldrl = getattr(oldrl, '_revlog', oldrl)
    83     newrl = _revlogfrompath(destrepo, rl_type, unencodedname)
    85     newrl = _revlog_from_store_entry(destrepo, entry)
    84     newrl = getattr(newrl, '_revlog', newrl)
    86     newrl = getattr(newrl, '_revlog', newrl)
    85 
    87 
    86     oldvfs = oldrl.opener
    88     oldvfs = oldrl.opener
    87     newvfs = newrl.opener
    89     newvfs = newrl.opener
    88     oldindex = oldvfs.join(oldrl._indexfile)
    90     oldindex = oldvfs.join(oldrl._indexfile)
    96     util.copyfile(oldindex, newindex)
    98     util.copyfile(oldindex, newindex)
    97     copydata = oldrl.opener.exists(oldrl._datafile)
    99     copydata = oldrl.opener.exists(oldrl._datafile)
    98     if copydata:
   100     if copydata:
    99         util.copyfile(olddata, newdata)
   101         util.copyfile(olddata, newdata)
   100 
   102 
   101     if rl_type & store.FILEFLAGS_FILELOG:
   103     if entry.revlog_type & store.FILEFLAGS_FILELOG:
       
   104         unencodedname = entry.unencoded_path
   102         destrepo.svfs.fncache.add(unencodedname)
   105         destrepo.svfs.fncache.add(unencodedname)
   103         if copydata:
   106         if copydata:
   104             destrepo.svfs.fncache.add(unencodedname[:-2] + b'.d')
   107             destrepo.svfs.fncache.add(unencodedname[:-2] + b'.d')
   105 
   108 
   106 
   109 
   131 def _perform_clone(
   134 def _perform_clone(
   132     ui,
   135     ui,
   133     dstrepo,
   136     dstrepo,
   134     tr,
   137     tr,
   135     old_revlog,
   138     old_revlog,
   136     rl_type,
   139     entry,
   137     unencoded,
       
   138     upgrade_op,
   140     upgrade_op,
   139     sidedata_helpers,
   141     sidedata_helpers,
   140     oncopiedrevision,
   142     oncopiedrevision,
   141 ):
   143 ):
   142     """returns the new revlog object created"""
   144     """returns the new revlog object created"""
   143     newrl = None
   145     newrl = None
   144     if matchrevlog(upgrade_op.revlogs_to_process, rl_type):
   146     revlog_path = entry.unencoded_path
       
   147     if matchrevlog(upgrade_op.revlogs_to_process, entry.revlog_type):
   145         ui.note(
   148         ui.note(
   146             _(b'cloning %d revisions from %s\n') % (len(old_revlog), unencoded)
   149             _(b'cloning %d revisions from %s\n')
   147         )
   150             % (len(old_revlog), revlog_path)
   148         newrl = _revlogfrompath(dstrepo, rl_type, unencoded)
   151         )
       
   152         newrl = _revlog_from_store_entry(dstrepo, entry)
   149         old_revlog.clone(
   153         old_revlog.clone(
   150             tr,
   154             tr,
   151             newrl,
   155             newrl,
   152             addrevisioncb=oncopiedrevision,
   156             addrevisioncb=oncopiedrevision,
   153             deltareuse=upgrade_op.delta_reuse_mode,
   157             deltareuse=upgrade_op.delta_reuse_mode,
   154             forcedeltabothparents=upgrade_op.force_re_delta_both_parents,
   158             forcedeltabothparents=upgrade_op.force_re_delta_both_parents,
   155             sidedata_helpers=sidedata_helpers,
   159             sidedata_helpers=sidedata_helpers,
   156         )
   160         )
   157     else:
   161     else:
   158         msg = _(b'blindly copying %s containing %i revisions\n')
   162         msg = _(b'blindly copying %s containing %i revisions\n')
   159         ui.note(msg % (unencoded, len(old_revlog)))
   163         ui.note(msg % (revlog_path, len(old_revlog)))
   160         _copyrevlog(tr, dstrepo, old_revlog, rl_type, unencoded)
   164         _copyrevlog(tr, dstrepo, old_revlog, entry)
   161 
   165 
   162         newrl = _revlogfrompath(dstrepo, rl_type, unencoded)
   166         newrl = _revlog_from_store_entry(dstrepo, entry)
   163     return newrl
   167     return newrl
   164 
   168 
   165 
   169 
   166 def _clonerevlogs(
   170 def _clonerevlogs(
   167     ui,
   171     ui,
   201     # Perform a pass to collect metadata. This validates we can open all
   205     # Perform a pass to collect metadata. This validates we can open all
   202     # source files and allows a unified progress bar to be displayed.
   206     # source files and allows a unified progress bar to be displayed.
   203     for entry in alldatafiles:
   207     for entry in alldatafiles:
   204         if not (entry.is_revlog and entry.is_revlog_main):
   208         if not (entry.is_revlog and entry.is_revlog_main):
   205             continue
   209             continue
   206         unencoded = entry.unencoded_path
   210 
   207 
   211         rl = _revlog_from_store_entry(srcrepo, entry)
   208         rl = _revlogfrompath(srcrepo, entry.revlog_type, unencoded)
       
   209 
   212 
   210         info = rl.storageinfo(
   213         info = rl.storageinfo(
   211             exclusivefiles=True,
   214             exclusivefiles=True,
   212             revisionscount=True,
   215             revisionscount=True,
   213             trackedsize=True,
   216             trackedsize=True,
   221         srcsize += datasize
   224         srcsize += datasize
   222         srcrawsize += rawsize
   225         srcrawsize += rawsize
   223 
   226 
   224         # This is for the separate progress bars.
   227         # This is for the separate progress bars.
   225         if entry.revlog_type & store.FILEFLAGS_CHANGELOG:
   228         if entry.revlog_type & store.FILEFLAGS_CHANGELOG:
   226             changelogs[unencoded] = entry.revlog_type
   229             changelogs[entry.target_id] = entry
   227             crevcount += len(rl)
   230             crevcount += len(rl)
   228             csrcsize += datasize
   231             csrcsize += datasize
   229             crawsize += rawsize
   232             crawsize += rawsize
   230         elif entry.revlog_type & store.FILEFLAGS_MANIFESTLOG:
   233         elif entry.revlog_type & store.FILEFLAGS_MANIFESTLOG:
   231             manifests[unencoded] = entry.revlog_type
   234             manifests[entry.target_id] = entry
   232             mcount += 1
   235             mcount += 1
   233             mrevcount += len(rl)
   236             mrevcount += len(rl)
   234             msrcsize += datasize
   237             msrcsize += datasize
   235             mrawsize += rawsize
   238             mrawsize += rawsize
   236         elif entry.revlog_type & store.FILEFLAGS_FILELOG:
   239         elif entry.revlog_type & store.FILEFLAGS_FILELOG:
   237             filelogs[unencoded] = entry.revlog_type
   240             filelogs[entry.target_id] = entry
   238             fcount += 1
   241             fcount += 1
   239             frevcount += len(rl)
   242             frevcount += len(rl)
   240             fsrcsize += datasize
   243             fsrcsize += datasize
   241             frawsize += rawsize
   244             frawsize += rawsize
   242         else:
   245         else:
   277             util.bytecount(fsrcsize),
   280             util.bytecount(fsrcsize),
   278             util.bytecount(frawsize),
   281             util.bytecount(frawsize),
   279         )
   282         )
   280     )
   283     )
   281     progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount)
   284     progress = srcrepo.ui.makeprogress(_(b'file revisions'), total=frevcount)
   282     for unencoded, rl_type in sorted(filelogs.items()):
   285     for target_id, entry in sorted(filelogs.items()):
   283         oldrl = _revlogfrompath(srcrepo, rl_type, unencoded)
   286         oldrl = _revlog_from_store_entry(srcrepo, entry)
   284 
   287 
   285         newrl = _perform_clone(
   288         newrl = _perform_clone(
   286             ui,
   289             ui,
   287             dstrepo,
   290             dstrepo,
   288             tr,
   291             tr,
   289             oldrl,
   292             oldrl,
   290             rl_type,
   293             entry,
   291             unencoded,
       
   292             upgrade_op,
   294             upgrade_op,
   293             sidedata_helpers,
   295             sidedata_helpers,
   294             oncopiedrevision,
   296             oncopiedrevision,
   295         )
   297         )
   296         info = newrl.storageinfo(storedsize=True)
   298         info = newrl.storageinfo(storedsize=True)
   319     if progress:
   321     if progress:
   320         progress.complete()
   322         progress.complete()
   321     progress = srcrepo.ui.makeprogress(
   323     progress = srcrepo.ui.makeprogress(
   322         _(b'manifest revisions'), total=mrevcount
   324         _(b'manifest revisions'), total=mrevcount
   323     )
   325     )
   324     for unencoded, rl_type in sorted(manifests.items()):
   326     for target_id, entry in sorted(manifests.items()):
   325         oldrl = _revlogfrompath(srcrepo, rl_type, unencoded)
   327         oldrl = _revlog_from_store_entry(srcrepo, entry)
   326         newrl = _perform_clone(
   328         newrl = _perform_clone(
   327             ui,
   329             ui,
   328             dstrepo,
   330             dstrepo,
   329             tr,
   331             tr,
   330             oldrl,
   332             oldrl,
   331             rl_type,
   333             entry,
   332             unencoded,
       
   333             upgrade_op,
   334             upgrade_op,
   334             sidedata_helpers,
   335             sidedata_helpers,
   335             oncopiedrevision,
   336             oncopiedrevision,
   336         )
   337         )
   337         info = newrl.storageinfo(storedsize=True)
   338         info = newrl.storageinfo(storedsize=True)
   359     if progress:
   360     if progress:
   360         progress.complete()
   361         progress.complete()
   361     progress = srcrepo.ui.makeprogress(
   362     progress = srcrepo.ui.makeprogress(
   362         _(b'changelog revisions'), total=crevcount
   363         _(b'changelog revisions'), total=crevcount
   363     )
   364     )
   364     for unencoded, rl_type in sorted(changelogs.items()):
   365     for target_id, entry in sorted(changelogs.items()):
   365         oldrl = _revlogfrompath(srcrepo, rl_type, unencoded)
   366         oldrl = _revlog_from_store_entry(srcrepo, entry)
   366         newrl = _perform_clone(
   367         newrl = _perform_clone(
   367             ui,
   368             ui,
   368             dstrepo,
   369             dstrepo,
   369             tr,
   370             tr,
   370             oldrl,
   371             oldrl,
   371             rl_type,
   372             entry,
   372             unencoded,
       
   373             upgrade_op,
   373             upgrade_op,
   374             sidedata_helpers,
   374             sidedata_helpers,
   375             oncopiedrevision,
   375             oncopiedrevision,
   376         )
   376         )
   377         info = newrl.storageinfo(storedsize=True)
   377         info = newrl.storageinfo(storedsize=True)