From 5a1d99989fa32be1684b9290b4a58e8418b7b92d Mon Sep 17 00:00:00 2001
From: shenwc <spd260@126.com>
Date: 星期二, 26 十一月 2024 17:57:50 +0800
Subject: [PATCH] 11111

---
 stores/gitee/gitee.go |  139 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 139 insertions(+), 0 deletions(-)

diff --git a/stores/gitee/gitee.go b/stores/gitee/gitee.go
new file mode 100755
index 0000000..4ed5121
--- /dev/null
+++ b/stores/gitee/gitee.go
@@ -0,0 +1,139 @@
+package gitee
+
+import (
+	"context"
+	"fmt"
+	"os"
+	"runtime"
+	"strings"
+
+	"github.com/mamh-mixed/go-gitee/gitee"
+	update "github.com/zan8in/goupdate"
+	"github.com/zan8in/goupdate/progress"
+	"golang.org/x/oauth2"
+)
+
+//https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoStargazers?ex=no
+
+type Store struct {
+	Owner   string
+	Repo    string
+	Version string
+}
+
+type GiteeResult struct {
+	Status        int // update success = 1; have latest version = 2;
+	LatestVersion string
+}
+
+// 更新最新版本
+// owner = zan8in
+// repo = afrog
+// version = 2.8.8 当前版本
+func Update(owner, repo, version string) (*GiteeResult, error) {
+	var (
+		result = &GiteeResult{}
+		err    error
+	)
+
+	var command string
+	switch runtime.GOOS {
+	case "windows":
+		command = repo + ".exe"
+	default:
+		command = repo
+	}
+
+	s := &Store{
+		Owner:   owner,
+		Repo:    repo,
+		Version: version,
+	}
+
+	m := update.Manager{
+		Command: command,
+	}
+
+	asset, err := s.LatestGitReleases()
+	if err != nil {
+		if strings.Contains(err.Error(), update.LatestVersionTips) {
+			result.LatestVersion = asset.LatestVersion
+			result.Status = 2
+			return result, nil
+		}
+		return nil, err
+	}
+
+	// download tarball to a tmp dir
+	tarball, err := asset.DownloadProxy(progress.Reader)
+	if err != nil {
+		return nil, fmt.Errorf("error downloading: %s", err)
+	}
+
+	// install it
+	if err := m.Install(tarball); err != nil {
+		return nil, fmt.Errorf("error installing: %s", err)
+	}
+
+	// gologger.Info().Msgf("Successfully updated to %s %s\n", command, s.Version)
+	result.LatestVersion = asset.LatestVersion
+	result.Status = 1
+	return result, nil
+}
+
+// LatestReleases returns releases newer than Version, or nil.
+func (s *Store) LatestGitReleases() (up *update.Asset, err error) {
+
+	token := os.Getenv("")
+
+	ctx := context.Background()
+	ts := oauth2.StaticTokenSource(
+		&oauth2.Token{AccessToken: token},
+	)
+
+	tc := oauth2.NewClient(ctx, ts)
+	client := gitee.NewClient(tc)
+
+	owner := s.Owner
+	repo := s.Repo
+
+	var currentOS string
+	switch runtime.GOOS {
+	case "darwin":
+		currentOS = "macOS"
+	default:
+		currentOS = runtime.GOOS
+	}
+
+	releases, _, err := client.Repositories.GetLatestRelease(ctx, owner, repo)
+	if err != nil {
+		return nil, err
+	}
+
+	version := (*releases.TagName)[1:]
+
+	if s.Version == version {
+		return &update.Asset{
+			LatestVersion: version,
+		}, fmt.Errorf("%s %s", s.Repo, update.LatestVersionTips)
+	}
+
+	zipName := fmt.Sprintf("%s_%s_%s_%s.zip", repo, version, currentOS, runtime.GOARCH)
+
+	downloadURL := ""
+	for _, asset := range releases.Assets {
+		if strings.HasSuffix(*asset.BrowserDownloadURL, zipName) {
+			downloadURL = *asset.BrowserDownloadURL
+			break
+		}
+	}
+
+	if len(downloadURL) == 0 {
+		return nil, fmt.Errorf("no release found for %s %s", s.Owner, s.Repo)
+	}
+
+	return &update.Asset{
+		URL:           downloadURL,
+		LatestVersion: version,
+	}, nil
+}

--
Gitblit v1.8.0