;๒ lR๐Cc@sฎdkZdkZdkZdklZdkTdklZdklZdk l Z l Z l Z d„Z d„Zd„Zd „Zd „Zd „Zd „Zd „ZdS(N(s recipe_error(s*(sgetwork(sNode(s download_files upload_files remote_removecCsฮti|dƒ}|djoMt|ƒdjo|d djod|dfSnttdƒ|‚nti|| ƒ}x6|D].}|ti j ottdƒ|‚q†q†W|||dfSd S( sIsolate the scheme of the URL.s://iisfile:sfilesNo :// found in "%s"s&Illegal character before colon in "%s"iN( sstringsfindsurlsislens UserErrors_slowersschemescs lowercase(surlscsisscheme((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pysseparate_schemes $cCsคx™no‘ti|dƒ}|djo!|| |||d}q nti|dƒ}|djo-|| tii|ƒ||d}q nPq W|SdS(s+Replace all "%file%" in "attr" with "name".is%file%iis %basename%i N(sstringsfindsattrsisnamesosspathsbasename(sattrsnamesi((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pysrepl_file_name(s  &c Cs_t|dƒ\} }|di| dƒ}|o t||||||fƒSn| djot |||||ƒSn|ddddgjot |||ƒSng}xฆ|D]ž}|d}t||iƒ|d<|d d gjot||||ƒ} n*|d jot|||ƒ} nd } | o|i|ƒn||dซsspublishN(.sfaillistsnodeliststodolistsints get_var_valsrecdicts groupcounts StandardErrorses recipe_errorsrpstacks_sstrsattrsthislistsNonesthis_use_cachesnodesnx_attrs attrnamessns attributesshas_keysattrnames use_cachesucsgets short_namesremovesappendslensDictlists str2dictlistsalists skip_commandssGlobalscmd_argssoptionssmsg_infosactionsmapslocsverscont_commandsressrsextend(srpstacksrecdictsnodelists use_cachesactions attrnamessfaillistsress groupcounts str2dictliststhis_use_cachesnodestodolistsalistsattrnamesnx_attrslocsesattrsnsrsthislistsuc((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pyshandle_nodelistcsx=  &  ' /    + 7    cCs#t||||dddgƒSdS(sิFetch nodes in "nodelist" according to its "fetch" attribute. When there is no "fetch" attribute use "commit". Only use cached files when "use_cache" is non-zero. Return list of failed nodes.sfetchscommitN(shandle_nodelistsrpstacksrecdictsnodelists use_cache(srpstacksrecdictsnodelists use_cache((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pysfetch_nodelistฤscCs t|||d|dgƒSdS(sgCheckout nodes in "nodelist" according to their "commit" attribute. Return list of failed nodes.iscommitN(shandle_nodelistsrpstacksrecdictsnodelistsaction(srpstacksrecdictsnodelistsaction((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pysverscont_nodelistอsc Csdkl}l}dkl} l}g}g}g}g} xP|D]H} | i ƒ}tii|ƒ o+| i| ƒt|tdƒ|ƒqEn| iidƒo| id}n+| iidƒo| id}nd}dkl}l}|||ƒ}| o!t|tdƒ| iƒƒnx[|D]S}|d }||gƒ}t"i#d d |ƒ}t"i#d d |ƒ}t%d |d|ƒ}d|idisvirtualsrememberssignfiles_nodesrootnameis[s]stouchsTouching "%s": %ssPublishing "%s": %ssitem is up-to-date: "%s"scontentssnobuildN(<sSigns sign_updatedsbuildcheck_updatedsDoBuildsUpdatescheck_need_updatestodolistsbuildchecklists targetlistsfailedsnodelistsnodesget_names node_namesosspathsexistssappends msg_errorsrecdicts_s attributesshas_keysssDictlists str2dictlists dictlist2strsrpstacksalists recipe_errors short_namesattrs attr_namesattr_strsressubsbuildcheck_strsNodestargetsget_sign_fnamescopyssourcesupdatesset_buildchecks upd_reasonsreasonsmsgs disp_namesGlobalscmd_argssoptionssgetsmsg_infos msg_depends buildchecksNonesextendshandle_nodelistsislen(srpstacksrecdictsnodelistsmsgs targetlists str2dictlistsbuildcheck_strsattr_strsbuildchecklists buildchecksUpdates disp_namesfailedsnodestodolists attr_namesalistsupdatesreasonscheck_need_updates dictlist2strstargetsattrsis node_namessssourcesbuildcheck_updateds sign_updated((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pyspublish_nodelistำsš  !        ! - #-   cCsc|idƒ ot|tdƒ|dƒndkl}|||dƒ}| ot|tdƒ|dƒnti i |dƒ}t } x|D]‡}t|dƒ\}} |di|dƒ}|o#t||| |||fƒ} Pn|djot|| |||ƒ} PqšqšW| t jot|td ƒ|dƒnt|ƒ}d } |d joศx่| D]น}|i|ƒ} | p| iidƒ oˆ| ot |ƒ} nt!ƒo<t"i#i$id ƒ o!t%|td ƒ| i&ƒƒq,q0t'||| gdd ƒo d} q0qwqwWn$t(|ƒ} x|i*i+ƒD]} | iidƒowt(| i,ƒ| joa|o%| i,| |jo| i,| djp!| oti i | i,ƒ|jo| i,| j opt!ƒo<t"i#i$id ƒ o!t%|tdƒ| i&ƒƒqSqWt'||| gddƒo d} qWqTqTW| SdS(sdWhen "action" is "remove: Remove all files in directory "dir" of VCS that don't belong there. When "action" is "add:" Add all files in the recipe in directory "dir" to the VCS that are missing. "dir" is a dictionary for the directory and its attributes. Enter directories recursively when "recursive" is non-zero. scommitsno commit attribute for %ssname(s str2dictlists commit attribute for %s is emptys_nos_listscvss*No working item in commit attribute for %sisremovestouchs Remove "%s"is/sAdd "%s"saddN(-sdirshas_keys recipe_errorsrpstacks_sDictlists str2dictlists commit_listsosspathsabspathsdirnamesNonesalists commit_itemsseparate_schemesschemesnamesrecdictsgetsfunsapplys recursivescvs_listsgetworksworksoksactionsitems find_nodesnodes attributessNodes skip_commandssGlobalscmd_argssoptionssmsg_infos short_namesverscont_commandslens dirname_lensnodessvaluessabsname(srpstacksrecdictsdirs recursivesactions str2dictlistsdirnamesschemes commit_listsnodesalists dirname_lensoksnamesworks commit_itemsitemsfun((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pysverscont_remove_addPs\       %   %(sossos.pathsstringsProcesss recipe_errors VersContCvssWorksgetworksNodesRemotes download_files upload_files remote_removesseparate_schemesrepl_file_namesverscont_commandshandle_nodelistsfetch_nodelistsverscont_nodelistspublish_nodelistsverscont_remove_add(sNodes remote_removespublish_nodelistsstringsseparate_schemesrepl_file_namesverscont_commandsverscont_remove_addsgetworks recipe_errorsverscont_nodelists download_filesossfetch_nodelistshandle_nodelists upload_file((s-/mnt/gmirror/ports/devel/aap/work/VersCont.pys?s         , a  }