3
_AfU                  @   s   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 d dlmZ d dlm	Z	 G dd de
ZG dd deZ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 )    N)EventLog)NoSuchProjectError)InvalidProjectGroupsErrorc               @   s   e Zd ZdZdZe ZdZdZdd Z	dd Z
edd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdddZd ddZdS )!Commandz2Base class for any command line action in repo.
  FNc             C   s   dS )NF )self_optr   r   9/home/qytech/356xLinux510-101server/.repo/repo/command.py	WantPager%   s    zCommand.WantPagerc             C   sV   | j  }xH|j D ]<\}}t||}|dk	r.qtjj|}|dk	rt||| qW |S )z) Set options from environment variables. N)_RegisteredEnvironmentOptionsitemsgetattrosenvirongetsetattr)r   optsZenv_optionsZenv_keyZopt_keyZ	opt_valueZ	env_valuer   r   r	   ReadEnvironmentOptions(   s    
zCommand.ReadEnvironmentOptionsc             C   sv   | j d krpy d| j }| jj jd|}W n tk
rH   d| j }Y nX d| j }tj||d| _ | j| j  | j S )Nzrepo %sz%progz/Run `repo help %s` to view the detailed manual.)usageepilog)		_optparseNAMEZ	helpUsagestripreplaceAttributeErroroptparseOptionParser_Options)r   mer   r   r   r   r	   r   =   s    


zCommand.OptionParserc             C   s   dS )z"Initialize the option parser.
    Nr   )r   pr   r   r	   r   J   s    zCommand._Optionsc             C   s   i S )a  Get options that can be set from environment variables.

    Return a dictionary mapping environment variable name
    to option key name that it can override.

    Example: {'REPO_MY_OPTION': 'my_option'}

    Will allow the option with key value 'my_option' to be set
    from the value in the environment variable named 'REPO_MY_OPTION'.

    Note: This does not work properly for options that are explicitly
    set to None by the user, or options that are defined with a
    default value other than None.

    r   )r   r   r   r	   r   N   s    z%Command._RegisteredEnvironmentOptionsc             C   s   | j j  tjd dS )z!Display usage and terminate.
       N)r   print_usagesysexit)r   r   r   r	   Usage`   s    
zCommand.Usagec             C   s   dS )a  Validate the user options & arguments before executing.

    This is meant to help break the code up into logical steps.  Some tips:
    * Use self.OptionParser.error to display CLI related errors.
    * Adjust opt member defaults as makes sense.
    * Adjust the args list, but do so inplace so the caller sees updates.
    * Try to avoid updating self state.  Leave that to Execute.
    Nr   )r   optargsr   r   r	   ValidateOptionsf   s    zCommand.ValidateOptionsc             C   s   t dS )z:Perform the action, after option parsing is complete.
    N)NotImplementedError)r   r%   r&   r   r   r	   Executep   s    zCommand.Executec             C   s   t dd |D | _d S )Nc             s   s   | ]}|j |fV  qd S )N)worktree).0r   r   r   r	   	<genexpr>v   s    z1Command._ResetPathToProjectMap.<locals>.<genexpr>)dict_by_path)r   projectsr   r   r	   _ResetPathToProjectMapu   s    zCommand._ResetPathToProjectMapc             C   s   || j |j< d S )N)r.   r*   )r   projectr   r   r	   _UpdatePathToProjectMapx   s    zCommand._UpdatePathToProjectMapc             C   s   d }t jj|rd }xP|rd||krd||jkrdy| j| }P W q tk
r`   |}t jj|}Y qX qW | r||jkry| j| }W q tk
r   Y qX n$y| j| }W n tk
r   Y nX |S )N)r   pathexistsZtopdirr.   KeyErrordirname)r   manifestr3   r1   Zoldpathr   r   r	   _GetProjectByPath{   s,    

zCommand._GetProjectByPath c                s  |s
| j }|j}g }|j} s*|jjd  s>dtj j   dd tj	d D  |si }	x.|D ]&}
|sp|
j
rb|	jdd |
j D  qbW |j|	j  x*|D ]"}
|s|
jr|
j r|j|
 qW n"| j| x|D ]
} fdd|j|D }|stjj|jd	d
}| j||}
|
r||
j r||s>|
j
r|d}x |
j D ]}| j| d}qLW |r|| j||pz|
}
|
r|
g}|st|xF|D ]>}
| r|
j rtd||
jf |
j st|qW |j| qW dd }|j|d |S )z1A list of projects that match the arguments.
    zmanifest.groupszdefault,platform-c             S   s   g | ]}|r|qS r   r   )r+   xr   r   r	   
