docs: def _storage_list(args, _):
    """ List the buckets or the contents of a bucket.
  
    This command is a bit different in that we allow wildchars in the bucket name and will list
    the buckets that match.
    """
    target = args['object'] if args['object'] else args['bucket']
    project = args['project']
    if target is None:
      return _storage_list_buckets(project, '*')  # List all buckets.
  
    bucket_name, key = datalab.storage._bucket.parse_name(target)
    if bucket_name is None:
      raise Exception('Cannot list %s; not a valid bucket name' % target)
  
    if key or not re.search('\?|\*|\[', target):
      # List the contents of the bucket
      if not key:
        key = '*'
      if project:
        # Only list if the bucket is in the project
        for bucket in datalab.storage.Buckets(project_id=project):
          if bucket.name == bucket_name:
            break
        else:
          raise Exception('%s does not exist in project %s' % (target, project))
      else:
        bucket = datalab.storage.Bucket(bucket_name)
  
      if bucket.exists():
        return _storage_list_keys(bucket, key)
      else:
        raise Exception('Bucket %s does not exist' % target)
  
    else:
      # Treat the bucket name as a pattern and show matches. We don't use bucket_name as that
      # can strip off wildchars and so we need to strip off gs:// here.
      return _storage_list_buckets(project, target[5:])