mirror of https://github.com/restic/restic.git
Add ability to report warnings to terminal
Report warnings to terminal when unrecognized generic attributes are found in the repository.
This commit is contained in:
parent
0962917974
commit
eeb1aa5388
|
@ -178,6 +178,9 @@ func runRestore(ctx context.Context, opts RestoreOptions, gopts GlobalOptions,
|
|||
totalErrors++
|
||||
return nil
|
||||
}
|
||||
res.Warn = func(message string) {
|
||||
msg.E("Warning: %s\n", message)
|
||||
}
|
||||
|
||||
excludePatterns := filter.ParsePatterns(opts.Exclude)
|
||||
insensitiveExcludePatterns := filter.ParsePatterns(opts.InsensitiveExclude)
|
||||
|
|
|
@ -224,8 +224,8 @@ func (node *Node) CreateAt(ctx context.Context, path string, repo BlobLoader) er
|
|||
}
|
||||
|
||||
// RestoreMetadata restores node metadata
|
||||
func (node Node) RestoreMetadata(path string) error {
|
||||
err := node.restoreMetadata(path)
|
||||
func (node Node) RestoreMetadata(path string, warn func(msg string)) error {
|
||||
err := node.restoreMetadata(path, warn)
|
||||
if err != nil {
|
||||
debug.Log("restoreMetadata(%s) error %v", path, err)
|
||||
}
|
||||
|
@ -233,7 +233,7 @@ func (node Node) RestoreMetadata(path string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (node Node) restoreMetadata(path string) error {
|
||||
func (node Node) restoreMetadata(path string, warn func(msg string)) error {
|
||||
var firsterr error
|
||||
|
||||
if err := lchown(path, int(node.UID), int(node.GID)); err != nil {
|
||||
|
@ -261,7 +261,7 @@ func (node Node) restoreMetadata(path string) error {
|
|||
}
|
||||
}
|
||||
|
||||
if err := node.restoreGenericAttributes(path); err != nil {
|
||||
if err := node.restoreGenericAttributes(path, warn); err != nil {
|
||||
debug.Log("error restoring generic attributes for %v: %v", path, err)
|
||||
if firsterr != nil {
|
||||
firsterr = err
|
||||
|
@ -766,14 +766,14 @@ func (node *Node) fillTimes(stat *statT) {
|
|||
}
|
||||
|
||||
// HandleUnknownGenericAttributesFound is used for handling and distinguing between scenarios related to future versions and cross-OS repositories
|
||||
func HandleUnknownGenericAttributesFound(unknownAttribs []GenericAttributeType) {
|
||||
func HandleUnknownGenericAttributesFound(unknownAttribs []GenericAttributeType, warn func(msg string)) {
|
||||
for _, unknownAttrib := range unknownAttribs {
|
||||
handleUnknownGenericAttributeFound(unknownAttrib)
|
||||
handleUnknownGenericAttributeFound(unknownAttrib, warn)
|
||||
}
|
||||
}
|
||||
|
||||
// handleUnknownGenericAttributeFound is used for handling and distinguing between scenarios related to future versions and cross-OS repositories
|
||||
func handleUnknownGenericAttributeFound(genericAttributeType GenericAttributeType) {
|
||||
func handleUnknownGenericAttributeFound(genericAttributeType GenericAttributeType, warn func(msg string)) {
|
||||
if checkGenericAttributeNameNotHandledAndPut(genericAttributeType) {
|
||||
// Print the unique error only once for a given execution
|
||||
os, exists := genericAttributesForOS[genericAttributeType]
|
||||
|
@ -784,7 +784,7 @@ func handleUnknownGenericAttributeFound(genericAttributeType GenericAttributeTyp
|
|||
debug.Log("Ignoring a generic attribute found in the repository: %s which may not be compatible with your OS. Compatible OS: %s", genericAttributeType, os)
|
||||
} else {
|
||||
// If genericAttributesForOS in node.go does not know about this attribute, then the repository may have been created by a newer version which has a newer GenericAttributeType.
|
||||
debug.Log("Found an unrecognized generic attribute in the repository: %s. You may need to upgrade to latest version of restic.", genericAttributeType)
|
||||
warn(fmt.Sprintf("Found an unrecognized generic attribute in the repository: %s. You may need to upgrade to latest version of restic.", genericAttributeType))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -792,9 +792,9 @@ func handleUnknownGenericAttributeFound(genericAttributeType GenericAttributeTyp
|
|||
// handleAllUnknownGenericAttributesFound performs validations for all generic attributes in the node.
|
||||
// This is not used on windows currently because windows has handling for generic attributes.
|
||||
// nolint:unused
|
||||
func (node Node) handleAllUnknownGenericAttributesFound() error {
|
||||
func (node Node) handleAllUnknownGenericAttributesFound(warn func(msg string)) error {
|
||||
for name := range node.GenericAttributes {
|
||||
handleUnknownGenericAttributeFound(name)
|
||||
handleUnknownGenericAttributeFound(name, warn)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -39,8 +39,8 @@ func Setxattr(path, name string, data []byte) error {
|
|||
}
|
||||
|
||||
// restoreGenericAttributes is no-op on AIX.
|
||||
func (node *Node) restoreGenericAttributes(_ string) error {
|
||||
return node.handleAllUnknownGenericAttributesFound()
|
||||
func (node *Node) restoreGenericAttributes(_ string, warn func(msg string)) error {
|
||||
return node.handleAllUnknownGenericAttributesFound(warn)
|
||||
}
|
||||
|
||||
// fillGenericAttributes is a no-op on AIX.
|
||||
|
|
|
@ -29,8 +29,8 @@ func Setxattr(path, name string, data []byte) error {
|
|||
}
|
||||
|
||||
// restoreGenericAttributes is no-op on netbsd.
|
||||
func (node *Node) restoreGenericAttributes(_ string) error {
|
||||
return node.handleAllUnknownGenericAttributesFound()
|
||||
func (node *Node) restoreGenericAttributes(_ string, warn func(msg string)) error {
|
||||
return node.handleAllUnknownGenericAttributesFound(warn)
|
||||
}
|
||||
|
||||
// fillGenericAttributes is a no-op on netbsd.
|
||||
|
|
|
@ -29,8 +29,8 @@ func Setxattr(path, name string, data []byte) error {
|
|||
}
|
||||
|
||||
// restoreGenericAttributes is no-op on openbsd.
|
||||
func (node *Node) restoreGenericAttributes(_ string) error {
|
||||
return node.handleAllUnknownGenericAttributesFound()
|
||||
func (node *Node) restoreGenericAttributes(_ string, warn func(msg string)) error {
|
||||
return node.handleAllUnknownGenericAttributesFound(warn)
|
||||
}
|
||||
|
||||
// fillGenericAttributes is a no-op on openbsd.
|
||||
|
|
|
@ -218,7 +218,7 @@ func TestNodeRestoreAt(t *testing.T) {
|
|||
nodePath = filepath.Join(tempdir, test.Name)
|
||||
}
|
||||
rtest.OK(t, test.CreateAt(context.TODO(), nodePath, nil))
|
||||
rtest.OK(t, test.RestoreMetadata(nodePath))
|
||||
rtest.OK(t, test.RestoreMetadata(nodePath, func(msg string) { rtest.OK(t, fmt.Errorf("Warning triggered for path: %s: %s", nodePath, msg)) }))
|
||||
|
||||
if test.Type == "dir" {
|
||||
rtest.OK(t, test.RestoreTimestamps(nodePath))
|
||||
|
|
|
@ -118,7 +118,7 @@ func (s statT) ctim() syscall.Timespec {
|
|||
}
|
||||
|
||||
// restoreGenericAttributes restores generic attributes for Windows
|
||||
func (node Node) restoreGenericAttributes(path string) (err error) {
|
||||
func (node Node) restoreGenericAttributes(path string, warn func(msg string)) (err error) {
|
||||
if len(node.GenericAttributes) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ func (node Node) restoreGenericAttributes(path string) (err error) {
|
|||
}
|
||||
}
|
||||
|
||||
HandleUnknownGenericAttributesFound(unknownAttribs)
|
||||
HandleUnknownGenericAttributesFound(unknownAttribs, warn)
|
||||
return errors.CombineErrors(errs...)
|
||||
}
|
||||
|
||||
|
|
|
@ -50,8 +50,8 @@ func handleXattrErr(err error) error {
|
|||
}
|
||||
|
||||
// restoreGenericAttributes is no-op.
|
||||
func (node *Node) restoreGenericAttributes(_ string) error {
|
||||
return node.handleAllUnknownGenericAttributesFound()
|
||||
func (node *Node) restoreGenericAttributes(_ string, warn func(msg string)) error {
|
||||
return node.handleAllUnknownGenericAttributesFound(warn)
|
||||
}
|
||||
|
||||
// fillGenericAttributes is a no-op.
|
||||
|
|
|
@ -24,6 +24,7 @@ type Restorer struct {
|
|||
progress *restoreui.Progress
|
||||
|
||||
Error func(location string, err error) error
|
||||
Warn func(message string)
|
||||
SelectFilter func(item string, dstpath string, node *restic.Node) (selectedForRestore bool, childMayBeSelected bool)
|
||||
}
|
||||
|
||||
|
@ -178,7 +179,7 @@ func (res *Restorer) restoreNodeTo(ctx context.Context, node *restic.Node, targe
|
|||
|
||||
func (res *Restorer) restoreNodeMetadataTo(node *restic.Node, target, location string) error {
|
||||
debug.Log("restoreNodeMetadata %v %v %v", node.Name, target, location)
|
||||
err := node.RestoreMetadata(target)
|
||||
err := node.RestoreMetadata(target, res.Warn)
|
||||
if err != nil {
|
||||
debug.Log("node.RestoreMetadata(%s) error %v", target, err)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue