3
_Af                 @   s  d Z 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ZG dd de	Z
e
 Zdd Zdd	 Zed
krte  ejjddatsdaejjdatsdadoZdpZdZdZdqZdZdZdZed ZdZdZddlZddlZddl Z ddl!Z!ddl"Z"ddl#Z#ej$d dkr ddl%Z&ddl'Z&n&ddl(Z(ddl)Z)e(j*dZ&e)e&_+e)e&_,ej-j.dZ/ej-j0e/dZ1g Z2drd d!Z3ej4d"dsZ5G d&d' d'e6Z7d(d) Z8da9d*d+ Z:d,d- Z;G d.d/ d/e6Z<dtd0d1Z=d2d3 Z>ej4d4duZ?dvd9d:Z@d;d< ZAdwd=d>ZBdxd?d@ZCdAdB ZDdCdD ZEdEdF ZFdGdH ZGdIdJ ZHdKdL ZIdMdN ZJdOdP ZKdQdR ZLdSdT ZMdUdV ZNdWdX ZOG dYdZ dZe	ZPd[d\ ZQd]d^ ZRd_d` ZSdadb ZTdcdd ZUdedf ZVdgdh ZWdidj ZXdkdl ZYdmdn ZZed
kreZej[dd  dS )yzRepo launcher.

This is a standalone tool that people may copy to anywhere in their system.
It is used to get an initial repo client checkout, and after that it runs the
copy of repo in the checkout.
    )print_functionNc               @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
TracezTrace helper logic.
REPO_TRACEc             C   s   | j tjj| jdk d S )N1)setosenvirongetr   )self r   3/home/qytech/356xLinux510-101server/.repo/repo/repo__init__)   s    zTrace.__init__c             C   s   t || _d S )N)boolenabled)r
   valuer   r   r   r   ,   s    z	Trace.setc             O   s   | j rt|| d S )N)r   print)r
   argskwargsr   r   r   r   /   s    zTrace.printN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   $   s
   r   c             C   sb   t jddj|  y6tj dkr6tj| }tj| nt	j
| d |  W n tk
r\   Y nX dS )z(Execute |cmd| or return None on failure.: Windowsr   N)tracer   joinplatformsystem
subprocesscallsysexitr   execvp	Exception)cmdretr   r   r   exec_command7   s    
r'   c              C   sD  dd } d}t j}|j}|j}||fdk rHtdj| t jd t jd	 ||f|k r@|\}}x&td
dD ]}| dj|||  qjW yFt	j
dddgt	jt	jd}|j \}	}
tdd |	jdj D }W n tt	jfk
r   d}Y nX |o||kr| d |dk r"tdj| t jd ntdj| t jd t jd	 dS )z5Make sure the active Python version is recent enough.c             S   s   t | gtj  d S )N)r'   r!   argv)progr   r   r   reexecF   s    z$check_python_version.<locals>.reexec            zVrepo: error: Your Python version is too old. Please use Python {}.{} or newer instead.)file   r   
   zpython{}.{}python3z-czAimport sys; print(sys.version_info.major, sys.version_info.minor))stdoutstderrc             s   s   | ]}t |V  qd S )N)int).0xr   r   r   	<genexpr>f   s    z'check_python_version.<locals>.<genexpr>zutf-8NzPrepo: warning: Python 2 is no longer supported; Please upgrade to Python {}.{}+.zKrepo: error: Python 3 version is too old; Please use Python {}.{} or newer.)r+   r,   )r-   r.   )r!   version_infomajorminorr   formatr4   r"   ranger   PopenPIPEcommunicatetupledecodesplitOSErrorCalledProcessError)r*   ZMIN_PYTHON_VERSIONverr:   r;   Z	min_majorZ	min_minorincprocoutput_Zpython3_verr   r   r   check_python_versionD   s>    
 


