def execute(self): project = config.project sfdc_client = config.sfdc_client files = self.params.get('files', None) for f in files: if '-meta.xml' in f: corresponding_file = f.split('-meta.xml')[0] if corresponding_file not in files: files.append(corresponding_file) for f in files: if '-meta.xml' in f: continue file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type['metaFile'] == True: corresponding_file = f + '-meta.xml' if corresponding_file not in files: files.append(corresponding_file) metadata_package_dict = util.get_metadata_hash(files) tmp, tmp_unpackaged = util.put_tmp_directory_on_disk(True) package_xml = util.get_package_xml_contents(metadata_package_dict) util.put_package_xml_in_directory(tmp_unpackaged, package_xml, True) empty_package_xml = util.get_empty_package_xml_contents() util.put_empty_package_xml_in_directory(tmp_unpackaged, empty_package_xml) zip_file = util.zip_directory(tmp, tmp) purge_on_delete_setting = config.connection.get_plugin_client_setting("mm_purge_on_delete", False); if purge_on_delete_setting: describe_result = config.sfdc_client.describeMetadata(retXml=False) if describe_result.testRequired == True: purge_on_delete_setting = False deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True, "purge_on_delete" : purge_on_delete_setting } delete_result = sfdc_client.delete(deploy_params) d = xmltodict.parse(delete_result,postprocessor=util.xmltodict_postprocessor) shutil.rmtree(tmp) result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result'] if result['success'] == True: removed = [] for f in files: try: file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type == None or not 'directoryName' in metadata_type: continue; directory = metadata_type['directoryName'] filepath = os.path.join(project.location, "src", directory, f) metapath = os.path.join(project.location, "src", directory, f + '-meta.xml') os.remove(filepath) os.remove(metapath) # remove the entry in file properties project.conflict_manager.remove_from_local_store(f) removed.append(f) except Exception, e: print e.message return util.generate_success_response("Removed metadata files: " + (",".join(removed)))
def get_retrieve_result(self, params): if 'directories' in params and len(params['directories']) > 0 and 'files' in params and len(params['files']) > 0: raise MMException("Please select either directories or files to refresh, not both") elif 'directories' in params and len(params['directories']) > 0: metadata = {} types = [] for d in params['directories']: basename = os.path.basename(d) # refresh all if it's the project base or src directory if basename == config.project.project_name or basename == "src": data = util.get_default_metadata_data(); if type(data) is dict and 'metadataObjects' in data: data = data['metadataObjects'] for item in data: if 'directoryName' in item: types.append(item['xmlName']) else: metadata_type = util.get_meta_type_by_dir(basename) if metadata_type: types.append(metadata_type['xmlName']) if 'childXmlNames' in metadata_type: for child in metadata_type['childXmlNames']: types.append(child) custom_fields = [] for val in self.project.get_package_types(): package_type = val['name'] members = val['members'] if package_type not in types: continue; metadata[package_type] = members if package_type == 'CustomObject': for member in members: if members == "*": for item in self.project.get_org_metadata(): if item['xmlName'] == 'CustomObject': for child in item['children']: if not child['title'].endswith("__c"): for props in child['children']: if props['title'] == 'fields': for field in props['children']: custom_fields.append(child['title']+'.'+field['title']) break if member != "*": break break if len(custom_fields): if 'CustomField' not in metadata: metadata['CustomField'] = [] metadata['CustomField'] = list(set(metadata['CustomField']+custom_fields)) if len(metadata) == 0: raise MMException("Could not find metadata types to refresh") elif 'files' in params and len(params['files']) > 0: metadata = util.get_metadata_hash(params['files']) else: raise MMException("Please provide either an array of 'directories' or an array of 'files'") #retrieves a fresh set of metadata based on the files that have been requested retrieve_result = self.project.sfdc_client.retrieve(package=metadata) return retrieve_result
def execute(self): project = config.project files = self.params.get('files', None) use_tooling_api = config.connection.get_plugin_client_setting('mm_compile_with_tooling_api', False) check_for_conflicts = config.connection.get_plugin_client_setting('mm_compile_check_conflicts', False) compiling_apex_metadata = True for f in files: if f.split('.')[-1] not in util.TOOLING_API_EXTENSIONS: #cannot use tooling api compiling_apex_metadata = False break #when compiling apex metadata, check to see if it is newer on the server if check_for_conflicts and compiling_apex_metadata: if 'action' not in self.params or self.params['action'] != 'overwrite': has_conflict, msg = config.project.conflict_manager.check_for_conflicts(files) if has_conflict: return msg #use tooling api here, if possible if use_tooling_api == True and compiling_apex_metadata and int(float(util.SFDC_API_VERSION)) >= 27: if 'metadata_container' not in project.settings or project.settings['metadata_container'] == None: container_id = project.sfdc_client.get_metadata_container_id() new_settings = project.settings new_settings['metadata_container'] = container_id project.put_settings_file(new_settings) else: container_id = project.settings['metadata_container'] file_ext = files[0].split('.')[-1] try: result = project.sfdc_client.compile_with_tooling_api(files, container_id) except MetadataContainerException as e: project.sfdc_client.delete_mavensmate_metadatacontainers_for_this_user() response = project.sfdc_client.new_metadatacontainer_for_this_user() project.update_setting("metadata_container",response["id"]) #return CompileSelectedMetadataCommand(params=self.params,args=self.args).execute() #ensure only a single retry result = project.sfdc_client.compile_with_tooling_api(files, response["id"]) if 'Id' in result and 'State' in result: if result['State'] == 'Completed': project.conflict_manager.refresh_local_store(files=files) return util.generate_response(result) #the user has either chosen not to use the tooling api, or it's non apex metadata else: try: for f in files: if '-meta.xml' in f: corresponding_file = f.split('-meta.xml')[0] if corresponding_file not in files: files.append(corresponding_file) for f in files: if '-meta.xml' in f: continue file_ext = f.split('.')[-1] metadata_type = util.get_meta_type_by_suffix(file_ext) if metadata_type == None: if sys.platform == "win32": dir_parts = f.split("\\") else: dir_parts = f.split("/") if 'documents' in dir_parts: metadata_type = util.get_meta_type_by_name("Document") if metadata_type != None and 'metaFile' in metadata_type and metadata_type['metaFile'] == True: corresponding_file = f + '-meta.xml' if corresponding_file not in files: files.append(corresponding_file) metadata_package_dict = util.get_metadata_hash(files) #debug(metadata_package_dict) tmp = util.put_tmp_directory_on_disk() os.makedirs(os.path.join(tmp,"unpackaged")) #copy files from project directory to tmp for full_file_path in files: if 'package.xml' in full_file_path: continue if config.is_windows: destination = os.path.join(tmp,'unpackaged',full_file_path.split('\src\\')[1]) else: destination = os.path.join(tmp,'unpackaged',full_file_path.split('/src/')[1]) destination_directory = os.path.dirname(destination) if not os.path.exists(destination_directory): os.makedirs(destination_directory) shutil.copy2(full_file_path, destination_directory) package_xml = util.get_package_xml_contents(metadata_package_dict) util.put_package_xml_in_directory(os.path.join(tmp,"unpackaged"), package_xml) zip_file = util.zip_directory(tmp, tmp) deploy_params = { "zip_file" : zip_file, "rollback_on_error" : True, "ret_xml" : True } deploy_result = project.sfdc_client.deploy(deploy_params) d = xmltodict.parse(deploy_result,postprocessor=util.xmltodict_postprocessor) result = d["soapenv:Envelope"]["soapenv:Body"]['checkDeployStatusResponse']['result'] shutil.rmtree(tmp) # Get new properties for the files we just compiled if result['success'] == True: project.conflict_manager.refresh_local_store(files=files) return json.dumps(result) except Exception, e: try: shutil.rmtree(tmp) except: pass return util.generate_error_response(e.message)
def get_retrieve_result(self, params): if 'directories' in params and len( params['directories']) > 0 and 'files' in params and len( params['files']) > 0: raise MMException( "Please select either directories or files to refresh, not both" ) elif 'directories' in params and len(params['directories']) > 0: metadata = {} types = [] for d in params['directories']: basename = os.path.basename(d) # refresh all if it's the project base or src directory if basename == config.project.project_name or basename == "src": data = util.get_default_metadata_data() if type(data) is dict and 'metadataObjects' in data: data = data['metadataObjects'] for item in data: if 'directoryName' in item: types.append(item['xmlName']) else: metadata_type = util.get_meta_type_by_dir(basename) if metadata_type: types.append(metadata_type['xmlName']) if 'childXmlNames' in metadata_type: for child in metadata_type['childXmlNames']: types.append(child) custom_fields = [] for val in self.project.get_package_types(): package_type = val['name'] members = val['members'] if package_type not in types: continue metadata[package_type] = members if package_type == 'CustomObject': for member in members: if members == "*": for item in self.project.get_org_metadata(): if item['xmlName'] == 'CustomObject': for child in item['children']: if not child['title'].endswith("__c"): for props in child['children']: if props['title'] == 'fields': for field in props[ 'children']: custom_fields.append( child['title'] + '.' + field['title']) break if member != "*": break break if len(custom_fields): if 'CustomField' not in metadata: metadata['CustomField'] = [] metadata['CustomField'] = list( set(metadata['CustomField'] + custom_fields)) if len(metadata) == 0: raise MMException("Could not find metadata types to refresh") elif 'files' in params and len(params['files']) > 0: metadata = util.get_metadata_hash(params['files']) else: raise MMException( "Please provide either an array of 'directories' or an array of 'files'" ) #retrieves a fresh set of metadata based on the files that have been requested retrieve_result = self.project.sfdc_client.retrieve(package=metadata) return retrieve_result