Kaynağa Gözat

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 3 yıl önce
ebeveyn
işleme
ccc67d7faa
4 değiştirilmiş dosya ile 71 ekleme ve 13 silme
  1. 2 2
      kernel/model/backup.go
  2. 4 0
      kernel/model/mount.go
  3. 12 7
      kernel/model/osssync.go
  4. 53 4
      kernel/model/sync.go

+ 2 - 2
kernel/model/backup.go

@@ -344,10 +344,10 @@ func DownloadBackup() (err error) {
 	localDirPath := Conf.Backup.GetSaveDir()
 	util.PushEndlessProgress(Conf.Language(68))
 	start := time.Now()
-	fetchedFiles, transferSize, err := ossDownload(localDirPath, "backup", false)
+	fetchedFilesCount, transferSize, _, err := ossDownload(localDirPath, "backup", false)
 	if nil == err {
 		elapsed := time.Now().Sub(start).Seconds()
-		util.LogInfof("downloaded backup [fetchedFiles=%d, transferSize=%s] in [%.2fs]", fetchedFiles, humanize.Bytes(transferSize), elapsed)
+		util.LogInfof("downloaded backup [fetchedFiles=%d, transferSize=%s] in [%.2fs]", fetchedFilesCount, humanize.Bytes(transferSize), elapsed)
 		util.PushEndlessProgress(Conf.Language(69))
 	}
 	return

+ 4 - 0
kernel/model/mount.go

@@ -179,6 +179,10 @@ func Mount(boxID string) (alreadyMount bool, err error) {
 		go func() {
 			time.Sleep(time.Second * 5)
 			util.PushErrMsg(Conf.Language(52), 9000)
+
+			// 每次打开帮助文档时自动检查版本更新并提醒 https://github.com/siyuan-note/siyuan/issues/5057
+			time.Sleep(time.Second * 10)
+			CheckUpdate(true)
 		}()
 	}
 

+ 12 - 7
kernel/model/osssync.go

@@ -161,7 +161,7 @@ func listCloudSyncDirOSS() (dirs []map[string]interface{}, size int64, err error
 	return
 }
 
-func ossDownload(localDirPath, cloudDirPath string, bootOrExit bool) (fetchedFiles int, transferSize uint64, err error) {
+func ossDownload(localDirPath, cloudDirPath string, bootOrExit bool) (fetchedFilesCount int, transferSize uint64, downloadedFiles []string, err error) {
 	if !gulu.File.IsExist(localDirPath) {
 		return
 	}
@@ -187,24 +187,29 @@ func ossDownload(localDirPath, cloudDirPath string, bootOrExit bool) (fetchedFil
 	waitGroup := &sync.WaitGroup{}
 	var downloadErr error
 	poolSize := 4
-	if poolSize > len(cloudFetches) {
+	if poolSize > len(cloudFetches)-1 /* 不计入 /.siyuan/conf.json,配置文件最后单独下载 */ {
 		poolSize = len(cloudFetches)
 	}
 	p, _ := ants.NewPoolWithFunc(poolSize, func(arg interface{}) {
 		defer waitGroup.Done()
+		if nil != downloadErr {
+			return // 快速失败
+		}
 
 		fetch := arg.(string)
-		err = ossDownload0(localDirPath, cloudDirPath, fetch, &fetchedFiles, &transferSize, bootOrExit)
+		err = ossDownload0(localDirPath, cloudDirPath, fetch, &fetchedFilesCount, &transferSize, bootOrExit)
 		if nil != err {
 			downloadErr = err // 仅记录最后一次错误
 			return
 		}
+		downloadedFiles = append(downloadedFiles, fetch)
+
 		if needPushProgress {
-			msg := fmt.Sprintf(Conf.Language(103), fetchedFiles, len(cloudFetches)-fetchedFiles)
-			util.PushProgress(util.PushProgressCodeProgressed, fetchedFiles, len(cloudFetches), msg)
+			msg := fmt.Sprintf(Conf.Language(103), fetchedFilesCount, len(cloudFetches)-fetchedFilesCount)
+			util.PushProgress(util.PushProgressCodeProgressed, fetchedFilesCount, len(cloudFetches), msg)
 		}
 		if bootOrExit {
-			msg := fmt.Sprintf("Downloading data from the cloud %d/%d", fetchedFiles, len(cloudFetches))
+			msg := fmt.Sprintf("Downloading data from the cloud %d/%d", fetchedFilesCount, len(cloudFetches))
 			util.IncBootProgress(0, msg)
 		}
 	})
@@ -224,7 +229,7 @@ func ossDownload(localDirPath, cloudDirPath string, bootOrExit bool) (fetchedFil
 		return
 	}
 
-	err = ossDownload0(localDirPath, cloudDirPath, "/.siyuan/conf.json", &fetchedFiles, &transferSize, bootOrExit)
+	err = ossDownload0(localDirPath, cloudDirPath, "/.siyuan/conf.json", &fetchedFilesCount, &transferSize, bootOrExit)
 	if nil != err {
 		return
 	}

+ 53 - 4
kernel/model/sync.go

@@ -300,7 +300,9 @@ func SyncData(boot, exit, byHand bool) {
 		syncDownloadErrCount++
 		return
 	}
-	data, err := os.ReadFile(filepath.Join(util.TempDir, "/sync/"+pathJSON))
+
+	tmpPathJSON := filepath.Join(util.TempDir, "/sync/"+pathJSON)
+	data, err := os.ReadFile(tmpPathJSON)
 	if nil != err {
 		return
 	}
@@ -320,13 +322,33 @@ func SyncData(boot, exit, byHand bool) {
 		syncDownloadErrCount++
 		return
 	}
+	if err = os.Rename(tmpPathJSON, filepath.Join(localSyncDirPath, pathJSON)); nil != err {
+		util.PushClearMsg()
+		msg := fmt.Sprintf(Conf.Language(80), formatErrorMsg(err))
+		Conf.Sync.Stat = msg
+		util.PushErrMsg(msg, 7000)
+		if boot {
+			BootSyncSucc = 1
+		}
+		if exit {
+			ExitSyncSucc = 1
+		}
+		syncDownloadErrCount++
+		return
+	}
 
-	fetchedFiles, transferSize, err := ossDownload(localSyncDirPath, "sync/"+Conf.Sync.CloudName, boot || exit)
+	fetchedFilesCount, transferSize, downloadedFiles, err := ossDownload(localSyncDirPath, "sync/"+Conf.Sync.CloudName, boot || exit)
 	if nil != err {
 		util.PushClearMsg()
 		msg := fmt.Sprintf(Conf.Language(80), formatErrorMsg(err))
 		Conf.Sync.Stat = msg
 		util.PushErrMsg(msg, 7000)
+
+		err = syncDirUpsertWorkspaceData(downloadedFiles)
+		if nil != err {
+			util.LogErrorf("upsert partially downloaded files to workspace data failed: %s", err)
+		}
+
 		if boot {
 			BootSyncSucc = 1
 		}
@@ -360,8 +382,8 @@ func SyncData(boot, exit, byHand bool) {
 	clearEmptyDirs(util.DataDir)
 
 	elapsed := time.Now().Sub(start).Seconds()
-	stat := fmt.Sprintf(Conf.Language(129), fetchedFiles, humanize.Bytes(transferSize)) + fmt.Sprintf(Conf.Language(131), elapsed)
-	util.LogInfof("sync [cloud=%d, local=%d, fetchedFiles=%d, transferSize=%s] downloaded in [%.2fs]", cloudSyncVer, syncConf.SyncVer, fetchedFiles, humanize.Bytes(transferSize), elapsed)
+	stat := fmt.Sprintf(Conf.Language(129), fetchedFilesCount, humanize.Bytes(transferSize)) + fmt.Sprintf(Conf.Language(131), elapsed)
+	util.LogInfof("sync [cloud=%d, local=%d, fetchedFiles=%d, transferSize=%s] downloaded in [%.2fs]", cloudSyncVer, syncConf.SyncVer, fetchedFilesCount, humanize.Bytes(transferSize), elapsed)
 
 	Conf.Sync.Downloaded = now
 	Conf.Sync.Stat = stat
@@ -490,6 +512,33 @@ func SetSyncEnable(b bool) (err error) {
 
 var syncLock = sync.Mutex{}
 
+func syncDirUpsertWorkspaceData(downloadedFiles []string) (err error) {
+	start := time.Now()
+
+	modified := map[string]bool{}
+	syncDir := Conf.Sync.GetSaveDir()
+	for _, file := range downloadedFiles {
+		file = filepath.Join(syncDir, file)
+		modified[file] = true
+	}
+
+	decryptedDataDir, _, err := recoverSyncData(modified)
+	if nil != err {
+		util.LogErrorf("decrypt data dir failed: %s", err)
+		return
+	}
+
+	dataDir := util.DataDir
+	if err = stableCopy(decryptedDataDir, dataDir); nil != err {
+		util.LogErrorf("copy decrypted data dir from [%s] to data dir [%s] failed: %s", decryptedDataDir, dataDir, err)
+		return
+	}
+	if elapsed := time.Since(start).Milliseconds(); 5000 < elapsed {
+		util.LogInfof("sync data to workspace data elapsed [%dms]", elapsed)
+	}
+	return
+}
+
 // syncDir2WorkspaceData 将 sync 的数据更新到 data 中。
 //   1. 删除 data 中冗余的文件
 //   2. 将 sync 中新增/修改的文件解密后拷贝到 data 中