rK   __main__REPO_URLz(https://gerrit.googlesource.com/git-repoREPO_REVZstabler-      r+   a  

     Repo Maintainer <repo@android.kernel.org>
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQGiBEj3ugERBACrLJh/ZPyVSKeClMuznFIrsQ+hpNnmJGw1a9GXKYKk8qHPhAZf
WKtrBqAVMNRLhL85oSlekRz98u41H5si5zcuv+IXJDF5MJYcB8f22wAy15lUqPWi
VCkk1l8qqLiuW0fo+ZkPY5qOgrvc0HW1SmdH649uNwqCbcKb6CxaTxzhOwCgj3AP
xI1WfzLqdJjsm1Nq98L0cLcD/iNsILCuw44PRds3J75YP0pze7YF/6WFMB6QSFGu
aUX1FsTTztKNXGms8i5b2l1B8JaLRWq/jOnZzyl1zrUJhkc0JgyZW5oNLGyWGhKD
Fxp5YpHuIuMImopWEMFIRQNrvlg+YVK8t3FpdI1RY0LYqha8pPzANhEYgSfoVzOb
fbfbA/4ioOrxy8ifSoga7ITyZMA+XbW8bx33WXutO9N7SPKS/AK2JpasSEVLZcON
ae5hvAEGVXKxVPDjJBmIc2cOe7kOKSi3OxLzBqrjS2rnjiP4o0ekhZIe4+ocwVOg
e0PLlH5avCqihGRhpoqDRsmpzSHzJIxtoeb+GgGEX8KkUsVAhbQpUmVwbyBNYWlu
dGFpbmVyIDxyZXBvQGFuZHJvaWQua2VybmVsLm9yZz6IYAQTEQIAIAUCSPe6AQIb
AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBZTDV6SD1xl1GEAn0x/OKQpy7qI
6G73NJviU0IUMtftAKCFMUhGb/0bZvQ8Rm3QCUpWHyEIu7kEDQRI97ogEBAA2wI6
5fs9y/rMwD6dkD/vK9v4C9mOn1IL5JCPYMJBVSci+9ED4ChzYvfq7wOcj9qIvaE0
GwCt2ar7Q56me5J+byhSb32Rqsw/r3Vo5cZMH80N4cjesGuSXOGyEWTe4HYoxnHv
gF4EKI2LK7xfTUcxMtlyn52sUpkfKsCpUhFvdmbAiJE+jCkQZr1Z8u2KphV79Ou+
P1N5IXY/XWOlq48Qf4MWCYlJFrB07xjUjLKMPDNDnm58L5byDrP/eHysKexpbakL
xCmYyfT6DV1SWLblpd2hie0sL3YejdtuBMYMS2rI7Yxb8kGuqkz+9l1qhwJtei94
5MaretDy/d/JH/pRYkRf7L+ke7dpzrP+aJmcz9P1e6gq4NJsWejaALVASBiioqNf
QmtqSVzF1wkR5avZkFHuYvj6V/t1RrOZTXxkSk18KFMJRBZrdHFCWbc5qrVxUB6e
N5pja0NFIUCigLBV1c6I2DwiuboMNh18VtJJh+nwWeez/RueN4ig59gRTtkcc0PR
35tX2DR8+xCCFVW/NcJ4PSePYzCuuLvp1vEDHnj41R52Fz51hgddT4rBsp0nL+5I
socSOIIezw8T9vVzMY4ArCKFAVu2IVyBcahTfBS8q5EM63mONU6UVJEozfGljiMw
xuQ7JwKcw0AUEKTKG7aBgBaTAgT8TOevpvlw91cAAwUP/jRkyVi/0WAb0qlEaq/S
ouWxX1faR+vU3b+Y2/DGjtXQMzG0qpetaTHC/AxxHpgt/dCkWI6ljYDnxgPLwG0a
Oasm94BjZc6vZwf1opFZUKsjOAAxRxNZyjUJKe4UZVuMTk6zo27Nt3LMnc0FO47v
FcOjRyquvgNOS818irVHUf12waDx8gszKxQTTtFxU5/ePB2jZmhP6oXSe4K/LG5T
+WBRPDrHiGPhCzJRzm9BP0lTnGCAj3o9W90STZa65RK7IaYpC8TB35JTBEbrrNCp
w6lzd74LnNEp5eMlKDnXzUAgAH0yzCQeMl7t33QCdYx2hRs2wtTQSjGfAiNmj/WW
Vl5Jn+2jCDnRLenKHwVRFsBX2e0BiRWt/i9Y8fjorLCXVj4z+7yW6DawdLkJorEo
p3v5ILwfC7hVx4jHSnOgZ65L9s8EQdVr1ckN9243yta7rNgwfcqb60ILMFF1BRk/
0V7wCL+68UwwiQDvyMOQuqkysKLSDCLb7BFcyA7j6KG+5hpsREstFX2wK1yKeraz
5xGrFy8tfAaeBMIQ17gvFSp/suc9DYO0ICK2BISzq+F+ZiAKsjMYOBNdH/h0zobQ
HTHs37+/QLMomGEGKZMWi0dShU2J5mNRQu3Hhxl3hHDVbt5CeJBb26aQcQrFz69W
zE3GNvmJosh6leayjtI9P2A6iEkEGBECAAkFAkj3uiACGwwACgkQFlMNXpIPXGWp
TACbBS+Up3RpfYVfd63c1cDdlru13pQAn3NQy/SN858MkxN+zym86UBgOad2uQIN
BF5FqOoBEAC8aRtWEtXzeuoQhdFrLTqYs2dy6kl9y+j3DMQYAMs8je582qzUigIO
ZZxq7T/3WQgghsdw9yPvdzlw9tKdet2TJkR1mtBfSjZQrkKwR0pQP4AD7t/90Whu
R8Wlu8ysapE2hLxMH5Y2znRQX2LkUYmk0K2ik9AgZEh3AFEg3YLl2pGnSjeSp3ch
cLX2n/rVZf5LXluZGRG+iov1Ka+8m+UqzohMA1DYNECJW6KPgXsNX++i8/iwZVic
PWzhRJSQC+QiAZNsKT6HNNKs97YCUVzhjBLnRSxRBPkr0hS/VMWY2V4pbASljWyd
GYmlDcxheLne0yjes0bJAdvig5rB42FOV0FCM4bDYOVwKfZ7SpzGCYXxtlwe0XNG
tLW9WA6tICVqNZ/JNiRTBLrsGSkyrEhDPKnIHlHRI5Zux6IHwMVB0lQKHjSop+t6
oyubqWcPCGGYdz2QGQHNz7huC/Zn0wS4hsoiSwPv6HCq3jNyUkOJ7wZ3ouv60p2I
kPurgviVaRaPSKTYdKfkcJOtFeqOh1na5IHkXsD9rNctB7tSgfsm0G6qJIVe3ZmJ
7QAyHBfuLrAWCq5xS8EHDlvxPdAD8EEsa9T32YxcHKIkxr1eSwrUrKb8cPhWq1pp
Jiylw6G1fZ02VKixqmPC4oFMyg1PO8L2tcQTrnVmZvfFGiaekHKdhQARAQABiQKW
BBgRAgAgFiEEi7mteT6OYVOvD5pEFlMNXpIPXGUFAl5FqOoCGwICQAkQFlMNXpIP
XGXBdCAEGQEKAB0WIQSjShO+jna/9GoMAi2i51qCSquWJAUCXkWo6gAKCRCi51qC
SquWJLzgD/0YEZYS7yKxhP+kk94TcTYMBMSZpU5KFClB77yu4SI1LeXq4ocBT4sp
EPaOsQiIx//j59J67b7CBe4UeRA6D2n0pw+bCKuc731DFi5X9C1zq3a7E67SQ2yd
FbYE2fnpVnMqb62g4sTh7JmdxEtXCWBUWL0OEoWouBW1PkFDHx2kYLC7YpZt3+4t
VtNhSfV8NS6PF8ep3JXHVd2wsC3DQtggeId5GM44o8N0SkwQHNjK8ZD+VZ74ZnhZ
HeyHskomiOC61LrZWQvxD6VqtfnBQ5GvONO8QuhkiFwMMOnpPVj2k7ngSkd5o27K
6c53ZESOlR4bAfl0i3RZYC9B5KerGkBE3dTgTzmGjOaahl2eLz4LDPdTwMtS+sAU
1hPPvZTQeYDdV62bOWUyteMoJu354GgZPQ9eItWYixpNCyOGNcJXl6xk3/OuoP6f
MciFV8aMxs/7mUR8q1Ei3X9MKu+bbODYj2rC1tMkLj1OaAJkfvRuYrKsQpoUsn4q
VT9+aciNpU/I7M30watlWo7RfUFI3zaGdMDcMFju1cWt2Un8E3gtscGufzbz1Z5Z
Gak+tCOWUyuYNWX3noit7Dk6+3JGHGaQettldNu2PLM9SbIXd2EaqK/eEv9BS3dd
ItkZwzyZXSaQ9UqAceY1AHskJJ5KVXIRLuhP5jBWWo3fnRMyMYt2nwNBAJ9B9TA8
VlBniwIl5EzCvOFOTGrtewCdHOvr3N3ieypGz1BzyCN9tJMO3G24MwReRal9Fgkr
BgEEAdpHDwEBB0BhPE/je6OuKgWzJ1mnrUmHhn4IMOHp+58+T5kHU3Oy6YjXBBgR
AgAgFiEEi7mteT6OYVOvD5pEFlMNXpIPXGUFAl5FqX0CGwIAgQkQFlMNXpIPXGV2
IAQZFggAHRYhBOH5BA16P22vrIl809O5XaJD5Io5BQJeRal9AAoJENO5XaJD5Io5
MEkA/3uLmiwANOcgE0zB9zga0T/KkYhYOWFx7zRyDhrTf9spAPwIfSBOAGtwxjLO
DCce5OaQJl/YuGHvXq2yx5h7T8pdAZ+PAJ4qfIk2LLSidsplTDXOKhOQAuOqUQCf
cZ7aFsJF4PtcDrfdejyAxbtsSHI=
=82Tj
-----END PGP PUBLIC KEY BLOCK-----
gitr0   r.   z.reporepo	manifestsz/main.pyz/gitc/.configz/gitc/manifest-rw/urllibz~/.repoconfigZgnupgFc             C   s(  | r
d}nd}t j|d}|jd}|jddddd	d
 |jdddddd
 |jd}|jddddd |jddddd |jddddd dg}| s|dg7 }|j|ddd d
 |jd!dd"d# |jd$d%d&d |jd'dd(d# |jd)d*d+d,d- |jd.dd/d# |jd0d1d2d3d4 |jd5dt jd# |jd6dd7d# |jd8dd9d# |jd:d;d<d=d>d? |jd@dAdBdCdDd? |jdEdFdGddHdI |jdJdKdGddLdI |jdM}|jdNddOdP |jdQddRdP |jdSdTdGddUdI |jdV}|jdWddXdYd4 | r$|jdZ}|jd[d\d]d^ |jdd_d`d^ |S )azSetup the CLI parser.z)repo gitc-init -u url -c client [options]zrepo init -u url [options])usagezLogging optionsz-vz	--verboseoutput_mode
