Exemplo n.º 1
0
        public async Task TestDownload()
        {
            const string ZipFile = "test.zip";
            var          builder = new XRefArchiveBuilder();

            Assert.True(await builder.DownloadAsync(new Uri("http://dotnet.github.io/docfx/xrefmap.yml"), ZipFile));

            using (var xar = XRefArchive.Open(ZipFile, XRefArchiveMode.Read))
            {
                var map = xar.GetMajor();
                Assert.True(map.HrefUpdated);
                Assert.True(map.Sorted);
                Assert.NotNull(map.References);
                Assert.Null(map.Redirections);
            }
            File.Delete(ZipFile);
        }
Exemplo n.º 2
0
        private async Task PackOneReferenceAsync(string file, XRefArchive writer)
        {
            var currentPackage = Path.GetFileName(file);

            lock (_currentPackages)
            {
                _currentPackages[Array.IndexOf(_currentPackages, null)] = currentPackage;
            }
            var entries = new List <XRefMapRedirection>();

            await GetItems(file).ForEachAsync(pair =>
            {
                lock (writer)
                {
                    entries.Add(
                        new XRefMapRedirection
                    {
                        UidPrefix = pair.EntryName,
                        Href      = writer.CreateMinor(
                            new XRefMap
                        {
                            Sorted      = true,
                            HrefUpdated = true,
                            References  = pair.ViewModel,
                        },
                            new[] { pair.EntryName })
                    });
                    _entryCount++;
                    _apiCount += pair.ViewModel.Count;
                }
            });

            lock (writer)
            {
                var map = writer.GetMajor();
                map.Redirections = (from r in map.Redirections.Concat(entries)
                                    orderby r.UidPrefix.Length descending
                                    select r).ToList();
                writer.UpdateMajor(map);
            }
            lock (_currentPackages)
            {
                _currentPackages[Array.IndexOf(_currentPackages, currentPackage)] = null;
            }
        }
Exemplo n.º 3
0
        private async Task PackReferenceAsync()
        {
            var files = GetAllFiles();

            if (files.Count == 0)
            {
                return;
            }
            var dir = Path.GetDirectoryName(_packageFile);

            if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            bool updateMode = File.Exists(_packageFile);

            using (var writer = XRefArchive.Open(_packageFile, updateMode ? XRefArchiveMode.Update : XRefArchiveMode.Create))
            {
                if (!updateMode)
                {
                    writer.CreateMajor(new XRefMap {
                        HrefUpdated = true, Redirections = new List <XRefMapRedirection>()
                    });
                }

                if (files.Count == 1)
                {
                    await PackOneReferenceAsync(files[0], writer);

                    return;
                }
                // left is smaller files, right is bigger files.
                var left      = 0;
                var right     = files.Count - 1;
                var leftTask  = PackOneReferenceAsync(files[left], writer);
                var rightTask = PackOneReferenceAsync(files[right], writer);
                while (left <= right)
                {
                    var completed = await Task.WhenAny(new[] { leftTask, rightTask }.Where(t => t != null));

                    await completed; // throw if any error.
                    if (completed == leftTask)
                    {
                        left++;
                        if (left < right)
                        {
                            leftTask = PackOneReferenceAsync(files[left], writer);
                        }
                        else
                        {
                            leftTask = null;
                        }
                    }
                    else
                    {
                        right--;
                        if (left < right)
                        {
                            rightTask = PackOneReferenceAsync(files[right], writer);
                        }
                        else
                        {
                            rightTask = null;
                        }
                    }
                }
            }
        }