3
_Af\                 @   sD  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	 e	 rPd dl
Zn d dlZd dlZejdZee_d dlZd dlmZ d dlmZmZ d dlZd dlmZmZmZ d dlmZmZmZ d	Zd
Z dZ!ejj"j#dddddg ejj$j#dddddg G dd de%Z&G dd de%Z'G dd de%Z(G dd de(Z)dS )    )print_functionN)
is_python3urllib)	GitConfig)R_HEADSHEAD)
RemoteSpecProjectMetaProject)ManifestParseErrorManifestInvalidPathErrorManifestInvalidRevisionErrorzmanifest.xmlzlocal_manifest.xmlZlocal_manifestssshgitzpersistent-httpsssorpcc               @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdd Zdd	 ZdS )
_Defaultz%Project defaults within the manifest.N   FTc             C   s   | j |j kS )N)__dict__)selfother r   >/home/qytech/356xLinux510-101server/.repo/repo/manifest_xml.py__eq__H   s    z_Default.__eq__c             C   s   | j |j kS )N)r   )r   r   r   r   r   __ne__K   s    z_Default.__ne__)__name__
__module____qualname____doc__revisionExprdestBranchExprupstreamExprremotesync_jsync_csync_s	sync_tagsr   r   r   r   r   r   r   <   s   r   c               @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )
_XmlRemoteNc             C   s8   || _ || _|| _|| _|| _|| _|| _| j | _d S )N)	namefetchUrlpushUrlmanifestUrlremoteAlias	reviewUrlrevision_resolveFetchUrlresolvedFetchUrl)r   r(   aliasfetchr*   r+   reviewr.   r   r   r   __init__P   s    z_XmlRemote.__init__c             C   s   | j |j kS )N)r   )r   r   r   r   r   r   a   s    z_XmlRemote.__eq__c             C   s   | j |j kS )N)r   )r   r   r   r   r   r   d   s    z_XmlRemote.__ne__c             C   sd   | j jd}| jjd}|jd|jdd krRtjjd| |}tjdd|}ntjj||}|S )N/:r   z	gopher://z
^gopher:// )	r)   rstripr+   findr   parseurljoinresub)r   urlr+   r   r   r   r/   g   s    z_XmlRemote._resolveFetchUrlc             C   sF   | j jd}|d | }| j}| jr*| j}t||| j| j| j| jdS )Nr5   )r>   r*   r3   	orig_namer)   )r0   r8   r(   r,   r   r*   r-   r)   )r   ZprojectNamer)   r>   
remoteNamer   r   r   ToRemoteSpecw   s    z_XmlRemote.ToRemoteSpec)NNNNNN)r   r   r   r4   r   r   r/   rA   r   r   r   r   r'   O   s        

r'   c               @   s  e Zd ZdZdd Zd]ddZdd Zd	d
 Zdd Zd^ddZ	dd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d_d?d@Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(e)d`dMdNZ*e+dOdP Z,dQdR Z-dSdT Z.dUdV Z/dWdX Z0dYdZ Z1d[d\ Z2dS )aXmlManifestz#manages the repo configuration filec             C   s   t jj|| _t jj| j| _t jj| jt| _t	j
 | _d| _d| _d| _t| dt jj|dt jj|dd| _t| dt jj|dt jj|dd}|| _t jj|jr|jjdrd|_| j  d S )	NFTrepoz	repo/.git)gitdirworktreeZ	manifestszmanifests.gitzrepo.worktree)ospathabspathrepodirdirnametopdirjoinMANIFEST_FILE_NAMEmanifestFiler   ForUserglobalConfiglocalManifestWarningisGitcClient_load_local_manifestsr
   repoProjectmanifestProjectexistsrD   config
GetBooleanuse_git_worktrees_Unload)r   rI   mpr   r   r   r4      s"    
zXmlManifest.__init__Tc             C   s   d}|s$t jj|}t jj|r$|}|dkrVt jj| jj|}t jj|sVtd| | j}z || _	|| _| j
  | j  W d|| _X dS )zBUse a different manifest, just for the current instantiation.
    Nzmanifest %s not found)rF   rG   rH   isfilerL   rU   rE   r   rN   rS   rZ   _Load)r   r(   Zload_local_manifestsrG   Z
local_patholdr   r   r   Override   s     zXmlManifest.Overridec          
   C   sP   | j | tjj| jr$tj| j t| jd}|jd|f  W dQ R X dS )z:Update the repo metadata to use a different manifest.
    wa  <?xml version="1.0" encoding="UTF-8"?>
<!--
DO NOT EDIT THIS FILE!  It is generated by repo and changes will be discarded.
If you want to use a different manifest, use `repo init -m <file>` instead.

If you want to customize your checkout by overriding manifest settings, use
the local_manifests/ directory instead.

For more information on repo manifests, check out:
https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
-->
<manifest>
  <include name="%s" />
</manifest>
N)	r_   rF   rG   lexistsrN   platform_utilsremoveopenwrite)r   r(   fpr   r   r   Link   s    
zXmlManifest.Linkc             C   s   |j d}|j| |jd|j |jd|j |jd k	rH|jd|j |jd k	r`|jd|j |jd k	rx|jd|j |jd k	r|jd|j d S )Nr"   r(   r2   pushurlr1   r3   r.   )	createElementappendChildsetAttributer(   r)   r*   r,   r-   r.   )r   rdocrooter   r   r   _RemoteToXml   s    





