mirror of
https://github.com/WJQSERVER-STUDIO/ghproxy.git
synced 2026-02-03 08:11:11 +08:00
25w16a
This commit is contained in:
parent
d26f6d1e1b
commit
a18660121a
18 changed files with 638 additions and 118 deletions
120
gitclone/git-client.go
Normal file
120
gitclone/git-client.go
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
package gitclone
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/pierrec/lz4"
|
||||
)
|
||||
|
||||
func CloneRepo(dir string, repoName string, repoUrl string) error {
|
||||
repoPath := dir
|
||||
_, err := git.PlainClone(repoPath, true, &git.CloneOptions{
|
||||
URL: repoUrl,
|
||||
Progress: os.Stdout,
|
||||
Mirror: true,
|
||||
})
|
||||
if err != nil && !errors.Is(err, git.ErrRepositoryAlreadyExists) {
|
||||
fmt.Printf("Fail to clone: %v\n", err)
|
||||
} else if err != nil && errors.Is(err, git.ErrRepositoryAlreadyExists) {
|
||||
// 移除文件夹
|
||||
fmt.Printf("Repository already exists\n")
|
||||
err = os.RemoveAll(repoPath)
|
||||
if err != nil {
|
||||
fmt.Printf("Fail to remove: %v\n", err)
|
||||
return err
|
||||
}
|
||||
_, err = git.PlainClone(repoPath, true, &git.CloneOptions{
|
||||
URL: repoUrl,
|
||||
Progress: os.Stdout,
|
||||
Mirror: true,
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Printf("Fail to clone: %v\n", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// 压缩
|
||||
err = CompressRepo(repoPath)
|
||||
if err != nil {
|
||||
fmt.Printf("Fail to compress: %v\n", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CompressRepo 将指定的仓库压缩成 LZ4 格式的压缩包
|
||||
func CompressRepo(repoPath string) error {
|
||||
lz4File, err := os.Create(repoPath + ".lz4")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create LZ4 file: %w", err)
|
||||
}
|
||||
defer lz4File.Close()
|
||||
|
||||
// 创建 LZ4 编码器
|
||||
lz4Writer := lz4.NewWriter(lz4File)
|
||||
defer lz4Writer.Close()
|
||||
|
||||
// 创建 tar.Writer
|
||||
tarBuffer := new(bytes.Buffer)
|
||||
tarWriter := tar.NewWriter(tarBuffer)
|
||||
|
||||
// 遍历仓库目录并打包
|
||||
err = filepath.Walk(repoPath, func(path string, info os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 创建 tar 文件头
|
||||
header, err := tar.FileInfoHeader(info, "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
header.Name, err = filepath.Rel(repoPath, path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 写入 tar 文件头
|
||||
if err := tarWriter.WriteHeader(header); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 如果是文件,写入文件内容
|
||||
if !info.IsDir() {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = io.Copy(tarWriter, file)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to walk through repo directory: %w", err)
|
||||
}
|
||||
|
||||
// 关闭 tar.Writer
|
||||
if err := tarWriter.Close(); err != nil {
|
||||
return fmt.Errorf("failed to close tar writer: %w", err)
|
||||
}
|
||||
|
||||
// 将 tar 数据写入 LZ4 压缩包
|
||||
if _, err := lz4Writer.Write(tarBuffer.Bytes()); err != nil {
|
||||
return fmt.Errorf("failed to write to LZ4 file: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue