o k`V@sddlZddlmZddlmZddlmZmZddlm Z ddl m Z m Z m Z mZe je jdZe je je je je jdZd d ZeeZeeZd Zd ZeefZd dZGddde ZGddde Z dS)N)cached) TracError)from_utimestamp to_utimestamp)_) ChangesetNode RepositoryNoSuchChangeset)DF)ACr EMcCstt|t|SN)dictzipvalueslist)dr;/usr/lib/python3/dist-packages/trac/versioncontrol/cache.py _invert_dictsrrepository_dir youngest_revcCs |jpdS)Nz (default)reponame)reposrrr_norm_reponame+ rc@s0eZdZdZeddZddZddZdd Zd d Z d d Z ddZ ddZ ddZ ddZedddZdFddZddZddZd d!ZdGd"d#ZdHd$d%Zd&d'ZdGd(d)Zd*d+Zd,d-ZdId/d0ZdId1d2ZdId3d4Zd5d6Zd7d8ZdHd9d:Z d;d<Z!d=d>Z"d?d@Z#dAdBZ$ CdJdDdEZ%dS)KCachedRepositoryFcC|jjSr)rscopeselfrrr3szCachedRepository.cCs2||_||_t|jj|_t||j|j|dSr) envrstrid _metadata_idr __init__nameparams)r%r'rlogrrrr+5szCachedRepository.__init__cCs|jdSr)rcloser$rrrr/;zCachedRepository.closecCs |jSr)rget_baser$rrrr1>r zCachedRepository.get_basecCs|j||Sr)rget_quickjump_entries normalize_revr%revrrrr2Az&CachedRepository.get_quickjump_entriescCs|j||Sr)r get_path_urlr%pathr5rrrr7Dr0zCachedRepository.get_path_urlcCst||||jSr)CachedChangesetr3r'r4rrr get_changesetGzCachedRepository.get_changesetcC |j|Sr)rget_changeset_uidr4rrrr>J z"CachedRepository.get_changeset_uidc csN|jd|jt|t|fD]\}z||VWqty$YqwdS)Nz SELECT rev FROM revision WHERE repos=%s AND time >= %s AND time < %s ORDER BY time DESC, rev DESC )r'db_queryr)rr;r )r%startstopr5rrrget_changesetsMs  zCachedRepository.get_changesetsc Cs|j|}||j}d}|jjA}z t||j|j}Wn ty(d}Ynw|r<|dt|j |j |j |j |fn| |j|Wd|SWd|S1sVwY|S)NzyUPDATE revision SET time=%s, author=%s, message=%s WHERE repos=%s AND rev=%s )rr;db_revr5r'db_transactionr:r rdateauthormessager)insert_changeset)r%r5csetsrevold_csetdbrrrsync_changesetXs.           zCachedRepository.sync_changesetr*c Cs.t|jdddgtt|jftS)z2Retrieve data for the cached `metadata` attribute.zr SELECT name, value FROM repository WHERE id=%%s AND name IN (%s) ,%s)rr'r@joinlenCACHE_METADATA_KEYSr)r$rrrmetadataks  zCachedRepository.metadataNc Cs|r||j}|||j|jj}|t}|r2|j|}|s1|j d|jt |n |j d|jt |d}d}||kr_|j d||t ||rZ|j |}n,z!|jj}|jjdkrt|jd|st|jj |dd}|j|}Wn tyYdSw|durdS||}|jj#}|d|j|fD]\} |jj|dWddSWdn1swY|dura||}|jjs}|j d |t ||j|} z||| WnEty,} z8t| |jjjr|j d |t || n |j d |t || |jj|d|WYd} ~ WddSd} ~ ww|d t ||jtf|`Wdn 1sEwY|}|j |}|rY|||dusdSdSdS) Nz3normalize_rev failed (youngest_rev=%r, reponame=%s)z7cache metadata undefined (youngest_rev=%r, reponame=%s)z)repos rev [%s] != cached rev [%s] in '%s'/T)find_initial_revz2SELECT rev FROM revision WHERE repos=%s AND rev=%s)rz$Trying to sync revision [%s] in '%s'z&Revision %s in '%s' already cached: %rz:Unable to create cache records for revision %s in '%s': %rzh UPDATE repository SET value=%s WHERE id=%s AND name=%s )! remove_cacherT save_metadatarclearrgetCACHE_YOUNGEST_REVr3r.debugrinfonext_rev oldest_revr#has_noderrDr'r@r)rEr;rI Exception isinstancedb_excIntegrityErrorwarningerrorrollbackr() r%feedbackcleanrTrepos_youngestyoungest next_youngestrKrMr5rJerrrsyncts                  "  #zCachedRepository.synccsjdtjj3}|djf|djf|dfddtD|dfddtD`Wd d S1sCwYd S) zRemove the repository cache.zCleaning cache in '%s'z#DELETE FROM revision WHERE repos=%sz&DELETE FROM node_change WHERE repos=%sz.DELETE FROM repository WHERE id=%s AND name=%scsg|]}j|fqSrr).0kr$rr z1CachedRepository.remove_cache..zt INSERT INTO repository (id, name, value) VALUES (%s, %s, %s) csg|]}j|dfqSrorpr$rrrsN) r.r]rr'rEr) executemanyrSrT)r%rMrr$rrWs  "zCachedRepository.remove_cachecCs|jj{}d}|t}|r/tj|tj|jkr.|j d||jt t dt |dn-|durH|j d|j|d|j t|jfd}n|j d |j|d |j|j tfd}t|vrk|d|j td fd}|rw|`WddSWddS1swYdS) zSave the repository metadata.Fz*'repository_dir' has changed from %r to %rzThe repository directory has changed, you should resynchronize the repository with: trac-admin $ENV repository resync '%(reponame)s'rNz$Storing initial "repository_dir": %sziINSERT INTO repository (id, name, value) VALUES (%s, %s, %s) TzResetting "repository_dir": %sz6UPDATE repository SET value=%s WHERE id=%s AND name=%srv)r'rErZCACHE_REPOSITORY_DIRosr9normcaser,r.r]rrrr)r[rT)r%rTrM invalidaterrrrrXsJ        &"zCachedRepository.save_metadatac Cs||}|jjK}|d|j|t|j|j|jf|D]-\}}}}} |j d|t |j ||||| ft |}t|}|d|j|||||| fqWddS1sWwYdS)zQCreate revision and node_change records for the given changeset instance.z~ INSERT INTO revision (repos,rev,time,author,message) VALUES (%s,%s,%s,%s,%s) z'Caching node change in [%s] in '%s': %rz INSERT INTO node_change (repos,rev,path,node_type,change_type,base_path, base_rev) VALUES (%s,%s,%s,%s,%s,%s,%s) N)rDr'rEr)rrFrGrH get_changesr.r\rr_inverted_kindmap_inverted_actionmap) r%r5rJrKrMr9kindactionbpathbrevrrrrIs&    "z!CachedRepository.insert_changesetcC|j|||Sr)rget_noder3r8rrrr6r<zCachedRepository.get_nodec Cs||}||}|||}|jjE}|dur4|d|j||f}|dddur2t|ddnd}||}dd|d||j|||||dfDWdS1s\wYdS)z\Return the revisions affecting `path` between `first` and `last` revisions. Nz SELECT MAX(rev) FROM node_change WHERE repos=%s AND rev<=%s AND path=%s AND change_type IN ('A', 'C', 'M') rcSsg|]\}t|qSr)int)rqr5rrrrsIrtz3CachedRepository._get_node_revs..z SELECT DISTINCT rev FROM node_change WHERE repos=%%s AND rev>=%%s AND rev<=%%s AND (path=%%s OR path %s)rU) r3rDrr'r@r)r prefix_matchprefix_match_value)r%r9lastfirstslastnoderMsfirstrrr_get_node_revs9s$     $    $zCachedRepository._get_node_revsc s|siSfdd|D}tdd|D}tdd|D}dd|D}dd|D}d }d }jj}|t|kr||||} ||7}t| } d d | } d | dd|df| | dd|f| f} g} | dd| D| D]\}}| |j d| |j q| j ||f| dd| D| fdd| D| | D]#\}} |}||\}}||kr|jkrnq|| |q|t|ksFWd|SWd|S1swY|S)Ncsg|] \}}||fqSr)r3rqrrr$rrrsTsz6CachedRepository._get_changed_revs..css|]\}}|VqdSrrrrrr Vsz5CachedRepository._get_changed_revs..cs|]\}}|jVqdSr)r5rrrrrWcSsi|] \}}|j||fqSrr9rrrr Xsz6CachedRepository._get_changed_revs..cSsi|]\}}|jgqSrrrrrrrYrwrrOrPa SELECT DISTINCT rev, (CASE WHEN path IN (%s) THEN path %s END) AS path FROM node_change WHERE repos=%%s AND rev>=%%s AND rev<=%%s AND (path IN (%s) %s)  z WHEN path z THEN %szOR path csrrrrrrrrurrUcsrrrrrrrrzrc3s$|] \}}|jdVqdS)rUN)rr9r)rMrrr{s)rDminmaxr'r@rrRrQextendappendrr9r)rev_dbr5)r% node_infosrr path_infos path_revsidxdeltarsubsetcountholdersqueryargsrrrKr9r5r)rMr%r_get_changed_revsPsj         % %%z"CachedRepository._get_changed_revscCrr)rr`r3r8rrrr`r<zCachedRepository.has_nodecCr"r)rr_r$rrrget_oldest_revszCachedRepository.get_oldest_revcCs||jtSr)rrTrZr[r$rrrget_youngest_revr6z!CachedRepository.get_youngest_revrvcCs|j|||Sr)r previous_revr3r%r5r9rrrrs zCachedRepository.previous_revcCs(|jr |d||S|j|||S)N>)has_linear_changesets_next_prev_revrr^r3rrrrr^szCachedRepository.next_revc CsD||}|jj}d}|dkrdnd}|j|g}|rn|d}|||dd;}|d|7}||||df|dd} d d t | } |d | d 7}t d t | d D]} | d | d| q^n|||dd;}|||D]\}|durt |WdSq{WddS1swYdS)NzCSELECT %(aggr)s(rev) FROM %(tab)s WHERE repos=%%s AND rev%(dir)s%%s<MAXMINrU node_change)aggrdirtabz AND (path=%s OR path rOrz OR (path IN (z) AND change_type='D'))revision)rDr'r@r)lstriprrrsplitrQrRrangerr) r% directionr5r9rKrMsqlrr componentsparentsirrrrs0     "zCachedRepository._next_prev_revcCs|jr t||S|j|Sr)rr parent_revsrr4rrrrs  zCachedRepository.parent_revscCs|j||||Sr)rrev_older_thanr3)r%rev1rev2rrrrszCachedRepository.rev_older_thancCs|j||||Sr)rget_path_historyr3)r%r9r5limitrrrrsz!CachedRepository.get_path_historycCr=r)rnormalize_path)r%r9rrrrr?zCachedRepository.normalize_pathc Csv|dust|tr|dvr||jpdSz t|}t|j}Wnttfy0Yt|w||kr7|St|)N)rvheadlatestrkr) rbr(lowerrrr ValueError TypeErrorr )r%r5rrrrr3s zCachedRepository.normalize_revcCst|S)z9Convert a revision to its representation in the database.)r(r4rrrrDszCachedRepository.db_revcCs|S)z;Convert a revision from its representation in the database.rr4rrrrszCachedRepository.rev_dbrcCs |j|||||||Sr)rr}r3)r%old_pathold_revnew_pathnew_revignore_ancestryrrrr}s zCachedRepository.get_changes)NFr)NNru)r)&__name__ __module__ __qualname__rpropertyr#r+r/r1r2r7r;r>rCrNrrTrnrWrXrIrrrr`rrrr^rrrrrr3rDrr}rrrrr!/sH    k+   6   r!c@s$eZdZddZddZddZdS)r:c Csv||_||}|jd|j|fD]\}}}t|}t|||||||dS|j d|j|t |t |)Nzv SELECT time, author, message FROM revision WHERE repos=%s AND rev=%s z(Missing revision record (%r, %r) in '%s') r'rDr@r)rrr+rr.r\rr ) r%rr5r'drev_daterGrHrFrrrr+s  zCachedChangeset.__init__ccsbt|jd|jj|j|jfD]\}}}}}t|}t|}|||||j |fVqdS)Nz SELECT path, node_type, change_type, base_path, base_rev FROM node_change WHERE repos=%s AND rev=%s ORDER BY path ) sortedr'r@rr)rDr5_kindmap _actionmapr)r%r9rchange base_pathbase_revrrrr}szCachedChangeset.get_changescCs|jj|jSr)rr;r5get_propertiesr$rrrr r<zCachedChangeset.get_propertiesN)rrrr+r}rrrrrr:s r:)!rz trac.cacher trac.corertrac.util.datefmtrrtrac.util.translationrtrac.versioncontrolrrr r DIRECTORYFILErADDCOPYDELETEEDITMOVErrr~rryr[rSrr!r:rrrrs.   @