zXmlManifest._RemoteToXmlc             C   s   dd t jd|D S )Nc             S   s   g | ]}|r|qS r   r   ).0xr   r   r   
<listcomp>   s    z,XmlManifest._ParseGroups.<locals>.<listcomp>z[,\s]+)r<   split)r   groupsr   r   r   _ParseGroups   s    zXmlManifest._ParseGroupsFNc                s  j }dkr|jjdr(jtjjj jd}j	| j
r|j	jd}j
j }djdd |D dd }	|j	j|	 j x&tjD ]}
jj|
 | qW jr|j	jd	 d
}jd} jrd}|jd jj  jrd}|jd j  jr6d}|jd j  jrPd}|jd j  jdkrrd}|jdd j   jrd}|jdd  jrd}|jdd  jsd}|jdd |r|j	| |j	jd	 jrjd}|jdj |j	| |j	jd	 fdd fddtdd jj D }d|t t| j!r|j	jd	 jd }|jd!j!j |jd"d#jj!j" |j	| j#|d	d$dd% dS )&zAWrite the current manifest out to the given file descriptor.
    Nzmanifest.groupsmanifestnotice
c             s   s   | ]}d| V  qdS )    Nz    r   )rq   liner   r   r   	<genexpr>   s    z#XmlManifest.Save.<locals>.<genexpr>r{   r7   FdefaultTr"   r.   zdest-branchupstreamr   zsync-jz%dzsync-ctruezsync-sz	sync-tagsfalsezmanifest-serverr>   c                s2   x,|D ]$}xj | D ]} | || qW qW d S )N)	_projects)parentparent_nodeprojectsZproject_nameproject)output_projectr   r   r   output_projects+  s    
z)XmlManifest.Save.<locals>.output_projectsc                sX  |j sd S |j}|j}| r:j| j|}j| j|}jd}|j| |jd| ||krn|jd| d }jrjj}j s|jj	|kr|jj	}|jd| rj
r|jj|jd }n|jjtd }|jd| r|jr|jd|j n||jkr|jd|j nlj|jj	 jp4j}| sJ||jkrX|jd|j |jr|j|jks||jjkr|jd|j |jr|jjkr|jd|j x@|jD ]6}	jd	}
|
jd
|	j |
jd|	j |j|
 qW x@|jD ]6}jd}|jd
