docs: function filterFiles(grunt, files) {
  	var filesToPack = [];
  	
  	files.forEach(function(fileMapping) {
  		// Fail if there is no dest field defined
  		if (!fileMapping.dest) {
  			grunt.warn('No destination folder is defined for source "' + fileMapping.src + '"');
  		}
  		if (fileMapping.relativeTo && !grunt.file.isDir(fileMapping.relativeTo)) {
  			grunt.warn('The path specified for relativeTo is not a directory "' + fileMapping.relativeTo + '"');
  		}
  		
  		// Evaluate specified source files to determine what to do in each case
  		fileMapping.src.forEach(function(filepath) {
  			var isLink = _fs.lstatSync(filepath).isSymbolicLink();
  			// Warn on invalid source files (if nonull was set).
  			if (!grunt.file.exists(filepath) && !isLink) {
  				grunt.log.warn('Source file "' + filepath + '" does not exists');
  			} else {
  				
  				var fileConfig = grunt.util._.omit(fileMapping, 'src', 'filter');
  				fileConfig.src = filepath;
  				if (fileMapping.directory) {
  					if (grunt.file.isDir(filepath)) {
  						fileConfig.directory = true;
  					} else {
  						grunt.log.warn('The path %s is not a directory but it is marked as such', filepath, fileMapping.relativeTo);
  					}
  				}
  				else {
  					if (grunt.file.isDir(filepath) && !fileMapping.includeDirectories) {
  						return;
  					}
  				}
  				if (isLink) {
  					fileConfig.link = _fs.readlinkSync(filepath);
  				}
  				if (fileMapping.relativeTo) {
  					if (grunt.file.doesPathContain(fileMapping.relativeTo, filepath)) {
  						fileConfig.path = path.relative(fileMapping.relativeTo, filepath);
  					} else {
  						grunt.log.warn('The path %s is not contained into the relativeTo directory %s', filepath, fileMapping.relativeTo);
  					}
  				} else {
  					fileConfig.path = filepath;
  				}
  				filesToPack.push(fileConfig);
  			}
  		});
  	});
  	
  	return filesToPack;
  }