store_truezshow all output)destactionhelpz-qz--quietstore_falsezonly show errorszManifest optionsz-uz--manifest-urlzmanifest repository locationURL)rY   metavarz-bz--manifest-branchzmanifest branch or revisionREVISIONz-mz--manifest-namezinitial manifest filezNAME.xmlz--current-branchz-ccurrent_branch_onlyz.fetch only current manifest branch from serverz--mirrorzRcreate a replica of the remote repositories rather than a client working directory)rX   rY   z--referencezlocation of mirror directoryDIRz--dissociatez-dissociate from reference mirrors after clonez--depthr5   Nz6create a shallow clone with given depth; see git clone)typedefaultrY   z--partial-clonez]perform partial clone (https://git-scm.com/docs/gitrepository-layout#_code_partialclone_code)z--clone-filterstorez	blob:nonez7filter for use with --partial-clone [default: %default])rX   ra   rY   z
--worktreez	--archivezRcheckout an archive instead of a git repository for each project. See git archive.z--submodulesz5sync any submodules associated with the manifest repoz-gz--groupsra   z\restrict manifest projects to ones with specified group(s) [default|all|G1,G2,G3|G4,-G5,-G6]GROUP)ra   rY   r\   z-pz
--platformautozcrestrict manifest projects to ones with a specified platform group [auto|all|none|linux|darwin|...]PLATFORMz--no-clone-bundleclone_bundleTz*disable use of /clone.bundle on HTTP/HTTPS)rW   ra   rX   rY   z	--no-tagstagsz don't fetch tags in the manifestzrepo Version optionsz
--repo-urlz$repo repository location ($REPO_URL))r\   rY   z--repo-branchz#repo branch or revision ($REPO_REV)z--no-repo-verifyrepo_verifyzdo not verify repo source codezOther optionsz--config-nameFzAlways prompt for name/e-mailzGITC optionsz-fz--manifest-filez3Optional manifest file to use for this GITC client.)rY   z--gitc-clientz5Name of the gitc_client instance to create or modify.)optparseOptionParseradd_option_group
add_optionSUPPRESS_HELP)	gitc_initrT   parsergroupcbr_optsr   r   r   	GetParser  s    















