code: def diff_sevice_by_changeset(service_name, service, environment, cf_client, repo_root):
      
      global ret_code
  
      logger.info('Investigating changeset for `%s`:`%s` in environment `%s`',
                  service['type'], service_name, environment)
  
      delete_any_existing_changesets(cf_client, service_name, environment)
  
      try:
          changeset = generate_changeset(service_name, environment,
                                         repo_root, service['template_file'])
      except Exception as e:
          ret_code = 2
          logger.error(e)
          return
  
      wait_for_changeset_creation(cf_client, changeset['Id'], changeset['StackId'])
  
      logger.info('Created Changeset ID: `%s`', changeset['Id'])
  
      desc = cf_client.describe_change_set(
          ChangeSetName=changeset['Id'], StackName=changeset['StackId'])
  
      cf_client.delete_change_set(
          ChangeSetName=changeset['Id'], StackName=changeset['StackId'])
  
      if changeset_is_empty(desc):
          logger.info('Deployed service `%s` in environment `%s` matches '
                      'the local template.', service_name, environment)
      else:
          ret_code = 1
          logger.error('Service `%s` in environment `%s` differs from '
                       'the local template.',
                       service_name, environment)
          details = jsonify(desc['Changes'])
          logger.info('Change details:\n        %s', indentify(details))
docs: If an ef-cf call fails, the error will be logged, the retcode set to 2, but
      the function will run to completion and return the list of non-error
      results.