public static void OpenWithDifftool(this RevisionGrid grid, string fileName, DiffWithRevisionKind diffKind)
        {
            IList<GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0)
                return;

            string output;
            if (diffKind == DiffWithRevisionKind.DiffBaseLocal)
            {
                if (revisions[0].ParentGuids.Length == 0)
                    return;
                output = Settings.Module.OpenWithDifftool(fileName, revisions[0].ParentGuids[0]);

            }
            else if (diffKind == DiffWithRevisionKind.DiffRemoteLocal)
                output = Settings.Module.OpenWithDifftool(fileName, revisions[0].Guid);
            else
                if (revisions.Count == 1)   // single item selected
                {
                    if (revisions[0].Guid == GitRevision.UncommittedWorkingDirGuid) //working dir changes
                        output = Settings.Module.OpenWithDifftool(fileName);
                    else if (revisions[0].Guid == GitRevision.IndexGuid) //staged changes
                        output = Settings.Module.OpenWithDifftool(fileName, null, null, "--cached");
                    else
                        output = Settings.Module.OpenWithDifftool(fileName, revisions[0].Guid,
                                                                      revisions[0].ParentGuids[0]);
                }
                else                        // multiple items selected
                    output = Settings.Module.OpenWithDifftool(fileName, revisions[0].Guid,
                                                                  revisions[revisions.Count - 1].Guid);

            if (!string.IsNullOrEmpty(output))
                MessageBox.Show(grid, output);
        }
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, DiffWithRevisionKind diffKind)
        {
            IList<GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0)
                return;

            string output;
            if (diffKind == DiffWithRevisionKind.DiffBaseLocal)
            {
                if (revisions[0].ParentGuids.Length == 0)
                    return;
                output = Settings.Module.OpenWithDifftool(fileName, revisions[0].ParentGuids[0]);

            }
            else if (diffKind == DiffWithRevisionKind.DiffRemoteLocal)
                output = Settings.Module.OpenWithDifftool(fileName, revisions[0].Guid);
            else
            {
                string firstRevision = revisions[0].Guid;
                var secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UncommittedWorkingDirGuid)
                {
                    firstRevision = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = null;

                if (firstRevision == GitRevision.UncommittedWorkingDirGuid) //working dir changes
                {
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                    {
                        firstRevision = string.Empty;
                        secondRevision = string.Empty;
                    }
                    else
                    {
                        // rev2 vs working dir changes
                        firstRevision = secondRevision;
                        secondRevision = string.Empty;
                    }
                }
                if (firstRevision == GitRevision.IndexGuid) //index
                {
                    if (secondRevision == null)
                    {
                        firstRevision = string.Empty;
                        secondRevision = string.Empty;
                        extraDiffArgs = extraDiffArgs.Join(" ", "--cached");
                    }
                    else //rev1 vs index
                    {
                        firstRevision = secondRevision;
                        secondRevision = string.Empty;
                        extraDiffArgs = extraDiffArgs.Join(" ", "--cached");
                    }
                }

                Debug.Assert(!GitRevision.IsArtificial(firstRevision), firstRevision.Join(" ", secondRevision));

                if (secondRevision == null)
                    secondRevision = firstRevision + "^";

                output = Settings.Module.OpenWithDifftool(fileName, firstRevision, secondRevision, extraDiffArgs);
            }

            if (!string.IsNullOrEmpty(output))
                MessageBox.Show(grid, output);
        }
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, string oldFileName, DiffWithRevisionKind diffKind, string parentGuid)
        {
            IList<GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0 || revisions.Count > 2)
                return;

            string output;
            if (diffKind == DiffWithRevisionKind.DiffAB)
            {
                string firstRevision = revisions[0].Guid;
                var secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid)
                {
                    firstRevision = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = "-M -C";

                if (GitRevision.IsArtificial(firstRevision))
                {
                    bool staged = firstRevision == GitRevision.IndexGuid;
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                        firstRevision = string.Empty;
                    else
                        firstRevision = secondRevision;
                    secondRevision = string.Empty;
                    if (staged) //rev1 vs index
                        extraDiffArgs = string.Join(" ", extraDiffArgs, "--cached");
                }
                else if (secondRevision == null)
                    secondRevision = parentGuid ?? firstRevision + "^";

                output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs);
            }
            else
            {
                string revisionToCmp;
                if (revisions.Count == 1)
                {
                    GitRevision revision = revisions[0];
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                        revisionToCmp = parentGuid ?? (revision.ParentGuids.Length == 0 ? null : revision.ParentGuids[0]);
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                        revisionToCmp = revision.Guid;
                    else
                        revisionToCmp = null;
                }
                else
                {
                    switch (diffKind)
                    {
                        case DiffWithRevisionKind.DiffALocal:
                            revisionToCmp = revisions[0].Guid;
                            break;
                        case DiffWithRevisionKind.DiffBLocal:
                            revisionToCmp = revisions[1].Guid;
                            break;
                        case DiffWithRevisionKind.DiffAParentLocal:
                            revisionToCmp = revisions[0].ParentGuids.Length == 0 ? null : revisions[0].ParentGuids[0];
                            break;
                        case DiffWithRevisionKind.DiffBParentLocal:
                            revisionToCmp = revisions[1].ParentGuids.Length == 0 ? null : revisions[1].ParentGuids[0];
                            break;
                        default:
                            revisionToCmp = null;
                            break;
                    }
                }

                if (revisionToCmp == null)
                    return;

                output = grid.Module.OpenWithDifftool(fileName, null, revisionToCmp);
            }

            if (!string.IsNullOrEmpty(output))
                MessageBox.Show(grid, output);
        }
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, string oldFileName, DiffWithRevisionKind diffKind)
        {
            IList<GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0 || revisions.Count > 2)
                return;

            string output;
            if (diffKind == DiffWithRevisionKind.DiffAB)
            {
                string firstRevision = revisions[0].Guid;
                var secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid)
                {
                    firstRevision = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = "-M -C";

                if (firstRevision == GitRevision.UnstagedGuid) //working dir changes
                {
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                    {
                        firstRevision = string.Empty;
                        secondRevision = string.Empty;
                    }
                    else
                    {
                        // rev2 vs working dir changes
                        firstRevision = secondRevision;
                        secondRevision = string.Empty;
                    }
                }
                if (firstRevision == GitRevision.IndexGuid) //index
                {
                    if (secondRevision == null)
                    {
                        firstRevision = string.Empty;
                        secondRevision = string.Empty;
                        extraDiffArgs = string.Join(" ", extraDiffArgs, "--cached");
                    }
                    else //rev1 vs index
                    {
                        firstRevision = secondRevision;
                        secondRevision = string.Empty;
                        extraDiffArgs = string.Join(" ", extraDiffArgs, "--cached");
                    }
                }

                Debug.Assert(!GitRevision.IsArtificial(firstRevision), string.Join(" ", firstRevision, secondRevision));

                if (secondRevision == null)
                    secondRevision = firstRevision + "^";

                output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs);
            }
            else
            {
                string revisionToCmp;
                if (revisions.Count == 1)
                {
                    GitRevision revision = revisions[0];
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                        revisionToCmp = revision.ParentGuids.Length == 0 ? null : revision.ParentGuids[0];
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                        revisionToCmp = revision.Guid;
                    else
                        revisionToCmp = null;
                }
                else
                {
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                        revisionToCmp = revisions[0].Guid;
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                        revisionToCmp = revisions[1].Guid;
                    else if (diffKind == DiffWithRevisionKind.DiffAParentLocal)
                        revisionToCmp = revisions[0].ParentGuids.Length == 0 ? null : revisions[0].ParentGuids[0];
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                        revisionToCmp = revisions[1].ParentGuids.Length == 0 ? null : revisions[1].ParentGuids[0];
                    else
                        revisionToCmp = null;
                }

                if (revisionToCmp == null)
                    return;

                output = grid.Module.OpenWithDifftool(fileName, revisionToCmp);
            }

            if (!string.IsNullOrEmpty(output))
                MessageBox.Show(grid, output);
        }
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, string oldFileName, DiffWithRevisionKind diffKind, string parentGuid)
        {
            IList <GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0 || revisions.Count > 2)
            {
                return;
            }

            string output;

            if (diffKind == DiffWithRevisionKind.DiffAB)
            {
                string firstRevision  = revisions[0].Guid;
                var    secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid)
                {
                    firstRevision  = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = "-M -C";

                if (GitRevision.IsArtificial(firstRevision))
                {
                    bool staged = firstRevision == GitRevision.IndexGuid;
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                    {
                        firstRevision = string.Empty;
                    }
                    else
                    {
                        firstRevision = secondRevision;
                    }
                    secondRevision = string.Empty;
                    if (staged) //rev1 vs index
                    {
                        extraDiffArgs = string.Join(" ", extraDiffArgs, "--cached");
                    }
                }
                else if (secondRevision == null)
                {
                    secondRevision = parentGuid ?? firstRevision + "^";
                }

                output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs);
            }
            else
            {
                string revisionToCmp;
                if (revisions.Count == 1)
                {
                    GitRevision revision = revisions[0];
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                    {
                        revisionToCmp = parentGuid ?? revision.FirstParentGuid ?? revision.Guid + '^';
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                    {
                        revisionToCmp = revision.Guid;
                    }
                    else
                    {
                        revisionToCmp = null;
                    }
                }
                else
                {
                    switch (diffKind)
                    {
                    case DiffWithRevisionKind.DiffALocal:
                        revisionToCmp = revisions[1].Guid;
                        break;

                    case DiffWithRevisionKind.DiffBLocal:
                        revisionToCmp = revisions[0].Guid;
                        break;

                    case DiffWithRevisionKind.DiffAParentLocal:
                        revisionToCmp = revisions[1].FirstParentGuid ?? revisions[1].Guid + '^';
                        break;

                    case DiffWithRevisionKind.DiffBParentLocal:
                        revisionToCmp = revisions[0].FirstParentGuid ?? revisions[0].Guid + '^';
                        break;

                    default:
                        revisionToCmp = null;
                        break;
                    }
                }

                if (revisionToCmp == null)
                {
                    return;
                }

                output = grid.Module.OpenWithDifftool(fileName, null, revisionToCmp);
            }

            if (!string.IsNullOrEmpty(output))
            {
                MessageBox.Show(grid, output);
            }
        }
