🔨 Refactor: optimize auto update

This commit is contained in:
萌萌哒赫萝 2023-04-06 12:50:07 +08:00
parent 2fab2cd79d
commit e0e26bd9ad
11 changed files with 165 additions and 190 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "piclist", "name": "piclist",
"version": "1.5.3", "version": "1.5.2",
"author": { "author": {
"name": "Kuingsmile", "name": "Kuingsmile",
"email": "msq@msq.pub" "email": "msq@msq.pub"

View File

@ -779,7 +779,7 @@ TIPS_CUSTOM_CONFIG_FILE_PATH_ERROR: Custom config file parse error, please check
TIPS_SHORTCUT_MODIFIED_SUCCEED: Shortcut modified successfully TIPS_SHORTCUT_MODIFIED_SUCCEED: Shortcut modified successfully
TIPS_SHORTCUT_MODIFIED_CONFLICT: Shortcut conflict, please reset TIPS_SHORTCUT_MODIFIED_CONFLICT: Shortcut conflict, please reset
TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: Custom link style modified successfully TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: Custom link style modified successfully
TIPS_FIND_NEW_VERSION: Find new version ${v}, update many new features, do you want to download the latest version? TIPS_FIND_NEW_VERSION: Find new version ${v}, update many new features, do you want to download the latest version in the background?
UPDATE_DOWNLOADED: Update downloaded UPDATE_DOWNLOADED: Update downloaded
TIPS_UPDATE_DOWNLOADED: The update has been downloaded and will be installed on the next app restart. Would you like to restart now? TIPS_UPDATE_DOWNLOADED: The update has been downloaded and will be installed on the next app restart. Would you like to restart now?
# privacy # privacy

View File

@ -780,7 +780,7 @@ TIPS_CUSTOM_CONFIG_FILE_PATH_ERROR: 自定义文件解析出错,请检查路
TIPS_SHORTCUT_MODIFIED_SUCCEED: 快捷键已经修改成功 TIPS_SHORTCUT_MODIFIED_SUCCEED: 快捷键已经修改成功
TIPS_SHORTCUT_MODIFIED_CONFLICT: 快捷键冲突,请重新设置 TIPS_SHORTCUT_MODIFIED_CONFLICT: 快捷键冲突,请重新设置
TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: 自定义链接格式已经修改成功 TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: 自定义链接格式已经修改成功
TIPS_FIND_NEW_VERSION: 发现新版本${v},更新了很多功能,是否下载最新的版本? TIPS_FIND_NEW_VERSION: 发现新版本${v},更新了很多功能,是否后台下载最新的版本?
UPDATE_DOWNLOADED: 更新已下载 UPDATE_DOWNLOADED: 更新已下载
TIPS_UPDATE_DOWNLOADED: 更新已下载,将在下次启动时安装,是否现在重启? TIPS_UPDATE_DOWNLOADED: 更新已下载,将在下次启动时安装,是否现在重启?

View File

@ -778,7 +778,7 @@ TIPS_CUSTOM_CONFIG_FILE_PATH_ERROR: 自訂設定檔案解析出錯,請檢查
TIPS_SHORTCUT_MODIFIED_SUCCEED: 快捷鍵已經修改成功 TIPS_SHORTCUT_MODIFIED_SUCCEED: 快捷鍵已經修改成功
TIPS_SHORTCUT_MODIFIED_CONFLICT: 快捷鍵衝突,請重新設定 TIPS_SHORTCUT_MODIFIED_CONFLICT: 快捷鍵衝突,請重新設定
TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: 自訂連結格式已經修改成功 TIPS_CUSTOM_LINK_STYLE_MODIFIED_SUCCEED: 自訂連結格式已經修改成功
TIPS_FIND_NEW_VERSION: 發現新版本${v},更新了很多功能,是否下載最新的版本? TIPS_FIND_NEW_VERSION: 發現新版本${v},更新了很多功能,是否後台下載最新的版本?
UPDATE_DOWNLOADED: 更新已下載 UPDATE_DOWNLOADED: 更新已下載
TIPS_UPDATE_DOWNLOADED: 更新已下載,将在下次啟動時安裝,是否立即重啟? TIPS_UPDATE_DOWNLOADED: 更新已下載,将在下次啟動時安裝,是否立即重啟?
# privacy # privacy

View File

@ -1,37 +1,36 @@
"use strict"; 'use strict'
require('dotenv').config() require('dotenv').config()
const { notarize } = require("@electron/notarize") const { notarize } = require('@electron/notarize')
const { const {
ELECTRON_SKIP_NOTARIZATION, ELECTRON_SKIP_NOTARIZATION,
XCODE_APP_LOADER_EMAIL, XCODE_APP_LOADER_EMAIL,
XCODE_APP_LOADER_PASSWORD, XCODE_APP_LOADER_PASSWORD
} = process.env } = process.env
async function main(context) { async function main (context) {
const { electronPlatformName, appOutDir } = context const { electronPlatformName, appOutDir } = context
if ( if (
electronPlatformName !== "darwin" || electronPlatformName !== 'darwin' ||
ELECTRON_SKIP_NOTARIZATION === "true" || ELECTRON_SKIP_NOTARIZATION === 'true' ||
!XCODE_APP_LOADER_EMAIL || !XCODE_APP_LOADER_EMAIL ||
!XCODE_APP_LOADER_PASSWORD !XCODE_APP_LOADER_PASSWORD
) { ) {
console.log("Skipping Apple notarization.") console.log('Skipping Apple notarization.')
return; return
} }
console.log("Starting Apple notarization.") console.log('Starting Apple notarization.')
const appName = context.packager.appInfo.productFilename; const appName = context.packager.appInfo.productFilename
await notarize({ await notarize({
appBundleId: "com.kuingsmile.piclist", appBundleId: 'com.kuingsmile.piclist',
appPath: `${appOutDir}/${appName}.app`, appPath: `${appOutDir}/${appName}.app`,
appleId: XCODE_APP_LOADER_EMAIL, appleId: XCODE_APP_LOADER_EMAIL,
appleIdPassword: XCODE_APP_LOADER_PASSWORD, appleIdPassword: XCODE_APP_LOADER_PASSWORD
}) })
console.log("Finished Apple notarization.") console.log('Finished Apple notarization.')
} }
exports.default = main; exports.default = main

View File

@ -14,7 +14,6 @@ const ACCOUNT_ID = process.env.R2_ACCOUNT_ID
const SECRET_ID = process.env.R2_SECRET_ID const SECRET_ID = process.env.R2_SECRET_ID
const SECRET_KEY = process.env.R2_SECRET_KEY const SECRET_KEY = process.env.R2_SECRET_KEY
const uploadFile = async () => { const uploadFile = async () => {
try { try {
const platform = process.platform const platform = process.platform

View File

@ -7,10 +7,11 @@ const pkg = require('../package.json')
const configList = require('./config') const configList = require('./config')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const yaml = require('js-yaml')
const BUCKET = 'piclist-dl' const BUCKET = 'piclist-dl'
const VERSION = pkg.version const VERSION = pkg.version
const FILE_PATH = `latest/` const FILE_PATH = 'latest/'
const ACCOUNT_ID = process.env.R2_ACCOUNT_ID const ACCOUNT_ID = process.env.R2_ACCOUNT_ID
const SECRET_ID = process.env.R2_SECRET_ID const SECRET_ID = process.env.R2_SECRET_ID
const SECRET_KEY = process.env.R2_SECRET_KEY const SECRET_KEY = process.env.R2_SECRET_KEY
@ -19,9 +20,22 @@ const s3 = new S3({
endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`, endpoint: `https://${ACCOUNT_ID}.r2.cloudflarestorage.com`,
accessKeyId: SECRET_ID, accessKeyId: SECRET_ID,
secretAccessKey: SECRET_KEY, secretAccessKey: SECRET_KEY,
signatureVersion: 'v4', signatureVersion: 'v4'
}) })
const removeDupField = path => {
const file = fs.readFileSync(path, 'utf8')
const data = yaml.load(file)
const filesMap = {}
data.files.forEach(file => {
const key = file.url + file.sha512 + file.size
filesMap[key] = file
})
data.files = Object.values(filesMap)
const newYml = yaml.dump(data, { lineWidth: -1 })
fs.writeFileSync(path, newYml, 'utf8')
}
const uploadFile = async () => { const uploadFile = async () => {
try { try {
const platform = process.platform const platform = process.platform
@ -30,7 +44,7 @@ const uploadFile = async () => {
for (const [index, config] of configList[platform].entries()) { for (const [index, config] of configList[platform].entries()) {
const fileName = `${config.appNameWithPrefix}${VERSION}${config.arch}${config.ext}` const fileName = `${config.appNameWithPrefix}${VERSION}${config.arch}${config.ext}`
const distPath = path.join(__dirname, '../dist_electron') const distPath = path.join(__dirname, '../dist_electron')
let versionFileName = config['version-file'] const versionFileName = config['version-file']
console.log('[PicList Dist] Uploading...', fileName, `${index + 1}/${configList[platform].length}`) console.log('[PicList Dist] Uploading...', fileName, `${index + 1}/${configList[platform].length}`)
const fileStream = fs.createReadStream(path.join(distPath, fileName)) const fileStream = fs.createReadStream(path.join(distPath, fileName))
const options = { const options = {
@ -55,7 +69,7 @@ const uploadFile = async () => {
} }
} }
}) })
parallelUploads3.on('httpUploadProgress', (progress) => { parallelUploads3.on('httpUploadProgress', progress => {
const progressBar = Math.round((progress.loaded / progress.total) * 100) const progressBar = Math.round((progress.loaded / progress.total) * 100)
process.stdout.write(`\r${progressBar}% ${fileName}`) process.stdout.write(`\r${progressBar}% ${fileName}`)
}) })
@ -72,17 +86,22 @@ const uploadFile = async () => {
} else { } else {
versionFilePath = path.join(distPath, 'latest-linux.yml') versionFilePath = path.join(distPath, 'latest-linux.yml')
} }
removeDupField(versionFilePath)
const versionFileBuffer = fs.readFileSync(versionFilePath) const versionFileBuffer = fs.readFileSync(versionFilePath)
await s3.upload({ await s3
.upload({
Bucket: BUCKET, Bucket: BUCKET,
Key: `${versionFileName}`, Key: `${versionFileName}`,
Body: versionFileBuffer Body: versionFileBuffer
}).promise() })
await s3.upload({ .promise()
await s3
.upload({
Bucket: BUCKET, Bucket: BUCKET,
Key: `${FILE_PATH}${versionFileName}`, Key: `${FILE_PATH}${versionFileName}`,
Body: versionFileBuffer Body: versionFileBuffer
}).promise() })
.promise()
versionFileHasUploaded = true versionFileHasUploaded = true
} }
} }

View File

@ -15,7 +15,6 @@ import { IWindowList } from '#/types/enum'
import pasteTemplate from '~/main/utils/pasteTemplate' import pasteTemplate from '~/main/utils/pasteTemplate'
import pkg from 'root/package.json' import pkg from 'root/package.json'
import { ensureFilePath, handleCopyUrl } from '~/main/utils/common' import { ensureFilePath, handleCopyUrl } from '~/main/utils/common'
import { privacyManager } from '~/main/utils/privacyManager'
// import { T } from '#/i18n' // import { T } from '#/i18n'
import { T } from '~/main/i18n' import { T } from '~/main/i18n'
import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion' import { isMacOSVersionGreaterThanOrEqualTo } from '~/main/utils/getMacOSVersion'
@ -50,12 +49,6 @@ export function createMenu () {
} }
} }
}, },
{
label: T('PRIVACY_AGREEMENT'),
click () {
privacyManager.show(false)
}
},
{ {
label: T('RELOAD_APP'), label: T('RELOAD_APP'),
click () { click () {
@ -115,12 +108,6 @@ export function createContextMenu () {
// @ts-ignore // @ts-ignore
submenu submenu
}, },
{
label: T('PRIVACY_AGREEMENT'),
click () {
privacyManager.show(false)
}
},
{ {
label: T('RELOAD_APP'), label: T('RELOAD_APP'),
click () { click () {

View File

@ -43,6 +43,7 @@ import getManageApi from '../manage/Main'
import UpDownTaskQueue from '../manage/datastore/upDownTaskQueue' import UpDownTaskQueue from '../manage/datastore/upDownTaskQueue'
import { T } from '~/main/i18n' import { T } from '~/main/i18n'
import { UpdateInfo, autoUpdater } from 'electron-updater' import { UpdateInfo, autoUpdater } from 'electron-updater'
import updateChecker from '../utils/updateChecker'
const isDevelopment = process.env.NODE_ENV !== 'production' const isDevelopment = process.env.NODE_ENV !== 'production'
const handleStartUpFiles = (argv: string[], cwd: string) => { const handleStartUpFiles = (argv: string[], cwd: string) => {
@ -77,11 +78,14 @@ autoUpdater.on('update-available', (info: UpdateInfo) => {
buttons: ['Yes', 'No'], buttons: ['Yes', 'No'],
message: T('TIPS_FIND_NEW_VERSION', { message: T('TIPS_FIND_NEW_VERSION', {
v: info.version v: info.version
}) }),
checkboxLabel: T('NO_MORE_NOTICE'),
checkboxChecked: false
}).then((result) => { }).then((result) => {
if (result.response === 0) { if (result.response === 0) {
autoUpdater.downloadUpdate() autoUpdater.downloadUpdate()
} }
db.set('settings.showUpdateTip', !result.checkboxChecked)
}) })
}) })
@ -151,8 +155,7 @@ class LifeCycle {
} }
createTray() createTray()
db.set('needReload', false) db.set('needReload', false)
// updateChecker() updateChecker()
autoUpdater.checkForUpdatesAndNotify()
// 不需要阻塞 // 不需要阻塞
process.nextTick(() => { process.nextTick(() => {
shortKeyHandler.init() shortKeyHandler.init()

View File

@ -1,13 +1,9 @@
import { dialog, shell } from 'electron'
import db from '~/main/apis/core/datastore' import db from '~/main/apis/core/datastore'
import pkg from 'root/package.json'
import { lt } from 'semver'
import { T } from '~/main/i18n'
import { getLatestVersion } from '#/utils/getLatestVersion' import { getLatestVersion } from '#/utils/getLatestVersion'
const version = pkg.version import { autoUpdater } from 'electron-updater'
// const releaseUrl = 'https://api.github.com/repos/Molunerfinn/PicGo/releases' // const releaseUrl = 'https://api.github.com/repos/Molunerfinn/PicGo/releases'
// const releaseUrlBackup = 'https://picgo-1251750343.cos.ap-chengdu.myqcloud.com' // const releaseUrlBackup = 'https://picgo-1251750343.cos.ap-chengdu.myqcloud.com'
const downloadUrl = 'https://github.com/Kuingsmile/PicList/releases/latest' // const downloadUrl = 'https://github.com/Kuingsmile/PicList/releases/latest'
const checkVersion = async () => { const checkVersion = async () => {
let showTip = db.get('settings.showUpdateTip') let showTip = db.get('settings.showUpdateTip')
@ -18,25 +14,7 @@ const checkVersion = async () => {
if (showTip) { if (showTip) {
const res: string = await getLatestVersion() const res: string = await getLatestVersion()
if (res !== '') { if (res !== '') {
const latest = res autoUpdater.checkForUpdatesAndNotify()
const result = compareVersion2Update(version, latest)
if (result) {
dialog.showMessageBox({
type: 'info',
title: T('FIND_NEW_VERSION'),
buttons: ['Yes', 'No'],
message: T('TIPS_FIND_NEW_VERSION', {
v: latest
}),
checkboxLabel: T('NO_MORE_NOTICE'),
checkboxChecked: false
}).then(res => {
if (res.response === 0) { // if selected yes
shell.openExternal(downloadUrl)
}
db.set('settings.showUpdateTip', !res.checkboxChecked)
})
}
} else { } else {
return false return false
} }
@ -45,13 +23,4 @@ const checkVersion = async () => {
} }
} }
// if true -> update else return false
const compareVersion2Update = (current: string, latest: string) => {
try {
return lt(current, latest)
} catch (e) {
return false
}
}
export default checkVersion export default checkVersion

View File

@ -151,7 +151,6 @@
</el-button> </el-button>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="false"
:label="$T('SETTINGS_OPEN_UPDATE_HELPER')" :label="$T('SETTINGS_OPEN_UPDATE_HELPER')"
> >
<el-switch <el-switch