diff --git a/changes/20241115120136.bugfix b/changes/20241115120136.bugfix new file mode 100644 index 0000000..9fc9af6 --- /dev/null +++ b/changes/20241115120136.bugfix @@ -0,0 +1 @@ +:arrow_up: upgrade dependencies diff --git a/changes/20241115141349.feature b/changes/20241115141349.feature new file mode 100644 index 0000000..a4fd34f --- /dev/null +++ b/changes/20241115141349.feature @@ -0,0 +1 @@ +:sparkles: `[artefacts]` Extend artefact download to retain the tree structure of the artefacts diff --git a/utils/artefacts/artefacts.go b/utils/artefacts/artefacts.go index 1a66309..21f041d 100644 --- a/utils/artefacts/artefacts.go +++ b/utils/artefacts/artefacts.go @@ -12,6 +12,7 @@ import ( "net/url" "os" "path/filepath" + "strings" "github.com/ARM-software/embedded-development-services-client-utils/utils/api" paginationUtils "github.com/ARM-software/embedded-development-services-client-utils/utils/pagination" @@ -24,6 +25,8 @@ import ( "github.com/ARM-software/golang-utils/utils/safeio" ) +const relativePathKey = "Relative Path" + type ( // GetArtefactManagersFirstPageFunc defines the function which can retrieve the first page of artefact managers. GetArtefactManagersFirstPageFunc = func(ctx context.Context, job string) (*client.ArtefactManagerCollection, *http.Response, error) @@ -35,6 +38,44 @@ type ( GetArtefactContentFunc = func(ctx context.Context, job, artefactID string) (*os.File, *http.Response, error) ) +func determineArtefactDestination(outputDir string, maintainTree bool, item *client.ArtefactManagerItem) (artefactFileName string, destinationDir string, err error) { + if item == nil { + err = fmt.Errorf("%w: missing artefact item", commonerrors.ErrUndefined) + return + } + artefactManagerName := item.GetName() + if artefactManagerName == "" { + err = fmt.Errorf("%w: missing artefact name", commonerrors.ErrUndefined) + return + } + rawFileName := artefactManagerName + if item.HasTitle() { + rawFileName = item.GetTitle() + } + artefactFileName = rawFileName + if unescapedName, err := url.PathUnescape(rawFileName); err == nil { + artefactFileName = unescapedName + } + destinationDir = filepath.Clean(outputDir) + if !maintainTree { + return + } + + if item.HasExtraMetadata() { + m := item.GetExtraMetadata() + treePath, ok := m[relativePathKey] + if !ok { + return + } + treePath = strings.TrimSpace(treePath) + if strings.HasSuffix(treePath, rawFileName) || strings.HasSuffix(treePath, artefactFileName) { + treePath = filepath.Dir(treePath) + } + destinationDir = filepath.Clean(filepath.Join(outputDir, treePath)) + } + return +} + type ArtefactManager struct { getArtefactManagerFunc GetArtefactManagerFunc getArtefactContentFunc GetArtefactContentFunc @@ -51,8 +92,11 @@ func NewArtefactManager(getArtefactManagersFirstPage GetArtefactManagersFirstPag getArtefactManagersFollowLinkFunc: getArtefactsManagersPage, } } - func (m *ArtefactManager) DownloadJobArtefact(ctx context.Context, jobName string, outputDirectory string, artefactManager *client.ArtefactManagerItem) (err error) { + return m.DownloadJobArtefactWithTree(ctx, jobName, false, outputDirectory, artefactManager) +} + +func (m *ArtefactManager) DownloadJobArtefactWithTree(ctx context.Context, jobName string, maintainTreeLocation bool, outputDirectory string, artefactManager *client.ArtefactManagerItem) (err error) { err = parallelisation.DetermineContextError(ctx) if err != nil { return @@ -83,14 +127,6 @@ func (m *ArtefactManager) DownloadJobArtefact(ctx context.Context, jobName strin return } - artefactFilename := artefactManagerName - if artefactManager.HasTitle() { - artefactFilename = artefactManager.GetTitle() - } - if unescapedName, err := url.PathUnescape(artefactFilename); err == nil { - artefactFilename = unescapedName - } - expectedSizePtr, ok := artefactManager.GetSizeOk() if !ok { err = fmt.Errorf("%w: could not fetch artefact's size from artefact's manager [%v]", commonerrors.ErrUndefined, artefactManagerName) @@ -105,6 +141,16 @@ func (m *ArtefactManager) DownloadJobArtefact(ctx context.Context, jobName strin } expectedHash := *expectedHashPtr + artefactFilename, artefactDestDir, err := determineArtefactDestination(outputDirectory, maintainTreeLocation, artefactManager) + if err != nil { + return + } + err = filesystem.MkDir(artefactDestDir) + if err != nil { + err = fmt.Errorf("%w: failed creating the output directory [%v] for job artefact: %v", commonerrors.ErrUnexpected, artefactDestDir, err.Error()) + return + } + artefact, resp, apierr := m.getArtefactContentFunc(ctx, jobName, artefactManagerName) defer func() { if resp != nil { @@ -120,7 +166,7 @@ func (m *ArtefactManager) DownloadJobArtefact(ctx context.Context, jobName strin return } - destination, err := filesystem.CreateFile(filepath.Join(outputDirectory, artefactFilename)) + destination, err := filesystem.CreateFile(filepath.Join(artefactDestDir, artefactFilename)) if err != nil { err = fmt.Errorf("%w: could not create a location to store generated artefact [%v]: %v", commonerrors.ErrUnexpected, artefactFilename, err.Error()) return @@ -161,8 +207,11 @@ func (m *ArtefactManager) DownloadJobArtefact(ctx context.Context, jobName strin return } +func (m *ArtefactManager) DownloadJobArtefactFromLink(ctx context.Context, jobName string, outputDirectory string, artefactManagerItemLink *client.HalLinkData) error { + return m.DownloadJobArtefactFromLinkWithTree(ctx, jobName, false, outputDirectory, artefactManagerItemLink) +} -func (m *ArtefactManager) DownloadJobArtefactFromLink(ctx context.Context, jobName string, outputDirectory string, artefactManagerItem *client.HalLinkData) (err error) { +func (m *ArtefactManager) DownloadJobArtefactFromLinkWithTree(ctx context.Context, jobName string, maintainTreeLocation bool, outputDirectory string, artefactManagerItemLink *client.HalLinkData) (err error) { err = parallelisation.DetermineContextError(ctx) if err != nil { return @@ -171,12 +220,12 @@ func (m *ArtefactManager) DownloadJobArtefactFromLink(ctx context.Context, jobNa err = fmt.Errorf("%w: function to retrieve an artefact manager was not properly defined", commonerrors.ErrUndefined) return } - if artefactManagerItem == nil { + if artefactManagerItemLink == nil { err = fmt.Errorf("%w: missing artefact link", commonerrors.ErrUndefined) return } - artefactManagerName := artefactManagerItem.GetName() + artefactManagerName := artefactManagerItemLink.GetName() artefactManager, resp, apierr := m.getArtefactManagerFunc(ctx, jobName, artefactManagerName) defer func() { if resp != nil { @@ -190,7 +239,7 @@ func (m *ArtefactManager) DownloadJobArtefactFromLink(ctx context.Context, jobNa if resp != nil { _ = resp.Body.Close() } - err = m.DownloadJobArtefact(ctx, jobName, outputDirectory, artefactManager) + err = m.DownloadJobArtefactWithTree(ctx, jobName, maintainTreeLocation, outputDirectory, artefactManager) return } @@ -263,7 +312,11 @@ func (m *ArtefactManager) fetchJobArtefactsNextPage(ctx context.Context, current return } -func (m *ArtefactManager) DownloadAllJobArtefacts(ctx context.Context, jobName string, outputDirectory string) (err error) { +func (m *ArtefactManager) DownloadAllJobArtefacts(ctx context.Context, jobName string, outputDirectory string) error { + return m.DownloadAllJobArtefactsWithTree(ctx, jobName, false, outputDirectory) +} + +func (m *ArtefactManager) DownloadAllJobArtefactsWithTree(ctx context.Context, jobName string, maintainTreeStructure bool, outputDirectory string) (err error) { err = parallelisation.DetermineContextError(ctx) if err != nil { return @@ -290,7 +343,7 @@ func (m *ArtefactManager) DownloadAllJobArtefacts(ctx context.Context, jobName s } artefactLink, ok := item.(*client.HalLinkData) if ok { - subErr = m.DownloadJobArtefactFromLink(ctx, jobName, outputDirectory, artefactLink) + subErr = m.DownloadJobArtefactFromLinkWithTree(ctx, jobName, maintainTreeStructure, outputDirectory, artefactLink) if subErr != nil { err = subErr return @@ -299,7 +352,7 @@ func (m *ArtefactManager) DownloadAllJobArtefacts(ctx context.Context, jobName s } else { artefactManager, ok := item.(*client.ArtefactManagerItem) if ok { - subErr = m.DownloadJobArtefact(ctx, jobName, outputDirectory, artefactManager) + subErr = m.DownloadJobArtefactWithTree(ctx, jobName, maintainTreeStructure, outputDirectory, artefactManager) if subErr != nil { err = subErr return diff --git a/utils/artefacts/artefacts_test.go b/utils/artefacts/artefacts_test.go index 82277fa..07381e1 100644 --- a/utils/artefacts/artefacts_test.go +++ b/utils/artefacts/artefacts_test.go @@ -11,6 +11,7 @@ import ( "net/http" "os" "path/filepath" + "strings" "testing" "time" @@ -164,6 +165,113 @@ func newTestArtefactManagerWithEmbeddedResources(t *testing.T, tmpDir, artefactC return newTestArtefactManager(t, tmpDir, artefactContent, false) } +func TestDetermineDestination(t *testing.T) { + outputDir := strings.ReplaceAll(faker.Sentence(), " ", "//") + " " + cleanedOutputDir := filepath.Clean(outputDir) + + tests := []struct { + item client.ArtefactManagerItem + maintainTree bool + outputDir string + expectedFileName string + expectedDir string + }{ + { + item: client.ArtefactManagerItem{ + ExtraMetadata: nil, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("test.j")), + }, + maintainTree: false, + outputDir: outputDir, + expectedFileName: "test.j", + expectedDir: cleanedOutputDir, + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: nil, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("test.j")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "test.j", + expectedDir: cleanedOutputDir, + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: nil, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("cool+blog&about%2Cstuff.yep")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "cool+blog&about,stuff.yep", + expectedDir: cleanedOutputDir, + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: &map[string]string{faker.Name(): faker.Sentence()}, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("cool+blog&about%2Cstuff.yep")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "cool+blog&about,stuff.yep", + expectedDir: cleanedOutputDir, + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: &map[string]string{relativePathKey: " test/1 "}, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("cool+blog&about%2Cstuff.yep")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "cool+blog&about,stuff.yep", + expectedDir: filepath.Join(cleanedOutputDir, "test", "1"), + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: &map[string]string{relativePathKey: " test/1/cool+blog&about,stuff.yep "}, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("cool+blog&about%2Cstuff.yep")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "cool+blog&about,stuff.yep", + expectedDir: filepath.Join(cleanedOutputDir, "test", "1"), + }, + { + item: client.ArtefactManagerItem{ + ExtraMetadata: &map[string]string{relativePathKey: " test/1/cool+blog&about%2Cstuff.yep "}, + Name: faker.Name(), + Size: nil, + Title: *client.NewNullableString(field.ToOptionalString("cool+blog&about%2Cstuff.yep")), + }, + maintainTree: true, + outputDir: outputDir, + expectedFileName: "cool+blog&about,stuff.yep", + expectedDir: filepath.Join(cleanedOutputDir, "test", "1"), + }, + } + for i := range tests { + test := tests[i] + t.Run(fmt.Sprintf("%d_%s", i, test.expectedFileName), func(t *testing.T) { + fileName, fileDest, err := determineArtefactDestination(test.outputDir, test.maintainTree, &test.item) + require.NoError(t, err) + assert.Equal(t, test.expectedFileName, fileName) + assert.Equal(t, test.expectedDir, fileDest) + }) + } +} + func TestArtefactDownload(t *testing.T) { t.Run("Happy download artefact", func(t *testing.T) { tmpDir, err := filesystem.TempDirInTempDir("test-artefact-") @@ -184,7 +292,25 @@ func TestArtefactDownload(t *testing.T) { require.NoError(t, err) assert.Equal(t, expectedContents, actualContents) }) + t.Run("Happy download artefact and keep tree", func(t *testing.T) { + tmpDir, err := filesystem.TempDirInTempDir("test-artefact-with-tree-") + require.NoError(t, err) + defer func() { _ = filesystem.Rm(tmpDir) }() + m, a := newTestArtefactManagerWithEmbeddedResources(t, tmpDir, faker.Sentence()) + + out := t.TempDir() + err = m.DownloadJobArtefactFromLinkWithTree(context.Background(), faker.Word(), true, out, &client.HalLinkData{ + Name: &a.name, + }) + require.NoError(t, err) + require.FileExists(t, filepath.Join(out, a.name)) + expectedContents, err := filesystem.ReadFile(a.path) + require.NoError(t, err) + actualContents, err := filesystem.ReadFile(filepath.Join(out, a.name)) + require.NoError(t, err) + assert.Equal(t, expectedContents, actualContents) + }) t.Run("Happy list artefacts links", func(t *testing.T) { tmpDir, err := filesystem.TempDirInTempDir("test-artefact-") require.NoError(t, err) diff --git a/utils/artefacts/interface.go b/utils/artefacts/interface.go index 69477ae..8a71dc0 100644 --- a/utils/artefacts/interface.go +++ b/utils/artefacts/interface.go @@ -15,12 +15,21 @@ import ( //go:generate mockgen -destination=../mocks/mock_$GOPACKAGE.go -package=mocks github.com/ARM-software/embedded-development-services-client-utils/utils/$GOPACKAGE IArtefactManager type IArtefactManager interface { - // DownloadJobArtefactFromLink downloads a specific artefact into the output directory from a particular link. + // DownloadJobArtefactFromLink downloads a specific artefact into the output directory from a particular link. The artefact will be placed at the root of the output directory. DownloadJobArtefactFromLink(ctx context.Context, jobName string, outputDirectory string, artefactManagerItemLink *client.HalLinkData) error - // DownloadJobArtefact downloads a specific artefact into the output directory. + // DownloadJobArtefactFromLinkWithTree downloads a specific artefact into the output directory from a particular link. + // maintainTreeLocation specifies whether the artefact will be placed in a tree structure or if it will be flat. + DownloadJobArtefactFromLinkWithTree(ctx context.Context, jobName string, maintainTreeLocation bool, outputDirectory string, artefactManagerItemLink *client.HalLinkData) error + // DownloadJobArtefact downloads a specific artefact into the output directory. The artefact will be placed at the root of the output directory. DownloadJobArtefact(ctx context.Context, jobName string, outputDirectory string, artefactManager *client.ArtefactManagerItem) error + // DownloadJobArtefactWithTree downloads a specific artefact into the output directory. + // maintainTreeLocation specifies whether the artefact will be placed in a tree structure or if it will be flat. + DownloadJobArtefactWithTree(ctx context.Context, jobName string, maintainTreeLocation bool, outputDirectory string, artefactManager *client.ArtefactManagerItem) error // ListJobArtefacts lists all artefact managers associated with a particular job. ListJobArtefacts(ctx context.Context, jobName string) (pagination.IPaginatorAndPageFetcher, error) - // DownloadAllJobArtefacts downloads all the artefacts produced for a particular job and puts them in an output directory. + // DownloadAllJobArtefacts downloads all the artefacts produced for a particular job and puts them in an output directory as a flat list. DownloadAllJobArtefacts(ctx context.Context, jobName string, outputDirectory string) error + // DownloadAllJobArtefactsWithTree downloads all the artefacts produced for a particular job and puts them in an output directory. + // maintainTreeStructure specifies whether to keep the tree structure of the artefacts or not in the output directory. + DownloadAllJobArtefactsWithTree(ctx context.Context, jobName string, maintainTreeStructure bool, outputDirectory string) error } diff --git a/utils/go.mod b/utils/go.mod index 5c7ba66..e9dbbb2 100644 --- a/utils/go.mod +++ b/utils/go.mod @@ -3,15 +3,15 @@ module github.com/ARM-software/embedded-development-services-client-utils/utils go 1.23 require ( - github.com/ARM-software/embedded-development-services-client/client v1.35.3 - github.com/ARM-software/golang-utils/utils v1.73.2 + github.com/ARM-software/embedded-development-services-client/client v1.36.1 + github.com/ARM-software/golang-utils/utils v1.74.1 github.com/go-faker/faker/v4 v4.5.0 github.com/go-logr/logr v1.4.2 github.com/golang/mock v1.6.0 github.com/stretchr/testify v1.9.0 go.uber.org/atomic v1.11.0 go.uber.org/goleak v1.3.0 - golang.org/x/sync v0.8.0 + golang.org/x/sync v0.9.0 ) require ( @@ -68,10 +68,10 @@ require ( github.com/zailic/slogr v0.0.2-alpha // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/utils/go.sum b/utils/go.sum index 621c8da..6dd10d0 100644 --- a/utils/go.sum +++ b/utils/go.sum @@ -1,8 +1,8 @@ bitbucket.org/creachadair/stringset v0.0.9/go.mod h1:t+4WcQ4+PXTa8aQdNKe40ZP6iwesoMFWAxPGd3UGjyY= -github.com/ARM-software/embedded-development-services-client/client v1.35.3 h1:af4J5Vq1mJdXSlDlo16oRgYg60TqNe+m2zzm5DNi6vs= -github.com/ARM-software/embedded-development-services-client/client v1.35.3/go.mod h1:Y6c5ipheDRXK37tUIsKS14+Tea2uyEtFLvQcyhbFWOU= -github.com/ARM-software/golang-utils/utils v1.73.2 h1:mc276w+98bII9b7htvbDjYvRUbucXdOtD0EdLx8s7vs= -github.com/ARM-software/golang-utils/utils v1.73.2/go.mod h1:0NsPlRBA51SInFU63LM6li34Rrl3774mIn3m5Pmgi14= +github.com/ARM-software/embedded-development-services-client/client v1.36.1 h1:DsW0oaSbI+xkGDYBfbz5SN5q5nu1EgzCXHhOlFYigEE= +github.com/ARM-software/embedded-development-services-client/client v1.36.1/go.mod h1:FOYpc1CM02XN6Psj53+P/yN6DBSPY4HEC1eKZYY2RO8= +github.com/ARM-software/golang-utils/utils v1.74.1 h1:OHJjn+Ti8ty3MRKGpjPtgJvngPwLxRy0zewZ4GvoHX0= +github.com/ARM-software/golang-utils/utils v1.74.1/go.mod h1:sXDZAe2s4PKz4eG2H0qbvsR2z45Wacs58p2/DftdN5g= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -206,8 +206,8 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -221,8 +221,8 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -253,14 +253,14 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= diff --git a/utils/mocks/mock_artefacts.go b/utils/mocks/mock_artefacts.go index 9ad7540..4252a72 100644 --- a/utils/mocks/mock_artefacts.go +++ b/utils/mocks/mock_artefacts.go @@ -56,6 +56,20 @@ func (mr *MockIArtefactManagerMockRecorder) DownloadAllJobArtefacts(arg0, arg1, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DownloadAllJobArtefacts", reflect.TypeOf((*MockIArtefactManager)(nil).DownloadAllJobArtefacts), arg0, arg1, arg2) } +// DownloadAllJobArtefactsWithTree mocks base method. +func (m *MockIArtefactManager) DownloadAllJobArtefactsWithTree(arg0 context.Context, arg1 string, arg2 bool, arg3 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DownloadAllJobArtefactsWithTree", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// DownloadAllJobArtefactsWithTree indicates an expected call of DownloadAllJobArtefactsWithTree. +func (mr *MockIArtefactManagerMockRecorder) DownloadAllJobArtefactsWithTree(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DownloadAllJobArtefactsWithTree", reflect.TypeOf((*MockIArtefactManager)(nil).DownloadAllJobArtefactsWithTree), arg0, arg1, arg2, arg3) +} + // DownloadJobArtefact mocks base method. func (m *MockIArtefactManager) DownloadJobArtefact(arg0 context.Context, arg1, arg2 string, arg3 *client.ArtefactManagerItem) error { m.ctrl.T.Helper() @@ -84,6 +98,34 @@ func (mr *MockIArtefactManagerMockRecorder) DownloadJobArtefactFromLink(arg0, ar return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DownloadJobArtefactFromLink", reflect.TypeOf((*MockIArtefactManager)(nil).DownloadJobArtefactFromLink), arg0, arg1, arg2, arg3) } +// DownloadJobArtefactFromLinkWithTree mocks base method. +func (m *MockIArtefactManager) DownloadJobArtefactFromLinkWithTree(arg0 context.Context, arg1 string, arg2 bool, arg3 string, arg4 *client.HalLinkData) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DownloadJobArtefactFromLinkWithTree", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 +} + +// DownloadJobArtefactFromLinkWithTree indicates an expected call of DownloadJobArtefactFromLinkWithTree. +func (mr *MockIArtefactManagerMockRecorder) DownloadJobArtefactFromLinkWithTree(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DownloadJobArtefactFromLinkWithTree", reflect.TypeOf((*MockIArtefactManager)(nil).DownloadJobArtefactFromLinkWithTree), arg0, arg1, arg2, arg3, arg4) +} + +// DownloadJobArtefactWithTree mocks base method. +func (m *MockIArtefactManager) DownloadJobArtefactWithTree(arg0 context.Context, arg1 string, arg2 bool, arg3 string, arg4 *client.ArtefactManagerItem) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DownloadJobArtefactWithTree", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(error) + return ret0 +} + +// DownloadJobArtefactWithTree indicates an expected call of DownloadJobArtefactWithTree. +func (mr *MockIArtefactManagerMockRecorder) DownloadJobArtefactWithTree(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DownloadJobArtefactWithTree", reflect.TypeOf((*MockIArtefactManager)(nil).DownloadJobArtefactWithTree), arg0, arg1, arg2, arg3, arg4) +} + // ListJobArtefacts mocks base method. func (m *MockIArtefactManager) ListJobArtefacts(arg0 context.Context, arg1 string) (pagination.IPaginatorAndPageFetcher, error) { m.ctrl.T.Helper() diff --git a/utils/pagination/page.go b/utils/pagination/page.go index b8b03bc..5efb751 100644 --- a/utils/pagination/page.go +++ b/utils/pagination/page.go @@ -79,7 +79,7 @@ func newClientPageMapper(page pagination.IStaticPage) client.IStaticPage { } } -// UnwrapPage tends to unwraps the page mappers to retrieve the raw page object. +// UnwrapPage tends to unwrap the page mappers to retrieve the raw page object. func UnwrapPage(page any) any { if page == nil { return nil