diff --git a/doc/075_scripting.rst b/doc/075_scripting.rst index 87ae4fcf4..fa7fa1b6e 100644 --- a/doc/075_scripting.rst +++ b/doc/075_scripting.rst @@ -139,7 +139,7 @@ Error +----------------------+-------------------------------------------+ | ``message_type`` | Always "error" | +----------------------+-------------------------------------------+ -| ``error`` | Error message | +| ``error.message`` | Error message | +----------------------+-------------------------------------------+ | ``during`` | What restic was trying to do | +----------------------+-------------------------------------------+ @@ -539,6 +539,19 @@ Status |``bytes_skipped`` | Total size of skipped files | +----------------------+------------------------------------------------------------+ +Error +^^^^^ + ++----------------------+-------------------------------------------+ +| ``message_type`` | Always "error" | ++----------------------+-------------------------------------------+ +| ``error.message`` | Error message | ++----------------------+-------------------------------------------+ +| ``during`` | Always "restore" | ++----------------------+-------------------------------------------+ +| ``item`` | Usually, the path of the problematic file | ++----------------------+-------------------------------------------+ + Verbose Status ^^^^^^^^^^^^^^ diff --git a/internal/ui/backup/json.go b/internal/ui/backup/json.go index bb6685136..f4a76afd7 100644 --- a/internal/ui/backup/json.go +++ b/internal/ui/backup/json.go @@ -67,7 +67,7 @@ func (b *JSONProgress) Update(total, processed Counter, errors uint, currentFile func (b *JSONProgress) ScannerError(item string, err error) error { b.error(errorUpdate{ MessageType: "error", - Error: err.Error(), + Error: errorObject{err.Error()}, During: "scan", Item: item, }) @@ -78,7 +78,7 @@ func (b *JSONProgress) ScannerError(item string, err error) error { func (b *JSONProgress) Error(item string, err error) error { b.error(errorUpdate{ MessageType: "error", - Error: err.Error(), + Error: errorObject{err.Error()}, During: "archival", Item: item, }) @@ -205,11 +205,15 @@ type statusUpdate struct { CurrentFiles []string `json:"current_files,omitempty"` } +type errorObject struct { + Message string `json:"message"` +} + type errorUpdate struct { - MessageType string `json:"message_type"` // "error" - Error string `json:"error"` - During string `json:"during"` - Item string `json:"item"` + MessageType string `json:"message_type"` // "error" + Error errorObject `json:"error"` + During string `json:"during"` + Item string `json:"item"` } type verboseUpdate struct { diff --git a/internal/ui/backup/json_test.go b/internal/ui/backup/json_test.go index 4846279b3..b4872efd5 100644 --- a/internal/ui/backup/json_test.go +++ b/internal/ui/backup/json_test.go @@ -17,11 +17,11 @@ func createJSONProgress() (*ui.MockTerminal, ProgressPrinter) { func TestJSONError(t *testing.T) { term, printer := createJSONProgress() test.Equals(t, printer.Error("/path", errors.New("error \"message\"")), nil) - test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":\"error \\\"message\\\"\",\"during\":\"archival\",\"item\":\"/path\"}\n"}, term.Errors) + test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":{\"message\":\"error \\\"message\\\"\"},\"during\":\"archival\",\"item\":\"/path\"}\n"}, term.Errors) } func TestJSONScannerError(t *testing.T) { term, printer := createJSONProgress() test.Equals(t, printer.ScannerError("/path", errors.New("error \"message\"")), nil) - test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":\"error \\\"message\\\"\",\"during\":\"scan\",\"item\":\"/path\"}\n"}, term.Errors) + test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":{\"message\":\"error \\\"message\\\"\"},\"during\":\"scan\",\"item\":\"/path\"}\n"}, term.Errors) } diff --git a/internal/ui/restore/json.go b/internal/ui/restore/json.go index 4135dd667..72cc38a6e 100644 --- a/internal/ui/restore/json.go +++ b/internal/ui/restore/json.go @@ -48,7 +48,7 @@ func (t *jsonPrinter) Update(p State, duration time.Duration) { func (t *jsonPrinter) Error(item string, err error) error { t.error(errorUpdate{ MessageType: "error", - Error: err.Error(), + Error: errorObject{err.Error()}, During: "restore", Item: item, }) @@ -113,11 +113,15 @@ type statusUpdate struct { BytesSkipped uint64 `json:"bytes_skipped,omitempty"` } +type errorObject struct { + Message string `json:"message"` +} + type errorUpdate struct { - MessageType string `json:"message_type"` // "error" - Error string `json:"error"` - During string `json:"during"` - Item string `json:"item"` + MessageType string `json:"message_type"` // "error" + Error errorObject `json:"error"` + During string `json:"during"` + Item string `json:"item"` } type verboseUpdate struct { diff --git a/internal/ui/restore/json_test.go b/internal/ui/restore/json_test.go index 1e0f80a4f..917a48070 100644 --- a/internal/ui/restore/json_test.go +++ b/internal/ui/restore/json_test.go @@ -66,5 +66,5 @@ func TestJSONPrintCompleteItem(t *testing.T) { func TestJSONError(t *testing.T) { term, printer := createJSONProgress() test.Equals(t, printer.Error("/path", errors.New("error \"message\"")), nil) - test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":\"error \\\"message\\\"\",\"during\":\"restore\",\"item\":\"/path\"}\n"}, term.Errors) + test.Equals(t, []string{"{\"message_type\":\"error\",\"error\":{\"message\":\"error \\\"message\\\"\"},\"during\":\"restore\",\"item\":\"/path\"}\n"}, term.Errors) }