rr   	RunResult
returncoder3   r4   c               @   s   e Zd ZdZdS )RunErrorz$Error when running a command failed.N)r   r   r   r   r   r   r   r   ru   i  s   ru   c                sV  |j dd}|j ddr4|jdtj |jdtj |j dd} fdd	}tj f|}|j|d
\}}ddj  }|dk	r|d7 }|tjkr|d7 }|tjkr|d7 }n|tjkr|d7 }tj	| t
|j||||}	|o|	jrRt	d d |	jf tjd t	d|jdtj  f tjd dd }
|
d|	j |
d|	j t|	|	S )z Run |cmd| and return its output.checkFcapture_outputr3   r4   inputNc                sN   | dkr| S y
| j dS  tk
rH   td | f tjd | j ddS X dS )zDecode |output| to text.Nzutf-8z/repo: warning: Invalid UTF-8 output:
cmd: %r
%r)r/   replace)rB   UnicodeErrorr   r!   r4   )rI   )r%   r   r   rB   u  s    

zrun_command.<locals>.decode)rx   z: r   z 0<|z 1>|z 2>|z 2>&1z,repo: error: "%s" failed with exit status %sr   )r/   z  cwd: %s
  cmd: %rcwdc             S   s(   |r$t d| dj|j f tjd d S )Nz  %s:
  >> %sz
  >> )r/   )r   r   
