mirror of
https://github.com/rwinkhart/libmutton.git
synced 2026-09-01 22:57:25 -04:00
Replace most occurrences of os.Exit(0) in the backend and sync packages with a custom backend.Exit function that can allow "soft exit" in GUI/TUI environments to avoid killing the entire process; currently all major errors still result in killing the entire process
This commit is contained in:
@@ -35,7 +35,7 @@ func ParseConfig(readKeys []string, missingValueError string) []string {
|
|||||||
case "":
|
case "":
|
||||||
fmt.Println(AnsiError + "Failed to find value for key \"" + key + "\" in section \"[LIBMUTTON]\" in libmutton.ini" + AnsiReset)
|
fmt.Println(AnsiError + "Failed to find value for key \"" + key + "\" in section \"[LIBMUTTON]\" in libmutton.ini" + AnsiReset)
|
||||||
case "0":
|
case "0":
|
||||||
os.Exit(0)
|
Exit(0)
|
||||||
default:
|
default:
|
||||||
fmt.Println(AnsiError + missingValueError + AnsiReset)
|
fmt.Println(AnsiError + missingValueError + AnsiReset)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -64,7 +64,7 @@ func ClipClearArgument() {
|
|||||||
oldContents := clipScanner.Text()
|
oldContents := clipScanner.Text()
|
||||||
clipClear(oldContents)
|
clipClear(oldContents)
|
||||||
} else {
|
} else {
|
||||||
os.Exit(0)
|
os.Exit(0) // use os.Exit instead of backend.Exit, as this function runs out of a background subprocess that is invisible to the user (will never appear in GUI/TUI environment)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func copyField(executableName, copySubject string) {
|
|||||||
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,5 +55,5 @@ func clipClear(oldContents string) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0) // use os.Exit instead of backend.Exit, as this function runs out of a background subprocess that is invisible to the user (will never appear in GUI/TUI environment)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func copyField(executableName, copySubject string) {
|
|||||||
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,5 +53,5 @@ func clipClear(oldContents string) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0) // use os.Exit instead of backend.Exit, as this function runs out of a background subprocess that is invisible to the user (will never appear in GUI/TUI environment)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ func copyField(executableName, copySubject string) {
|
|||||||
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,5 +77,5 @@ func clipClear(oldContents string) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0) // use os.Exit instead of backend.Exit, as this function runs out of a background subprocess that is invisible to the user (will never appear in GUI/TUI environment)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ func copyField(executableName, copySubject string) {
|
|||||||
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
fmt.Println(AnsiError + "Failed to launch automated clipboard clearing process - does this libmutton implementation support the \"clipclear\" argument?" + AnsiReset)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
os.Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
Exit(0) // only exit if clipboard clearing process is launched, otherwise assume continuous clipboard refresh
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,5 +51,5 @@ func clipClear(oldContents string) {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
os.Exit(0) // use os.Exit instead of backend.Exit, as this function runs out of a background subprocess that is invisible to the user (will never appear in GUI/TUI environment)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ func Rename(oldLocation, newLocation string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO implement synced renaming
|
// TODO implement synced renaming
|
||||||
os.Exit(0)
|
Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EnsureSliceLength ensures slice is long enough to contain the specified index
|
// EnsureSliceLength ensures slice is long enough to contain the specified index
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
//go:build !returnOnExit
|
||||||
|
|
||||||
|
package backend
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
func Exit(code int) {
|
||||||
|
os.Exit(code)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
//go:build returnOnExit
|
||||||
|
|
||||||
|
package backend
|
||||||
|
|
||||||
|
func Exit(code int) {
|
||||||
|
return code
|
||||||
|
}
|
||||||
+4
-4
@@ -138,7 +138,7 @@ func getRemoteDataFromClient(manualSync bool) (map[string]int64, []string, []str
|
|||||||
fmt.Println(backend.AnsiError + "Sync failed - No device ID found; run \"" + os.Args[0] + " init\" to generate a device ID" + backend.AnsiReset)
|
fmt.Println(backend.AnsiError + "Sync failed - No device ID found; run \"" + os.Args[0] + " init\" to generate a device ID" + backend.AnsiReset)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
} else {
|
} else {
|
||||||
os.Exit(0) // exit silently if the sync job was called automatically, as the user may just be in offline mode
|
backend.Exit(0) // exit silently if the sync job was called automatically, as the user may just be in offline mode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
output := GetSSHOutput("libmuttonserver fetch", clientDeviceID[0].Name(), manualSync)
|
output := GetSSHOutput("libmuttonserver fetch", clientDeviceID[0].Name(), manualSync)
|
||||||
@@ -378,7 +378,7 @@ func ShearRemoteFromClient(targetLocationIncomplete string) {
|
|||||||
// call the server to remotely shear the target and add it to the deletions list
|
// call the server to remotely shear the target and add it to the deletions list
|
||||||
GetSSHOutput("libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, backend.PathSeparator, "\x1d"), false)
|
GetSSHOutput("libmuttonserver shear", deviceID+"\n"+strings.ReplaceAll(targetLocationIncomplete, backend.PathSeparator, "\x1d"), false)
|
||||||
|
|
||||||
os.Exit(0) // sync is not required after shearing since the target has already been removed from the local system
|
backend.Exit(0) // sync is not required after shearing since the target has already been removed from the local system
|
||||||
}
|
}
|
||||||
|
|
||||||
// deletionSync removes entries from the client that have been deleted on the server (multi-client deletion)
|
// deletionSync removes entries from the client that have been deleted on the server (multi-client deletion)
|
||||||
@@ -400,7 +400,7 @@ func AddFolderRemoteFromClient(targetLocationIncomplete string) {
|
|||||||
AddFolderLocal(targetLocationIncomplete) // add the folder on the local system
|
AddFolderLocal(targetLocationIncomplete) // add the folder on the local system
|
||||||
GetSSHOutput("libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, backend.PathSeparator, "\x1d"), false) // call the server to create the folder remotely
|
GetSSHOutput("libmuttonserver addfolder", strings.ReplaceAll(targetLocationIncomplete, backend.PathSeparator, "\x1d"), false) // call the server to create the folder remotely
|
||||||
|
|
||||||
os.Exit(0)
|
backend.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// folderSync creates folders on the client (from the given list of folder names)
|
// folderSync creates folders on the client (from the given list of folder names)
|
||||||
@@ -439,5 +439,5 @@ func RunJob(manualSync bool) {
|
|||||||
syncLists(localEntryModMap, remoteEntryModMap, manualSync)
|
syncLists(localEntryModMap, remoteEntryModMap, manualSync)
|
||||||
|
|
||||||
// exit program after successful sync
|
// exit program after successful sync
|
||||||
os.Exit(0)
|
backend.Exit(0)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user