这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
背景
有时候你想刷一刷github的commit墙,或者公司需要每天提交代码,你想摸鱼。就有这么一个小需求,想要自动commit
、push
代码。
github实际这种轮子还是很多的,但是实现也很简单。我们就自己写一个耍耍吧
实现原理
最简单的方式
- 创建一个文件
- git add 文件
- 比如我们给文件添加一个空格
- git commit
- git push
大致就是这样一个流程。比如下次我们再提交就是移除空格
语言选择
java对于文件的读取和这种小工具编写起来还是有点麻烦。goland足够轻量,也友好的支持跨平台,所以我们就用goland写一下,顺带巩固巩固刚学没几天的goland
编码
package main
import (
"flag"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
)
const (
defaultPath = "/Users/xiaozou/Desktop/sofe/java/weihubeats"
defaultInterval = "10s"
defaultJavaFile = "MQ.java"
commitMsg = "add test"
)
func main() {
var projectPath, intervalStr string
flag.StringVar(&projectPath, "path", defaultPath, "Path to the project")
flag.StringVar(&intervalStr, "interval", defaultInterval, "Interval between commits (e.g., 30m, 2h)")
flag.Parse()
interval, err := time.ParseDuration(intervalStr)
if err != nil {
fmt.Println("Invalid interval format:", err)
return
}
filePath := filepath.Join(projectPath, defaultJavaFile)
if !checkFileExists(filePath) {
err := os.WriteFile(filePath, []byte{}, 0644)
if err != nil {
fmt.Printf("Failed to create file %s: error: %s\n", defaultJavaFile, err)
return
}
fmt.Printf("create file %s success/n", defaultJavaFile)
}
ticker := time.NewTicker(interval)
defer ticker.Stop()
addSpace := true
for range ticker.C {
if err := modifyFile(filePath, addSpace); err != nil {
fmt.Println("Failed to modify file:", err)
return
}
if addSpace {
fmt.Println("add space success")
} else {
fmt.Println("remove space success")
}
if err := commitChanges(projectPath, commitMsg); err != nil {
fmt.Println("Failed to commit changes:", err)
return
}
fmt.Println("push git success")
addSpace = !addSpace
}
}
func checkFileExists(filePath string) bool {
_, err := os.Stat(filePath)
return !os.IsNotExist(err)
}
/*
*
追加空格
*/
func modifyFile(filePath string, addSpace bool) error {
content, err := os.ReadFile(filePath)
if err != nil {
return err
}
var newContent string
if addSpace {
newContent = string(content) + " "
} else {
newContent = strings.TrimRight(string(content), " ")
}
return os.WriteFile(filePath, []byte(newContent), 0644)
}
func commitChanges(projectPath, message string) error {
cmd := exec.Command("git", "add", ".")
cmd.Dir = projectPath
if err := cmd.Run(); err != nil {
return err
}
cmd = exec.Command("git", "commit", "-m", message)
cmd.Dir = projectPath
if err := cmd.Run(); err != nil {
return err
}
fmt.Printf("git commit success message: %s\n", message)
cmd = exec.Command("git", "push", "origin", "master")
cmd.Dir = projectPath
return cmd.Run()
}
效果
总结
总得来说使用goland写一些工具类啥的还是很方便的,api和打包非常轻量。
比如文件的读取写入只需要一行代码搞定
err := os.WriteFile(filePath, []byte{}, 0644)
content, err := os.ReadFile(filePath)