<listcomp>   s    z'Command.GetProjects.<locals>.<listcomp>z[,\s]+c             s   s   | ]}|j |fV  qd S )N)name)r+   r   r   r   r	   r,      s   z&Command.GetProjects.<locals>.<genexpr>c                s   g | ]}|j  r|qS r   )MatchesGroups)r+   r1   )groupsr   r	   r;      s    \/FTz%s (%s)c             S   s   | j S )N)relpath)r:   r   r   r	   _getpath   s    z%Command.GetProjects.<locals>._getpath)key)r7   r/   ZmanifestProjectconfig	GetStringplatformsystemlowerresplitZsync_supdateZGetDerivedSubprojectsextendvaluesZExistsr=   appendr0   ZGetProjectsWithNamer   r3   abspathr   r8   ZDerivedr2   r   rA   r   sort)r   r&   r7   r>   Z
missing_okZsubmodules_okZall_projects_listresultZmpZderived_projectsr1   argr/   r3   Zsearch_againZ
subprojectrB   r   )r>   r	   GetProjects   s^    







zCommand.GetProjectsc             C   s   g }dd |D }xf| j dD ]X}xR|D ]<}|j|jpB|j|j}| rZ|rZ|j| P |r(|r(P q(W |r|j| qW |jdd d |S )Nc             S   s   g | ]}t jd | t jqS )z%s)rI   compile
IGNORECASE)r+   ar   r   r	   r;      s    z(Command.FindProjects.<locals>.<listcomp>r9   c             S   s   | j S )N)rA   )r1   r   r   r	   <lambda>   s    z&Command.FindProjects.<locals>.<lambda>)rC   )rS   searchr<   rA   rN   rP   )r   r&   ZinverserQ   patternsr1   patternmatchr   r   r	   FindProjects   s    


zCommand.FindProjects)Nr9   FF)F)__name__
__module____qualname____doc__commonr   	event_logr7   r   r
   r   propertyr   r   r   r$   r'   r)   r0   r2   r8   rS   r\   r   r   r   r	   r      s&   
 
Er   c               @   s   e Zd ZdZdd ZdS )InteractiveCommandzuCommand which requires user interaction on the tty and
     must not run within a pager, even if the user asks to.
  c             C   s   dS )NFr   )r   r   r   r   r	   r
      s    zInteractiveCommand.WantPagerN)r]   r^   r_   r`   r
   r   r   r   r	   rd      s   rd   c               @   s   e Zd ZdZdd ZdS )PagedCommandzlCommand which defaults to output in a pager, as its
     display tends to be larger than one screen full.
  c             C   s   dS )NTr   )r   r   r   r   r	   r
      s    zPagedCommand.WantPagerN)r]   r^   r_   r`   r
   r   r   r   r	   re      s   re   c               @   s   e Zd ZdZdS )MirrorSafeCommandz`Command permits itself to run within a mirror,
     and does not require a working directory.
  N)r]   r^   r_   r`   r   r   r   r	   rf      s   rf   c               @   s   e Zd ZdZdS )GitcAvailableCommandznCommand that requires GITC to be available, but does
     not require the local client to be a GITC client.
  N)r]   r^   r_   r`   r   r   r   r	   rg     s   rg   c               @   s   e Zd ZdZdS )GitcClientCommandzCCommand that requires the local client to be a GITC
     client.
  N)r]   r^   r_   r`   r   r   r   r	   rh   
  s   rh   )r   r   rF   rI   r"   rb   r   errorr   r   objectr   rd   re   rf   rg   rh   r   r   r   r	   <module>   s    Q		