Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/NuGetMirror/MirrorUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,74 +9,74 @@

namespace NuGetMirror
{
/// <summary>
/// Mirror a feed to disk as a folder of nupkgs.
/// </summary>
public static class MirrorUtility
{
private const string CursorFile = "cursor.json";

/// <summary>
/// cursor.json path
/// </summary>
public static FileInfo GetCursorFile(DirectoryInfo root)
{
ArgumentNullException.ThrowIfNull(root);
return new FileInfo(Path.Combine(root.FullName, CursorFile));
}

/// <summary>
/// Load cursor.json if it exists.
/// If it doesn't exist MinTime is returned.
/// </summary>
public static DateTimeOffset LoadCursor(DirectoryInfo root)
{
ArgumentNullException.ThrowIfNull(root);

var file = GetCursorFile(root);

if (file.Exists)
{
var json = LoadJson(file.OpenRead());
using var stream = file.OpenRead();
var json = LoadJson(stream);
var cursorValue = json["cursor"]?.ToObject<string>();

return DateTimeOffset.Parse(json["cursor"]!.ToObject<string>()!, CultureInfo.InvariantCulture);
if (!string.IsNullOrEmpty(cursorValue))
{
return DateTimeOffset.Parse(cursorValue, CultureInfo.InvariantCulture);
}
}

return DateTimeOffset.MinValue;
}

internal static JObject LoadJson(Stream stream)
{
using (var reader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(reader))
using var reader = new StreamReader(stream);
using var jsonReader = new JsonTextReader(reader)
{
// Avoid error prone json.net date handling
jsonReader.DateParseHandling = DateParseHandling.None;
DateParseHandling = DateParseHandling.None
};

return JObject.Load(jsonReader);
}
return JObject.Load(jsonReader);
}

/// <summary>
/// Write cursor.json to disk.
/// </summary>
public static void SaveCursor(DirectoryInfo root, DateTimeOffset time)
{
var file = GetCursorFile(root);
ArgumentNullException.ThrowIfNull(root);

var file = GetCursorFile(root);
FileUtility.Delete(file.FullName);

var json = new JObject()
var json = new JObject
{
{ "cursor", time.ToString("o") }
["cursor"] = time.ToString("o")
};

File.WriteAllText(file.FullName, json.ToString());
}

internal static void SetTempRoot(this SourceCacheContext context, string path)
{
ArgumentNullException.ThrowIfNull(context);
ArgumentException.ThrowIfNullOrWhiteSpace(path);

var folderProp = typeof(SourceCacheContext)
.GetField("_generatedTempFolder", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
.GetField("_generatedTempFolder",
BindingFlags.Instance | BindingFlags.NonPublic)
?? throw new InvalidOperationException("Field _generatedTempFolder not found");

folderProp!.SetValue(context, path);
folderProp.SetValue(context, path);
}
}
}