Fixes for bad indexed data

This commit is contained in:
Timothy Baldridge 2020-01-23 16:02:49 -07:00
parent bebb514bd4
commit b0725e1fc2
4 changed files with 48 additions and 3 deletions

View File

@ -1,6 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using DynamicData;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MongoDB.Bson; using MongoDB.Bson;
@ -8,6 +10,7 @@ using MongoDB.Driver;
using MongoDB.Driver.Linq; using MongoDB.Driver.Linq;
using Wabbajack.BuildServer.Models; using Wabbajack.BuildServer.Models;
using Wabbajack.Common; using Wabbajack.Common;
using Wabbajack.Lib.Downloaders;
using Wabbajack.VirtualFileSystem; using Wabbajack.VirtualFileSystem;
namespace Wabbajack.BuildServer.Controllers namespace Wabbajack.BuildServer.Controllers
@ -36,6 +39,48 @@ namespace Wabbajack.BuildServer.Controllers
return Ok(string.Join("\r\n", state.FirstOrDefault().State.GetMetaIni())); return Ok(string.Join("\r\n", state.FirstOrDefault().State.GetMetaIni()));
} }
[Authorize]
[HttpDelete]
[Route("/indexed_files/nexus/{Game}/mod/{ModId}")]
public async Task<IActionResult> PurgeBySHA256(string Game, string ModId)
{
var files = await Db.DownloadStates.AsQueryable().Where(d => d.State is NexusDownloader.State &&
((NexusDownloader.State)d.State).GameName == Game &&
((NexusDownloader.State)d.State).ModID == ModId)
.ToListAsync();
async Task DeleteParentsOf(HashSet<string> acc, string hash)
{
var parents = await Db.IndexedFiles.AsQueryable().Where(f => f.Children.Any(c => c.Hash == hash))
.ToListAsync();
foreach (var parent in parents)
await DeleteThisAndAllChildren(acc, parent.Hash);
}
async Task DeleteThisAndAllChildren(HashSet<string> acc, string hash)
{
acc.Add(hash);
var children = await Db.IndexedFiles.AsQueryable().Where(f => f.Hash == hash).FirstOrDefaultAsync();
if (children == null) return;
foreach (var child in children.Children)
{
await DeleteThisAndAllChildren(acc, child.Hash);
}
}
var acc = new HashSet<string>();
foreach (var file in files)
await DeleteThisAndAllChildren(acc, file.Hash);
var acclst = acc.ToList();
await Db.DownloadStates.DeleteManyAsync(d => acc.Contains(d.Hash));
await Db.IndexedFiles.DeleteManyAsync(d => acc.Contains(d.Hash));
return Ok(acc.ToList());
}
[HttpGet] [HttpGet]
[Route("{xxHashAsBase64}")] [Route("{xxHashAsBase64}")]
public async Task<IActionResult> GetFile(string xxHashAsBase64) public async Task<IActionResult> GetFile(string xxHashAsBase64)

View File

@ -207,7 +207,7 @@ namespace Wabbajack.Common
Utils.Status($"Extracting {name} - 100%", 100, alsoLog: true); Utils.Status($"Extracting {name} - 100%", 100, alsoLog: true);
return; return;
} }
Utils.Log(new _7zipReturnError(p.ExitCode, source, dest, p.StandardOutput.ReadToEnd())); Utils.Error(new _7zipReturnError(p.ExitCode, source, dest, p.StandardOutput.ReadToEnd()));
} }
/// <summary> /// <summary>

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Wabbajack.Common.StatusFeed.Errors namespace Wabbajack.Common.StatusFeed.Errors
{ {
public class _7zipReturnError : AStatusMessage, IError public class _7zipReturnError : AErrorMessage
{ {
public string Destination { get; } public string Destination { get; }
public string Filename; public string Filename;

View File

@ -391,7 +391,7 @@ namespace Wabbajack.Lib
Directory.EnumerateDirectories(OutputFolder, DirectoryEnumerationOptions.Recursive) Directory.EnumerateDirectories(OutputFolder, DirectoryEnumerationOptions.Recursive)
.Where(p => !expectedFolders.Contains(p)) .Where(p => !expectedFolders.Contains(p))
.OrderByDescending(p => p.Length) .OrderByDescending(p => p.Length)
.Do(p => Directory.Delete(p)); .Do(Utils.DeleteDirectory);
} }
catch (Exception) catch (Exception)
{ {