def METHOD_NAME(self, path, req_tag=True):
    """ Collect single artifact, be it in S3 or locally.
    :param: path string: S3 or local (relative) path
    :param: req_tag bool: Require tag to match.
    """
    print('?  %s' % path)
    # For local files, strip download path.
    # Also ignore any parent directories.
    if path.startswith(self.dlpath):
        folder = os.path.basename(os.path.dirname(path[len(self.dlpath):]))
    else:
        folder = os.path.basename(os.path.dirname(path))
    # The folder contains the tokens needed to perform
    # matching of project, gitref, etc.
    rinfo = re.findall(r'(?P<tag>[^-]+)-(?P<val>.*?)__', folder)
    if rinfo is None or len(rinfo) == 0:
        print('Incorrect folder/file name format for %s' % folder)
        return None
    info = dict(rinfo)
    # Ignore AppVeyor Debug builds
    if info.get('bldtype', '').lower() == 'debug':
        print('Ignoring debug artifact %s' % folder)
        return None
    tag = info.get('tag', None)
    if tag is not None and (len(tag) == 0 or tag.startswith('$(')):
        # AppVeyor doesn't substite $(APPVEYOR_REPO_TAG_NAME)
        # with an empty value when not set, it leaves that token
        # in the string - so translate that to no tag.
        del info['tag']
    # Match tag or sha to gitref
    unmatched = list()
    for m, v in self.match.items():
        if m not in info or info[m] != v:
            unmatched.append(m)
    # Make sure all matches were satisfied, unless this is a
    # common artifact.
    if info.get('p', '') != 'common' and len(unmatched) > 0:
        print(info)
        print('%s: %s did not match %s' %
              (info.get('p', None), folder, unmatched))
        return None
    return Artifact(self, path, info)