splitlinesr!   r4   )namerI   r   r   r   _print_output  s    z"run_command.<locals>._print_output)pop
setdefaultr   r?   r>   r@   r   STDOUTr   r   rs   rt   r!   r4   r	   r   getcwdr3   ru   )r%   r   rv   Z	cmd_inputrB   rH   r3   r4   dbgr&   r~   r   )r%   r   run_commandm  s:    




r   c              C   sh   t d krdda yBttd.} x&| D ]}tjd|}|r |jda q W W d Q R X W n tk
rb   Y nX t S )N rz"gitc_dir=(?P<gitc_manifest_dir>.*)gitc_manifest_dir)_gitc_manifest_diropenGITC_CONFIG_FILErematchrp   IOError)Zgitc_configliner   r   r   r   get_gitc_manifest_dir  s    
r   c             C   s   | t krdS | jt snt }|dkr(dS |d dkr<|d7 }| |krHdS | j|sVdS | j|d jdd S | jt d jdd S )zParse a path in the GITC FS and return its client name.

  @param gitc_fs_path: A subdirectory path within the GITC_FS_ROOT_DIR.

  @returns: The GITC client name
  Nr   r0   /r   )GITC_FS_ROOT_DIR
startswithr   rC   )gitc_fs_pathZmanifest_dirr   r   r   gitc_parse_clientdir  s    

r   c               @   s   e Zd ZdZdS )CloneFailurez3Indicate the remote clone of repo itself failed.
  N)r   r   r   r   r   r   r   r   r     s   r   c             C   s  t |d}|j| \}} | r.|j  tjd |jdk|_|jdk|_|j}|sbt	}t
jd|  |j}|s~t}t
jd|  |jdr|tdd }|jd	rtd
| tjd t y|r\t }|stdtjd tjd |j}| sttj }|stdtjd tjd tjj||}tjj|s@tj| tj| tjjtr\dS tjt W nT tk
r }	 z6|	j t j!krtdt|	j"f tjd tjd W Y dd}	~	X nX t#  y|j$sd}
nt% rt&|j}
nd}
|jstd| tjj'tjjtt(}t)|||j*|j|j |
r@t+|||j}nd| }t,||||j tjj-tjj|dstd| tjd W n. tk
r   |jrtdtjd  Y nX dS )z0Installs repo by cloning it over the network.
  )rn   r0   FTz--repo-url=%sz--repo-branch=%szrefs/heads/Nzrefs/zfatal: invalid branch name '%s')r/   z3fatal: GITC filesystem is not available. Exiting...z$fatal: GITC client (-c) is required.z#fatal: cannot make %s directory: %szDownloading Repo source fromzrefs/remotes/origin/%s^0rQ   zRwarning: '%s' does not look like a git-repo repository, is REPO_URL set correctly?z7fatal: repo init failed; run without --quiet to see why).rr   
parse_argsprint_usager!   r"   rU   quietverboserepo_urlrM   
extra_argsappendrepo_branchrN   r   lenr   r4   r   r   gitc_clientr   r   r   pathr   existsmakedirschdirrepodirmkdirrD   errnoEEXISTstrerror_CheckGitVersionrh   NeedSetupGnuPG
SetupGnuPGabspathS_repo_Clonerf   _Verify	_Checkoutisfile)r   rn   ro   opturlbranchr   r   
client_direZ	do_verifydstrevr   r   r   _Init  s    










r   c              O   s   |j dd |j dd yttgt|  f|S  tk
r } z^ttjd tdt tjd td| tjd ttjd tdt tjd tjd W Y d	d	}~X n t	k
r   t
 Y nX d	S )
z%Run git and return execution details.rw   Trv   )r/   z"repo: error: "%s" is not availablezrepo: error: %sz2Please make sure %s is installed and in your path.r0   N)r   r   GITlistrD   r   r!   r4   r"   ru   r   )r   r   r   r   r   r   run_git-  s    
r   
GitVersionr:   r;   microfullc             C   s   | d krt dj} | jds d S | tdd  j }|jdd }g }x<|jdd d D ]&}|j rv|jt| qZ|jd qZW |j| t	| S )Nz	--versionzgit version -r   .r+   )
r   r3   r   r   striprC   isdigitr   r5   r   )ver_strZfull_versionZnum_ver_strZto_tupleZnum_strr   r   r   ParseGitVersionE  s    


