33import shutil
44import tempfile
55from collections import defaultdict
6+ from itertools import chain
67from xml .etree .ElementTree import ParseError
78
89from defusedxml .minidom import parseString
@@ -47,6 +48,35 @@ def _run_task(self):
4748 paths = self .options .get ("paths" )
4849 plan_or_flow_name = self .options .get ("name" )
4950
51+ (
52+ components ,
53+ api_retrieve_unpackaged_response ,
54+ ) = self .get_repo_existing_components (plan_or_flow_name , paths )
55+
56+ if not components :
57+ self .logger .info ("No components found in deploy path" )
58+ raise TaskOptionsError ("No plan or paths options provided" )
59+
60+ self .logger .debug ("Components detected at source" )
61+ for component_type , component_names in components .items ():
62+ self .logger .debug (f"{ component_type } : { ', ' .join (component_names )} " )
63+ # check common components
64+ components .pop ("Settings" , None )
65+ existing_components = process_common_components (
66+ api_retrieve_unpackaged_response , components
67+ )
68+
69+ if existing_components :
70+ self .logger .info ("Components exists in the target org:" )
71+ for component_type , component_names in existing_components .items ():
72+ self .logger .info (f"{ component_type } : { ', ' .join (component_names )} " )
73+ self .return_values ["existing_components" ] = existing_components
74+ else :
75+ self .logger .info (
76+ "No components from the deploy paths exist in the target org."
77+ )
78+
79+ def get_repo_existing_components (self , plan_or_flow_name , paths = "" ):
5080 if paths :
5181 paths = process_list_arg (paths )
5282 self .logger .info (f"Using provided paths: { paths } " )
@@ -71,16 +101,37 @@ def _run_task(self):
71101 self .logger .debug (
72102 f"deploy paths found in the plan or flow.{ self .deploy_paths } "
73103 )
74-
75104 # Temp dir to copy all deploy paths from task options
76105 temp_dir = tempfile .mkdtemp ()
77106 self .logger .info (f"Temporary deploy directory created: { temp_dir } " )
78-
107+ mdapi_components = {}
108+ mdapi_response_messages = []
79109 for path in self .deploy_paths :
80110 full_path = os .path .join (self .project_config .repo_root , path )
81111 if not os .path .exists (full_path ):
82112 self .logger .info (f"Skipping path: '{ path } ' - path doesn't exist" )
83113 continue
114+ elif "package.xml" in os .listdir (full_path ):
115+ package_xml_path = os .path .join (full_path , "package.xml" )
116+ source_xml_tree = metadata_tree .parse (package_xml_path )
117+ components = metadata_tree .parse_package_xml_types (
118+ "name" , source_xml_tree
119+ )
120+ response_messages = self ._get_api_object_responce (
121+ package_xml_path , source_xml_tree .version .text
122+ )
123+ merged = {}
124+ for key in set (components ).union (mdapi_components ):
125+ merged [key ] = list (
126+ set (
127+ chain (
128+ components .get (key , []), mdapi_components .get (key , [])
129+ )
130+ )
131+ )
132+ mdapi_components = merged
133+ mdapi_response_messages .extend (response_messages )
134+ continue
84135 self ._copy_to_tempdir (path , temp_dir )
85136
86137 (
@@ -90,28 +141,22 @@ def _run_task(self):
90141
91142 # remove temp dir
92143 shutil .rmtree (temp_dir )
144+ merged = {}
145+ if components :
146+ for key in set (components ).union (mdapi_components ):
147+ merged [key ] = list (
148+ set (chain (components .get (key , []), mdapi_components .get (key , [])))
149+ )
150+ components = merged
151+ else :
152+ components = mdapi_components
93153
94- if not components :
95- self .logger .info (f"No components found in deploy path{ path } " )
96- raise TaskOptionsError ("No plan or paths options provided" )
97-
98- self .logger .debug ("Components detected at source" )
99- for component_type , component_names in components .items ():
100- self .logger .debug (f"{ component_type } : { ', ' .join (component_names )} " )
101- # check common components
102- existing_components = process_common_components (
103- api_retrieve_unpackaged_response , components
104- )
105-
106- if existing_components :
107- self .logger .info ("Components exists in the target org:" )
108- for component_type , component_names in existing_components .items ():
109- self .logger .info (f"{ component_type } : { ', ' .join (component_names )} " )
110- self .return_values ["existing_components" ] = existing_components
154+ if api_retrieve_unpackaged_response :
155+ api_retrieve_unpackaged_response .extend (mdapi_response_messages )
111156 else :
112- self . logger . info (
113- "No components from the deploy paths exist in the target org."
114- )
157+ api_retrieve_unpackaged_response = mdapi_response_messages
158+
159+ return [ components , api_retrieve_unpackaged_response ]
115160
116161 def _copy_to_tempdir (self , src_dir , temp_dir ):
117162 for item in os .listdir (src_dir ):
0 commit comments