| New file |
| | |
| | | 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 |
| | | } |