o ]LbvW@s ddlmZddlZddlZddlmZddlmZddlm Z m Z m Z m Z m Z mZmZmZmZmZmZddlmZmZmZmZdd lmZd d Zd d ZddZdZ dZ!dZ"e#e e!e"gZ$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*dd Z+d!d"Z,d#d$Z-dS)%)absolute_importN)_)getattr) changelogerrorfilelogmanifestmetadatapycompat requirementsscmutilstoreutilvfs) constantsflagutilnodemapsidedata)actionscCsT|jdd}tjp | }|s#|jtjtjtjft ||t j ddt ||jS)Ns experimentalsworker.repository-upgradeT)replace)ui configboolr iswindowsregister_sidedata_computer revlogconstKIND_CHANGELOG sidedatamodSD_FILESr _get_worker_sidedata_adderrREVIDX_HASCOPIESINFOget_sidedata_helpers_wanted_sidedata)srcrepodstrepouse_w sequentialr(@/usr/lib/python3/dist-packages/mercurial/upgrade_utils/engine.pyr"%s  r"cCs|tj@r t|jS|tj@r(d}d|vr|ddd}tj|j|j|dS|ddd dd}t |dkrGt d}||;}t ||d}t|j|S) z]Obtain a revlog from a repo path. An instance of the appropriate class is returned. /rr)tree.rs)cannot recognize revlog from filename: %s)rFILEFLAGS_CHANGELOGrsvfsFILEFLAGS_MANIFESTLOGrsplitr manifestrevlog nodeconstantssplitlenrrAbortr)reporl_typepathmandir path_partmsgr(r(r)_revlogfrompath4s      r=c Cst|d|}t|||}t|d|}|j}|j}||j}||j} ||j} ||j} ||jdWdn1sAwYt|| |j|j} | r[t| | |t j @rx|j j || rz|j j |ddddSdSdS)a copy all relevant files for `oldrl` into `destrepo` store Files are copied "as is" without any transformation. The copy is performed without extra checks. Callers are responsible for making sure the copied content is compatible with format of the destination repository. _revlogwNs.d)rr=openerjoin _indexfile _datafilercopyfileexistsrFILEFLAGS_FILELOGr/fncacheadd) trdestrepooldrlr8 unencodednamenewrloldvfsnewvfsoldindexnewindexolddatanewdatacopydatar(r(r) _copyrevlogMs,          rVs changelogsmanifests all-filelogscCs:|tj@r t|vS|tj@rt|vS|tj@sJt|vS)zcheck if a revlog is selected for cloning. In other words, are there any updates which need to be done on revlog or it can be blindly copied. The store entry is checked against the passed filter)rr.UPGRADE_CHANGELOGr0UPGRADE_MANIFESTrGUPGRADE_FILELOGS) revlogfilterr8r(r(r) matchrevlogvs  r[c Csd} t|j|r*|tdt||ft|||} |j|| ||j|j|d| Std} || |t|ft |||||t|||} | S)z%returns the new revlog object createdNscloning %d revisions from %s ) addrevisioncb deltareuseforcedeltabothparentssidedata_helperss+blindly copying %s containing %i revisions ) r[revlogs_to_processnoterr5r=clonedelta_reuse_modeforce_re_delta_both_parentsrV) rr%rJ old_revlogr8 unencoded upgrade_opr_oncopiedrevisionrNr<r(r(r)_perform_clones(   ric' sPd}d}d}d}d} d} d} d} d} d}d}d}d}d}d}d}d}d}t|j}i}i}i}|D]\}}}|tj@s>q3d}||vrEq3t|||}|jddddd} || dpZd7}| dpad}!| dpgd}"||!7}||"7}|tj@r||f||<|t|7}||!7}||"7}q3|tj@r||f||<|d7}|t|7}||!7}||"7}q3|tj @r||f||<| d7} | t|7} | |!7} | |"7} q3t d q3|sd S| t d || ||f| t d t|t|fd fd d}#t||}$| t d| | t| t| f|jjt d| dt|D]"\}\}}%t||||%||||$|# }&|&jdd} | | dp=d7} q| t d| | t| | f| t d||t|t|frl|jjt d|dt|D]"\}\}}%t||||%||||$|# }&|&jdd} || dpd7}q|| t d||t||f| t d|t|t|frɈ|jjt d|dt|D]"\}\}}%t||||%||||$|# }&|&jdd} || dpd7}qو| t d|t||f| ||}| t d|t||fd S)zCopy revlogs between 2 repos.r)sundo.backup.00changelog.isundo.backup.00manifest.iT)exclusivefilesrevisionscount trackedsize storedsizesrevisionscounts storedsizes trackedsizersunknown revlog typeNsPmigrating %d total revisions (%d in filelogs, %d in manifests, %d in changelog) s'migrating %s in store; %s tracked data cs dS)N) increment)rlrevnodeprogressr(r)rhs z'_clonerevlogs..oncopiedrevisionsMmigrating %d filelogs containing %d revisions (%s in store; %s tracked data) sfile revisions)total)rmsOfinished migrating %d filelog revisions across %d filelogs; change in size: %s sNmigrating %d manifests containing %d revisions (%s in store; %s tracked data) smanifest revisionssQfinished migrating %d manifest revisions across %d manifests; change in size: %s sKmigrating changelog containing %d revisions (%s in store; %s tracked data) schangelog revisionss>finished migrating %d changelog revisions; change in size: %s sFfinished migrating %d total revisions; total change in store size: %s )listrwalkFILEFLAGS_REVLOG_MAINr= storageinfor.r5r0rGrProgrammingErrorstatusrr bytecountr"r makeprogresssorteditemsricomplete)'rr$r%rJrgrevcountsrcsize srcrawsizedstsizefcount frevcountfsrcsizefrawsizefdstsizemcount mrevcountmsrcsizemrawsizemdstsize crevcountcsrcsizecrawsizecdstsize alldatafiles manifests changelogsfilelogsr8rfsize skip_undoroinfodatasizerawsizerhr_rLrNr(rrr) _clonerevlogss|                             rccs`t|jjjdddD]!\}}}t|durq |drq |tjkr%q |dvr*q |Vq dS)zOyields files which should be copied to destination after revlogs are clonedr*T)statNsundo)slocksfncache)r}rrreaddir revlog_type startswithrS_IFREG)r$r9kindstr(r(r) _files_to_copy_post_revlog_clones   rcCs@|jrt|j|dn|jjdddt|j|jdS)aReplace the stores after current repository is upgraded Creates a backup of current repository store at backup path Replaces upgraded store files in current repo from upgraded one Arguments: currentrepo: repo object of current repository upgradedrepo: repo object of the upgraded data backupvfs: vfs object for the backup path upgrade_op: upgrade operation object to be used to decide what all is upgraded sstoreT)forciblyN) backup_storerrenamespathrBrrmtree) currentrepo upgradedrepo backupvfsrgr(r(r)_replacestoressrcCsdS)zHook point for extensions to perform additional actions during upgrade. This function is called after revlogs and store files have been copied but before the new store is swapped into the original location. Nr()rr$r%r r(r(r)finishdatamigrationsrcCs8|sJ|s Jd}d}|tdtj|jvr3|tdt|||dd|jtjtj|jvrO|tdt|||dd|jtjtj|jvrl|tdt |||dd |jtjntj|jvr|td t |||d d |jtj|js|jsdS|j r|td t ||j |St|jd krd|jvr|js|td|d"}|}|j}tj||ddtj||jjjddWdn1swYt ||j |St|jd krDdd|jDrD|jsD|td|d }|}|j}t|||t|||jjjWdn 1s6wYt ||j |S|d}t|||||Wdn 1s]wYt|D]#} |jtd| |jj| } |jj| } tj | | ddqft!|||t"|td|j#rt$j%d|j&d}t'(|}t |j(d|d|tdt ||j"dhB|td|j#r|td||tdt)} t*||||t)| } |td | |td!t ||j |j#r|dusJ|+d"|S)#ayDo the low-level work of upgrading a repository. The upgrade is effectively performed as a copy between a source repository and a temporary destination repository. The source repository is unmodified for as long as possible so the upgrade can abort at any time without causing loss of service for readers and without corrupting the source repository. NsP(it is safe to interrupt this process any time before data migration completes) s!upgrading to dirstate-v2 from v1 sv1v2s#downgrading from dirstate-v2 to v1 s"create dirstate-tracked-hint file T)rIs"remove dirstate-tracked-hint file Fs"upgrading repository requirements rpersistent-nodemaps7upgrading repository to use persistent nodemap feature supgrade)forcecSsg|] }|jdkr|qS)r)name).0xr(r(r) s  zupgrade..s=downgrading repository to not use persistent nodemap feature s copying %s )copystats.data fully upgraded in a temporary repository upgradebackup.prefixdirrequiress\marking source repository as being upgraded; clients will be unable to read from repository supgradeinprogresss*starting in-place swap of repository data 'replaced files will be backed up at %s sreplacing store... sCstore replacement complete; repository was inconsistent for %0.1fs sBfinalizing requirements file and making repository readable again s store/lock), currentwlockrzrupgrade_actions dirstatev2upgrade_dirstateremoveremoved_actionsdirstatetrackedkeyupgrade_tracked_hintrequirements_onlyr writereporequirementsnew_requirementsr5upgrade_actions_names transaction unfilteredrrpersist_nodemap manifestlog _rootstorer>delete_nodemaprrrrrawvfsrBrrErr rr mkdtempr9vfsmodrtimerrunlink)rr$r%rg backuppathrrJunficlpsrcdsttstartelapsedr(r(r)upgrades          k  V        rc CsJ|jrQtjd|jd}|td|t|}t |j d| dzt |j d| dWnt t fyP}z |j t jkrFWYd}~nd}~ww|jj|dkks[J|jj|dk|j_|jj|jj_d|j_z|jdWnt t fy}z |j t jkrWYd}~nd}~ww|jdt||jdS)NrrrrsdirstaterT)rr rr9rzrrrrrErBIOErrorOSErrorerrnoENOENTdirstate_use_dirstate_v2_mappreload_dirtyrwriter rr)rr$rgoldnewrrer(r(r)r|sD        rcCsH|rd|j_d|j_d|j_|jd|s|jt||jdS)NT) r_use_tracked_hintr_dirty_tracked_setrdelete_tracked_hintr rr)rr$rgrIr(r(r)rs  r). __future__rrri18nrr rrrrr r r r rrrr revlogutilsrrrrrrrrr"r=rVrWrXrY frozensetUPGRADE_ALL_REVLOGSr[rirrrrrrrr(r(r(r)s8   4  #o4 &