golang的私有化定制自动更新插件
shenwc
2024-11-26 5a1d99989fa32be1684b9290b4a58e8418b7b92d
stores/gitee/gitee.go
New file
@@ -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
}