func ReadLocalPackages(repo *repo.Repo, basePath string) (
	pkgMap *map[string]interfaces.PackageInterface,
	warnings []string,
	err error) {

	pkgMap = &map[string]interfaces.PackageInterface{}
	warnings = []string{}

	searchPaths, err := repo.FilteredSearchList("")
	if err != nil {
		return
	}

	for _, path := range searchPaths {
		pkgDir := basePath + "/" + path

		if util.NodeNotExist(pkgDir) {
			continue
		}

		var dirList []string
		if dirList, err = repo.FilteredSearchList(path); err != nil {
			return
		}

		for _, subDir := range dirList {
			var subWarnings []string
			subWarnings, err = ReadLocalPackageRecursive(repo, *pkgMap,
				basePath, filepath.Join(path, subDir))
			warnings = append(warnings, subWarnings...)
			if err != nil {
				return
			}
		}
	}

	return
}
func ReadLocalPackageRecursive(repo *repo.Repo,
	pkgList map[string]interfaces.PackageInterface, basePath string,
	pkgName string) ([]string, error) {

	var warnings []string

	dirList, err := repo.FilteredSearchList(pkgName)
	if err != nil {
		return warnings, util.NewNewtError(err.Error())
	}

	for _, name := range dirList {
		if LocalPackageSpecialName(name) || strings.HasPrefix(name, ".") {
			continue
		}

		subWarnings, err := ReadLocalPackageRecursive(repo, pkgList,
			basePath, filepath.Join(pkgName, name))
		warnings = append(warnings, subWarnings...)
		if err != nil {
			return warnings, err
		}
	}

	if util.NodeNotExist(filepath.Join(basePath, pkgName,
		PACKAGE_FILE_NAME)) {

		return warnings, nil
	}

	pkg, err := LoadLocalPackage(repo, filepath.Join(basePath, pkgName))
	if err != nil {
		warnings = append(warnings, err.Error())
		return warnings, nil
	}

	if oldPkg, ok := pkgList[pkg.Name()]; ok {
		oldlPkg := oldPkg.(*LocalPackage)
		warnings = append(warnings,
			fmt.Sprintf("Multiple packages with same pkg.name=%s "+
				"in repo %s; path1=%s path2=%s", oldlPkg.Name(), repo.Name(),
				oldlPkg.BasePath(), pkg.BasePath()))

		return warnings, nil
	}

	pkgList[pkg.Name()] = pkg

	return warnings, nil
}