Beispiel #6
0
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, DiffWithRevisionKind diffKind)
        {
            IList <GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0)
            {
                return;
            }

            string output;

            if (diffKind == DiffWithRevisionKind.DiffBaseLocal)
            {
                if (revisions[0].ParentGuids.Length == 0)
                {
                    return;
                }
                output = GitModule.Current.OpenWithDifftool(fileName, revisions[0].ParentGuids[0]);
            }
            else if (diffKind == DiffWithRevisionKind.DiffRemoteLocal)
            {
                output = GitModule.Current.OpenWithDifftool(fileName, revisions[0].Guid);
            }
            else
            {
                string firstRevision  = revisions[0].Guid;
                var    secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UncommittedWorkingDirGuid)
                {
                    firstRevision  = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = null;

                if (firstRevision == GitRevision.UncommittedWorkingDirGuid) //working dir changes
                {
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                    {
                        firstRevision  = string.Empty;
                        secondRevision = string.Empty;
                    }
                    else
                    {
                        // rev2 vs working dir changes
                        firstRevision  = secondRevision;
                        secondRevision = string.Empty;
                    }
                }
                if (firstRevision == GitRevision.IndexGuid) //index
                {
                    if (secondRevision == null)
                    {
                        firstRevision  = string.Empty;
                        secondRevision = string.Empty;
                        extraDiffArgs  = string.Join(" ", extraDiffArgs, "--cached");
                    }
                    else //rev1 vs index
                    {
                        firstRevision  = secondRevision;
                        secondRevision = string.Empty;
                        extraDiffArgs  = string.Join(" ", extraDiffArgs, "--cached");
                    }
                }

                Debug.Assert(!GitRevision.IsArtificial(firstRevision), string.Join(" ", firstRevision, secondRevision));

                if (secondRevision == null)
                {
                    secondRevision = firstRevision + "^";
                }

                output = GitModule.Current.OpenWithDifftool(fileName, firstRevision, secondRevision, extraDiffArgs);
            }

            if (!string.IsNullOrEmpty(output))
            {
                MessageBox.Show(grid, output);
            }
        }
