func compareDirs()

in pkg/dubboctl/cmd/subcmd/manifest_diff.go [80:153]


func compareDirs(dirA, dirB string) (string, error) {
	filesA, err := os.ReadDir(dirA)
	if err != nil {
		return "", err
	}
	filesB, err := os.ReadDir(dirB)
	if err != nil {
		return "", err
	}
	createFileMap := func(dir string, files []os.DirEntry) (map[string]struct{}, error) {
		res := make(map[string]struct{})
		for _, file := range files {
			if file.IsDir() {
				return nil, errors.New("do not support recursive traversal")
			}
			res[file.Name()] = struct{}{}
		}
		return res, nil
	}
	mapA, err := createFileMap(dirA, filesA)
	if err != nil {
		return "", err
	}
	mapB, err := createFileMap(dirB, filesB)
	if err != nil {
		return "", err
	}
	var diffBuilder strings.Builder
	var addBuilder strings.Builder
	var errBuilder strings.Builder
	for file := range mapA {
		if _, ok := mapB[file]; ok {
			fileA := filepath.Join(dirA, file)
			fileB := filepath.Join(dirB, file)
			res, err := compareFiles(fileA, fileB)
			if err != nil {
				errBuilder.WriteString(err.Error() + "\n")
				continue
			}
			if res != "" {
				diffBuilder.WriteString(fmt.Sprintf("%s---%s\n", fileA, fileB))
				diffBuilder.WriteString(res + "\n")
			}
		} else {
			addBuilder.WriteString(fmt.Sprintf("%s doesn't exist in %s\n", file, dirB))
		}
	}
	for file := range mapB {
		if _, ok := mapA[file]; !ok {
			addBuilder.WriteString(fmt.Sprintf("%s doesn't exist in %s\n", file, dirA))
		}
	}
	errRes := errBuilder.String()
	if errRes != "" {
		errRes = "------parse error------\n" + errRes + "\n"
	}
	addRes := addBuilder.String()
	if addRes != "" {
		addRes = "------addition------\n" + addRes + "\n"
	}
	diffRes := diffBuilder.String()
	if diffRes != "" {
		diffRes = "------diff------\n" + diffRes + "\n"
	}

	var final string
	if errRes == "" && addRes == "" && diffRes == "" {
		final = "two dirs are identical\n"
	} else {
		final = errRes + addRes + diffRes
	}

	return final, nil
}