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); } }
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); } }
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); } } }