code: def filefind(self, names):
          
          if type(names) is str:
              names = [names]
          lower_names = []
          for name in names:
              lower_names.append(name.lower())
          names = lower_names
          files = self.list_files()
          found = []
          for fullpath in files:
              filename = os.path.basename(fullpath)
              if filename.lower() in names:
                  logger.debug("Found %s", fullpath)
                  if not os.path.exists(fullpath):
                      # Strange.  It at least happens in the tests when
                      # we deliberately remove a CHANGES.txt file.
                      logger.warn("Found file %s in version control but not on "
                                  "file system.", fullpath)
                      continue
                  found.append(fullpath)
          if not found:
              return
          if len(found) > 1:
              found.sort(key=len)
              logger.warn("Found more than one file, picked the shortest one to "
                          "change: %s", ', '.join(found))
          return found[0]
docs: Return first found file matching name (case-insensitive).
  
          Some packages have docs/HISTORY.txt and
          package/name/HISTORY.txt.  We make sure we only return the one
          in the docs directory if no other can be found.
  
          'names' can be a string or a list of strings; if you have both
          a CHANGES.txt and a docs/HISTORY.txt, you want the top level
          CHANGES.txt to be found first.