diff --git a/golang_learn/data_func/go_to_git/main.go b/golang_learn/data_func/go_to_git/main.go new file mode 100644 index 0000000..54415a8 --- /dev/null +++ b/golang_learn/data_func/go_to_git/main.go @@ -0,0 +1,121 @@ +package main + +import ( + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" +) + +func main() { + projectDir := "E:\\Code-Java\\全国公务员\\" // 替换为指定目录 p 的路径 + author := "张献维" // 替换为指定的用户名称 + since := "2023-12-12" // 替换为指定的开始日期 + + // 更改工作目录到指定目录 p + if err := os.Chdir(projectDir); err != nil { + fmt.Println("Error changing directory:", err) + return + } + + // 获取指定用户和时间后的 Java 和 XML 提交文件 + files, err := getGitFiles(author, since, "*.java", "*.xml") + if err != nil { + fmt.Println("Error getting Git files:", err) + return + } + + fmt.Println("Java and XML files in commit:", files) + + // 在 projectDir 下创建目录 b + destinationDirB := filepath.Join(projectDir, "b-java") + if err := os.MkdirAll(destinationDirB, 0755); err != nil { + fmt.Println("Error creating directory b-java:", err) + return + } + // 在 projectDir 下创建目录 c + destinationDirC := filepath.Join(projectDir, "c-class") + if err := os.MkdirAll(destinationDirC, 0755); err != nil { + fmt.Println("Error creating directory c-class:", err) + return + } + + // 复制找到的 Java 和 XML 文件到目录 b + for _, file := range files { + srcPath := filepath.Join(projectDir, file) + dstPath := filepath.Join(destinationDirB, filepath.Base(file)) + if err := copyFile(srcPath, dstPath); err != nil { + fmt.Println("Error copying file:", err) + } + srcPath = strings.Replace(file, "src/main/java", "target/classes", 1) + srcPath = strings.Replace(srcPath, "src-check/main/java", "target/classes", 1) + srcPath = strings.Replace(srcPath, "src-3member/main/java", "target/classes", 1) + if strings.HasSuffix(file, ".java") { + srcPath = filepath.Join(projectDir, strings.Replace(srcPath, ".java", ".class", 1)) + } + dstPath = filepath.Join(destinationDirC, filepath.Base(srcPath)) + if err := copyFile(srcPath, dstPath); err != nil { + fmt.Println("Error copying file:", err) + } + } +} + +func getGitFiles(author, since string, patterns ...string) ([]string, error) { + cmdArgs := []string{"log", "--since=" + since, "--author=" + author, "--name-only", "--pretty=format:"} + cmdArgs = append(cmdArgs, "--") + cmdArgs = append(cmdArgs, patterns...) + cmd := exec.Command("git", cmdArgs...) + output, err := cmd.Output() + if err != nil { + return nil, err + } + + files := strings.Split(strings.TrimSpace(string(output)), "\n") + uniqueFiles := uniqueNonEmptyElementsOf(files) + return uniqueFiles, nil +} + +func copyClassFiles(sourceDir, destinationDir string) error { + return filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if strings.HasSuffix(path, ".class") { + destinationPath := filepath.Join(destinationDir, filepath.Base(path)) + return copyFile(path, destinationPath) + } + return nil + }) +} + +func copyFile(src, dst string) error { + sourceFile, err := os.Open(src) + if err != nil { + return err + } + defer sourceFile.Close() + + destFile, err := os.Create(dst) + if err != nil { + return err + } + defer destFile.Close() + + _, err = io.Copy(destFile, sourceFile) + return err +} + +func uniqueNonEmptyElementsOf(elements []string) []string { + encountered := map[string]bool{} + result := []string{} + + for _, element := range elements { + if element != "" && !encountered[element] { + encountered[element] = true + result = append(result, element) + } + } + return result +}