Beispiel #7
0
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, string oldFileName, DiffWithRevisionKind diffKind)
        {
            IList <GitRevision> revisions = grid.GetSelectedRevisions();

            if (revisions.Count == 0 || revisions.Count > 2)
            {
                return;
            }

            string output;

            if (diffKind == DiffWithRevisionKind.DiffAB)
            {
                string firstRevision  = revisions[0].Guid;
                var    secondRevision = revisions.Count == 2 ? revisions[1].Guid : null;

                //to simplify if-ology
                if (GitRevision.IsArtificial(secondRevision) && firstRevision != GitRevision.UnstagedGuid)
                {
                    firstRevision  = secondRevision;
                    secondRevision = revisions[0].Guid;
                }

                string extraDiffArgs = "-M -C";

                if (firstRevision == GitRevision.UnstagedGuid) //working dir changes
                {
                    if (secondRevision == null || secondRevision == GitRevision.IndexGuid)
                    {
                        firstRevision  = string.Empty;
                        secondRevision = string.Empty;
                    }
                    else
                    {
                        // rev2 vs working dir changes
                        firstRevision  = secondRevision;
                        secondRevision = string.Empty;
                    }
                }
                if (firstRevision == GitRevision.IndexGuid) //index
                {
                    if (secondRevision == null)
                    {
                        firstRevision  = string.Empty;
                        secondRevision = string.Empty;
                        extraDiffArgs  = string.Join(" ", extraDiffArgs, "--cached");
                    }
                    else //rev1 vs index
                    {
                        firstRevision  = secondRevision;
                        secondRevision = string.Empty;
                        extraDiffArgs  = string.Join(" ", extraDiffArgs, "--cached");
                    }
                }

                Debug.Assert(!GitRevision.IsArtificial(firstRevision), string.Join(" ", firstRevision, secondRevision));

                if (secondRevision == null)
                {
                    secondRevision = firstRevision + "^";
                }

                output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs);
            }
            else
            {
                string revisionToCmp;
                if (revisions.Count == 1)
                {
                    GitRevision revision = revisions[0];
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                    {
                        revisionToCmp = revision.ParentGuids.Length == 0 ? null : revision.ParentGuids[0];
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                    {
                        revisionToCmp = revision.Guid;
                    }
                    else
                    {
                        revisionToCmp = null;
                    }
                }
                else
                {
                    if (diffKind == DiffWithRevisionKind.DiffALocal)
                    {
                        revisionToCmp = revisions[0].Guid;
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                    {
                        revisionToCmp = revisions[1].Guid;
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffAParentLocal)
                    {
                        revisionToCmp = revisions[0].ParentGuids.Length == 0 ? null : revisions[0].ParentGuids[0];
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffBLocal)
                    {
                        revisionToCmp = revisions[1].ParentGuids.Length == 0 ? null : revisions[1].ParentGuids[0];
                    }
                    else
                    {
                        revisionToCmp = null;
                    }
                }

                if (revisionToCmp == null)
                {
                    return;
                }

                output = grid.Module.OpenWithDifftool(fileName, revisionToCmp);
            }

            if (!string.IsNullOrEmpty(output))
            {
                MessageBox.Show(grid, output);
            }
        }
            /// <summary>
            /// One row selected:
            /// B - Selected row
            /// A - B's parent
            ///
            /// Two rows selected:
            /// A - first selected row
            /// B - second selected row
            /// </summary>
            public static string Get(IList <GitRevision> revisions, DiffWithRevisionKind diffKind,
                                     out string extraDiffArgs, out string firstRevision, out string secondRevision)
            {
                //Note: Order in revisions is that first clicked is last in array
                string error = "";

                //Detect rename and copy
                extraDiffArgs = "-M -C";

                if (revisions == null)
                {
                    error          = "Unexpected null revision argument to difftool";
                    firstRevision  = null;
                    secondRevision = null;
                }
                else if (revisions.Count == 0 || revisions.Count > 2)
                {
                    error          = "Unexpected number of arguments to difftool: " + revisions.Count;
                    firstRevision  = null;
                    secondRevision = null;
                }
                else if (revisions[0] == null || revisions.Count > 1 && revisions[1] == null)
                {
                    error          = "Unexpected single null argument to difftool";
                    firstRevision  = null;
                    secondRevision = null;
                }
                else if (diffKind == DiffWithRevisionKind.DiffAB)
                {
                    if (revisions.Count == 1)
                    {
                        firstRevision = revisions[0].FirstParentGuid ?? revisions[0].Guid + '^';
                    }
                    else
                    {
                        firstRevision = revisions[1].Guid;
                    }
                    secondRevision = revisions[0].Guid;
                }
                else
                {
                    //Second revision is always local
                    secondRevision = null;

                    if (diffKind == DiffWithRevisionKind.DiffBLocal)
                    {
                        firstRevision = revisions[0].Guid;
                    }
                    else if (diffKind == DiffWithRevisionKind.DiffBParentLocal)
                    {
                        firstRevision = revisions[0].FirstParentGuid ?? revisions[0].Guid + '^';
                    }
                    else
                    {
                        firstRevision = revisions[0].Guid;
                        if (revisions.Count == 1)
                        {
                            if (diffKind == DiffWithRevisionKind.DiffALocal)
                            {
                                firstRevision = revisions[0].FirstParentGuid ?? revisions[0].Guid + '^';
                            }
                            else if (diffKind == DiffWithRevisionKind.DiffAParentLocal)
                            {
                                firstRevision = (revisions[0].FirstParentGuid ?? revisions[0].Guid + '^') + "^";
                            }
                            else
                            {
                                error = "Unexpected arg to difftool with one revision: " + diffKind;
                            }
                        }
                        else
                        {
                            if (diffKind == DiffWithRevisionKind.DiffALocal)
                            {
                                firstRevision = revisions[1].Guid;
                            }
                            else if (diffKind == DiffWithRevisionKind.DiffAParentLocal)
                            {
                                firstRevision = revisions[1].FirstParentGuid ?? revisions[1].Guid + '^';
                            }
                            else
                            {
                                error = "Unexpected arg to difftool with two revisions: " + diffKind;
                            }
                        }
                    }
                }
                return(error);
            }
        public static void OpenWithDifftool(this RevisionGrid grid, string fileName, string oldFileName, DiffWithRevisionKind diffKind)
        {
            //Note: Order in revisions is that first clicked is last in array
            string extraDiffArgs;
            string firstRevision;
            string secondRevision;

            string error = DiffKindRevision.Get(grid.GetSelectedRevisions(), diffKind, out extraDiffArgs, out firstRevision, out secondRevision);

            if (!string.IsNullOrEmpty(error))
            {
                MessageBox.Show(grid, error);
            }
            else
            {
                string output = grid.Module.OpenWithDifftool(fileName, oldFileName, firstRevision, secondRevision, extraDiffArgs);
                if (!string.IsNullOrEmpty(output))
                {
                    MessageBox.Show(grid, output);
                }
            }
        }