def read(self):
        """Reads the data stored in the files we have been initialized with. It will
        ignore files that cannot be read, possibly leaving an empty configuration

        :return: Nothing
        :raise IOError: if a file cannot be handled"""
        if self._is_initialized:
            return
        self._is_initialized = True

        if not isinstance(self._file_or_files, (tuple, list)):
            files_to_read = [self._file_or_files]
        else:
            files_to_read = list(self._file_or_files)
        # end assure we have a copy of the paths to handle

        seen = set(files_to_read)
        num_read_include_files = 0
        while files_to_read:
            file_path = files_to_read.pop(0)
            fp = file_path
            close_fp = False

            # assume a path if it is not a file-object
            if not hasattr(fp, "seek"):
                try:
                    fp = open(file_path, 'rb')
                    close_fp = True
                except __HOLE__:
                    continue
            # END fp handling

            try:
                self._read(fp, fp.name)
            finally:
                if close_fp:
                    fp.close()
            # END read-handling

            # Read includes and append those that we didn't handle yet
            # We expect all paths to be normalized and absolute (and will assure that is the case)
            if self._has_includes():
                for _, include_path in self.items('include'):
                    if include_path.startswith('~'):
                        include_path = os.path.expanduser(include_path)
                    if not os.path.isabs(include_path):
                        if not close_fp:
                            continue
                        # end ignore relative paths if we don't know the configuration file path
                        assert os.path.isabs(file_path), "Need absolute paths to be sure our cycle checks will work"
                        include_path = os.path.join(os.path.dirname(file_path), include_path)
                    # end make include path absolute
                    include_path = os.path.normpath(include_path)
                    if include_path in seen or not os.access(include_path, os.R_OK):
                        continue
                    seen.add(include_path)
                    files_to_read.append(include_path)
                    num_read_include_files += 1
                # each include path in configuration file
            # end handle includes
        # END for each file object to read

        # If there was no file included, we can safely write back (potentially) the configuration file
        # without altering it's meaning
        if num_read_include_files == 0:
            self._merge_includes = False
        # end
dataset/ETHPy150Open gitpython-developers/GitPython/git/config.py/GitConfigParser.read