a —+«bwã @s´dZddlmZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZm Z dd l!m"Z"iZ#e $e#¡Z$d Z%d Z&d Z'd Z(dZ)ddddddœZ*e +¡Z+iZ,e -e,¡Z-e-dddde+dej.ddd„ƒZ/e+dej.ddd„ƒZ0e+d ej.dd!d"„ƒZ1d#d$iZ2d%d&„Z3d'd(„Z4d)d*„Z5Gd+d,„d,e6ƒZ7Gd-d.„d.ejƒZ8d/d0„Z9d1d2„Z:e$d3d4d5ded6ƒfd7d8d$ed9ƒed:ƒfged;ƒdd?„ƒZ;e$d@e je$dRe j{file|basename},v {node|short} {date|svnutcdate} {author|user})r'r(sLastChangedRevisions LastChangedBysLastChangedDaterr)ÚupdateÚ configbool)ÚuiÚ templatesZkwsetsr r r!Ú_defaultkwmapsÅs&þù ûör-cCs |d|ƒS)zlHelper for keyword expansion removal in text. Depending on subfunc also returns number of substitutions.s$\1$r )ÚtextÚsubfuncr r r!Ú _shrinktextásr0cs0‡fdd„|jDƒ}‡fdd„|jDƒ}||fS)zªRetrieves modified and added files from a working directory state and returns the subset of each contained in given changed files retrieved from a change context.csg|]}|ˆvr|‘qSr r ©Ú.0Úf©Úchangedr r!Ú ër&z_preselect..csg|]}|ˆvr|‘qSr r r1r4r r!r6ìr&)ÚmodifiedÚadded)Úwstatusr5r7r8r r4r!Ú _preselectçsr:c@seZdZdZdd„Zedd„ƒZejdd„ƒZ ejdd „ƒZ ejd d „ƒZ d d „Z dd„Z dd„Zdd„Zddd„Zdd„Zdd„Zdd„ZdS)Ú kwtemplaterzr Sets up keyword templates, corresponding keyword regex, and provides keyword substitution functions. cCsl||_t |¡|_t |jdg||¡|_tdt ¡v|_ d|_ |j  d¡}|r\t |ƒ|_ n t|jƒ|_ dS)Nr&r%Fó keywordmaps)r+ÚweakrefÚrefÚ_reporÚrootÚkwtoolsÚ restrictedÚsplitÚrestrictÚ postcommitÚ configitemsÚdictr,r-)Úselfr+ÚrepoÚincÚexcÚkwmapsr r r!Ú__init__ös   zkwtemplater.__init__cCs| ¡S©N)r?©rHr r r!rIszkwtemplater.repocCsd ttj|j ¡ƒ¡S)z+Returns bar-separated and escaped keywords.ó|)ÚjoinÚmaprZreescaper,ÚkeysrOr r r!Úescapeszkwtemplater.escapecCst d|j¡S)z&Returns regex for unexpanded keywords.s\$(%s)\$©ÚreÚcompilerTrOr r r!Úrekw szkwtemplater.rekwcCst d|j¡S)z$Returns regex for expanded keywords.s\$(%s): [^$\n\r]*? \$rUrOr r r!Úrekwexpszkwtemplater.rekwexpcs‡‡‡fdd„}|||ƒS)z1Replaces keywords in data with expanded template.cs\| d¡}t ˆjˆjˆj|¡}ˆj ¡|jˆˆjjˆdt   ˆj  ¡¡}d||fS)Né)r@Úfiles $%s: %s $) Úgroupr Z maketemplaterr+rIr,Z pushbufferZshowr@rÚ firstlineZ popbuffer)ZmobjÚkwZctZekw©ÚctxÚpathrHr r!Úkwsubs ÿ z%kwtemplater.substitute..kwsubr )rHÚdatarar`r/rbr r_r!Ú substitutes zkwtemplater.substitutecCs|jj||d ¡S)z4Similar to filelog.linkrev, but returns a changectx.)Úfileid)rIÚfilectxÚ changectx)rHrarer r r!Úlinkctx%szkwtemplater.linkctxcCs>|js:| |¡r:t |¡s:| ||¡}| ||||jj¡S|S)z$Returns data with keywords expanded.)rDrrÚbinaryrhrdrXÚsub)rHraÚnodercr`r r r!Úexpand)sÿþý zkwtemplater.expandcs‡‡fdd„|DƒS)zkReturns subset of candidates which are configured for keyword expansion but are not symbolic links.cs(g|] }ˆ |¡rdˆ |¡vr|‘qS©ól)rÚflagsr1©r`rHr r!r67r&z(kwtemplater.iskwfile..r )rHZcandr`r rpr!Úiskwfile4szkwtemplater.iskwfileFcCs|js|s|jr| ||¡}|s$dS|jo,|}|js<|rD|rD| ¡}|jsN|rV|j}n|j}|rjtdƒ} ntdƒ} |jd} |D]z} |jr¤|j | ¡  || ¡} n |j  | ¡} t   | ¡r¼q€|rD|  ¡} |rà| | || ¡}nL|jr,t| ƒdkr,| D]0}| |vrú||  || ¡sú||  ¡}q,qú| | | ||j¡\} }n$|jrX| | ¡}nt| |jƒ\} }|r€|j | | ¡|jj| ddd}| | ¡| ¡|rä| |  ¡}|j}|j}t |¡}|||f}|jj  !| |¡q€|jr€|jj j"| ddq€dS) z7Overwrites selected files expanding/shrinking keywords.Ns"overwriting %s expanding keywords s"overwriting %s shrinking keywords rZswbT)Z atomictemp)Z p1_tracked)#rDrErqZmanifestrXrYrrIr[ÚreadÚwreadrriÚparentsrhÚlenÚcmprgrdÚsubnÚsearchr0r+ÚnoteÚwvfsÚwriteÚcloseÚlstatÚst_modeÚst_sizerZmtime_ofÚdirstateZ set_cleanZupdate_file_p1)rHr`Ú candidatesÚlookuprlrXZkwcmdZmfZre_kwÚmsgÚwctxr3rcrtÚpÚfoundÚfpÚsÚmodeÚsizeÚmtimeZ cache_datar r r!Ú overwrite9s^              zkwtemplater.overwritecCs&| |¡r"t |¡s"t||jjƒS|S)z4Returns text with all keyword substitutions removed.)rrrir0rYrj)rHÚfnamer.r r r!Úshrinkrszkwtemplater.shrinkcCs6| |¡r2d |¡}t |¡s2t||jjƒ d¡S|S)z1Returns lines with keyword substitutions removed.r&T)rrQrrir0rYrjÚ splitlines)rHrÚlinesr.r r r!Ú shrinklinesxs    zkwtemplater.shrinklinescCs|jr| ||¡S|S)z]If in restricted mode returns data read from wdir with keyword substitutions removed.)rDrŽ)rHrrcr r r!rs€s zkwtemplater.wreadN)F)Ú__name__Ú __module__Ú __qualname__Ú__doc__rMÚpropertyrIrZ propertycacherTrXrYrdrhrlrqrŒrŽr‘rsr r r r!r;ðs$       9r;csFeZdZdZ‡fdd„Z‡fdd„Zd ‡fdd„ Z‡fd d „Z‡ZS) Ú kwfilelogz† Subclass of filelog to hook into its read, add, cmp methods. Keywords are "stored" unexpanded, and processed on reading. cs"tt|ƒ ||¡||_||_dSrN)Úsuperr—rMÚkwtra)rHÚopenerr™ra©Ú __class__r r!rMŽszkwfilelog.__init__cs0tt|ƒ |¡}| |¡r|S|j |j||¡S)z&Expands keywords when reading filelog.)r˜r—rrZrenamedr™rlra)rHrkrcr›r r!rr“s zkwfilelog.readNcs*|j |j|¡}tt|ƒ ||||||¡S)z5Removes keyword substitutions when adding to filelog.)r™rŽrar˜r—Úadd)rHr.ÚmetaÚtrÚlinkZp1Zp2r›r r!ršsz kwfilelog.addcs"|j |j|¡}tt|ƒ ||¡S)z-Removes keyword substitutions for comparison.)r™rŽrar˜r—rv)rHrkr.r›r r!rvŸsz kwfilelog.cmp)NN) r’r“r”r•rMrrrrvÚ __classcell__r r r›r!r—ˆs   r—cOsb|r8t |¡}|jt |||¡d| d¡p2| d¡dS| d¡rPt t dƒ¡‚t t dƒ¡‚dS) z\Bails out if [keyword] configuration is not active. Returns status of working directory.Tóunknownóall)rÚcleanÚunknownókeywords[keyword] patterns cannot matchs no [keyword] patterns configuredN) rÚ byteskwargsÚstatusrrÚgetrFr ÚAbortr)r+rIr„r™ÚpatsÚoptsr r r!Ú_status¥s  ý r­cOs²|d}t| ¡ƒdkr&t tdƒ¡‚t|ddƒ}| ¡dt||||g|¢Ri|¤Ž}|jsp|j sp|j sp|j r~t tdƒ¡‚|  ||j d|¡Wdƒn1s¤0YdS)z7Selects files and passes them to kwtemplater.overwrite.NrZsoutstanding uncommitted mergeÚ _keywordkwtsoutstanding uncommitted changesT)rurtr rªrrÚwlockr­r7r8ZremovedÚdeletedrŒr¤)r+rIrlr«r¬r„r™r¨r r r!Ú _kwfwrite´s  r±skwdemoódsdefaults"show default keyword template mapsófórcfilesread maps from rcfilesFILEs+hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...T)Z optionalrepocsN‡fdd„}d}t dd¡}ˆ tdƒ|¡|dur<ˆ}n|j}tj||dd }ˆ d |dd ¡ˆ d d ¡}ˆ d d |d ¡ˆ  d ¡} |s˜|  d¡rHˆ  tdƒ¡| r¸ˆ  tdƒ¡|  d¡sÆ| sè|rÚˆ  tdƒ¡nˆ  tdƒ¡|  d¡rˆ  |  d¡¡|r8dd  |¡} |j d| ¡ˆ  |j  d¡¡tˆ  d ¡ƒ} nš|  d¡r¼|rjˆ  tdƒ¡nˆ  tdƒ¡tˆƒ} | r∠ tdƒ¡t | ¡D]\} } ˆ d | | d ¡qžn&ˆ  tdƒ¡| rÚt| ƒ} ntˆƒ} tˆƒtˆ|ƒˆ d¡|d ˆ  d ¡ƒ|d ˆ  d ¡ƒ|d t | ¡ƒdd  t|  ¡ƒ¡d}|j ||¡|d |g¡ˆ td ƒ|¡ˆ |¡| ¡|j d!¡Wdƒn1s®0Yˆ  d"¡D]8\}}| d#d$¡d% d&¡d'krÂ|j d"|dd ¡qÂtd(ƒ}ˆ d)|¡|j |d*ˆ  td+ƒ¡ˆ | !|¡¡|j "|j#¡dS),a–print [keywordmaps] configuration and an expansion example Show current, custom, or default keyword template maps and their expansions. Extend the current configuration by specifying maps as arguments and using -f/--rcfile to source an external hgrc file. Use -d/--default to disable current configuration. See :hg:`help templates` for information on templates and filters. csJˆ d|¡t|ƒD].\}}t|tƒr2t |¡}ˆ d||f¡qdS)Ns[%s] s%s = %s )r{ÚsortedÚ isinstanceÚboolrZpprint)ÚsectionÚitemsÚkÚv©r+r r!Ú demoitemsØs   zdemo..demoitemssdemo.txtr&skwdemo.s$creating temporary repository at %s NT)Zcreater¦rrr<Zrcfiles3 configuration using custom keyword template maps s! extending current template maps rs# overriding default svn keywordset s# overriding default cvs keywordset r´s[keywordmaps] %s ó shgrcs- configuration using default svn keywordset s- configuration using default cvs keywordset s! disabling current template maps s4 configuration using current keyword template maps s[extensions] keyword = ó$s$ $s$ s keywords written to %s: s demobranchshooksó.rZrscommitéÿÿÿÿs.hg keyword configuration and expansion exampleshg ci -m '%s' )r.s keywords expanded )$rZmkdtempryrÚbaseuir ÚinstanceZ setconfigr*rFr©r¨Z readconfigrQZvfsr{rGr-Z iteritemsÚuisetupÚ reposetupZ writenoi18nrµrSrzrr¯r€Z setbranchrCÚfindr+ÚcommitrsÚrmtreer@)r+rIÚargsr¬r½ÚfnZtmpdirrÂÚsvnZuikwmapsZrcmapsrLrºr»ÚkeywordsÚnameÚcmdrƒr r¼r!ÚdemoÁs|           , rÏskwexpands!hg kwexpand [OPTION]... [FILE]...)Z inferrepocOst||dg|¢Ri|¤ŽdS)zŸexpand keywords in the working directory Run after (re)enabling keyword expansion. kwexpand refuses to run if given files contain local changes. TN©r±©r+rIr«r¬r r r!rl'srlókwfilesóAr£s&show keyword status flags of all filesóióignores"show files excluded from expansionóur¢s%only show unknown (not tracked) filess hg kwfiles [OPTION]... [FILE]...c s´t|ddƒ}|d}t||||g|¢Ri|¤Ž}|r>| ¡}nd}g}t |¡}| d¡rd| d¡rzt|j|j|j ƒ}|  ||¡‰|  |j |¡} |  |j |¡‰| d¡r¶| d¡rˆ| ˆf} n gggf} | d¡sâ| d¡r | ‡fdd„|Dƒ‡fd d„|j Dƒf7} d   ¡} t| t d ¡| ƒ} | d |¡} d }| d¡sJ|jrNd}| D]T\}}}d|}|D]:}|  ¡| j||d| j||| ||¡f|dqhqR|  ¡dS)ashow files configured for keyword expansion List which files in the working directory are matched by the [keyword] configuration patterns. Useful to prevent inadvertent keyword expansion and to speed up execution by including only files that are actual candidates for expansion. See :hg:`help keyword` on how to construct patterns both for inclusion and exclusion of files. With -A/--all and -v/--verbose the codes used to show the status of files are:: K = keyword expansion candidate k = keyword expansion candidate (not tracked) I = ignored i = ignored (not tracked) r®Nr&r¢r£rÕcsg|]}|ˆvr|‘qSr r r1)Úkwfilesr r!r6lr&zfiles..csg|]}|ˆvr|‘qSr r r1)Ú kwunknownr r!r6mr&s5enabled deleted enabledunknown ignored ignoredunknownsK!kIirÒs%.0s%s s%s %s skwfiles.)Zkwstatusra)Úlabel)rr­Úgetcwdrr§r©rµr7r8r¤rqr°r¥rCÚzipZbytestrÚ formatterÚverboseZ startitemrcZplainZpathtoÚend)r+rIr«r¬r™r„r¨ÚcwdÚfilesZ kwdeletedZ showfilesZkwlabelsZkwstatesZfmZfmtZkwstateÚcharÚ filenamesrÙr3r )r×rØr!rà8sD      þ &ràskwshrinks!hg kwshrink [OPTION]... [FILE]...cOst||dg|¢Ri|¤ŽdS)zµrevert expanded keywords in the working directory Must be run before changing/disabling active keywords. kwshrink refuses to run if given files contain local changes. FNrÐrÑr r r!rŽ~srŽcCs@|||||||ƒtt|ddƒddƒ}|r<| |j|j¡|_dS)ztMonkeypatch/wrap patch.patchfile.__init__ to avoid rejects or conflicts due to expanded keywords in working dir.rINr®)rr‘rr)ÚorigrHr+ZgpZbackendÚstoreZeolmoder™r r r!Úkwpatchfile_init’sråcos^t|ddƒ}|r|j}d|_z0||g|¢Ri|¤ŽD] }|Vq4W|rZ||_n |rX||_0dS)z*Monkeypatch patch.diff to avoid expansion.r®NT)rrD)rãrIrÉÚkwargsr™rDÚchunkr r r!Úkwdiffœs  ÿrèccsTt|jddƒ}|r |j}tj|_z"||ƒD] }|Vq*W|rP||_n |rN||_0dS)z2Wraps webcommands.x turning off keyword expansion.r®N)rrIrrÚnever)rãZwebr™Z origmatchrçr r r!Ú kwweb_skipªs  ÿrêc CsÚt|ddƒ}|dur&|||||||ƒS| ¡˜|j ¡nd|_|||||||ƒ}|| ¡krˆ||} d|_| | |  ¡dd¡d|_|WdƒWdƒS1s®0YWdƒn1sÌ0YdS)z3Wraps cmdutil.amend expanding keywords after amend.r®NTF) rr¯r€Ú parentchangerErkrDrŒrà) rãr+rIÚoldZextrar«r¬r™Znewidr`r r r!Úkw_amend¸s  rícsÆtˆddƒ‰ˆdur$||ˆ|||ƒSˆ ¡†||ˆ|||ƒ| d¡rXWdƒdSˆd‰ˆ ¡‰‡‡‡‡fdd„‰‡‡fdd„ˆj ¡Dƒ}ˆ ˆ|dd¡Wdƒn1s¸0YdS) aÔWraps cmdutil.copy so that copy/rename destinations do not contain expanded keywords. Note that the source of a regular file destination may also be a symlink: hg cp sym x -> x is symlink cp sym x; hg cp -A sym x -> x is file (maybe expanded keywords) For the latter we have to follow the symlink to find out whether its target is configured for expansion and we therefore must unexpand the keywords in the destination.r®Nsdry_runcs<ˆj |¡}dˆ |¡vr2t ˆjˆtj |¡¡}ˆ  |¡S)z™Returns true if dest is a regular file and configured for expansion or a symlink which points to a file configured for expansion.rn) r€ZcopiedrorZ canonpathr@ÚosraÚrealpathr)ÚdestÚsource)rßr™rIr„r r!Ú haskwsourceÜs  ÿzkw_copy..haskwsourcecs&g|]}dˆ |¡vrˆ|ƒr|‘qSrm)ror1)ròr„r r!r6çsþzkw_copy..F)rr¯r©rÚr€ZcopiesrŒ)rãr+rIr«r¬Úrenamerr )rßròr™rIr„r!Úkw_copyÈs    þrôc Os t|ddƒ}|dur.||||g|¢Ri|¤ŽS| ¡¾d|_|d}| ¡}||||g|¢Ri|¤Ž} |d} || krât||  ¡ƒ\} } d|_|j ¡2|  | | dd¡|  | | ddd¡Wdƒn1sÒ0Yd|_| WdƒS1sü0YdS)z9Wraps record.dorecord expanding keywords after recording.r®NTrÀF) rr¯rEr¨r:ràrDr€rërŒ) rãr+rIZ commitfuncr«r¬r™r`r9ÚretZrecctxr7r8r r r!Ú kw_dorecordïs"   0röcCs˜|jr| |¡St|jddƒ}|dur0|||ƒS|jdurp|jjs€| | ¡¡r\d| ¡vs€|  ¡d|  ¡ks€|  ¡|  ¡kr”|j  |j|  ¡¡SdS)Nr®rnéT) Z _customcmprvrr?Z _filenodeZ_encodefilterpatsrrarorŠZ_filelogrc)rãrHZfctxr™r r r!Ú kwfilectx_cmps&  ÿý ü ûúø røcCsŽdd„}t td|¡t tjdt¡t tjdt¡t tdt ¡t t dt ¡t t dt ¡t t d t ¡t ¡D]}t t|t¡qvd S) a Monkeypatches dispatch._parse to retrieve user command. Overrides file method to return kwfilelog instead of filelog if file matches user configuration. Wraps commit to overwrite configured files with updated keyword substitutions. Monkeypatches patch and webcommands.cSs*|||ƒ\}}}}}|td<|||||fS)z9Monkeypatch dispatch._parse to obtain running hg command.r%)rA)rãr+rÉrÎÚfuncÚoptionsZ cmdoptionsr r r!Úkwdispatch_parse$sz!uisetup..kwdispatch_parses_parsescmps__init__sdiffsamendscopysdorecordN)r Z wrapfunctionrrrfrørZ patchfilerårèrrírôröÚnokwwebcommandsrCrrê)r+rûÚcr r r!rÄs rÄcsÎz>| ¡r6tdt ¡vs6dt |j¡vs6|j d¡r.kwrepocs&|ddkr|dd…}t|jˆ|ƒS)Nró/rZ)r—Zsvfs)rHr3)r™r r!r[Ps  zreposetup..kwrepo.filecstˆ|ƒ |¡}ˆ ||¡SrN)r˜rs)rHÚfilenamerc©rœÚkwrepor™r r!rsUszreposetup..kwrepo.wreadcs0|j|_ztˆ|ƒj|i|¤ŽW|`S|`0dSrN)Ú kwcommitctxÚ commitctxr˜rÇ)rHrÉr¬)rœrr r!rÇYs þz reposetup..kwrepo.commitFNcsTtˆ|ƒ |||¡}ˆjsPˆj}dˆ_ˆ ||t| ¡| ¡ƒdd¡|ˆ_|S)NTF)r˜rrErDrŒrµr8r7)rHr`r ZorigctxÚnrDrr r!rbsÿz%reposetup..kwrepo.kwcommitctxc s¼| ¡ ˆj}z€|s"|d ¡}tˆ|ƒ ||¡}|sx|d}t| ¡|ƒ\}}dˆ_ˆ ||dd¡ˆ ||dd¡|W|ˆ_WdƒS|ˆ_0Wdƒn1s®0YdS)NrÀFT)r¯rDràr˜Úrollbackr:r¨rŒ) rHZdryrunÚforceZ origrestrictr5rõr`r7r8rr r!rns   þz"reposetup..kwrepo.rollback)FN)FF) r’r“r”r[rsrÇrrr¡r ©rr™r›r!rOs    r)ÚlocalrAÚ nokwcommandsrCrZ splitpathr@Z_urlÚ startswithÚAttributeErrorrFÚappendr;rœr®)r+rIrJrKÚpatÚoptr rr!rÅ6s.ÿþý ü     0rÅ)N)F)Ir•Z __future__rrîrVr=Zmercurial.i18nrZmercurial.pycompatrZmercurial.hgwebrZ mercurialrrrr r r r r rrrrrrrrrZmercurial.utilsrrZmercurial.dirstateutilsrZcmdtableZcommandZ testedwithr rürBZrecordextensionsZ colortableZtemplatefilterZ configtableZ configitemrr"r#r$rAr-r0r:Úobjectr;r—r­r±rÏZwalkoptsrlràrŽrårèrêrírôrörørÄrÅr r r r!Ús¸9    L  ÿÿû ý        þù ]ü ýû÷ ;ü   '