Skip to content

Commit 522d018

Browse files
committed
Automount and other updates:
- Added a Windows service that performs automount after a reboot - No more 'git.exe cat-file' background processes - Downloaded Git objects are now written to a cache in the .gvfs folder - Bug fixes and perf improvements
1 parent e351386 commit 522d018

File tree

166 files changed

+5601
-2157
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

166 files changed

+5601
-2157
lines changed

GVFS.sln

+20
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
1515
EndProjectSection
1616
EndProject
1717
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GVFS", "GVFS", "{2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}"
18+
ProjectSection(SolutionItems) = preProject
19+
GVFS\GvLib.NativeBinaries.props = GVFS\GvLib.NativeBinaries.props
20+
GVFS\LibGit2Sharp.NativeBinaries.props = GVFS\LibGit2Sharp.NativeBinaries.props
21+
EndProjectSection
1822
EndProject
1923
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.GVFlt", "GVFS\GVFS.GVFlt\GVFS.GVFlt.csproj", "{1118B427-7063-422F-83B9-5023C8EC5A7A}"
2024
EndProject
@@ -30,6 +34,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS", "GVFS\GVFS\GVFS.cspr
3034
ProjectSection(ProjectDependencies) = postProject
3135
{17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {17498502-AEFF-4E70-90CC-1D0B56A8ADF5}
3236
{798DE293-6EDA-4DC4-9395-BE7A71C563E3} = {798DE293-6EDA-4DC4-9395-BE7A71C563E3}
37+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}
3338
{5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258}
3439
{BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917}
3540
EndProjectSection
@@ -47,13 +52,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.FunctionalTests", "GVF
4752
{07F2A520-2AB7-46DD-97C0-75D8E988D55B} = {07F2A520-2AB7-46DD-97C0-75D8E988D55B}
4853
{3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} = {3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}
4954
{32220664-594C-4425-B9A0-88E0BE2F3D2A} = {32220664-594C-4425-B9A0-88E0BE2F3D2A}
55+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}
5056
{BDA91EE5-C684-4FC5-A90A-B7D677421917} = {BDA91EE5-C684-4FC5-A90A-B7D677421917}
5157
EndProjectSection
5258
EndProject
5359
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GVFS.NativeTests", "GVFS\GVFS.NativeTests\GVFS.NativeTests.vcxproj", "{3771C555-B5C1-45E2-B8B7-2CEF1619CDC5}"
5460
EndProject
5561
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Hooks", "GVFS\GVFS.Hooks\GVFS.Hooks.csproj", "{BDA91EE5-C684-4FC5-A90A-B7D677421917}"
5662
EndProject
63+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Service", "GVFS\GVFS.Service\GVFS.Service.csproj", "{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}"
64+
EndProject
5765
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Mount", "GVFS\GVFS.Mount\GVFS.Mount.csproj", "{17498502-AEFF-4E70-90CC-1D0B56A8ADF5}"
5866
ProjectSection(ProjectDependencies) = postProject
5967
{5A6656D5-81C7-472C-9DC8-32D071CB2258} = {5A6656D5-81C7-472C-9DC8-32D071CB2258}
@@ -70,6 +78,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Scripts", "Scripts", "{2867
7078
Scripts\RunUnitTests.bat = Scripts\RunUnitTests.bat
7179
EndProjectSection
7280
EndProject
81+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GVFS.Service.UI", "GVFS\GVFS.Service.UI\GVFS.Service.UI.csproj", "{93B403FD-DAFB-46C5-9636-B122792A548A}"
82+
EndProject
7383
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GitHooksLoader", "GitHooksLoader\GitHooksLoader.vcxproj", "{798DE293-6EDA-4DC4-9395-BE7A71C563E3}"
7484
EndProject
7585
Global
@@ -118,6 +128,10 @@ Global
118128
{BDA91EE5-C684-4FC5-A90A-B7D677421917}.Debug|x64.Build.0 = Debug|x64
119129
{BDA91EE5-C684-4FC5-A90A-B7D677421917}.Release|x64.ActiveCfg = Release|x64
120130
{BDA91EE5-C684-4FC5-A90A-B7D677421917}.Release|x64.Build.0 = Release|x64
131+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Debug|x64.ActiveCfg = Debug|x64
132+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Debug|x64.Build.0 = Debug|x64
133+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Release|x64.ActiveCfg = Release|x64
134+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B}.Release|x64.Build.0 = Release|x64
121135
{17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Debug|x64.ActiveCfg = Debug|x64
122136
{17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Debug|x64.Build.0 = Debug|x64
123137
{17498502-AEFF-4E70-90CC-1D0B56A8ADF5}.Release|x64.ActiveCfg = Release|x64
@@ -126,6 +140,10 @@ Global
126140
{5A6656D5-81C7-472C-9DC8-32D071CB2258}.Debug|x64.Build.0 = Debug|x64
127141
{5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.ActiveCfg = Release|x64
128142
{5A6656D5-81C7-472C-9DC8-32D071CB2258}.Release|x64.Build.0 = Release|x64
143+
{93B403FD-DAFB-46C5-9636-B122792A548A}.Debug|x64.ActiveCfg = Debug|x64
144+
{93B403FD-DAFB-46C5-9636-B122792A548A}.Debug|x64.Build.0 = Debug|x64
145+
{93B403FD-DAFB-46C5-9636-B122792A548A}.Release|x64.ActiveCfg = Release|x64
146+
{93B403FD-DAFB-46C5-9636-B122792A548A}.Release|x64.Build.0 = Release|x64
129147
{798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.ActiveCfg = Debug|x64
130148
{798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Debug|x64.Build.0 = Debug|x64
131149
{798DE293-6EDA-4DC4-9395-BE7A71C563E3}.Release|x64.ActiveCfg = Release|x64
@@ -145,8 +163,10 @@ Global
145163
{0F0A008E-AB12-40EC-A671-37A541B08C7F} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA}
146164
{3771C555-B5C1-45E2-B8B7-2CEF1619CDC5} = {C41F10F9-1163-4CFA-A465-EA728F75E9FA}
147165
{BDA91EE5-C684-4FC5-A90A-B7D677421917} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}
166+
{B8C1DFBA-CAFD-4F7E-A1A3-E11907B5467B} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}
148167
{17498502-AEFF-4E70-90CC-1D0B56A8ADF5} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}
149168
{5A6656D5-81C7-472C-9DC8-32D071CB2258} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}
150169
{28674A4B-1223-4633-A460-C8CC39B09318} = {DCE11095-DA5F-4878-B58D-2702765560F5}
170+
{93B403FD-DAFB-46C5-9636-B122792A548A} = {2EF2EC94-3A68-4ED7-9A58-B7057ADBA01C}
151171
EndGlobalSection
152172
EndGlobal

