示例#1
0
        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");
                }
            }
        }