private void UpdateToAlwaysExcludeFile(RepoMetadata repoMetadata) { if (repoMetadata.GetAlwaysExcludeInvalid()) { this.FailMountAndExit("always_exclude left in a corrupt state after failed mount."); } string alwaysExcludePath = Path.Combine(this.enlistment.WorkingDirectoryRoot, GVFSConstants.DotGit.Info.AlwaysExcludePath); if (File.Exists(alwaysExcludePath)) { this.FailMountAndExit("Error migrating to " + alwaysExcludePath + ", file already exists."); } string excludePath = Path.Combine(this.enlistment.WorkingDirectoryRoot, GVFSConstants.DotGit.Info.ExcludePath); if (File.Exists(excludePath)) { try { string[] lines = File.ReadAllLines(excludePath); // To be valid, both exclude and always_exclude must be correctly written to, // and the disk layout version stored on disk must be updated. repoMetadata.SetAlwaysExcludeInvalid(true); string newAlwaysExcludeContents = string.Join("\n", lines.Where(x => !x.StartsWith(GVFSConstants.GitCommentSignString))) + "\n"; string newExcludeContents = string.Join("\n", lines.Where(x => x.StartsWith(GVFSConstants.GitCommentSignString))) + "\n"; File.WriteAllText(alwaysExcludePath, newAlwaysExcludeContents); File.WriteAllText(excludePath, newExcludeContents); } catch (Exception e) { EventMetadata metadata = new EventMetadata(); metadata.Add("Area", "Mount"); metadata.Add("alwaysExcludePath", alwaysExcludePath); metadata.Add("excludePath", excludePath); metadata.Add("Exception", e.ToString()); metadata.Add("ErrorMessage", "Failed to migrate " + excludePath + " to " + alwaysExcludePath); this.tracer.RelatedError(metadata); this.FailMountAndExit("Error migrating " + excludePath + " to " + alwaysExcludePath + ", run 'gvfs log' for details"); } } }