コード例 #1
0
            public void MapsProperties()
            {
                var v1      = NuGetVersion.Parse("1.0.0");
                var changes = MutableIndexChanges.FromLatestIndexChanges(new Dictionary <SearchFilters, LatestIndexChanges>
                {
                    {
                        SearchFilters.Default,
                        new LatestIndexChanges(
                            SearchIndexChangeType.AddFirst,
                            new List <HijackIndexChange>
                        {
                            HijackIndexChange.UpdateMetadata(v1),
                            HijackIndexChange.SetLatestToTrue(v1),
                        })
                    },
                });

                var solid = changes.Solidify();

                Assert.Equal(new[] { SearchFilters.Default }, solid.Search.Keys.ToArray());
                Assert.Equal(SearchIndexChangeType.AddFirst, solid.Search[SearchFilters.Default]);
                Assert.False(solid.Hijack[v1].Delete);
                Assert.True(solid.Hijack[v1].UpdateMetadata);
                Assert.True(solid.Hijack[v1].LatestStableSemVer1);
                Assert.False(solid.Hijack[v1].LatestSemVer1);
                Assert.False(solid.Hijack[v1].LatestStableSemVer2);
                Assert.False(solid.Hijack[v1].LatestSemVer2);
            }
コード例 #2
0
        public void Merge(MutableIndexChanges added)
        {
            if (added == null)
            {
                throw new ArgumentNullException(nameof(added));
            }

            foreach (var pair in added.SearchChanges)
            {
                MergeSearchIndexChanges(pair.Key, pair.Value);
            }

            foreach (var pair in added.HijackChanges)
            {
                MergeHijackIndexChanges(pair.Key, pair.Value);
            }

            // Verify that there are not multiple latest versions per search filter.
            foreach (var searchFilters in DocumentUtilities.AllSearchFilters)
            {
                var latest = HijackDocuments
                             .Where(x => x.Value.GetLatest(searchFilters).GetValueOrDefault(false))
                             .Select(x => x.Key.ToFullString())
                             .ToList();
                Guard.Assert(
                    latest.Count <= 1,
                    $"There are {latest.Count} versions set to be latest on search filter {searchFilters}: {string.Join(", ", latest)}");
            }
        }
コード例 #3
0
        private MutableIndexChanges Upsert(
            string fullVersion,
            NuGetVersion parsedVersion,
            VersionPropertiesData data)
        {
            var added = new VersionProperties(fullVersion, parsedVersion, data);

            _versionProperties[added.ParsedVersion] = KeyValuePair.Create(added.FullVersion, data);

            // Detect changes related to the latest versions, per search filter.
            var output = new Dictionary <SearchFilters, LatestIndexChanges>();

            foreach (var pair in _versionLists)
            {
                var searchFilter = pair.Key;
                var listState    = pair.Value;
                var predicate    = SearchFilterPredicates[searchFilter];

                LatestIndexChanges latestIndexChanges;
                if (predicate(added))
                {
                    latestIndexChanges = listState.Upsert(added.Filtered);
                }
                else
                {
                    latestIndexChanges = listState.Remove(added.ParsedVersion);
                }

                output[searchFilter] = latestIndexChanges;
            }

            return(MutableIndexChanges.FromLatestIndexChanges(output));
        }
コード例 #4
0
        internal MutableIndexChanges ApplyChangesInternal(IEnumerable <VersionListChange> changes)
        {
            var mutableChanges = new MutableIndexChanges();

            // Process the changes in descending order.
            var sortedChanges = changes
                                .OrderByDescending(x => x.ParsedVersion)
                                .ToList();

            // Verify that there is only one change per version.
            var versionsWithMultipleChanges = sortedChanges
                                              .GroupBy(x => x.ParsedVersion)
                                              .OrderBy(x => x.Key)
                                              .Select(x => KeyValuePair.Create(x.Key.ToFullString(), x.Count()))
                                              .Where(x => x.Value > 1)
                                              .ToList();

            if (versionsWithMultipleChanges.Any())
            {
                throw new ArgumentException(
                          $"There are multiple changes for the following version(s): " +
                          string.Join(", ", versionsWithMultipleChanges.Select(x => $"{x.Key} ({x.Value} changes)")),
                          nameof(changes));
            }

            foreach (var change in sortedChanges)
            {
                MutableIndexChanges versionChanges;
                if (!change.IsDelete)
                {
                    versionChanges = Upsert(change.FullVersion, change.ParsedVersion, change.Data);
                }
                else
                {
                    versionChanges = Delete(change.ParsedVersion);
                }

                mutableChanges.Merge(versionChanges);
            }

            // Verify that we are updating the metadata of all non-delete changes.
            foreach (var change in changes)
            {
                Guard.Assert(
                    mutableChanges.HijackDocuments.ContainsKey(change.ParsedVersion),
                    $"The should be a hijack document for each changed version. Version {change.FullVersion} does " +
                    "not have a hijack document.");

                if (!change.IsDelete)
                {
                    Guard.Assert(
                        mutableChanges.HijackDocuments[change.ParsedVersion].UpdateMetadata == true,
                        $"The metadata of version {change.FullVersion} should be updated.");
                }
            }

            return(mutableChanges);
        }
コード例 #5
0
        internal MutableIndexChanges Delete(NuGetVersion parsedVersion)
        {
            _versionProperties.Remove(parsedVersion);

            // Detect changes related to the latest versions, per search filter.
            var output = new Dictionary <SearchFilters, LatestIndexChanges>();

            foreach (var pair in _versionLists)
            {
                var searchFilter = pair.Key;
                var listState    = pair.Value;

                // We can execute this on all lists, no matter the search filter predicate because removing a version
                // that was never added will result in recalculating the version list, which supports the reflow
                // scenario.
                output[searchFilter] = listState.Delete(parsedVersion);
            }

            return(MutableIndexChanges.FromLatestIndexChanges(output));
        }