forked from https-github-com-Surachai-kent/runtime
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFileCache.cs
More file actions
93 lines (74 loc) · 2.89 KB
/
FileCache.cs
File metadata and controls
93 lines (74 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Text.Json;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
#nullable enable
internal sealed class FileCache
{
private CompilerCache? _newCache;
private CompilerCache? _oldCache;
public bool Enabled { get; }
public TaskLoggingHelper Log { get; }
public FileCache(string? cacheFilePath, TaskLoggingHelper log)
{
Log = log;
if (string.IsNullOrEmpty(cacheFilePath))
{
Log.LogMessage(MessageImportance.Low, $"Disabling cache, because CacheFilePath is not set");
return;
}
Enabled = true;
if (File.Exists(cacheFilePath))
{
_oldCache = (CompilerCache?)JsonSerializer.Deserialize(File.ReadAllText(cacheFilePath),
typeof(CompilerCache),
new JsonSerializerOptions());
}
_oldCache ??= new();
_newCache = new(_oldCache.FileHashes);
}
public bool UpdateAndCheckHasFileChanged(string filePath, string newHash)
{
if (!Enabled)
throw new InvalidOperationException("Cache is not enabled. Make sure the cache file path is set");
_newCache!.FileHashes[filePath] = newHash;
return !_oldCache!.FileHashes.TryGetValue(filePath, out string? oldHash) || oldHash != newHash;
}
public bool ShouldCopy(ProxyFile proxyFile, [NotNullWhen(true)] out string? cause)
{
if (!Enabled)
throw new InvalidOperationException("Cache is not enabled. Make sure the cache file path is set");
cause = null;
string newHash = Utils.ComputeHash(proxyFile.TempFile);
_newCache!.FileHashes[proxyFile.TargetFile] = newHash;
if (!File.Exists(proxyFile.TargetFile))
{
cause = $"the output file didn't exist";
return true;
}
string? oldHash;
if (!_oldCache!.FileHashes.TryGetValue(proxyFile.TargetFile, out oldHash))
oldHash = Utils.ComputeHash(proxyFile.TargetFile);
if (oldHash != newHash)
{
cause = $"hash for the file changed";
return true;
}
return false;
}
public bool Save(string? cacheFilePath)
{
if (!Enabled || string.IsNullOrEmpty(cacheFilePath))
return false;
var json = JsonSerializer.Serialize (_newCache, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(cacheFilePath!, json);
return true;
}
public ProxyFile NewFile(string targetFile) => new ProxyFile(targetFile, this);
}