ó ŸçƒQc@sdZddlZddlZddlmZdZedZdZedZeeZ e dZ e ddZ d „Z d „Z d „Zd „Zd „ZgedƒD]Zeeƒ^qªZd„Zd„Zd„Zd„Zdefd„ƒYZdS(s3 A "pvec" is a changeset property based on the theory of vector clocks that can be compared to discover relatedness without consulting a graph. This can be useful for tasks like determining how a disconnected patch relates to a repository. Currently a pvec consist of 448 bits, of which 24 are 'depth' and the remainder are a bit vector. It is represented as a 70-character base85 string. Construction: - a root changeset has a depth of 0 and a bit vector based on its hash - a normal commit has a changeset where depth is increased by one and one bit vector bit is flipped based on its hash - a merge changeset pvec is constructed by copying changes from one pvec into the other to balance its depth Properties: - for linear changes, difference in depth is always <= hamming distance - otherwise, changes are probably divergent - when hamming distance is < 200, we can reliably detect when pvecs are near Issues: - hamming distance ceases to work over distances of ~ 200 - detecting divergence is less accurate when the common ancestor is very close to either revision or total distance is high - this could probably be improved by modeling the relation between delta and hdist Uses: - a patch pvec can be used to locate the nearest available common ancestor for resolving conflicts - ordering of patches can be established without a DAG - two head pvecs can be compared to determine whether push/pull/merge is needed and approximately how many changesets are involved - can be used to find a heuristic divergence measure between changesets on different branches iÿÿÿÿN(tnullreviÀiiiicCs/d}x"|D]}|dt|ƒ}q W|S(sconvert a bytestring to a longii(tord(tbstvtb((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_bin>s cCs?d}x2t|ƒD]$}t|d@ƒ|}|dL}qW|S(Ntiÿi(txrangetchr(RtlRtp((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_strEs cCst|t ƒt|tƒfS(sdepth and bitvec(Rt _depthbytes(R((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_splitLscCst|tƒt|tƒS(N(R R t _vecbytes(tdepthtbitvec((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_joinPscCs8d}x+|r3|d@r&|d7}n|dL}q W|S(Nii((txtc((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_hweightSs    icCs=||A}d}x&|r8|t|d@7}|dL}qW|S(s+find the hamming distance between two longsiiÿi(t_htab(taRtdR((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt_hamming\s   cCsÿ|\}}|\}}||krE||||f\}}}}nt||ƒ}||}|} ||A} d} ||kr•||dd} nd} || } | ræxG| râ| | @rÕ| | N} | d8} n| dK} q®Wnt| |ƒ} | | fS(Nii(Rt_flipbit(RtyRtd1tv1td2tv2thdisttddistRtmtitchangesR((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyt _mergeveces*   !        cCs t|ƒd@t}|d|>AS(Nlÿÿi(thasht_vecbits(Rtnodetbit((s2/sys/lib/python2.7/site-packages/mercurial/pvec.pyRŠsc CsR|j}tj|dƒs'i|_n|j}|jƒ|kr)|j}xÛt|jƒdƒD]À}||krb|j|ƒ}|j|ƒ\}}|t krÅdt |dt ƒf||1s(         % %