diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index 48b3b44a2..5c395cb8f 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -872,6 +872,8 @@ "136": "Initializing data repository key...", "137": "Failed to initialize data repository key", "138": "Data repository key is set", - "139": "Data snapshot is being generated, [%s] data files have been processed, [%s] remaining..." + "139": "Data snapshot is being generated, [%s] data files have been processed, [%s] remaining...", + "140": "Failed to create data snapshot", + "141": "Failed to rollback data snapshot" } } diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 02d335c68..e4948db78 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -872,6 +872,8 @@ "136": "Initialisation de la clé du référentiel de données...", "137": "Échec de l'initialisation de la clé du référentiel de données", "138": "La clé du référentiel de données est définie", - "139": "L'instantané des données est en cours de génération, [%s] fichiers de données ont été traités, [%s] restants..." + "139": "L'instantané des données est en cours de génération, [%s] fichiers de données ont été traités, [%s] restants...", + "140": "Échec de la création de l'instantané des données", + "141": "Échec de la restauration de l'instantané des données" } } diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 65699d884..2cf9939c4 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -871,6 +871,8 @@ "136": "初始化數據倉庫密鑰...", "137": "初始化數據倉庫密鑰失敗", "138": "數據倉庫密鑰設置完畢", - "139": "正在生成數據快照,已處理 [%s] 個數據文件,剩餘待處理 [%s]..." + "139": "正在生成數據快照,已處理 [%s] 個數據文件,剩餘待處理 [%s]...", + "140": "創建數據快照失敗", + "141": "回滾數據快照失敗" } } diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 0ef047e95..a466cb11d 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -873,6 +873,8 @@ "136": "初始化数据仓库密钥...", "137": "初始化数据仓库密钥失败", "138": "数据仓库密钥设置完毕", - "139": "正在生成数据快照,已处理 [%s] 个数据文件,剩余待处理 [%s]..." + "139": "正在生成数据快照,已处理 [%s] 个数据文件,剩余待处理 [%s]...", + "140": "创建数据快照失败", + "141": "回滚数据快照失败" } } diff --git a/kernel/api/repo.go b/kernel/api/repo.go index 6fc40f858..45659c3b8 100644 --- a/kernel/api/repo.go +++ b/kernel/api/repo.go @@ -27,6 +27,27 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func getRepoFile(c *gin.Context) { + +} + +func checkoutRepo(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + id := arg["id"].(string) + if err := model.CheckoutRepo(id); nil != err { + ret.Code = -1 + ret.Msg = model.Conf.Language(141) + return + } +} + func getRepoIndexLogs(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) @@ -60,7 +81,7 @@ func indexRepo(c *gin.Context) { message := arg["message"].(string) if err := model.IndexRepo(message); nil != err { ret.Code = -1 - ret.Msg = model.Conf.Language(137) + ret.Msg = model.Conf.Language(140) return } } diff --git a/kernel/api/router.go b/kernel/api/router.go index a6eb512c1..1d10aacd4 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -249,7 +249,9 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/repo/initRepoKey", model.CheckAuth, initRepoKey) ginServer.Handle("POST", "/api/repo/importRepoKey", model.CheckAuth, importRepoKey) ginServer.Handle("POST", "/api/repo/indexRepo", model.CheckAuth, indexRepo) + ginServer.Handle("POST", "/api/repo/checkoutRepo", model.CheckAuth, checkoutRepo) ginServer.Handle("POST", "/api/repo/getRepoIndexLogs", model.CheckAuth, getRepoIndexLogs) + ginServer.Handle("POST", "/api/repo/getRepoFile", model.CheckAuth, getRepoFile) ginServer.Handle("POST", "/api/notification/pushMsg", model.CheckAuth, pushMsg) ginServer.Handle("POST", "/api/notification/pushErrMsg", model.CheckAuth, pushErrMsg) diff --git a/kernel/go.mod b/kernel/go.mod index 002c0b77a..ae9384cc4 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -40,7 +40,7 @@ require ( github.com/patrickmn/go-cache v2.1.0+incompatible github.com/qiniu/go-sdk/v7 v7.13.0 github.com/radovskyb/watcher v1.0.7 - github.com/siyuan-note/dejavu v0.0.0-20220613134332-45af7919bc94 + github.com/siyuan-note/dejavu v0.0.0-20220613144035-412877c5ffa6 github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676 github.com/vmihailenco/msgpack/v5 v5.3.5 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 diff --git a/kernel/go.sum b/kernel/go.sum index ab99f2e68..31b8e5fa0 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -421,6 +421,8 @@ github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJV github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/siyuan-note/dejavu v0.0.0-20220613134332-45af7919bc94 h1:NRlFUCAFPEMWoBrvuEQ0csBUoyKvWtQ67g6ctGH5kVA= github.com/siyuan-note/dejavu v0.0.0-20220613134332-45af7919bc94/go.mod h1:pZFVF2imlfZMT5w6899ZwXCLKVccZ9GDJzdLHJ+ONik= +github.com/siyuan-note/dejavu v0.0.0-20220613144035-412877c5ffa6 h1:YwbEqSGcdnS15HakNOZpCtI80rthjQM87FXHRsYIa6M= +github.com/siyuan-note/dejavu v0.0.0-20220613144035-412877c5ffa6/go.mod h1:pZFVF2imlfZMT5w6899ZwXCLKVccZ9GDJzdLHJ+ONik= github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676 h1:QB9TjJQFhXhZ6dAtPpY02DlzHAQm1C+WqZq6OadG8mI= github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 9950b9135..9f752724b 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -29,10 +29,20 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func GetRepoFile(id string) (ret []byte, err error) { + //repo, err := dejavu.NewRepo(util.DataDir, util.RepoDir, Conf.Repo.Key) + //if nil != err { + // util.LogErrorf("init repo failed: %s", err) + // return + //} + + return +} + func GetRepoIndexLogs(page int) (logs []*dejavu.Log, err error) { repo, err := dejavu.NewRepo(util.DataDir, util.RepoDir, Conf.Repo.Key) if nil != err { - util.LogErrorf("new repo failed: %s", err) + util.LogErrorf("init repo failed: %s", err) return } @@ -93,6 +103,38 @@ func InitRepoKey() (err error) { return } +var checkoutCallbacks = map[string]dejavu.Callback{ + "walkData": func(context, arg interface{}, err error) { + context.(func(msg string))(arg.(string)) + }, + "upsertFile": func(context, arg interface{}, err error) { + context.(func(msg string))(arg.(*entity.File).Path) + }, + "removeFile": func(context, arg interface{}, err error) { + context.(func(msg string))(arg.(*entity.File).Path) + }, +} + +func CheckoutRepo(id string) (err error) { + if 1 > len(Conf.Repo.Key) { + err = errors.New("repo key is nil") + return + } + + repo, err := dejavu.NewRepo(util.DataDir, util.RepoDir, Conf.Repo.Key) + if nil != err { + util.LogErrorf("init repo failed: %s", err) + return + } + + syncLock.Lock() + defer syncLock.Unlock() + filesys.ReleaseAllFileLocks() + err = repo.Checkout(id, util.PushEndlessProgress, checkoutCallbacks) + util.PushClearProgress() + return +} + var indexCallbacks = map[string]dejavu.Callback{ "walkData": func(context, arg interface{}, err error) { context.(func(msg string))(arg.(string)) @@ -113,6 +155,7 @@ func IndexRepo(message string) (err error) { repo, err := dejavu.NewRepo(util.DataDir, util.RepoDir, Conf.Repo.Key) if nil != err { + util.LogErrorf("init repo failed: %s", err) return }