r   c              C   sV   t  } | d kr"tdtjd t | tk rRdjttt}td| tjd t d S )Nz#fatal: unable to detect git version)r/   r   zfatal: git %s or later required)	r   r   r!   r4   r   MIN_GIT_VERSIONr   mapstr)Zver_actneedr   r   r   r   Y  s    r   c             C   s\   | dkrt j} d}tjj }d|jdt j f }|| krJ| | d | }t||| d dS )z-Set up GIT_TRACE2_PARENT_SID for git tracing.NZGIT_TRACE2_PARENT_SIDzrepo-%s-P%08xz%Y%m%dT%H%M%SZr   )env)r   r   datetimeutcnowstrftimegetpid_setenv)r   ZKEYnowr   r   r   r   SetGitTrace2ParentSide  s    
r   c             C   s@   |dkrt j}y||| < W n  tk
r:   |j || < Y nX dS )z1Set |key| in the OS environment |env| to |value|.N)r   r   UnicodeEncodeErrorencode)keyr   r   r   r   r   r   {  s    r   c              C   sf   t jjtsdS t jjtd} t jj| s.dS t| j } | sBdS tt	t
| jd} | tk rbdS dS )NTzkeyring-versionr   F)r   r   isdirhome_dot_repor   r   r   readrA   r   r5   rC   KEYRING_VERSION)kvr   r   r   r     s    r   c          0   C   s  yt jt W nP tk
r^ } z4|jtjkrNtdt|jf tj	d tj
d W Y d d }~X nX yt jttj W nP tk
r } z4|jtjkrtdt|jf tj	d tj
d W Y d d }~X nX | stddjdd tD f  dd	dd
g}y t|tjdtdtjdd W nD tk
rV   | sRtdtj	d tdtj	d ttj	d dS X tt jjtdd }|jdjtttd  W d Q R X dS )Nz#fatal: cannot make %s directory: %s)r/   r0   z4repo: Updating release signing keys to keyset ver %sr   c             s   s   | ]}t |V  qd S )N)r   )r6   r7   r   r   r   r8     s    zSetupGnuPG.<locals>.<genexpr>Zgpgz	--homedirz--importTzutf-8)stdinrw   r{   rv   rx   z&warning: gpg (GnuPG) is not available.z.warning: Installing it is strongly encouraged.Fzkeyring-versionw
)r   r   r   rD   r   r   r   r   r!   r4   r"   gpg_dirstatS_IRWXUr   r   r   r   r?   MAINTAINER_KEYSr   r   r   writer   r   )r   r   r%   fdr   r   r   r     s>    

$r   c             C   s   t d||| d dS )z9Set a git configuration option to the specified value.
  config)r{   N)r   )r{   r}   r   r   r   r   
_SetConfig  s    r   c             C   s   t jjtd}t jj|sdS dd|d| g}t|ddi}|jdkrJ|jS |jdkrXdS td	d
j||j	f t
j	d t dS )z!Read a repo configuration option.r   Nz--filez--getrv   Fr   r0   zrepo: error: git %s failed:
%sr   )r/   )r   r   r   r   r   r   rt   r3   r   r4   r!   ru   )r}   r   r%   r&   r   r   r   _GetRepoConfig  s    


r   c              C   s.  g } t jj }yndd l}|j }xX|jD ]N}|j| }|j|d d| |d |d  |j|d d| |d |d  q(W W n tk
r   Y nX | jt jj| | jt jj	| dt
jkrt
jd }| jt jj||d dt
jkr| jt jjdd	 | jt jjdd	 t jjt jj|   d S )
Nr   r0   z
http://%s/r-   zhttps://%s/
http_proxy)httphttpsREPO_CURL_VERBOSE)
debuglevel)rS   requestHTTPPasswordMgrWithDefaultRealmnetrchostsadd_passwordr$   r   HTTPBasicAuthHandlerHTTPDigestAuthHandlerr   r   ProxyHandlerHTTPHandlerHTTPSHandlerinstall_openerbuild_opener)handlersmgrr   nhostpr   r   r   r   	_InitHttp  s(    

 (

r   c             C   sR   dg}|r|j d tj}nd }|j | |j d |j d t|||d d S )Nfetchz--quietz#+refs/heads/*:refs/remotes/origin/*z+refs/tags/*:refs/tags/*)r4   r{   )r   r   r?   r   )r   r{   srcr   r   r%   errr   r   r   _Fetch  s    