GVFS/FastFetch/FastFetch.csproj

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Import Project="LibGit2Sharp.NativeBinaries.props" Condition="Exists('LibGit2Sharp.NativeBinaries.props')" />
3+
<Import Project="..\LibGit2Sharp.NativeBinaries.props" Condition="Exists('..\LibGit2Sharp.NativeBinaries.props')" />
44
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
55
<PropertyGroup>
66
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -73,8 +73,6 @@
7373
<Compile Include="GitEnlistment.cs" />
7474
<Compile Include="Git\DiffHelper.cs" />
7575
<Compile Include="Git\GitPackIndex.cs" />
76-
<Compile Include="Git\LibGit2Helpers.cs" />
77-
<Compile Include="Git\LibGit2Repo.cs" />
7876
<Compile Include="Git\RefSpecHelpers.cs" />
7977
<Compile Include="Index.cs" />
8078
<Compile Include="Jobs\BatchObjectDownloadJob.cs" />
@@ -108,7 +106,7 @@
108106
<Error Condition="!Exists('..\..\..\packages\StyleCop.Error.MSBuild.1.0.0\build\StyleCop.Error.MSBuild.Targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\StyleCop.Error.MSBuild.1.0.0\build\StyleCop.Error.MSBuild.Targets'))" />
109107
<Error Condition="!Exists('..\..\..\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\Microsoft.Diagnostics.Tracing.EventRegister.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\Microsoft.Diagnostics.Tracing.EventRegister.targets'))" />
110108
<Error Condition="!Exists('..\..\..\packages\StyleCop.MSBuild.4.7.54.0\build\StyleCop.MSBuild.Targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\StyleCop.MSBuild.4.7.54.0\build\StyleCop.MSBuild.Targets'))" />
111-
<Error Condition="!Exists('LibGit2Sharp.NativeBinaries.props')" Text="$([System.String]::Format('$(ErrorText)', 'LibGit2Sharp.NativeBinaries.props'))" />
109+
<Error Condition="!Exists('..\LibGit2Sharp.NativeBinaries.props')" Text="$([System.String]::Format('$(ErrorText)', '..\LibGit2Sharp.NativeBinaries.props'))" />
112110
</Target>
113111
<Import Project="..\..\..\packages\StyleCop.Error.MSBuild.1.0.0\build\StyleCop.Error.MSBuild.Targets" Condition="Exists('..\..\..\packages\StyleCop.Error.MSBuild.1.0.0\build\StyleCop.Error.MSBuild.Targets')" />
114112
<Import Project="..\..\..\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\Microsoft.Diagnostics.Tracing.EventRegister.targets" Condition="Exists('..\..\..\packages\Microsoft.Diagnostics.Tracing.EventRegister.1.1.28\build\Microsoft.Diagnostics.Tracing.EventRegister.targets')" />

