From a9cb87787e7db0b1f1c4520293c0b04996accc29 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 4 Jan 2023 20:13:17 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E5=B7=A5=E4=BD=9C=E7=A9=BA=E9=97=B4=20https:?= =?UTF-8?q?//github.com/siyuan-note/siyuan/issues/4642?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/util/working.go | 2 +- kernel/util/working_mobile.go | 122 ++++++++++++++++++++++++++-------- 2 files changed, 95 insertions(+), 29 deletions(-) diff --git a/kernel/util/working.go b/kernel/util/working.go index e84f8c524..ed91959cc 100644 --- a/kernel/util/working.go +++ b/kernel/util/working.go @@ -217,7 +217,7 @@ func initWorkspaceDir(workspaceArg string) { log.Printf("unmarshal workspace conf [%s] failed: %s", workspaceConf, err) } - tmp := workspacePaths[:0] + var tmp []string for _, d := range workspacePaths { d = strings.TrimRight(d, " \t\n") // 去掉工作空间路径尾部空格 https://github.com/siyuan-note/siyuan/issues/6353 if gulu.File.IsDir(d) { diff --git a/kernel/util/working_mobile.go b/kernel/util/working_mobile.go index de565f00f..465468f5c 100644 --- a/kernel/util/working_mobile.go +++ b/kernel/util/working_mobile.go @@ -17,9 +17,11 @@ package util import ( + "log" "math/rand" "os" "path/filepath" + "strings" "time" "github.com/88250/gulu" @@ -33,41 +35,105 @@ func BootMobile(container, appDir, workspaceBaseDir, lang string) { rand.Seed(time.Now().UTC().UnixNano()) initMime() initHttpClient() - - workspaceDir := filepath.Join(workspaceBaseDir, "siyuan") - HomeDir = filepath.Join(workspaceBaseDir, "home") - userHomeConfDir := filepath.Join(HomeDir, ".config", "siyuan") - if !gulu.File.IsExist(userHomeConfDir) { - os.MkdirAll(userHomeConfDir, 0755) - } - WorkingDir = filepath.Join(appDir, "app") - WorkspaceDir = workspaceDir - ConfDir = filepath.Join(workspaceDir, "conf") - DataDir = filepath.Join(workspaceDir, "data") - HistoryDir = filepath.Join(workspaceDir, "history") - RepoDir = filepath.Join(WorkspaceDir, "repo") - TempDir = filepath.Join(workspaceDir, "temp") - osTmpDir := filepath.Join(TempDir, "os") - os.RemoveAll(osTmpDir) - os.MkdirAll(osTmpDir, 0755) - os.RemoveAll(filepath.Join(TempDir, "repo")) - os.Setenv("TMPDIR", osTmpDir) - DBPath = filepath.Join(TempDir, DBName) - HistoryDBPath = filepath.Join(TempDir, "history.db") - BlockTreePath = filepath.Join(TempDir, "blocktree.msgpack") - LogPath = filepath.Join(TempDir, "siyuan.log") - logging.SetLogPath(LogPath) - AppearancePath = filepath.Join(ConfDir, "appearance") - ThemesPath = filepath.Join(AppearancePath, "themes") - IconsPath = filepath.Join(AppearancePath, "icons") - SnippetsPath = filepath.Join(DataDir, "snippets") ServerPort = FixedPort Container = container UserAgent = UserAgent + " " + Container httpclient.SetUserAgent(UserAgent) Lang = lang + + WorkingDir = filepath.Join(appDir, "app") + HomeDir = filepath.Join(workspaceBaseDir, "home") + userHomeConfDir := filepath.Join(HomeDir, ".config", "siyuan") + if !gulu.File.IsExist(userHomeConfDir) { + os.MkdirAll(userHomeConfDir, 0755) + } + + initWorkspaceDirMobile(workspaceBaseDir) + initPathDir() bootBanner := figure.NewFigure("SiYuan", "", true) logging.LogInfof("\n" + bootBanner.String()) logBootInfo() } + +func initWorkspaceDirMobile(workspaceBaseDir string) { + userHomeConfDir := filepath.Join(HomeDir, ".config", "siyuan") + workspaceConf := filepath.Join(userHomeConfDir, "workspace.json") + if !gulu.File.IsExist(workspaceConf) { + if err := os.MkdirAll(userHomeConfDir, 0755); nil != err && !os.IsExist(err) { + log.Printf("create user home conf folder [%s] failed: %s", userHomeConfDir, err) + os.Exit(ExitCodeCreateConfDirErr) + } + } + + defaultWorkspaceDir := filepath.Join(workspaceBaseDir, "siyuan") + var workspacePaths []string + if !gulu.File.IsExist(workspaceConf) { + WorkspaceDir = defaultWorkspaceDir + if !gulu.File.IsDir(WorkspaceDir) { + log.Printf("use the default workspace [%s] since the specified workspace [%s] is not a dir", WorkspaceDir, defaultWorkspaceDir) + WorkspaceDir = defaultWorkspaceDir + } + workspacePaths = append(workspacePaths, WorkspaceDir) + } else { + data, err := os.ReadFile(workspaceConf) + if err = gulu.JSON.UnmarshalJSON(data, &workspacePaths); nil != err { + log.Printf("unmarshal workspace conf [%s] failed: %s", workspaceConf, err) + } + + var tmp []string + for _, d := range workspacePaths { + d = strings.TrimRight(d, " \t\n") // 去掉工作空间路径尾部空格 https://github.com/siyuan-note/siyuan/issues/6353 + if gulu.File.IsDir(d) { + tmp = append(tmp, d) + } + } + workspacePaths = tmp + + if 0 < len(workspacePaths) { + WorkspaceDir = workspacePaths[len(workspacePaths)-1] + if !gulu.File.IsDir(WorkspaceDir) { + log.Printf("use the default workspace [%s] since the specified workspace [%s] is not a dir", WorkspaceDir, defaultWorkspaceDir) + WorkspaceDir = defaultWorkspaceDir + } + workspacePaths[len(workspacePaths)-1] = WorkspaceDir + } else { + WorkspaceDir = defaultWorkspaceDir + workspacePaths = append(workspacePaths, WorkspaceDir) + } + } + + if data, err := gulu.JSON.MarshalJSON(workspacePaths); nil == err { + if err = os.WriteFile(workspaceConf, data, 0644); nil != err { + log.Fatalf("write workspace conf [%s] failed: %s", workspaceConf, err) + } + } else { + log.Fatalf("marshal workspace conf [%s] failed: %s", workspaceConf, err) + } + + ConfDir = filepath.Join(WorkspaceDir, "conf") + DataDir = filepath.Join(WorkspaceDir, "data") + RepoDir = filepath.Join(WorkspaceDir, "repo") + HistoryDir = filepath.Join(WorkspaceDir, "history") + TempDir = filepath.Join(WorkspaceDir, "temp") + osTmpDir := filepath.Join(TempDir, "os") + os.RemoveAll(osTmpDir) + if err := os.MkdirAll(osTmpDir, 0755); nil != err { + log.Fatalf("create os tmp dir [%s] failed: %s", osTmpDir, err) + } + os.RemoveAll(filepath.Join(TempDir, "repo")) + os.Setenv("TMPDIR", osTmpDir) + os.Setenv("TEMP", osTmpDir) + os.Setenv("TMP", osTmpDir) + DBPath = filepath.Join(TempDir, DBName) + HistoryDBPath = filepath.Join(TempDir, "history.db") + BlockTreePath = filepath.Join(TempDir, "blocktree.msgpack") + SnippetsPath = filepath.Join(DataDir, "snippets") + + AppearancePath = filepath.Join(ConfDir, "appearance") + ThemesPath = filepath.Join(AppearancePath, "themes") + IconsPath = filepath.Join(AppearancePath, "icons") + + LogPath = filepath.Join(TempDir, "siyuan.log") + logging.SetLogPath(LogPath) +}