用GoLand写一个小玩意-git定时push、commit

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

背景

有时候你想刷一刷github的commit墙,或者公司需要每天提交代码,你想摸鱼。就有这么一个小需求,想要自动commitpush代码。

github实际这种轮子还是很多的,但是实现也很简单。我们就自己写一个耍耍吧

实现原理

最简单的方式

  1. 创建一个文件
  2. git add 文件
  3. 比如我们给文件添加一个空格
  4. git commit
  5. git push

大致就是这样一个流程。比如下次我们再提交就是移除空格

语言选择

java对于文件的读取和这种小工具编写起来还是有点麻烦。goland足够轻量,也友好的支持跨平台,所以我们就用goland写一下,顺带巩固巩固刚学没几天的goland

编码

go 复制代码
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和打包非常轻量。

比如文件的读取写入只需要一行代码搞定

go 复制代码
		err := os.WriteFile(filePath, []byte{}, 0644)
go 复制代码
        content, err := os.ReadFile(filePath)
相关推荐
yhole33 分钟前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉40 分钟前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
@atweiwei1 小时前
深入解析gRPC服务发现机制
微服务·云原生·rpc·go·服务发现·consul
白毛大侠1 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet2 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明2 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff2 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法
TlYf NTLE2 小时前
Spring Boot3.3.X整合Mybatis-Plus
spring boot·后端·mybatis
SHoM SSER2 小时前
Spring Boot性能提升的核武器,速度提升500%!
java·spring boot·后端
weixin_425023002 小时前
Spring Boot 2.7 + JDK8 集成 Knife4j 4.1.0 教程(仅展示带注解接口)
java·spring boot·后端