GVFS/FastFetch/FetchHelper.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public FetchHelper(
4646
this.ChunkSize = chunkSize;
4747
this.Tracer = tracer;
4848
this.Enlistment = enlistment;
49-
this.ObjectRequestor = new GitObjectsHttpRequestor(tracer, enlistment, downloadThreadCount);
49+
this.ObjectRequestor = new GitObjectsHttpRequestor(tracer, enlistment);
5050
this.GitObjects = new GitObjects(tracer, enlistment, this.ObjectRequestor);
5151
this.PathWhitelist = new List<string>();
5252

@@ -77,7 +77,7 @@ public static bool TryLoadPathWhitelist(ITracer tracer, string pathWhitelistInpu
7777
IEnumerable<string> allLines = File.ReadAllLines(pathWhitelistFile)
7878
.Select(line => line.Trim())
7979
.Where(line => !string.IsNullOrEmpty(line))
80-
.Where(line => !line.StartsWith(GVFSConstants.GitCommentSignString))
80+
.Where(line => !line.StartsWith(GVFSConstants.GitCommentSign.ToString()))
8181
.Select(makePathAbsolute);
8282

8383
pathWhitelistOutput.AddRange(allLines);
@@ -214,9 +214,9 @@ protected void DownloadMissingCommit(string commitSha, GitObjects gitObjects)
214214

215215
using (ITracer activity = this.Tracer.StartActivity("DownloadTrees", EventLevel.Informational, Keywords.Telemetry, startMetadata))
216216
{
217-
using (GitCatFileBatchCheckProcess catFileProcess = new GitCatFileBatchCheckProcess(this.Tracer, this.Enlistment))
217+
using (LibGit2Repo repo = new LibGit2Repo(this.Tracer, this.Enlistment.WorkingDirectoryRoot))
218218
{
219-
if (!catFileProcess.ObjectExists_CanTimeout(commitSha))
219+
if (!repo.ObjectExists(commitSha))
220220
{
221221
if (!gitObjects.TryDownloadAndSaveCommits(new[] { commitSha }, commitDepth: CommitDepth))
222222
{

GVFS/FastFetch/Git/DiffHelper.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,10 @@ public void PerformDiff(string targetCommitSha)
6868
{
6969
string targetTreeSha;
7070
string headTreeSha;
71-
using (GitCatFileBatchProcess catFile = new GitCatFileBatchProcess(this.tracer, this.enlistment))
71+
using (LibGit2Repo repo = new LibGit2Repo(this.tracer, this.enlistment.WorkingDirectoryRoot))
7272
{
73-
targetTreeSha = catFile.GetTreeSha_CanTimeout(targetCommitSha);
74-
headTreeSha = catFile.GetTreeSha_CanTimeout("HEAD");
73+
targetTreeSha = repo.GetTreeSha(targetCommitSha);
74+
headTreeSha = repo.GetTreeSha("HEAD");
7575
}
7676

7777
this.PerformDiff(headTreeSha, targetTreeSha);

GVFS/FastFetch/Git/GitIndexGenerator.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void CreateFromHeadTree()
6969

7070
GitProcess git = new GitProcess(this.enlistment);
7171
GitProcess.Result result = git.LsTree(
72-
GVFSConstants.HeadCommitName,
72+
GVFSConstants.DotGit.HeadName,
7373
this.EnqueueEntriesFromLsTree,
7474
recursive: true,
7575
showAllTrees: false);
@@ -191,11 +191,11 @@ private class LsTreeEntry
191191

192192
public static LsTreeEntry ParseFromLsTreeLine(string line)
193193
{
194-
int blobIndex = line.IndexOf(GitCatFileProcess.BlobMarker);
194+
int blobIndex = line.IndexOf(DiffTreeResult.BlobMarker);
195195
if (blobIndex >= 0)
196196
{
197197
LsTreeEntry blobEntry = new LsTreeEntry();
198-
blobEntry.Sha = line.Substring(blobIndex + GitCatFileProcess.BlobMarker.Length, GVFSConstants.ShaStringLength);
198+
blobEntry.Sha = line.Substring(blobIndex + DiffTreeResult.BlobMarker.Length, GVFSConstants.ShaStringLength);
199199
blobEntry.Filename = GitPathConverter.ConvertPathOctetsToUtf8(line.Substring(line.LastIndexOf("\t") + 1).Trim('"'));
200200

201201
return blobEntry;

GVFS/FastFetch/GitEnlistment.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,14 @@ namespace FastFetch
88
public class GitEnlistment : Enlistment
99
{
1010
private GitEnlistment(string repoRoot, string cacheBaseUrl, string gitBinPath)
11-
: base(repoRoot, repoRoot, cacheBaseUrl, gitBinPath, gvfsHooksRoot: null)
11+
: base(
12+
repoRoot,
13+
repoRoot,
14+
Path.Combine(repoRoot, GVFSConstants.DotGit.Objects.Root),
15+
null,
16+
cacheBaseUrl,
17+
gitBinPath,
18+
gvfsHooksRoot: null)
1219
{
1320
}
1421

GVFS/FastFetch/Jobs/BatchObjectDownloadJob.cs

+4-18
Original file line numberDiff line numberDiff line change
@@ -80,30 +80,18 @@ protected override void DoWork()
8080
metadata.Add("PackId", request.PackId);
8181
metadata.Add("ActiveDownloads", this.activeDownloadCount);
8282
metadata.Add("NumberOfObjects", request.ObjectIds.Count);
83-
83+
8484
using (ITracer activity = this.tracer.StartActivity(DownloadAreaPath, EventLevel.Informational, Keywords.Telemetry, metadata))
8585
{
8686
try
8787
{
88-
RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.InvocationResult result;
89-
90-
if (request.ObjectIds.Count == 1)
91-
{
92-
result = this.objectRequestor.TryDownloadLooseObject(
93-
request.ObjectIds[0],
94-
onSuccess: (tryCount, response) => this.WriteObjectOrPack(request, tryCount, response),
95-
onFailure: RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.StandardErrorHandler(activity, DownloadAreaPath));
96-
}
97-
else
98-
{
99-
HashSet<string> successfulDownloads = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
100-
result = this.objectRequestor.TryDownloadObjects(
88+
HashSet<string> successfulDownloads = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
89+
RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.InvocationResult result = this.objectRequestor.TryDownloadObjects(
10190
() => request.ObjectIds.Except(successfulDownloads),
10291
commitDepth: 1,
10392
onSuccess: (tryCount, response) => this.WriteObjectOrPack(request, tryCount, response, successfulDownloads),
104-
onFailure: RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.StandardErrorHandler(activity, DownloadAreaPath),
93+
onFailure: RetryWrapper<GitObjectsHttpRequestor.GitObjectTaskResult>.StandardErrorHandler(activity, request.PackId, DownloadAreaPath),
10594
preferBatchedLooseObjects: true);
106-
}
10795

10896
if (!result.Succeeded)
10997
{
@@ -150,7 +138,6 @@ protected override void DoAfterWork()
150138
case GitObjectContentType.LooseObject:
151139
string sha = request.ObjectIds.First();
152140
fileName = this.gitObjects.WriteLooseObject(
153-
this.enlistment.WorkingDirectoryRoot,
154141
response.Stream,
155142
sha,
156143
bufToCopyWith);
@@ -164,7 +151,6 @@ protected override void DoAfterWork()
164151
OnLooseObject onLooseObject = (objectStream, sha1) =>
165152
{
166153
this.gitObjects.WriteLooseObject(
167-
this.enlistment.WorkingDirectoryRoot,
168154
objectStream,
169155
sha1,
170156
bufToCopyWith);

GVFS/FastFetch/Jobs/CheckoutJob.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ private void HandleAllFileDeleteOperations()
274274

275275
private void HandleAllFileAddOperations()
276276
{
277-
using (LibGit2Repo repo = new LibGit2Repo(this.tracer, this.enlistment.EnlistmentRoot))
277+
using (LibGit2Repo repo = new LibGit2Repo(this.tracer, this.enlistment.WorkingDirectoryRoot))
278278
{
279279
string availableBlob;
280280
while (this.AvailableBlobShas.TryTake(out availableBlob, millisecondsTimeout: -1))

GVFS/FastFetch/Jobs/FindMissingBlobsJob.cs

+4-11
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ public class FindMissingBlobsJob : Job
2727
private BlockingCollection<string> inputQueue;
2828

2929
private ConcurrentHashSet<string> alreadyFoundBlobIds;
30-
private ProcessPool<GitCatFileBatchCheckProcess> catFilePool;
3130

3231
public FindMissingBlobsJob(
3332
int maxParallel,
@@ -44,11 +43,6 @@ public FindMissingBlobsJob(
4443

4544
this.DownloadQueue = new BlockingCollection<string>();
4645
this.AvailableBlobs = availableBlobs;
47-
48-
this.catFilePool = new ProcessPool<GitCatFileBatchCheckProcess>(
49-
tracer,
50-
() => new GitCatFileBatchCheckProcess(this.tracer, this.enlistment),
51-
maxParallel);
5246
}
5347

5448
public BlockingCollection<string> DownloadQueue { get; }
@@ -57,11 +51,11 @@ public FindMissingBlobsJob(
5751
protected override void DoWork()
5852
{
5953
string blobId;
60-
while (this.inputQueue.TryTake(out blobId, Timeout.Infinite))
54+
using (LibGit2Repo repo = new LibGit2Repo(this.tracer, this.enlistment.WorkingDirectoryRoot))
6155
{
62-
this.catFilePool.Invoke(catFileProcess =>
56+
while (this.inputQueue.TryTake(out blobId, Timeout.Infinite))
6357
{
64-
if (!catFileProcess.ObjectExists_CanTimeout(blobId))
58+
if (!repo.ObjectExists(blobId))
6559
{
6660
Interlocked.Increment(ref this.missingBlobCount);
6761
this.DownloadQueue.Add(blobId);
@@ -71,14 +65,13 @@ protected override void DoWork()
7165
Interlocked.Increment(ref this.availableBlobCount);
7266
this.AvailableBlobs.Add(blobId);
7367
}
74-
});
68+
}
7569
}
7670
}
7771

7872
protected override void DoAfterWork()
7973
{
8074
this.DownloadQueue.CompleteAdding();
81-
this.catFilePool.Dispose();
8275

8376
EventMetadata metadata = new EventMetadata();
8477
metadata.Add("TotalMissingObjects", this.missingBlobCount);

GVFS/FastFetch/Properties/AssemblyInfo.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
[assembly: AssemblyConfiguration("")]
1010
[assembly: AssemblyCompany("")]
1111
[assembly: AssemblyProduct("FastFetch")]
12-
[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
12+
[assembly: AssemblyCopyright("Copyright © Microsoft 2017")]
1313
[assembly: AssemblyTrademark("")]
1414
[assembly: AssemblyCulture("")]
1515

0 commit comments

Comments
 (0)