|j |jd|j |j| qW dd|j d|j g  fdd|jD }|rt|jddj| xL|jD ]B}|jdkr|jd}|jd|j |jd|j |j| q|W |jr|jdd |j r|jdd |j!s|jdd |j"r|jdt#|j" j$|| |j%rTt&dd |j%D }||t't(| d S )Nr   r(   rG   r"   z^0r.   r   zdest-branchcopyfilesrcdestlinkfileallzname:%szpath:%sc                s   g | ]}| kr|qS r   r   )rq   g)default_groupsr   r   rs   j  s    z<XmlManifest.Save.<locals>.output_project.<locals>.<listcomp>ru   ,r   
annotationvaluezsync-czsync-sz	sync-tagsr   zclone-depthc             s   s   | ]}|j V  qd S )N)r(   )rq   Zsubpr   r   r   r}     s    z;XmlManifest.Save.<locals>.output_project.<locals>.<genexpr>))MatchesGroupsr(   relpath_UnjoinName_UnjoinRelpathri   rj   rk   r"   r?   IsMirrorbare_git	rev_parser   work_gitr   r   remotesr.   r!   dest_branchr    	copyfilesr   r   	linkfilesru   rL   annotationskeepr   r$   r%   r&   clone_depthstr_output_manifest_project_extrassubprojectssetlistsorted)r   r   pr(   r   ro   r@   r   r.   cZcelleZegroupsaZaer   )drm   ru   r   peg_revpeg_rev_upstreamr   )r   r   r   0  s    





z(XmlManifest.Save.<locals>.output_projectc             s   s   | ]}|j s|jV  qd S )N)r   r(   )rq   r   r   r   r   r}     s    z
repo-hooksz
in-projectzenabled-listrz   z  zUTF-8)$rU   rW   	GetStringrv   xmldomminidomZDocumentri   rj   rx   
splitlinesrL   ZcreateTextNoder~   r   r   rp   r"   rk   r(   r   r    r!   r#   r$   r%   r&   _manifest_serverr   _pathsvaluesr   _repo_hooks_projectenabled_repo_hooksZwritexml)r   fdr   r   ru   r[   rn   Znotice_elementZnotice_linesZindented_noticerl   Zhave_defaultro   r   r   )r   rm   ru   r   r   r   r   r   r   Save   s    







W

zXmlManifest.Savec             C   s   dS )z@Manifests can modify e if they support extra project attributes.Nr   )r   r   ro   r   r   r   r     s    z+XmlManifest._output_manifest_project_extrasc             C   s   | j   | jS )N)r]   r   )r   r   r   r   paths  s    zXmlManifest.pathsc             C   s   | j   t| jj S )N)r]   r   r   r   )r   r   r   r   r     s    zXmlManifest.projectsc             C   s   | j   | jS )N)r]   _remotes)r   r   r   r   r     s    zXmlManifest.remotesc             C   s   | j   | jS )N)r]   _default)r   r   r   r   r~     s    zXmlManifest.defaultc             C   s   | j   | jS )N)r]   r   )r   r   r   r   repo_hooks_project  s    zXmlManifest.repo_hooks_projectc             C   s   | j   | jS )N)r]   _notice)r   r   r   r   rx     s    zXmlManifest.noticec             C   s   | j   | jS )N)r]   r   )r   r   r   r   manifest_server  s    zXmlManifest.manifest_serverc             C   s    | j jjdr| j jjdS d S )Nzrepo.partialclonezrepo.clonefilter)rU   rW   rX   r   )r   r   r   r   CloneFilter  s    zXmlManifest.CloneFilterc             C   s   | j jjdS )Nzrepo.mirror)rU   rW   rX   )r   r   r   r   r     s    zXmlManifest.IsMirrorc             C   s   | j jjdS )Nzrepo.worktree)rU   rW   rX   )r   r   r   r   UseGitWorktrees  s    zXmlManifest.UseGitWorktreesc             C   s   | j jjdS )Nzrepo.archive)rU   rW   rX   )r   r   r   r   	IsArchive  s    zXmlManifest.IsArchivec             C   s   | j jjdS )Nzrepo.submodules)rU   rW   rX   )r   r   r   r   HasSubmodules  s    zXmlManifest.HasSubmodulesc             C   s:   d| _ i | _i | _i | _d | _d | _d | _d | _d | _d S )NF)	_loadedr   r   r   r   r   r   branchr   )r   r   r   r   rZ     s    zXmlManifest._Unloadc             C   s  | j s| j}|j|jj}|d k	r>|jtr>|ttd  }|| _g }|j	| j
| j| jj | jr>tjj| jt}tjj|r| jsd| _tdttjj| jtf tjd |j	| j
|| j tjjtjj| jt}yHxBttj|D ]0}|jdrtjj||}|j	| j
|| j qW W n tk
r<   Y nX y| j| W n0 t k
r| } z| j!  |W Y d d }~X nX | j"r| j#| j$ | j#| j d| _ d S )NTz>warning: %s is deprecated; put local manifests in `%s` instead)filez.xml)%r   rU   	GetBranchCurrentBranchmerge
startswithr   lenr   append_ParseManifestXmlrN   rE   rS   rF   rG   rL   rI   LOCAL_MANIFEST_NAMErV   rQ   printLOCAL_MANIFESTS_DIR_NAMEsysstderrrH   r   rb   listdirendswithOSError_ParseManifestr   rZ   r   _AddMetaProjectMirrorrT   )r   mbnodeslocalZ	local_dirZ
local_filero   r   r   r   r]     sJ    

