Files
lazygit-cleaner/main.go
2024-08-15 23:54:17 +02:00

160 lines
3.9 KiB
Go

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"))
}
}
}