瀏覽代碼

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

Vanessa 2 年之前
父節點
當前提交
25b8f08470
共有 4 個文件被更改,包括 94 次插入32 次删除
  1. 3 3
      kernel/mobile/kernel.go
  2. 1 1
      kernel/util/runtime.go
  3. 2 5
      kernel/util/working.go
  4. 88 23
      kernel/util/working_mobile.go

+ 3 - 3
kernel/mobile/kernel.go

@@ -32,16 +32,16 @@ import (
 	_ "golang.org/x/mobile/bind"
 	_ "golang.org/x/mobile/bind"
 )
 )
 
 
-func StartKernelFast(container, appDir, workspaceDir, nativeLibDir, privateDataDir, localIP string) {
+func StartKernelFast(container, appDir, workspaceBaseDir, localIPs string) {
 	go server.Serve(true)
 	go server.Serve(true)
 }
 }
 
 
-func StartKernel(container, appDir, workspaceDir, nativeLibDir, privateDataDir, timezoneID, localIPs, lang string) {
+func StartKernel(container, appDir, workspaceBaseDir, timezoneID, localIPs, lang string) {
 	SetTimezone(container, appDir, timezoneID)
 	SetTimezone(container, appDir, timezoneID)
 	util.Mode = "prod"
 	util.Mode = "prod"
 
 
 	util.LocalIPs = strings.Split(localIPs, ",")
 	util.LocalIPs = strings.Split(localIPs, ",")
-	util.BootMobile(container, appDir, workspaceDir, nativeLibDir, privateDataDir, lang)
+	util.BootMobile(container, appDir, workspaceBaseDir, lang)
 
 
 	model.InitConf()
 	model.InitConf()
 	go server.Serve(false)
 	go server.Serve(false)

+ 1 - 1
kernel/util/runtime.go

@@ -36,7 +36,7 @@ const (
 	ExitCodeUnavailablePort  = 21 // 端口不可用
 	ExitCodeUnavailablePort  = 21 // 端口不可用
 	ExitCodeCreateConfDirErr = 22 // 创建配置目录失败
 	ExitCodeCreateConfDirErr = 22 // 创建配置目录失败
 	ExitCodeBlockTreeErr     = 23 // 无法读写 blocktree.msgpack 文件
 	ExitCodeBlockTreeErr     = 23 // 无法读写 blocktree.msgpack 文件
-	ExitCodeWorkspaceLocked  = 24 // 工作已被锁定
+	ExitCodeWorkspaceLocked  = 24 // 工作空间已被锁定
 	ExitCodeOk               = 0  // 正常退出
 	ExitCodeOk               = 0  // 正常退出
 	ExitCodeFatal            = 1  // 致命错误
 	ExitCodeFatal            = 1  // 致命错误
 )
 )

+ 2 - 5
kernel/util/working.go

@@ -176,9 +176,6 @@ var (
 	IconsPath      string        // 配置目录下的外观目录下的 icons/ 路径
 	IconsPath      string        // 配置目录下的外观目录下的 icons/ 路径
 	SnippetsPath   string        // 数据目录下的 snippets/ 路径
 	SnippetsPath   string        // 数据目录下的 snippets/ 路径
 
 
-	AndroidNativeLibDir   string // Android 库路径
-	AndroidPrivateDataDir string // Android 私有数据路径
-
 	UIProcessIDs = sync.Map{} // UI 进程 ID
 	UIProcessIDs = sync.Map{} // UI 进程 ID
 
 
 	IsNewbie bool // 是否是第一次安装
 	IsNewbie bool // 是否是第一次安装
@@ -210,7 +207,7 @@ func initWorkspaceDir(workspaceArg string) {
 			WorkspaceDir = workspaceArg
 			WorkspaceDir = workspaceArg
 		}
 		}
 		if !gulu.File.IsDir(WorkspaceDir) {
 		if !gulu.File.IsDir(WorkspaceDir) {
-			log.Printf("use the default workspace [%s] since the specified workspace [%s] is not a dir", WorkspaceDir, defaultWorkspaceDir)
+			log.Printf("use the default workspace [%s] since the specified workspace [%s] is not a dir", defaultWorkspaceDir, WorkspaceDir)
 			WorkspaceDir = defaultWorkspaceDir
 			WorkspaceDir = defaultWorkspaceDir
 		}
 		}
 		workspacePaths = append(workspacePaths, WorkspaceDir)
 		workspacePaths = append(workspacePaths, WorkspaceDir)
@@ -220,7 +217,7 @@ func initWorkspaceDir(workspaceArg string) {
 			log.Printf("unmarshal workspace conf [%s] failed: %s", workspaceConf, err)
 			log.Printf("unmarshal workspace conf [%s] failed: %s", workspaceConf, err)
 		}
 		}
 
 