zXmlManifest._Loadc       
      C   sb  yt jjj|}W n< tt jjjfk
rN } ztd||f W Y d d }~X nX | s^|j	 rltd|f x(|j	D ]}|j
dkrtP qtW td|f g }x|j	D ]}|j
dkrP| j|d}tjj||}	tjj|	std|f y|j| j|	| W nP tttfk
r    Y n4 tk
rL } ztd||f W Y d d }~X nX q|j| qW |S )	Nzerror parsing manifest %s: %szno root node in %srw   zno <manifest> in %sincluder(   z(include %s doesn't exist or isn't a filez'failed parsing included manifest %s: %s)r   r   r   r:   r   ZparsersZexpatZ
ExpatErrorr   
childNodesnodeName_reqattrF   rG   rL   r\   extendr   KeyboardInterruptRuntimeError
SystemExit	Exceptionr   )
r   rG   Zinclude_rootrn   ro   rw   r   noder(   rf   r   r   r   r     s6    "

"zXmlManifest._ParseManifestXmlc                s  xbt j| D ]T}|jdkrj|}|r|jjkrT|j|j kr`td|j q|j|j< qW xPt j| D ]B}|jdkrpj|}jd kr|_qp|jkrptdj	 qpW jd krt
 _x@t j| D ]2}|jdkrԈjd k	rtdj	 j|_qW xLt j| D ]>}|jdkrj|d}jd k	rLtd	j	 |_qW  fd
d xt j| D ]}|jdkrj|} | |jdkrlj|d}|jkrtd| |jd}|jd}	|	rj|	}	|jd}
|jd}|rj|}xZj| D ]L}|r6|j|kr6q|	rH|jj|	 |
rT|
|_|r|j||_qW |jdkrj|d}j|dj }jd k	rtdj	 yj| }W n" tk
r   td| Y nX t|dkrtdj	 |d _|j_|jdkrtj|d}|jkr>td| xj| D ]}j|j= qJW j|= jrtjj|krtd _qtW d S )Nr"   z2remote %s already exists with different attributesr~   zduplicate default in %srx   zduplicate notice in %szmanifest-serverr>   zduplicate manifest-server in %sc                s   j j| jg }| jd kr.td| jjf | jjkrNtd| jjf | j| j< |j|  x| jD ]} | qlW d S )Nzmissing path for %s in %szduplicate path %s in %s)	r   
setdefaultr(   r   r   rN   r   r   r   )r   r   
subproject)recursively_add_projectsr   r   r   r   Y  s    

z<XmlManifest._ParseManifest.<locals>.recursively_add_projectsr   zextend-projectr(   z9extend-project element specifies non-existent project: %srG   ru   r.   z
repo-hooksz
in-projectzenabled-listzduplicate repo-hooks in %sz#project %s not found for repo-hooksr   z'internal error parsing repo-hooks in %sr   zremove-projectz9remove-project element specifies non-existent project: %s) 	itertoolschainr   _ParseRemoter(   r   r   _ParseDefaultr   rN   r   r   _ParseNoticer   r   _ParseProjectr   getAttributerv   _get_remoter   ru   r   r   rA   r"   rt   r   KeyErrorr   r   r   )r   Z	node_listr   r"   Znew_defaultr>   r   r(   rG   ru   r.   r   r   r   Zrepo_hooks_projectsr   )r   r   r   r   /  s    




















zXmlManifest._ParseManifestc       
      C   s@  d }|j |jjj}|jdr*td| | jrv| jjrv| jjj}|jdsT|d7 }|j|rv| jj}|t	|d  }|d kr|j
