private void EnqueueOperationsFromDiffTreeLine()

in GVFS/GVFS.Common/Prefetch/Git/DiffHelper.cs [243:323]


        private void EnqueueOperationsFromDiffTreeLine(ITracer activity, string line)
        {
            if (!line.StartsWith(":"))
            {
                // Diff-tree starts with metadata we can ignore.
                // Real diff lines always start with a colon
                return;
            }

            DiffTreeResult result = DiffTreeResult.ParseFromDiffTreeLine(line);
            if (!this.ShouldIncludeResult(result))
            {
                return;
            }

            if (result.Operation == DiffTreeResult.Operations.Unknown ||
                result.Operation == DiffTreeResult.Operations.Unmerged ||
                result.Operation == DiffTreeResult.Operations.CopyEdit ||
                result.Operation == DiffTreeResult.Operations.RenameEdit)
            {
                EventMetadata metadata = new EventMetadata();
                metadata.Add(nameof(result.TargetPath), result.TargetPath);
                metadata.Add(nameof(line), line);
                activity.RelatedError(metadata, "Unexpected diff operation: " + result.Operation);
                this.HasFailures = true;
                return;
            }

            // Separate and enqueue all directory operations first.
            if (result.SourceIsDirectory || result.TargetIsDirectory)
            {
                switch (result.Operation)
                {
                    case DiffTreeResult.Operations.Delete:
                        if (!this.stagedDirectoryOperations.Add(result))
                        {
                            EventMetadata metadata = new EventMetadata();
                            metadata.Add(nameof(result.TargetPath), result.TargetPath);
                            metadata.Add(TracingConstants.MessageKey.WarningMessage, "A case change was attempted. It will not be reflected in the working directory.");
                            activity.RelatedEvent(EventLevel.Warning, "CaseConflict", metadata);
                        }

                        break;
                    case DiffTreeResult.Operations.Add:
                    case DiffTreeResult.Operations.Modify:
                        if (!this.stagedDirectoryOperations.Add(result))
                        {
                            EventMetadata metadata = new EventMetadata();
                            metadata.Add(nameof(result.TargetPath), result.TargetPath);
                            metadata.Add(TracingConstants.MessageKey.WarningMessage, "A case change was attempted. It will not be reflected in the working directory.");
                            activity.RelatedEvent(EventLevel.Warning, "CaseConflict", metadata);

                            // Replace the delete with the add to make sure we don't delete a folder from under ourselves
                            this.stagedDirectoryOperations.Remove(result);
                            this.stagedDirectoryOperations.Add(result);
                        }

                        break;
                    default:
                        activity.RelatedError("Unexpected diff operation from line: {0}", line);
                        break;
                }
            }
            else
            {
                switch (result.Operation)
                {
                    case DiffTreeResult.Operations.Delete:
                        this.EnqueueFileDeleteOperation(activity, result.TargetPath);

                        break;
                    case DiffTreeResult.Operations.Modify:
                    case DiffTreeResult.Operations.Add:
                        this.EnqueueFileAddOperation(activity, result);
                        break;
                    default:
                        activity.RelatedError("Unexpected diff operation from line: {0}", line);
                        break;
                }
            }
        }