@@ -11,26 +11,28 @@ import (
1111 "github.com/harness/harness-cli/module/ar/migrate/engine"
1212 "github.com/harness/harness-cli/module/ar/migrate/tree"
1313 "github.com/harness/harness-cli/module/ar/migrate/types"
14+ "github.com/harness/harness-cli/module/ar/migrate/util"
1415
1516 "github.com/google/uuid"
1617 "github.com/rs/zerolog"
1718 "github.com/rs/zerolog/log"
1819)
1920
2021type Version struct {
21- srcRegistry string
22- destRegistry string
23- srcAdapter adapter.Adapter
24- destAdapter adapter.Adapter
25- artifactType types.ArtifactType
26- logger zerolog.Logger
27- pkg types.Package
28- version types.Version
29- node * types.TreeNode
30- stats * types.TransferStats
31- mapping * types.RegistryMapping
32- config * types.Config
33- registry types.RegistryInfo
22+ srcRegistry string
23+ destRegistry string
24+ srcAdapter adapter.Adapter
25+ destAdapter adapter.Adapter
26+ artifactType types.ArtifactType
27+ logger zerolog.Logger
28+ pkg types.Package
29+ version types.Version
30+ node * types.TreeNode
31+ stats * types.TransferStats
32+ mapping * types.RegistryMapping
33+ config * types.Config
34+ registry types.RegistryInfo
35+ existingFileMap map [string ]bool
3436}
3537
3638func NewVersionJob (
@@ -59,19 +61,20 @@ func NewVersionJob(
5961 Logger ()
6062
6163 return & Version {
62- srcRegistry : srcRegistry ,
63- destRegistry : destRegistry ,
64- srcAdapter : src ,
65- destAdapter : dest ,
66- artifactType : artifactType ,
67- logger : jobLogger ,
68- pkg : pkg ,
69- version : version ,
70- node : node ,
71- stats : stats ,
72- mapping : mapping ,
73- config : config ,
74- registry : registry ,
64+ srcRegistry : srcRegistry ,
65+ destRegistry : destRegistry ,
66+ srcAdapter : src ,
67+ destAdapter : dest ,
68+ artifactType : artifactType ,
69+ logger : jobLogger ,
70+ pkg : pkg ,
71+ version : version ,
72+ node : node ,
73+ stats : stats ,
74+ mapping : mapping ,
75+ config : config ,
76+ registry : registry ,
77+ existingFileMap : make (map [string ]bool ),
7578 }
7679}
7780
@@ -89,6 +92,20 @@ func (r *Version) Pre(ctx context.Context) error {
8992 logger .Info ().Msg ("Starting version pre-migration step" )
9093 startTime := time .Now ()
9194
95+ // reading all existing files for this version from destination
96+
97+ if ! r .config .Overwrite && (r .artifactType != types .MAVEN && r .pkg .Name != "" && r .version .Name != "" ) {
98+ existingFiles , err := r .getAllExistingFilesForThisVersion (ctx )
99+ if err != nil {
100+ logger .Warn ().Err (err ).Msg ("Failed to get existing files, will proceed with migration" )
101+ } else {
102+ // Populate existingFileMap with file name
103+ for _ , fileName := range existingFiles {
104+ r .existingFileMap [fileName ] = true
105+ }
106+ logger .Info ().Msgf ("Found %d existing files for version %s" , len (r .existingFileMap ), r .version .Name )
107+ }
108+ }
92109 logger .Info ().
93110 Dur ("duration" , time .Since (startTime )).
94111 Msg ("Completed version pre-migration step" )
@@ -101,7 +118,6 @@ func (r *Version) Migrate(ctx context.Context) error {
101118 Str ("step" , "migrate" ).
102119 Str ("trace_id" , traceID ).
103120 Logger ()
104-
105121 logger .Info ().Msg ("Starting version migration step" )
106122 startTime := time .Now ()
107123
@@ -115,6 +131,25 @@ func (r *Version) Migrate(ctx context.Context) error {
115131 return fmt .Errorf ("get files from tree failed: %w" , err )
116132 }
117133 for _ , file := range files {
134+ // Check if file already exists in destination
135+ if r .existingFileMap [file .Name ] {
136+ util .GetSkipPrinter ().Println (fmt .Sprintf ("Registry [%s], Package [%s/%s], File [%s] already exists" ,
137+ r .destRegistry ,
138+ r .pkg .Name , r .version .Name , file .Name ))
139+ logger .Info ().Msgf ("Skipping file %s as it already exists in destination" , file .Uri )
140+
141+ // Add to statistics
142+ stat := types.FileStat {
143+ Name : file .Name ,
144+ Registry : r .srcRegistry ,
145+ Uri : file .Uri ,
146+ Size : int64 (file .Size ),
147+ Status : types .StatusSkip ,
148+ }
149+ r .stats .FileStats = append (r .stats .FileStats , stat )
150+ continue
151+ }
152+
118153 job := NewFileJob (r .srcAdapter , r .destAdapter , r .srcRegistry , r .destRegistry , r .artifactType , r .pkg ,
119154 r .version , r .node , file , r .stats , r .mapping , r .config , r .registry )
120155 jobs = append (jobs , job )
@@ -202,3 +237,22 @@ func (r *Version) Post(ctx context.Context) error {
202237 Msg ("Completed version post-migration step" )
203238 return nil
204239}
240+
241+ // getAllExistingFilesForThisVersion fetches existing files for this version from the destination API
242+ // Returns a slice of file paths that already exist
243+ func (r * Version ) getAllExistingFilesForThisVersion (ctx context.Context ) ([]string , error ) {
244+ // Call the destination adapter API to get all files for this version
245+ allFileNames , err := r .destAdapter .GetAllFilesForVersion (
246+ ctx ,
247+ r .registry .Path ,
248+ r .pkg .Name ,
249+ r .version .Name ,
250+ )
251+
252+ if err != nil {
253+ return nil , fmt .Errorf ("failed to get existing files from destination: %w" , err )
254+ }
255+
256+ r .logger .Info ().Msgf ("Retrieved %d existing files from destination API for version %s" , len (allFileNames ), r .version .Name )
257+ return allFileNames , nil
258+ }
0 commit comments