add clues, fault to small /internal pkgs (#2336)
This commit is contained in:
parent
5537a11948
commit
313f05fcb6
@ -5,6 +5,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: Remove in favor of clues.Stack()
|
||||||
|
|
||||||
// Err provides boiler-plate functions that other types of errors can use
|
// Err provides boiler-plate functions that other types of errors can use
|
||||||
// if they wish to be compared with `errors.As()`. This struct ensures that
|
// if they wish to be compared with `errors.As()`. This struct ensures that
|
||||||
// stack traces are printed when requested (if present) and that Err
|
// stack traces are printed when requested (if present) and that Err
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
|
// TODO: can be replaced with slices.Contains()
|
||||||
func ContainsString(super []string, sub string) bool {
|
func ContainsString(super []string, sub string) bool {
|
||||||
for _, s := range super {
|
for _, s := range super {
|
||||||
if s == sub {
|
if s == sub {
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/alcionai/clues"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -85,7 +86,10 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrNoTimeString = errors.New("no substring contains a known time format")
|
var (
|
||||||
|
ErrNoTimeString = errors.New("no substring contains a known time format")
|
||||||
|
errParsingStringToTime = errors.New("parsing string as time.Time")
|
||||||
|
)
|
||||||
|
|
||||||
// Now produces the current time as a string in the standard format.
|
// Now produces the current time as a string in the standard format.
|
||||||
func Now() string {
|
func Now() string {
|
||||||
@ -132,7 +136,7 @@ func FormatLegacyTime(t time.Time) string {
|
|||||||
// the provided string. Always returns a UTC timezone value.
|
// the provided string. Always returns a UTC timezone value.
|
||||||
func ParseTime(s string) (time.Time, error) {
|
func ParseTime(s string) (time.Time, error) {
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
return time.Time{}, errors.New("cannot interpret an empty string as time.Time")
|
return time.Time{}, clues.Stack(errParsingStringToTime, errors.New("empty string"))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, form := range formats {
|
for _, form := range formats {
|
||||||
@ -142,14 +146,14 @@ func ParseTime(s string) (time.Time, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return time.Time{}, errors.New("unable to parse time string: " + s)
|
return time.Time{}, clues.Stack(errParsingStringToTime, errors.New(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExtractTime greedily retrieves a timestamp substring from the provided string.
|
// ExtractTime greedily retrieves a timestamp substring from the provided string.
|
||||||
// returns ErrNoTimeString if no match is found.
|
// returns ErrNoTimeString if no match is found.
|
||||||
func ExtractTime(s string) (time.Time, error) {
|
func ExtractTime(s string) (time.Time, error) {
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
return time.Time{}, errors.New("cannot extract time.Time from an empty string")
|
return time.Time{}, clues.Stack(errParsingStringToTime, errors.New("empty string"))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, re := range regexes {
|
for _, re := range regexes {
|
||||||
@ -159,5 +163,5 @@ func ExtractTime(s string) (time.Time, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return time.Time{}, errors.Wrap(ErrNoTimeString, s)
|
return time.Time{}, clues.Stack(ErrNoTimeString, errors.New(s))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/alcionai/clues"
|
||||||
analytics "github.com/rudderlabs/analytics-go"
|
analytics "github.com/rudderlabs/analytics-go"
|
||||||
|
|
||||||
"github.com/alcionai/corso/src/internal/version"
|
"github.com/alcionai/corso/src/internal/version"
|
||||||
@ -93,7 +93,7 @@ func NewBus(ctx context.Context, s storage.Storage, tenID string, opts control.O
|
|||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Bus{}, errors.Wrap(err, "configuring event bus")
|
return Bus{}, clues.Wrap(err, "configuring event bus").WithClues(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
|
"github.com/alcionai/clues"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/alcionai/corso/src/internal/data"
|
"github.com/alcionai/corso/src/internal/data"
|
||||||
@ -52,17 +53,16 @@ func (ss *streamStore) WriteBackupDetails(
|
|||||||
ss.tenant,
|
ss.tenant,
|
||||||
collectionPurposeDetails,
|
collectionPurposeDetails,
|
||||||
ss.service,
|
ss.service,
|
||||||
false,
|
false)
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", clues.Stack(err).WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We could use an io.Pipe here to avoid a double copy but that
|
// TODO: We could use an io.Pipe here to avoid a double copy but that
|
||||||
// makes error handling a bit complicated
|
// makes error handling a bit complicated
|
||||||
dbytes, err := json.Marshal(backupDetails)
|
dbytes, err := json.Marshal(backupDetails)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "marshalling backup details")
|
return "", clues.Wrap(err, "marshalling backup details").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
dc := &streamCollection{
|
dc := &streamCollection{
|
||||||
@ -79,10 +79,9 @@ func (ss *streamStore) WriteBackupDetails(
|
|||||||
[]data.Collection{dc},
|
[]data.Collection{dc},
|
||||||
nil,
|
nil,
|
||||||
nil,
|
nil,
|
||||||
false,
|
false)
|
||||||
)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", nil
|
return "", errors.Wrap(err, "storing details in repository")
|
||||||
}
|
}
|
||||||
|
|
||||||
return backupStats.SnapshotID, nil
|
return backupStats.SnapshotID, nil
|
||||||
@ -104,7 +103,7 @@ func (ss *streamStore) ReadBackupDetails(
|
|||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, clues.Stack(err).WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
var bc stats.ByteCounter
|
var bc stats.ByteCounter
|
||||||
@ -116,7 +115,9 @@ func (ss *streamStore) ReadBackupDetails(
|
|||||||
|
|
||||||
// Expect only 1 data collection
|
// Expect only 1 data collection
|
||||||
if len(dcs) != 1 {
|
if len(dcs) != 1 {
|
||||||
return nil, errors.Errorf("expected 1 details data collection: %d", len(dcs))
|
return nil, clues.New("greater than 1 details data collection found").
|
||||||
|
WithClues(ctx).
|
||||||
|
With("collection_count", len(dcs))
|
||||||
}
|
}
|
||||||
|
|
||||||
dc := dcs[0]
|
dc := dcs[0]
|
||||||
@ -129,12 +130,12 @@ func (ss *streamStore) ReadBackupDetails(
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return nil, errors.New("context cancelled waiting for backup details data")
|
return nil, clues.New("context cancelled waiting for backup details data").WithClues(ctx)
|
||||||
|
|
||||||
case itemData, ok := <-items:
|
case itemData, ok := <-items:
|
||||||
if !ok {
|
if !ok {
|
||||||
if !found {
|
if !found {
|
||||||
return nil, errors.New("no backup details found")
|
return nil, clues.New("no backup details found").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &d, nil
|
return &d, nil
|
||||||
@ -142,7 +143,7 @@ func (ss *streamStore) ReadBackupDetails(
|
|||||||
|
|
||||||
err := json.NewDecoder(itemData.ToReader()).Decode(&d)
|
err := json.NewDecoder(itemData.ToReader()).Decode(&d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to decode details data from repository")
|
return nil, clues.Wrap(err, "decoding details data").WithClues(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
found = true
|
found = true
|
||||||
@ -157,7 +158,7 @@ func (ss *streamStore) DeleteBackupDetails(
|
|||||||
) error {
|
) error {
|
||||||
err := ss.kw.DeleteSnapshot(ctx, detailsID)
|
err := ss.kw.DeleteSnapshot(ctx, detailsID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "deleting backup details failed")
|
return errors.Wrap(err, "deleting backup details")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/alcionai/clues"
|
||||||
"github.com/dustin/go-humanize"
|
"github.com/dustin/go-humanize"
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/alcionai/corso/src/cli/print"
|
"github.com/alcionai/corso/src/cli/print"
|
||||||
"github.com/alcionai/corso/src/internal/common"
|
"github.com/alcionai/corso/src/internal/common"
|
||||||
@ -509,7 +509,7 @@ func (i SharePointInfo) Values() []string {
|
|||||||
func (i *SharePointInfo) UpdateParentPath(newPath path.Path) error {
|
func (i *SharePointInfo) UpdateParentPath(newPath path.Path) error {
|
||||||
newParent, err := path.GetDriveFolderPath(newPath)
|
newParent, err := path.GetDriveFolderPath(newPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "making sharepoint path from %s", newPath)
|
return clues.Wrap(err, "making sharePoint path").With("path", newPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
i.ParentPath = newParent
|
i.ParentPath = newParent
|
||||||
@ -551,7 +551,7 @@ func (i OneDriveInfo) Values() []string {
|
|||||||
func (i *OneDriveInfo) UpdateParentPath(newPath path.Path) error {
|
func (i *OneDriveInfo) UpdateParentPath(newPath path.Path) error {
|
||||||
newParent, err := path.GetDriveFolderPath(newPath)
|
newParent, err := path.GetDriveFolderPath(newPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "making drive path from %s", newPath)
|
return clues.Wrap(err, "making oneDrive path").With("path", newPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
i.ParentPath = newParent
|
i.ParentPath = newParent
|
||||||
|
|||||||
@ -20,7 +20,7 @@ func ToOneDrivePath(p Path) (*DrivePath, error) {
|
|||||||
if len(folders) < 3 {
|
if len(folders) < 3 {
|
||||||
return nil, clues.
|
return nil, clues.
|
||||||
New("folder path doesn't match expected format for OneDrive items").
|
New("folder path doesn't match expected format for OneDrive items").
|
||||||
With("folders", p.Folder())
|
With("path_folders", p.Folder())
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DrivePath{DriveID: folders[1], Folders: folders[3:]}, nil
|
return &DrivePath{DriveID: folders[1], Folders: folders[3:]}, nil
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user