dd }| jjjd}td|d | |d}||d  }|jdr|d d }|| jkr<|j  tjj| jd
| }t| ||j|||d |pd |jd d	}	|	g| j|	j< |	| j|	j< d S )Nz/.gitzrefusing to mirror %sr5   r   zremote.origin.urlorigin)r2   r+   z.gitr{   z%s.git)	rw   r(   r"   rD   objdirrE   r   r   
revisionId)	GetRemoter"   r(   r>   r   r   r   r0   r   r   rindexrU   rW   r   r'   r   PreSyncrF   rG   rL   rK   r	   rA   r   r   r   )
r   r   r(   Zm_urlr>   r"   sr+   rD   r   r   r   r   r     s@    




z!XmlManifest._AddMetaProjectMirrorc       	      C   s   | j |d}|jd}|dkr"d}| j |d}|jd}|dkrDd}|jd}|dkrZd}|jd}|dkrpd}| jjjd	}t|||||||S )
z9
    reads a <remote> element from the manifest file
    r(   r1   r7   Nr2   rh   r3   r.   zremote.origin.url)r   r   rU   rW   r   r'   )	r   r   r(   r1   r2   r*   r3   r.   r+   r   r   r   r     s     



zXmlManifest._ParseRemotec             C   s   t  }| j||_|jd|_|jdkr.d|_|jdp:d|_|jdpJd|_|jd}|dksh|dkrpd|_n
t||_|jd}|sd	|_	n|j
 dk|_	|jd}|sd	|_n|j
 dk|_|jd}|sd|_n|j
 dk|_|S )z:
    reads a <default> element from the manifest file
    r.   r7   Nzdest-branchr   zsync-jr   zsync-cFyesr   1zsync-sz	sync-tagsT)r   r   r   )r   r   r   )r   r   r   )r   r   r"   r   r   r    r!   r#   intr$   lowerr%   r&   )r   r   r   r#   r$   r%   r&   r   r   r   r     s0    





zXmlManifest._ParseDefaultc       	      C   s   |j d j}tj}|j }x:|dd D ]*}|j }|r(t|t| }t||}q(W |d j g}x*|dd D ]}|j	||d j
  qrW x|r|d  r|d= qW x|r|d  r|d= qW dj|S )a  
    reads a <notice> element from the manifest file

    The <notice> element is distinct from other tags in the XML in that the
    data is conveyed between the start and end tag (it's not an empty-element
    tag).

    The white space (carriage returns, indentation) for the notice element is
    relevant and is parsed in a way that is based on how python docstrings work.
    In fact, the code is remarkably similar to here:
      http://www.python.org/dev/peps/pep-0257/
    r   r   Nry   r   )r   datar   maxsizer   lstripr   minstripr   r8   rL   )	r   r   rx   Z	minIndentlinesr|   ZlstrippedLineindentZ
cleanLinesr   r   r   r     s     

