private async Task ScanBucket(List <MigrationJob> migrationJobs, string bucketKeyOld)
        {
            OssBucket bucketOld = _bucketFactory.CreateBucket(bucketKeyOld);
            OssBucket bucketNew = _bucketFactory.CreateBucket(_bucketProvider.GetBucketKeyFromOld(bucketKeyOld));

            List <string> projectNames = (List <string>) await _projectService.GetProjectNamesAsync(bucketOld);

            foreach (string projectName in projectNames)
            {
                var    ossAttributes = new OssAttributes(projectName);
                string attributeFile = ossAttributes.Metadata;

                // check attributes file existance in new destination bucket
                if (await bucketNew.ObjectExistsAsync(attributeFile))
                {
                    continue;
                }

                ProjectMetadata projectMetadata = await bucketOld.DeserializeAsync <ProjectMetadata>(attributeFile);

                ProjectInfo projectInfo = new ProjectInfo();
                projectInfo.Name             = projectName;
                projectInfo.TopLevelAssembly = projectMetadata.TLA;

                migrationJobs.Add(new MigrationJob(JobType.CopyAndAdopt, bucketOld, projectInfo, ONC.ProjectUrl(projectName)));
            }
        }
        private async Task ScanBucket(List <MigrationJob> migrationJobs, string bucketKeyOld)
        {
            OssBucket bucketOld = _bucketFactory.CreateBucket(bucketKeyOld);
            OssBucket bucketNew = _bucketFactory.CreateBucket(_bucketProvider.GetBucketKeyFromOld(bucketKeyOld));

            List <string> projectNamesNew = new List <string>();

            try
            {
                List <string> projectNamesNewFromOss = (List <string>) await _projectService.GetProjectNamesAsync(bucketNew);

                foreach (string projectName in projectNamesNewFromOss)
                {
                    var    ossAttributes = new OssAttributes(projectName);
                    string metadataFile  = ossAttributes.Metadata;
                    // if metadata file is missing for project we consider that project not migrated
                    if (await bucketNew.ObjectExistsAsync(metadataFile))
                    {
                        projectNamesNew.Add(projectName);
                    }
                }
            }
            catch (ApiException e) when(e.ErrorCode == StatusCodes.Status404NotFound)
            {
                // swallow non existing item
            }

            List <string> projectNamesOld = (List <string>) await _projectService.GetProjectNamesAsync(bucketOld);

            foreach (string projectName in projectNamesOld)
            {
                if (!projectNamesNew.Contains(projectName))
                {
                    // new project list does not contain old project => lets copy and adopt
                    var             ossAttributes   = new OssAttributes(projectName);
                    string          metadataFile    = ossAttributes.Metadata;
                    ProjectMetadata projectMetadata = await bucketOld.DeserializeAsync <ProjectMetadata>(metadataFile);

                    ProjectInfo projectInfo = new ProjectInfo();
                    projectInfo.Name             = projectName;
                    projectInfo.TopLevelAssembly = projectMetadata.TLA;

                    migrationJobs.Add(new MigrationJob(JobType.CopyAndAdopt, bucketOld, projectInfo, ONC.ProjectUrl(projectName)));
                }
            }

            // check if any of migrated projects were deleted in old bucket
            // (user deleted them after migration started)
            foreach (string projectName in projectNamesNew)
            {
                if (!projectNamesOld.Contains(projectName))
                {
                    migrationJobs.Add(new MigrationJob(JobType.RemoveNew, bucketNew, new ProjectInfo(projectName), null));
                }
            }
        }