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
}