zXmlManifest._ParseNoticec             C   s   t jj||S )N)rF   rG   rL   )r   parent_namer(   r   r   r   	_JoinName8  s    zXmlManifest._JoinNamec             C   s   t jj||S )N)rF   rG   r   )r   r  r(   r   r   r   r   ;  s    zXmlManifest._UnjoinNamec             K   s:  | j |d}|r| j|j|}| j|}|dkr8| jj}|dkrRtd|| jf |jdp`|j	}|sn| jj
}|std|| jf |jd}|s|}|jdrtd|| jf |jd	}|sd
}n|j d$k}|jd}	|	sd}	n|	j d%k}	|jd}
|
s| jj}
n|
j d&k}
|jd}|s2| jj}n|j d'k}|jd}|ryt|}|dkrht W n( tk
r   td|| jf Y nX |jdp| jj}|jdp| jj}d}|jdr|jd}| j|}|dkr| j||\}}}}}nd}| j|||\}}}}dd| d| g}|jt|j| | jr~|jdr~|jdj d(kr~tjj| jd| }tf | ||j ||||||d|||	|
||||||d|}xz|j!D ]p}|j"dkr| j#|| |j"d kr| j$|| |j"d!kr| j%|| |j"d"kr|j&j'| j(||d# qW |S ))z:
    reads a <project> element from the manifest file
    r(   Nz"no remote for project %s within %sr.   z$no revision for project %s within %srG   r5   z(project %s path cannot be absolute in %srebaseTr   r   r   zsync-cFzsync-sz	sync-tagszclone-depthr   zinvalid clone-depth %s in %szdest-branchr   r7   ru   r   zname:%szpath:%sz
force-pathz%s.git)rw   r(   r"   rD   r   rE   r   r   r   r
  ru   r$   r%   r&   r   r   r   r   rY   r   r   r   r   )r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   r   ))r   r	  r(   r   r   r"   r   rN   r   r.   r   r   r   r%   r&   r   
ValueErrorr    r!   ZhasAttributerv   GetProjectPathsGetSubprojectPathsr   r   
differencer   rF   rG   rL   rK   r	   rA   r   r   _ParseCopyFile_ParseLinkFile_ParseAnnotationr   r   r   )r   r   r   Zextra_proj_attrsr(   r"   r   rG   r
  r$   r%   r&   r   r   r   ru   r   rE   rD   r   rY   r   r   nr   r   r   r   >  s    














zXmlManifest._ParseProjectc             C   s   d}|}| j r,d }tjj| jd| }|}nxtjj| j|jdd}tjj| jdd| }tjj|sn| j rtjj| jdd| }nd}tjj| jdd| }|}|||||fS )	NFz%s.git\r5   r   zproject-objectsT	worktrees)	r   rF   rG   rL   rK   replacerI   rV   r   )r   r(   rG   rY   r   rE   rD   r   r   r   r   r    s    zXmlManifest.GetProjectPathsc             C   s   | j j|g S )N)r   get)r   r(   r   r   r   GetProjectsWithName  s    zXmlManifest.GetProjectsWithNamec             C   s   t jj|j|S )N)rF   rG   rL   r(   )r   r   Zsubmodule_pathr   r   r   GetSubprojectName  s    zXmlManifest.GetSubprojectNamec             C   s   t jj||S )N)rF   rG   rL   )r   parent_relpathr   r   r   r   _JoinRelpath  s    zXmlManifest._JoinRelpathc             C   s   t jj||S )N)rF   rG   r   )r   r  r   r   r   r   r     s    zXmlManifest._UnjoinRelpathc             C   sj   | j |j|}tjj|jdd| }tjj|jdd| }| jrFd }ntjj|j|jdd}||||fS )Nr   z%s.gitzsubproject-objectsr  r5   )	r  r   rF   rG   rL   rD   r   rE   r  )r   r   r(   rG   r   rD   r   rE   r   r   r   r    s    zXmlManifest.GetSubprojectPathsc             C   s  d| krdS ddddddd	d
ddddddddh}|t | @ r@dS | j } tjdtjtjj }|j| }|dgkrx,t |D ] }|d!ks|j	dr~d|f S q~W | r|j
| d" rdS tjj| }|dkst|dkr|j	dr|j
|d stjj|s|j	drdS d S )#z?Verify |path| is reasonable for use in <copyfile> & <linkfile>.~z;~ not allowed (due to 8.3 filenames on Windows filesystems)u   ‌u   ‍u   ‎u   ‏u   ‪u   ‫u   ‬u   ‭u   ‮u   ⁪u   ⁫u   ⁬u   ⁭u   ⁮u   ⁯u   ﻿z(Unicode combining characters not allowedz[/%s]....gitz.repozbad component: %sr   zdirs not allowed   r   r5   zpath cannot be outsideN>   r  r  r  r   )r   r   r<   compileescaperF   rG   seprt   r   matchnormpathr   isabs)rG   symlinkZBAD_CODEPOINTSreseppartspartZnormr   r   r   _CheckLocalPath  sF    


&zXmlManifest._CheckLocalPathc             C   sL   | j |}|r td|||f | j ||dkd}|rHtd|||f dS )an  Verify |src| & |dest| are reasonable for <copyfile> & <linkfile>.

    We verify the path independent of any filesystem state as we won't have a
    checkout available to compare to.  i.e. This is for parsing validation
    purposes only.

    We'll do full/live sanity checking before we do the actual filesystem
    modifications in _CopyFile/_LinkFile/etc...
    z<%s> invalid "dest": %s: %sr   )r&  z<%s> invalid "src": %s: %sN)r*  r   )clselementr   r   msgr   r   r   _ValidateFilePaths  s    
zXmlManifest._ValidateFilePathsc             C   s@   | j |d}| j |d}| js<| jd|| |j||| j d S )Nr   r   r   )r   r   r.  AddCopyFilerK   )r   r   r   r   r   r   r   r   r  7  s
    zXmlManifest._ParseCopyFilec             C   s@   | j |d}| j |d}| js<| jd|| |j||| j d S )Nr   r   r   )r   r   r.  AddLinkFilerK   )r   r   r   r   r   r   r   r   r  A  s
    zXmlManifest._ParseLinkFilec             C   sp   | j |d}| j |d}y| j |dj }W n tk
rD   d}Y nX |dkr^|dkr^td|j||| d S )Nr(   r   r   r   r   z3optional "keep" attribute must be "true" or "false")r   r   r   AddAnnotation)r   r   r   r(   r   r   r   r   r   r  K  s    
zXmlManifest._ParseAnnotationc             C   s8   |j d}|sd S | jj|}|s4td|| jf |S )Nr"   zremote %s not defined in %s)r   r   r  r   rN   )r   r   r(   vr   r   r   r   W  s    
zXmlManifest._get_remotec             C   s(   |j |}|s$td||j| jf |S )z3
    reads a required attribute from the node.
    zno %s in <%s> within %s)r   r   r   rN   )r   r   Zattnamer2  r   r   r   r   b  s
    
zXmlManifest._reqattc             C   s   | j }|j }t|j }t|j }g g g g d}x|D ]}||krX|d j||  q8|| }|| }	y|j }
|	j }W n& tk
r   |d j||	f Y nX |
|kr|d j||	f |j| q8W x|D ]}|d j||  qW |S )zoreturn the projects differences between two manifests.

    The diff will be from self to given manifest.

    )addedremovedchangedunreachabler4  r6  r5  r3  )r   r   keysr   GetCommitRevisionIdr   rc   )r   rw   ZfromProjectsZ
toProjectsZfromKeysZtoKeysdiffprojZfromProjZtoProjZ	fromRevIdZtoRevIdr   r   r   projectsDiffl  s*    

zXmlManifest.projectsDiff)T)FTN)N)F)3r   r   r   r   r4   r_   rg   rp   rv   r   r   propertyr   r   r   r~   r   rx   r   r   r   r   r   r   rZ   r]   r   r   r   r   r   r   r	  r   r   r  r  r  r  r   r  staticmethodr*  classmethodr.  r  r  r  r   r   r;  r   r   r   r   rB      s`   

 ,/$ &&'