r  c             C   s  | j ds| d7 } | d7 } tddd|dd}xZ|jj D ]L}tjdj|}|r8|jd	}|jd
}| j|r8|| t	|d   } P q8W | jd r| jd rdS t
tjj|ddd}	zytjj| }
W n tjjk
r0 } z@|jdkrdS td|  tjd td|j tjd t W Y d d }~X nT tjjk
r } z2td|  tjd td|j tjd t W Y d d }~X nX zB|rtd|  tjd x$|
jd}|sdS |	j| qW W d |
j  X W d |	j  X d S )Nr   zclone.bundler   z--get-regexpzurl.*.insteadofF)r{   rv   z^url\.(.*)\.insteadof (.*)$r0   r-   zhttp:zhttps:z.gitzw+b        zfatal: Cannot get %s)r/   zfatal: HTTP error %szfatal: error %szDownloading clone bundle %si    T)r  r  r  r  )endswithr   r3   r|   r   compiler   rp   r   r   r   r   r   r   rS   r   urlopenerror	HTTPErrorcoder   r!   r4   r   URLErrorreasonr   r   close)r   r{   r   r   r&   r   mnew_urlold_urlrW   r   r   bufr   r   r   _DownloadBundle  sN    






r  c             C   s6   t jj| dd}zt| | |dd W d t j| X d S )Nz.gitzclone.bundleTF)r   r   r   r  remove)r{   r   r   r   r   _ImportBundle0  s    r  c             C   s   |rt d|  ytj| W n@ tk
r\ } z$t d||jf tjd t W Y dd}~X nX tdd|d t	  t
|d|  t
|d	d
 |rt| |||rt| t| |d|| dS )z;Clones a git repository to a new subdirectory of repodir
  zCloning git repositoryz#fatal: cannot make %s directory: %s)r/   Ninitz--quiet)r{   zremote.origin.urlzremote.origin.fetchz#+refs/heads/*:refs/remotes/origin/*origin)r   r   r   rD   r   r!   r4   r   r   r   r   r  r  r  )r   r{   rf   r   r   r   r   r   r   r   8  s"    

r   c             C   s   y t dd| | d}|jj }W n( tk
rH   td| tjd  Y nX tjdj	|}|r|j
d}|sttjd td||f tjd ttjd tjj }td	t| t d
d|| |d d| S )z.Verify the branch has been signed by a tag.
  describez	origin/%s)r{   z&fatal: branch '%s' has not been signed)r/   z^(.*)-[0-9]{1,}-g[0-9a-f]{1,}$r0   z5info: Ignoring branch '%s'; using tagged release '%s'	GNUPGHOMEtagz-v)r{   r   z%s^0)r   r3   r   r   r   r!   r4   r   r  r   rp   r   r   copyr   r   )r{   r   r   r&   curr  r   r   r   r   r   Q  s$    

r   c             C   sp   t dd|| d t| dd t| dd|  t dd	d| d d
ddg}|sT|jd |jd	 t |d| i dS )z@Checkout an upstream branch into the repository and track it.
  z
update-refzrefs/heads/default)r{   zbranch.default.remoter  zbranch.default.mergezrefs/heads/%szsymbolic-refHEADz	read-treez--resetz-uz-vr{   N)r   r   r   )r{   r   r   r   r%   r   r   r   r   j  s    


r   c              C   sn   t j } d}d}xJ| dkrZ| |krZ| rZt jj| tt}t jj|sd}| }t jj| } qW |t jj| tfS )zCLook for a repo installation, starting at the current directory.
  Nr   )r   r   r   r   r   	REPO_MAINr   dirname)curdirrQ   Zolddirr   r   r   	_FindRepo{  s    
r!  c               @   s   e Zd ZdZdZdS )_OptionsFN)r   r   r   rY   versionr   r   r   r   r"    s   r"  c             C   sn   | d
kr| g fS t d| f }|dkr.| g fS |j jdd}|d } t|d	krbtj|d }ng }| |fS )z Look up user registered aliases.	gitc-initrY   r  zalias.%sNr   r0   r   r-   >   rY   r  r$  )r   r   rC   r   shlex)r}   aliasr   r   r   r   _ExpandAlias  s    r'  c             C   s   d }t  }g }xxtt| D ]h}| | }|dks8|dkr@d|_q|dkrPd|_q|dkrdtjd q|jds|}| |d d  }P qW |||fS )Nz-hz--helpTz	--versionz--tracer   r0   )r"  r=   r   rY   r#  r   r   r   )r   r%   r   argiar   r   r   _ParseArguments  s     
r+  c              C   s,   d} t  rd} td|  d  tjd d S )Nr   z&  gitc-init Initialize a GITC Client.
zusage: repo COMMAND [ARGS]

