1313# limitations under the License. 
1414import  os 
1515import  sys 
16- 
16+ from   typing   import   Optional 
1717import  click  as  click 
1818from  library_generation .generate_pr_description  import  generate_pr_descriptions 
1919from  library_generation .generate_repo  import  generate_from_yaml 
@@ -51,6 +51,17 @@ def main(ctx):
5151 metadata about library generation. 
5252 """ ,
5353) 
54+ @click .option ( 
55+  "--library-names" , 
56+  type = str , 
57+  default = None , 
58+  show_default = True , 
59+  help = """  
60+  A list of library names that will be generated, separated by comma. 
61+  The library name of a library is the value of library_name or api_shortname, 
62+  if library_name is not specified, in the generation configuration. 
63+  """ ,
64+ ) 
5465@click .option ( 
5566 "--repository-path" , 
5667 type = str , 
@@ -77,6 +88,7 @@ def main(ctx):
7788def  generate (
7889 baseline_generation_config_path : str ,
7990 current_generation_config_path : str ,
91+  library_names : Optional [str ],
8092 repository_path : str ,
8193 api_definitions_path : str ,
8294):
@@ -86,24 +98,32 @@ def generate(
8698 history. 
8799
88100 If baseline generation config is not specified but current generation 
89-  config is specified, generate all libraries based on current generation  
90-  config without commit history. 
101+  config is specified, generate all libraries if `library_names` is not  
102+  specified, based on current generation  config without commit history. 
91103
92104 If current generation config is not specified but baseline generation 
93105 config is specified, raise FileNotFoundError because current generation 
94106 config should be the source of truth of library generation. 
95107
96108 If both baseline generation config and current generation config are not 
97109 specified, generate all libraries based on the default generation config, 
98-  which is generation_config.yaml in the current working directory. Raise 
99-  FileNotFoundError if the default config does not exist. 
110+  which is generation_config.yaml in the current working directory. 
111+ 
112+  If `library_names` is specified, only libraries whose name can be found in 
113+  the current generation config or default generation config, if current 
114+  generation config is not specified, will be generated. Changed libraries 
115+  will be ignored even if baseline and current generation config are 
116+  specified. 
117+ 
118+  Raise FileNotFoundError if the default config does not exist. 
100119
101120 The commit history, if generated, will be available in 
102121 repository_path/pr_description.txt. 
103122 """ 
104123 __generate_repo_and_pr_description_impl (
105124 baseline_generation_config_path = baseline_generation_config_path ,
106125 current_generation_config_path = current_generation_config_path ,
126+  library_names = library_names ,
107127 repository_path = repository_path ,
108128 api_definitions_path = api_definitions_path ,
109129 )
@@ -112,6 +132,7 @@ def generate(
112132def  __generate_repo_and_pr_description_impl (
113133 baseline_generation_config_path : str ,
114134 current_generation_config_path : str ,
135+  library_names : Optional [str ],
115136 repository_path : str ,
116137 api_definitions_path : str ,
117138):
@@ -146,30 +167,39 @@ def __generate_repo_and_pr_description_impl(
146167 current_generation_config_path  =  os .path .abspath (current_generation_config_path )
147168 repository_path  =  os .path .abspath (repository_path )
148169 api_definitions_path  =  os .path .abspath (api_definitions_path )
170+  include_library_names  =  _parse_library_name_from (library_names )
171+ 
149172 if  not  baseline_generation_config_path :
150-  # Execute full  generation based on current_generation_config if 
173+  # Execute selective  generation based on current_generation_config if 
151174 # baseline_generation_config is not specified. 
152175 # Do not generate pull request description. 
153176 generate_from_yaml (
154177 config = from_yaml (current_generation_config_path ),
155178 repository_path = repository_path ,
156179 api_definitions_path = api_definitions_path ,
180+  target_library_names = include_library_names ,
157181 )
158182 return 
159183
160-  # Compare two generation configs and only generate  changed libraries. 
184+  # Compare two generation configs to get  changed libraries. 
161185 # Generate pull request description. 
162186 baseline_generation_config_path  =  os .path .abspath (baseline_generation_config_path )
163187 config_change  =  compare_config (
164188 baseline_config = from_yaml (baseline_generation_config_path ),
165189 current_config = from_yaml (current_generation_config_path ),
166190 )
167-  # pass  None if we want to fully generate the repository. 
168-  target_library_names  =  (
191+  # Pass  None if we want to fully generate the repository. 
192+  changed_library_names  =  (
169193 config_change .get_changed_libraries ()
170194 if  not  _needs_full_repo_generation (config_change = config_change )
171195 else  None 
172196 )
197+  # Include library names takes preference if specified. 
198+  target_library_names  =  (
199+  include_library_names 
200+  if  include_library_names  is  not   None 
201+  else  changed_library_names 
202+  )
173203 generate_from_yaml (
174204 config = config_change .current_config ,
175205 repository_path = repository_path ,
@@ -191,6 +221,12 @@ def _needs_full_repo_generation(config_change: ConfigChange) -> bool:
191221 return  not  current_config .is_monorepo () or  current_config .contains_common_protos ()
192222
193223
224+ def  _parse_library_name_from (includes : str ) ->  Optional [list [str ]]:
225+  if  includes  is  None :
226+  return  None 
227+  return  [library_name .strip () for  library_name  in  includes .split ("," )]
228+ 
229+ 
194230@main .command () 
195231@click .option ( 
196232 "--generation-config-path" , 
0 commit comments