-		tmp := workspacePaths[:0]
+		var tmp []string
 		for _, d := range workspacePaths {
 		for _, d := range workspacePaths {
 			d = strings.TrimRight(d, " \t\n") // 去掉工作空间路径尾部空格 https://github.com/siyuan-note/siyuan/issues/6353
 			d = strings.TrimRight(d, " \t\n") // 去掉工作空间路径尾部空格 https://github.com/siyuan-note/siyuan/issues/6353
 			if gulu.File.IsDir(d) {
 			if gulu.File.IsDir(d) {

+ 88 - 23
kernel/util/working_mobile.go

@@ -17,9 +17,11 @@
 package util
 package util
 
 
 import (
 import (
+	"log"
 	"math/rand"
 	"math/rand"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
+	"strings"
 	"time"
 	"time"
 
 
 	"github.com/88250/gulu"
 	"github.com/88250/gulu"
@@ -28,47 +30,110 @@ import (
 	"github.com/siyuan-note/logging"
 	"github.com/siyuan-note/logging"
 )
 )
 
 
-func BootMobile(container, appDir, workspaceDir, nativeLibDir, privateDataDir, lang string) {
+func BootMobile(container, appDir, workspaceBaseDir, lang string) {
 	IncBootProgress(3, "Booting...")
 	IncBootProgress(3, "Booting...")
 	rand.Seed(time.Now().UTC().UnixNano())
 	rand.Seed(time.Now().UTC().UnixNano())
 	initMime()
 	initMime()
 	initHttpClient()
 	initHttpClient()
+	ServerPort = FixedPort
+	Container = container
+	UserAgent = UserAgent + " " + Container
+	httpclient.SetUserAgent(UserAgent)
+	Lang = lang
 
 
-	HomeDir = filepath.Join(workspaceDir, "home")
+	WorkingDir = filepath.Join(appDir, "app")
+	HomeDir = filepath.Join(workspaceBaseDir, "home")
 	userHomeConfDir := filepath.Join(HomeDir, ".config", "siyuan")
 	userHomeConfDir := filepath.Join(HomeDir, ".config", "siyuan")
 	if !gulu.File.IsExist(userHomeConfDir) {
 	if !gulu.File.IsExist(userHomeConfDir) {
 		os.MkdirAll(userHomeConfDir, 0755)
 		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")
+
+	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", defaultWorkspaceDir, WorkspaceDir)
+				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")
 	RepoDir = filepath.Join(WorkspaceDir, "repo")
-	TempDir = filepath.Join(workspaceDir, "temp")
+	HistoryDir = filepath.Join(WorkspaceDir, "history")
+	TempDir = filepath.Join(WorkspaceDir, "temp")
 	osTmpDir := filepath.Join(TempDir, "os")
 	osTmpDir := filepath.Join(TempDir, "os")
 	os.RemoveAll(osTmpDir)
 	os.RemoveAll(osTmpDir)
-	os.MkdirAll(osTmpDir, 0755)
+	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.RemoveAll(filepath.Join(TempDir, "repo"))
 	os.Setenv("TMPDIR", osTmpDir)
 	os.Setenv("TMPDIR", osTmpDir)
+	os.Setenv("TEMP", osTmpDir)
+	os.Setenv("TMP", osTmpDir)
 	DBPath = filepath.Join(TempDir, DBName)
 	DBPath = filepath.Join(TempDir, DBName)
 	HistoryDBPath = filepath.Join(TempDir, "history.db")
 	HistoryDBPath = filepath.Join(TempDir, "history.db")
 	BlockTreePath = filepath.Join(TempDir, "blocktree.msgpack")
 	BlockTreePath = filepath.Join(TempDir, "blocktree.msgpack")
-	AndroidNativeLibDir = nativeLibDir
-	AndroidPrivateDataDir = privateDataDir
-	LogPath = filepath.Join(TempDir, "siyuan.log")
-	logging.SetLogPath(LogPath)
+	SnippetsPath = filepath.Join(DataDir, "snippets")
+
 	AppearancePath = filepath.Join(ConfDir, "appearance")
 	AppearancePath = filepath.Join(ConfDir, "appearance")
 	ThemesPath = filepath.Join(AppearancePath, "themes")
 	ThemesPath = filepath.Join(AppearancePath, "themes")
 	IconsPath = filepath.Join(AppearancePath, "icons")
 	IconsPath = filepath.Join(AppearancePath, "icons")
-	SnippetsPath = filepath.Join(DataDir, "snippets")
-	ServerPort = FixedPort
-	Container = container
-	UserAgent = UserAgent + " " + Container
-	httpclient.SetUserAgent(UserAgent)
-	Lang = lang
-	initPathDir()
-	bootBanner := figure.NewFigure("SiYuan", "", true)
-	logging.LogInfof("\n" + bootBanner.String())
-	logBootInfo()
+
+	LogPath = filepath.Join(TempDir, "siyuan.log")
+	logging.SetLogPath(LogPath)
 }
 }