diff --git a/kernel/api/repo.go b/kernel/api/repo.go index eed0318d5..256908ad8 100644 --- a/kernel/api/repo.go +++ b/kernel/api/repo.go @@ -62,7 +62,7 @@ func diffRepoSnapshots(c *gin.Context) { left := arg["left"].(string) right := arg["right"].(string) - adds, updates, removes, err := model.DiffRepoSnapshots(left, right) + diff, err := model.DiffRepoSnapshots(left, right) if nil != err { ret.Code = -1 ret.Msg = err.Error() @@ -70,9 +70,7 @@ func diffRepoSnapshots(c *gin.Context) { } ret.Data = map[string]interface{}{ - "adds": adds, - "updates": updates, - "removes": removes, + "diff": diff, } } diff --git a/kernel/go.mod b/kernel/go.mod index a13bcdca9..270c38dd5 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -39,7 +39,7 @@ require ( github.com/patrickmn/go-cache v2.1.0+incompatible github.com/radovskyb/watcher v1.0.7 github.com/shirou/gopsutil/v3 v3.22.11 - github.com/siyuan-note/dejavu v0.0.0-20221215030457-cdeb29f2189f + github.com/siyuan-note/dejavu v0.0.0-20221217082303-2b63c518c7b1 github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da github.com/siyuan-note/filelock v0.0.0-20221117095924-e1947438a35e @@ -61,7 +61,7 @@ require ( github.com/alecthomas/chroma v0.10.0 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef // indirect - github.com/aws/aws-sdk-go v1.44.160 // indirect + github.com/aws/aws-sdk-go v1.44.162 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/dlclark/regexp2 v1.7.0 // indirect github.com/dsnet/compress v0.0.1 // indirect @@ -119,7 +119,7 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect golang.org/x/crypto v0.4.0 // indirect - golang.org/x/exp v0.0.0-20221212164502-fae10dda9338 // indirect + golang.org/x/exp v0.0.0-20221215174704-0915cd710c24 // indirect golang.org/x/mod v0.7.0 // indirect golang.org/x/net v0.4.0 // indirect golang.org/x/sync v0.1.0 // indirect diff --git a/kernel/go.sum b/kernel/go.sum index 1ccb763e1..d7f780baa 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -48,6 +48,8 @@ github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef h1:2JGTg6JapxP github.com/asaskevich/EventBus v0.0.0-20200907212545-49d423059eef/go.mod h1:JS7hed4L1fj0hXcyEejnW57/7LCetXggd+vwrRnYeII= github.com/aws/aws-sdk-go v1.44.160 h1:F41sWUel1CJ69ezoBGCg8sDyu9kyeKEpwmDrLXbCuyA= github.com/aws/aws-sdk-go v1.44.160/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.162 h1:hKAd+X+/BLxVMzH+4zKxbQcQQGrk2UhFX0OTu1Mhon8= +github.com/aws/aws-sdk-go v1.44.162/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= @@ -373,6 +375,8 @@ github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYED github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/siyuan-note/dejavu v0.0.0-20221215030457-cdeb29f2189f h1:ufAgHjQdpXsEN0CVnMbXng3qyObITEw7dnoiSBlbjL0= github.com/siyuan-note/dejavu v0.0.0-20221215030457-cdeb29f2189f/go.mod h1:aarwJw3uJaqNoIGVLmyhZjMCjI+xAzwrMIg05scqmtc= +github.com/siyuan-note/dejavu v0.0.0-20221217082303-2b63c518c7b1 h1:OsKmVwcihgfoylPB4+qjJ5q0GuZgUPBBDXQ9hMs4zZM= +github.com/siyuan-note/dejavu v0.0.0-20221217082303-2b63c518c7b1/go.mod h1:aarwJw3uJaqNoIGVLmyhZjMCjI+xAzwrMIg05scqmtc= github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 h1:Bi7/7f29LW+Fm0cHc0J1NO1cZqyJwljSWVmfOqVZgaE= github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw= github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da h1:/jNhl7LC+9BhkWvNxuJDdsNfA/2wvfuj9mqWx4CbV90= @@ -456,6 +460,8 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20221212164502-fae10dda9338 h1:OvjRkcNHnf6/W5FZXSxODbxwD+X7fspczG7Jn/xQVD4= golang.org/x/exp v0.0.0-20221212164502-fae10dda9338/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20221215174704-0915cd710c24 h1:6w3iSY8IIkp5OQtbYj8NeuKG1jS9d+kYaubXqsoOiQ8= +golang.org/x/exp v0.0.0-20221215174704-0915cd710c24/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190823064033-3a9bac650e44/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= diff --git a/kernel/model/repository.go b/kernel/model/repository.go index 2139299df..21e608b8f 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -34,6 +34,7 @@ import ( "time" "github.com/88250/gulu" + "github.com/88250/lute" "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/88250/lute/render" @@ -77,20 +78,8 @@ func OpenRepoSnapshotDoc(fileID string) (id, rootID, content string, isLargeDoc if nil != err { return } - - file, err := repo.GetFile(fileID) - if nil != err { - return - } - - data, err := repo.OpenFile(file) - if nil != err { - return - } - - isLargeDoc = 1024*1024*1 <= len(data) luteEngine := NewLute() - snapshotTree, err := parse.ParseJSONWithoutFix(data, luteEngine.ParseOptions) + isLargeDoc, snapshotTree, err := parseTreeInSnapshot(fileID, repo, luteEngine) if nil != err { logging.LogErrorf("parse tree from snapshot file [%s] failed", fileID) return @@ -138,7 +127,19 @@ func OpenRepoSnapshotDoc(fileID string) (id, rootID, content string, isLargeDoc return } -func DiffRepoSnapshots(left, right string) (adds, updates, removes []*entity.File, err error) { +type LeftRightDiff struct { + AddsLeft []*DiffFile + UpdatesLeft []*DiffFile + UpdatesRight []*DiffFile + RemovesRight []*DiffFile +} + +type DiffFile struct { + FileID string + Title string +} + +func DiffRepoSnapshots(left, right string) (ret *LeftRightDiff, err error) { if 1 > len(Conf.Repo.Key) { err = errors.New(Conf.Language(26)) return @@ -149,16 +150,108 @@ func DiffRepoSnapshots(left, right string) (adds, updates, removes []*entity.Fil return } - leftIndex, err := repo.GetIndex(left) - if nil != err { - return - } - rightIndex, err := repo.GetIndex(right) + diff, err := repo.DiffIndex(left, right) if nil != err { return } - adds, updates, removes, err = repo.DiffIndex(leftIndex, rightIndex) + luteEngine := NewLute() + for _, addLeft := range diff.AddsLeft { + title, err := parseTitleInSnapshot(addLeft.ID, repo, luteEngine) + if nil != err { + logging.LogErrorf("parse title from snapshot file [%s] failed", addLeft.ID) + continue + } + + ret.AddsLeft = append(ret.AddsLeft, &DiffFile{ + FileID: addLeft.ID, + Title: title, + }) + } + + for _, updateLeft := range diff.UpdatesLeft { + title, err := parseTitleInSnapshot(updateLeft.ID, repo, luteEngine) + if nil != err { + logging.LogErrorf("parse title from snapshot file [%s] failed", updateLeft.ID) + continue + } + + ret.UpdatesLeft = append(ret.UpdatesLeft, &DiffFile{ + FileID: updateLeft.ID, + Title: title, + }) + } + + for _, updateRight := range diff.UpdatesRight { + title, err := parseTitleInSnapshot(updateRight.ID, repo, luteEngine) + if nil != err { + logging.LogErrorf("parse title from snapshot file [%s] failed", updateRight.ID) + continue + } + + ret.UpdatesRight = append(ret.UpdatesRight, &DiffFile{ + FileID: updateRight.ID, + Title: title, + }) + } + + for _, removeRight := range diff.RemovesRight { + title, err := parseTitleInSnapshot(removeRight.ID, repo, luteEngine) + if nil != err { + logging.LogErrorf("parse title from snapshot file [%s] failed", removeRight.ID) + continue + } + + ret.RemovesRight = append(ret.RemovesRight, &DiffFile{ + FileID: removeRight.ID, + Title: title, + }) + } + return +} + +func parseTitleInSnapshot(fileID string, repo *dejavu.Repo, luteEngine *lute.Lute) (title string, err error) { + file, err := repo.GetFile(fileID) + if nil != err { + return + } + + if strings.HasSuffix(file.Path, ".sy") { + var data []byte + data, err = repo.OpenFile(file) + if nil != err { + return + } + + var tree *parse.Tree + tree, err = parse.ParseJSONWithoutFix(data, luteEngine.ParseOptions) + if nil != err { + return + } + + title = tree.Root.IALAttr("title") + } else { + title = path.Base(file.Path) + } + return +} + +func parseTreeInSnapshot(fileID string, repo *dejavu.Repo, luteEngine *lute.Lute) (isLargeDoc bool, tree *parse.Tree, err error) { + file, err := repo.GetFile(fileID) + if nil != err { + return + } + + data, err := repo.OpenFile(file) + if nil != err { + return + } + + isLargeDoc = 1024*1024*1 <= len(data) + tree, err = parse.ParseJSONWithoutFix(data, luteEngine.ParseOptions) + if nil != err { + return + } return }