code: def get_list_info(self, task_name=None):
          
          try:
              tasks = []
  
              # get all tasks dirs
              tasks_dir = os.path.join(self._paths['base_dir'], 'tasks')
  
              if task_name:
                  # if task folder doesn't exist, return nothing
                  if not os.path.isdir(os.path.join(tasks_dir, task_name)):
                      return []
  
                  task_names = [task_name]
  
              else:
                  task_names = [name for name in os.listdir(tasks_dir)
                                if os.path.isdir(os.path.join(tasks_dir, name))]
                  task_names.sort()
  
              for name in task_names:
                  try:
                      # parse task config and run option hooks
                      task_config = os.path.join(tasks_dir, name, 'task.cfg')
                      parser_ = parser.parse_config(task_config,
                                                    self.HEADER_TASK_CONFIG)
                      registration.run_option_hooks(parser_,
                                                    disable_missing=False)
  
                      tasks.append((name, parser_.options, parser_.blocks))
  
                  except (parser.ParseError, errors.InvalidTaskConfig):
                      tasks.append((name, None, None))
  
              return tasks
  
          except OSError:
              return []
docs: Lists all tasks and associated information.
  
              `task_name`
                  Task name to limit. Default: return all valid tasks.
  
              Returns list of tuples (task_name, options, block_options)