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); }
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; } }
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; } } } } }