x
=


rB   c                   s2   e Zd Z fddZd fdd	Zdd Z  ZS )	GitcManifestc                sF   t t| j| d| _|| _tjjtj	 || _
tjj| j
d| _dS )z#Initialize the GitcManifest object.Tz	.manifestN)superr?  r4   rR   gitc_client_namerF   rG   rL   
gitc_utilsget_gitc_manifest_dirgitc_client_dirrN   )r   rI   rA  )	__class__r   r   r4     s    zGitcManifest.__init__Nc                s   t t| j|||jddS )zDOverride _ParseProject and add support for GITC specific attributes.zold-revision)r   old_revision)r@  r?  r   r   )r   r   r   )rE  r   r   r     s    
zGitcManifest._ParseProjectc             C   s   |j r|jdt|j  dS )z'Output GITC Specific Project attributeszold-revisionN)rF  rk   r   )r   r   ro   r   r   r   r     s    z,GitcManifest._output_manifest_project_extras)N)r   r   r   r4   r   r   __classcell__r   r   )rE  r   r?    s   	r?  )*
__future__r   r   rF   r<   r   Zxml.dom.minidomr   	pyversionr   urllib.parser   impurlparse
new_moduler:   rB  
git_configr   git_refsr   r   rb   r   r   r	   r
   errorr   r   r   rM   r   r   uses_relativer   uses_netlocobjectr   r'   rB   r?  r   r   r   r   <module>   sZ   

6        