From 65290faba0779212b974dc590247aa108da3c7f5 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Thu, 15 Aug 2024 23:54:17 +0200 Subject: [PATCH] Initial commit --- .gitignore | 1 + go.mod | 3 + log.log | 0 main.go | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 .gitignore create mode 100644 go.mod create mode 100644 log.log create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..926b439 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +main.log diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d7483ca --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module lazygit-cleaner + +go 1.23.0 diff --git a/log.log b/log.log new file mode 100644 index 0000000..e69de29 diff --git a/main.go b/main.go new file mode 100644 index 0000000..246f09d --- /dev/null +++ b/main.go @@ -0,0 +1,159 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "path" + "path/filepath" + "strings" +) + +var Error *log.Logger + +func init() { + log.SetFlags(log.Lmicroseconds | log.Lshortfile) + logFile, err := os.Create("main.log") + if err != nil { + log.Printf("Error creating log file: %v", err) + os.Exit(1) + } + logger := io.MultiWriter(os.Stdout, logFile) + log.SetOutput(logger) + + Error = log.New(io.MultiWriter(logFile, os.Stderr, os.Stdout), + fmt.Sprintf("%sERROR:%s ", "\033[0;101m", "\033[0m"), + log.Lmicroseconds|log.Lshortfile) +} + +const projectsFile = `C:\Users\Administrator\Seafile\Other\lazygit\state.yml` + +var scanFolders []string = []string{ + `C:\Users\Administrator\Seafile\Projects-Clion\ClionProjects`, + `C:\Users\Administrator\Seafile\Projects-Elixir\ElixirProjects`, + `C:\Users\Administrator\Seafile\Projects-Go\GoProjects`, + `C:\Users\Administrator\Seafile\Projects-Idea\IdeaProjects`, + `C:\Users\Administrator\Seafile\Projects-Other\Projects`, + `C:\Users\Administrator\Seafile\Projects-Pycharm\PycharmProjects`, + `C:\Users\Administrator\Seafile\Projects-Rider\RiderProjects`, + `C:\Users\Administrator\Seafile\Projects-Webstorm\WebstormProjects`, +} + +func main() { + file, err := os.OpenFile(projectsFile, os.O_RDWR, 0666) + if err != nil { + Error.Printf("Error opening file: %v", err) + return + } + defer file.Close() + + data, err := io.ReadAll(file) + if err != nil { + Error.Printf("Error reading file: %v", err) + return + } + + lines := strings.Split(string(data), "\n") + var repos = make(map[string]struct{}, 0) + var isRepos bool + for i, line := range lines { + if strings.HasPrefix(line, "recentrepos") { + log.Printf("Repos starting at line %d (%s)", i, line) + isRepos = true + continue + } + if isRepos && !strings.HasPrefix(line, " ") { + log.Printf("Repos ending at line %d (%s)", i, line) + isRepos = false + break + } + if isRepos { + repo := strings.TrimPrefix(line, " - ") + repo = path.Clean(repo) + repo = filepath.ToSlash(repo) + repo = strings.ReplaceAll(repo, "\\", "/") + repos[repo] = struct{}{} + } + } + log.Printf("Found %d repos", len(repos)) + + var invalid int + for repo := range repos { + file, err := os.Open(repo) + if err != nil { + if os.IsNotExist(err) { + log.Printf("%s does not exist", repo) + invalid++ + delete(repos, repo) + continue + } + Error.Printf("Error opening %s: %v", repo, err) + continue + } + file.Close() + + file, err = os.Open(path.Join(repo, ".git")) + if err != nil { + Error.Printf("%s does not have a .git directory: %v", repo, err) + invalid++ + delete(repos, repo) + continue + } + file.Close() + } + log.Printf("Deleted %d invalid repos", invalid) + + for _, folder := range scanFolders { + folder = path.Clean(folder) + folder = filepath.ToSlash(folder) + + file, err := os.Open(folder) + if err != nil { + Error.Printf("Error opening %s: %v", folder, err) + continue + } + file.Close() + + file, err = os.Open(path.Join(folder, ".git")) + if err != nil { + Error.Printf("%s does not have a .git directory: %v", folder, err) + continue + } + file.Close() + + repos[folder] = struct{}{} + } + + // repoKeys := make([]string, 0, len(repos)) + // for repo := range repos { + // repoKeys = append(repoKeys, repo) + // } + // slices.Sort(repoKeys) + + file.Truncate(0) + file.Seek(0, io.SeekStart) + var writingDone bool + for i, line := range lines { + if strings.HasPrefix(line, "recentrepos") { + log.Printf("Repos starting at line %d (%s)", i, line) + isRepos = true + file.Write([]byte(line + "\n")) + continue + } + if isRepos && !strings.HasPrefix(line, " ") { + log.Printf("Repos ending at line %d (%s)", i, line) + isRepos = false + } + if isRepos && !writingDone { + for repo := range repos { + file.Write([]byte(" - " + repo + "\n")) + } + writingDone = true + continue + } + if !isRepos { + file.Write([]byte(line + "\n")) + } + } +}