// Update the meta data, meta sign, public key func (uc *UpdateClient) Update(repoURL string) error { repo, err := client.NewUCRepo(repoURL) if err != nil { return err } needUpdate := false remoteMetaBytes, err := repo.GetMeta() if err != nil { return err } localMetaFile := filepath.Join(uc.getCacheDir(), repo.NRString(), defaultMeta) localMetaBytes, err := ioutil.ReadFile(localMetaFile) if err != nil { needUpdate = true } else { var remoteMeta utils.Meta var localMeta utils.Meta json.Unmarshal(remoteMetaBytes, &remoteMeta) json.Unmarshal(localMetaBytes, &localMeta) needUpdate = localMeta.Before(remoteMeta) } if !needUpdate { fmt.Println("Already updated to the latest version.") return nil } uc.save(repo, defaultMeta, remoteMetaBytes) signBytes, _ := repo.GetMetaSign() pubBytes, _ := repo.GetPublicKey() err = utils.SHA256Verify(pubBytes, remoteMetaBytes, signBytes) if err != nil { fmt.Println("Fail to verify meta by public key") return err } metaURL, err := uc.save(repo, defaultMeta, remoteMetaBytes) if err != nil { return err } signURL, err := uc.save(repo, defaultMetaSign, signBytes) if err != nil { os.Remove(metaURL) return err } _, err = uc.save(repo, defaultPublicKey, pubBytes) if err != nil { os.Remove(metaURL) os.Remove(signURL) return err } return nil }