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 }