forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.4 KiB
122 lines
3.4 KiB
1 year ago
|
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
|
||
|
}
|