repo is not yet installed.  Use "repo init" to install it here.

The most commonly used repo commands are:

  init      Install repo in the current working directory
zp  help      Display detailed help on a command

For access to the full online help, install repo ("repo init").
r   )r   r   r!   r"   )Z
gitc_usager   r   r   _Usage  s    r,  c             C   sb   | rN| d dkr6t | d dkd}|j  tjd qTtd| d  tjd nt  tjd d S )	Nr   r  	gitc-init)rn   zferror: '%s' is not a bootstrap command.
        For access to online help, install repo ("repo init").)r/   r0   >   r  r-  )rr   
print_helpr!   r"   r   r4   r,  )r   ro   r   r   r   _Help  s    r/  c               C   sb   t d t ddjdd tD f  t dtf  t dt jf  t dtj  tjd	 d
S )zShow version information.z<repo not installed>zrepo launcher version %sr   c             s   s   | ]}t |V  qd S )N)r   )r6   r7   r   r   r   r8     s    z_Version.<locals>.<genexpr>z       (from %s)zgit %sz	Python %sr   N)	r   r   VERSION__file__r   r   r!   r#  r"   r   r   r   r   _Version  s    r2  c               C   s   t dtjd tjd d S )NzBerror: repo is not installed.  Use "repo init" to install it here.)r/   r0   )r   r!   r4   r"   r   r   r   r   _NotInstalled  s    
r3  c             C   s    t d|  tjd tjd d S )Nzderror: command '%s' requires repo to be installed first.
        Use "repo init" to install it here.)r/   r0   )r   r!   r4   r"   )r%   r   r   r   _NoCommands  s    r4  c             C   st   t jj| }t jj|d}t jj|d}t jj|rpt jj|rpx&dD ]}t jjt jj||sFdS qFW ||fS dS )	Nzmain.pyz.gitgit_config.py
project.pysubcmds)r5  r6  r7  )NN)NN)r   r   r  r   r   r   r   )wrapper_pathmy_dirmy_mainmy_gitr}   r   r   r   _RunSelf  s     r<  c             C   sX   | a ytd|  dd}|jj aW n0 tk
rR   td|  tjd tj	d Y nX d S )Nz--git-dir=%szsymbolic-refr  zfatal: %s has no current branch)r/   r0   )
rM   r   r3   r   rN   r   r   r!   r4   r"   )gitdirr&   r   r   r   _SetDefaultsTo  s    r>  c             C   s  t | \}}}t  d\}}|dkr.t \}}tjjt}t|\}}tj }	t	 rx|	j
t	 rxtdtjd tjd |sbt|\}}
|
| }|jrt  |dkrt| |js|dkrt  |st  |dks|dkrZ|rt| yt||dkd W nN tk
rL   tjjtt}td	| tjd tj|d
d tjd Y nX t \}}nt| |rl|}djtt t!}tj"|d| d| d| dg}|j#|  |j#t$ t%| td| tjd tjd d S )Nz	gitc-initzerror: repo cannot be used in the GITC local manifest directory.
If you want to work on this GITC client please rerun this command from the corresponding client under /gitc/)r/   r0   rY   r#  r  )rn   z@fatal: cloning the git-repo repository failed, will remove '%s' T)ignore_errorsr   z--repo-dir=%sz--wrapper-version=%sz--wrapper-path=%sz--zfatal: unable to start %s   )NN)&r+  r   r!  r   r   r   r1  r<  r   r   r   r   r!   r4   r"   r'  rY   r,  r/  r#  r2  r3  r>  r   r   r   r   r   shutilrmtreer4  r   r   r0  
executableextendr   r'   )	orig_argsr%   r   r   Z	repo_mainZrel_repo_dirr8  r:  r;  r{   
alias_argsr   r   mer   r   r   main  sb    




rH  )r-   rO   )r-   r+   )r0   r.   r-   )F)rt   r3   r4   )F)r:   r;   r   r   )N)N)N)\r   
__future__r   r   r   r   r%  r   r!   objectr   r   r'   rK   r   r   r	   rM   rN   r0  r   r   r   r   r   r   ZS_manifestsr  r   r   collectionsr   ri   r   rA  r   r9   urllib.requestrS   urllib.errorimpurllib2
new_moduler   r	  r   
expanduserr   r   r   r   rr   
namedtuplers   r$   ru   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+  r,  r/  r2  r3  r4  r<  r>  rH  r(   r   r   r   r   <module>   s   6M


d6
[


+/
B
