|
@@ -300,7 +300,9 @@ func SyncData(boot, exit, byHand bool) {
|
|
syncDownloadErrCount++
|
|
syncDownloadErrCount++
|
|
return
|
|
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 {
|
|
if nil != err {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -320,13 +322,33 @@ func SyncData(boot, exit, byHand bool) {
|
|
syncDownloadErrCount++
|
|
syncDownloadErrCount++
|
|
return
|
|
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 {
|
|
if nil != err {
|
|
util.PushClearMsg()
|
|
util.PushClearMsg()
|
|
msg := fmt.Sprintf(Conf.Language(80), formatErrorMsg(err))
|
|
msg := fmt.Sprintf(Conf.Language(80), formatErrorMsg(err))
|
|
Conf.Sync.Stat = msg
|
|
Conf.Sync.Stat = msg
|
|
util.PushErrMsg(msg, 7000)
|
|
util.PushErrMsg(msg, 7000)
|
|
|
|
+
|
|
|
|
+ err = syncDirUpsertWorkspaceData(downloadedFiles)
|
|
|
|
+ if nil != err {
|
|
|
|
+ util.LogErrorf("upsert partially downloaded files to workspace data failed: %s", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
if boot {
|
|
if boot {
|
|
BootSyncSucc = 1
|
|
BootSyncSucc = 1
|
|
}
|
|
}
|
|
@@ -360,8 +382,8 @@ func SyncData(boot, exit, byHand bool) {
|
|
clearEmptyDirs(util.DataDir)
|
|
clearEmptyDirs(util.DataDir)
|
|
|
|
|
|
elapsed := time.Now().Sub(start).Seconds()
|
|
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.Downloaded = now
|
|
Conf.Sync.Stat = stat
|
|
Conf.Sync.Stat = stat
|
|
@@ -490,6 +512,33 @@ func SetSyncEnable(b bool) (err error) {
|
|
|
|
|
|
var syncLock = sync.Mutex{}
|
|
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 中。
|
|
// syncDir2WorkspaceData 将 sync 的数据更新到 data 中。
|
|
// 1. 删除 data 中冗余的文件
|
|
// 1. 删除 data 中冗余的文件
|
|
// 2. 将 sync 中新增/修改的文件解密后拷贝到 data 中
|
|
// 2. 将 sync 中新增/修改的文件解密后拷贝到 data 中
|