diff --git a/GitCommands/Git/GitCommandHelpers.cs b/GitCommands/Git/GitCommandHelpers.cs
index 17382be8213..fe51752a997 100644
--- a/GitCommands/Git/GitCommandHelpers.cs
+++ b/GitCommands/Git/GitCommandHelpers.cs
@@ -427,24 +427,43 @@ public static ArgumentString StopBisectCmd()
return new GitArgumentBuilder("bisect") { "reset" };
}
- public static ArgumentString RebaseCmd(string branch, bool interactive, bool preserveMerges, bool autosquash, bool autoStash, string from = null, string onto = null)
+ public static ArgumentString RebaseCmd(
+ string branch, bool interactive, bool preserveMerges, bool autosquash, bool autoStash, bool ignoreDate, bool committerDateIsAuthorDate, string from = null, string onto = null)
{
if (from == null ^ onto == null)
{
throw new ArgumentException($"For arguments \"{nameof(from)}\" and \"{nameof(onto)}\", either both must have values, or neither may.");
}
- return new GitArgumentBuilder("rebase")
+ var builder = new GitArgumentBuilder("rebase");
+ if (ignoreDate)
{
- { interactive, "-i" },
- { interactive && autosquash, "--autosquash" },
- { interactive && !autosquash, "--no-autosquash" },
- { preserveMerges, GitVersion.Current.SupportRebaseMerges ? "--rebase-merges" : "--preserve-merges" },
- { autoStash, "--autostash" },
- from.QuoteNE(),
- branch.Quote(),
- { onto != null, $"--onto {onto}" }
- };
+ builder.Add("--ignore-date");
+ }
+ else if (committerDateIsAuthorDate)
+ {
+ builder.Add("--committer-date-is-author-date");
+ }
+ else
+ {
+ if (interactive)
+ {
+ builder.Add("-i");
+ builder.Add(autosquash ? "--autosquash" : "--no-autosquash");
+ }
+
+ if (preserveMerges)
+ {
+ builder.Add(GitVersion.Current.SupportRebaseMerges ? "--rebase-merges" : "--preserve-merges");
+ }
+ }
+
+ builder.Add(autoStash, "--autostash");
+ builder.Add(from.QuoteNE());
+ builder.Add(branch.Quote());
+ builder.Add(onto != null, $"--onto {onto}");
+
+ return builder;
}
public static ArgumentString AbortRebaseCmd()
diff --git a/GitUI/CommandsDialogs/FormRebase.Designer.cs b/GitUI/CommandsDialogs/FormRebase.Designer.cs
index f5bad9a0375..1d2c957b20e 100644
--- a/GitUI/CommandsDialogs/FormRebase.Designer.cs
+++ b/GitUI/CommandsDialogs/FormRebase.Designer.cs
@@ -28,6 +28,7 @@ protected override void Dispose(bool disposing)
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
this.label1 = new System.Windows.Forms.Label();
this.lblCurrent = new System.Windows.Forms.Label();
this.Branches = new System.Windows.Forms.ComboBox();
@@ -45,6 +46,8 @@ private void InitializeComponent()
this.chkPreserveMerges = new System.Windows.Forms.CheckBox();
this.chkAutosquash = new System.Windows.Forms.CheckBox();
this.chkStash = new System.Windows.Forms.CheckBox();
+ this.chkIgnoreDate = new System.Windows.Forms.CheckBox();
+ this.chkCommitterDateIsAuthorDate = new System.Windows.Forms.CheckBox();
this.flowLayoutPanel5 = new System.Windows.Forms.FlowLayoutPanel();
this.chkSpecificRange = new System.Windows.Forms.CheckBox();
this.lblRangeFrom = new System.Windows.Forms.Label();
@@ -65,10 +68,11 @@ private void InitializeComponent()
this.Ok = new System.Windows.Forms.Button();
this.panel2 = new System.Windows.Forms.Panel();
this.panel3 = new System.Windows.Forms.Panel();
+ this.Commit = new System.Windows.Forms.Button();
this.panel4 = new System.Windows.Forms.Panel();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.rebasePanel = new System.Windows.Forms.FlowLayoutPanel();
- this.Commit = new System.Windows.Forms.Button();
+ this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.flowLayoutPanel2.SuspendLayout();
this.OptionsPanel.SuspendLayout();
this.flowLayoutPanel4.SuspendLayout();
@@ -86,7 +90,7 @@ private void InitializeComponent()
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(3, 0);
this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(305, 19);
+ this.label1.Size = new System.Drawing.Size(236, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Rebase current branch on top of another branch";
//
@@ -96,7 +100,7 @@ private void InitializeComponent()
this.lblCurrent.AutoSize = true;
this.lblCurrent.Location = new System.Drawing.Point(3, 5);
this.lblCurrent.Name = "lblCurrent";
- this.lblCurrent.Size = new System.Drawing.Size(105, 19);
+ this.lblCurrent.Size = new System.Drawing.Size(80, 13);
this.lblCurrent.TabIndex = 2;
this.lblCurrent.Text = "Current branch:";
//
@@ -106,18 +110,18 @@ private void InitializeComponent()
this.Branches.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.Branches.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.Branches.FormattingEnabled = true;
- this.Branches.Location = new System.Drawing.Point(81, 3);
+ this.Branches.Location = new System.Drawing.Point(68, 3);
this.Branches.Name = "Branches";
- this.Branches.Size = new System.Drawing.Size(218, 27);
+ this.Branches.Size = new System.Drawing.Size(218, 21);
this.Branches.TabIndex = 6;
//
// label2
//
this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(3, 4);
+ this.label2.Location = new System.Drawing.Point(3, 7);
this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(72, 19);
+ this.label2.Size = new System.Drawing.Size(59, 13);
this.label2.TabIndex = 5;
this.label2.Text = "Rebase on";
//
@@ -177,11 +181,11 @@ private void InitializeComponent()
this.flowLayoutPanel2.Controls.Add(this.lblCurrent);
this.flowLayoutPanel2.Controls.Add(this.Currentbranch);
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
- this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 19);
+ this.flowLayoutPanel2.Location = new System.Drawing.Point(0, 13);
this.flowLayoutPanel2.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
this.flowLayoutPanel2.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5);
- this.flowLayoutPanel2.Size = new System.Drawing.Size(509, 29);
+ this.flowLayoutPanel2.Size = new System.Drawing.Size(684, 23);
this.flowLayoutPanel2.TabIndex = 31;
this.flowLayoutPanel2.WrapContents = false;
//
@@ -189,9 +193,9 @@ private void InitializeComponent()
//
this.Currentbranch.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.Currentbranch.AutoSize = true;
- this.Currentbranch.Location = new System.Drawing.Point(114, 5);
+ this.Currentbranch.Location = new System.Drawing.Point(89, 5);
this.Currentbranch.Name = "Currentbranch";
- this.Currentbranch.Size = new System.Drawing.Size(0, 19);
+ this.Currentbranch.Size = new System.Drawing.Size(0, 13);
this.Currentbranch.TabIndex = 3;
//
// OptionsPanel
@@ -201,12 +205,12 @@ private void InitializeComponent()
this.OptionsPanel.Controls.Add(this.flowLayoutPanel4, 0, 0);
this.OptionsPanel.Controls.Add(this.flowLayoutPanel5, 0, 1);
this.OptionsPanel.Dock = System.Windows.Forms.DockStyle.Fill;
- this.OptionsPanel.Location = new System.Drawing.Point(3, 84);
+ this.OptionsPanel.Location = new System.Drawing.Point(3, 72);
this.OptionsPanel.Name = "OptionsPanel";
this.OptionsPanel.RowCount = 2;
this.OptionsPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.OptionsPanel.RowStyles.Add(new System.Windows.Forms.RowStyle());
- this.OptionsPanel.Size = new System.Drawing.Size(503, 72);
+ this.OptionsPanel.Size = new System.Drawing.Size(678, 72);
this.OptionsPanel.TabIndex = 30;
this.OptionsPanel.Visible = false;
//
@@ -216,10 +220,12 @@ private void InitializeComponent()
this.flowLayoutPanel4.Controls.Add(this.chkPreserveMerges);
this.flowLayoutPanel4.Controls.Add(this.chkAutosquash);
this.flowLayoutPanel4.Controls.Add(this.chkStash);
+ this.flowLayoutPanel4.Controls.Add(this.chkIgnoreDate);
+ this.flowLayoutPanel4.Controls.Add(this.chkCommitterDateIsAuthorDate);
this.flowLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel4.Location = new System.Drawing.Point(3, 3);
this.flowLayoutPanel4.Name = "flowLayoutPanel4";
- this.flowLayoutPanel4.Size = new System.Drawing.Size(497, 25);
+ this.flowLayoutPanel4.Size = new System.Drawing.Size(672, 25);
this.flowLayoutPanel4.TabIndex = 0;
this.flowLayoutPanel4.WrapContents = false;
//
@@ -229,32 +235,31 @@ private void InitializeComponent()
this.chkInteractive.AutoSize = true;
this.chkInteractive.Location = new System.Drawing.Point(3, 3);
this.chkInteractive.Name = "chkInteractive";
- this.chkInteractive.Size = new System.Drawing.Size(139, 23);
+ this.chkInteractive.Size = new System.Drawing.Size(116, 17);
this.chkInteractive.TabIndex = 7;
this.chkInteractive.Text = "Interactive Rebase";
this.chkInteractive.UseVisualStyleBackColor = true;
- this.chkInteractive.Click += new System.EventHandler(this.InteractiveRebaseClick);
+ this.chkInteractive.CheckedChanged += new System.EventHandler(this.chkInteractive_CheckedChanged);
//
// chkPreserveMerges
//
this.chkPreserveMerges.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.chkPreserveMerges.AutoSize = true;
- this.chkPreserveMerges.Location = new System.Drawing.Point(148, 3);
+ this.chkPreserveMerges.Location = new System.Drawing.Point(125, 3);
this.chkPreserveMerges.Name = "chkPreserveMerges";
- this.chkPreserveMerges.Size = new System.Drawing.Size(130, 23);
+ this.chkPreserveMerges.Size = new System.Drawing.Size(106, 17);
this.chkPreserveMerges.TabIndex = 7;
this.chkPreserveMerges.Text = "Preserve Merges";
this.chkPreserveMerges.UseVisualStyleBackColor = true;
- this.chkPreserveMerges.Click += new System.EventHandler(this.InteractiveRebaseClick);
//
// chkAutosquash
//
this.chkAutosquash.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.chkAutosquash.AutoSize = true;
this.chkAutosquash.Enabled = false;
- this.chkAutosquash.Location = new System.Drawing.Point(284, 3);
+ this.chkAutosquash.Location = new System.Drawing.Point(237, 3);
this.chkAutosquash.Name = "chkAutosquash";
- this.chkAutosquash.Size = new System.Drawing.Size(101, 23);
+ this.chkAutosquash.Size = new System.Drawing.Size(82, 17);
this.chkAutosquash.TabIndex = 7;
this.chkAutosquash.Text = "Autosquash";
this.chkAutosquash.UseVisualStyleBackColor = true;
@@ -264,13 +269,39 @@ private void InitializeComponent()
this.chkStash.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.chkStash.AutoSize = true;
this.chkStash.Enabled = false;
- this.chkStash.Location = new System.Drawing.Point(343, 3);
+ this.chkStash.Location = new System.Drawing.Point(325, 3);
this.chkStash.Name = "chkStash";
- this.chkStash.Size = new System.Drawing.Size(54, 19);
+ this.chkStash.Size = new System.Drawing.Size(76, 17);
this.chkStash.TabIndex = 8;
this.chkStash.Text = "Auto stash";
this.chkStash.UseVisualStyleBackColor = true;
//
+ // chkIgnoreDate
+ //
+ this.chkIgnoreDate.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.chkIgnoreDate.AutoSize = true;
+ this.chkIgnoreDate.Location = new System.Drawing.Point(407, 3);
+ this.chkIgnoreDate.Name = "chkIgnoreDate";
+ this.chkIgnoreDate.Size = new System.Drawing.Size(80, 17);
+ this.chkIgnoreDate.TabIndex = 9;
+ this.chkIgnoreDate.Text = "Ignore date";
+ this.toolTip1.SetToolTip(this.chkIgnoreDate, "Changes the author dates of the commits in this branch\r\ninto the commit dates.");
+ this.chkIgnoreDate.UseVisualStyleBackColor = true;
+ this.chkIgnoreDate.CheckedChanged += new System.EventHandler(this.chkIgnoreDate_CheckedChanged);
+ //
+ // chkCommitterDateIsAuthorDate
+ //
+ this.chkCommitterDateIsAuthorDate.Anchor = System.Windows.Forms.AnchorStyles.Left;
+ this.chkCommitterDateIsAuthorDate.AutoSize = true;
+ this.chkCommitterDateIsAuthorDate.Location = new System.Drawing.Point(493, 3);
+ this.chkCommitterDateIsAuthorDate.Name = "chkCommitterDateIsAuthorDate";
+ this.chkCommitterDateIsAuthorDate.Size = new System.Drawing.Size(163, 17);
+ this.chkCommitterDateIsAuthorDate.TabIndex = 10;
+ this.chkCommitterDateIsAuthorDate.Text = "Committer date is author date";
+ this.toolTip1.SetToolTip(this.chkCommitterDateIsAuthorDate, "Changes the committer dates of the commits in this branch\r\ninto the author dates.");
+ this.chkCommitterDateIsAuthorDate.UseVisualStyleBackColor = true;
+ this.chkCommitterDateIsAuthorDate.CheckedChanged += new System.EventHandler(this.chkCommitterDateIsAuthorDate_CheckedChanged);
+ //
// flowLayoutPanel5
//
this.flowLayoutPanel5.AutoSize = true;
@@ -283,7 +314,7 @@ private void InitializeComponent()
this.flowLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel5.Location = new System.Drawing.Point(3, 34);
this.flowLayoutPanel5.Name = "flowLayoutPanel5";
- this.flowLayoutPanel5.Size = new System.Drawing.Size(497, 35);
+ this.flowLayoutPanel5.Size = new System.Drawing.Size(672, 35);
this.flowLayoutPanel5.TabIndex = 1;
this.flowLayoutPanel5.WrapContents = false;
//
@@ -291,9 +322,9 @@ private void InitializeComponent()
//
this.chkSpecificRange.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.chkSpecificRange.AutoSize = true;
- this.chkSpecificRange.Location = new System.Drawing.Point(3, 4);
+ this.chkSpecificRange.Location = new System.Drawing.Point(3, 6);
this.chkSpecificRange.Name = "chkSpecificRange";
- this.chkSpecificRange.Size = new System.Drawing.Size(111, 23);
+ this.chkSpecificRange.Size = new System.Drawing.Size(94, 17);
this.chkSpecificRange.TabIndex = 12;
this.chkSpecificRange.Text = "Specific range";
this.chkSpecificRange.UseVisualStyleBackColor = true;
@@ -303,9 +334,9 @@ private void InitializeComponent()
//
this.lblRangeFrom.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRangeFrom.AutoSize = true;
- this.lblRangeFrom.Location = new System.Drawing.Point(120, 6);
+ this.lblRangeFrom.Location = new System.Drawing.Point(103, 8);
this.lblRangeFrom.Name = "lblRangeFrom";
- this.lblRangeFrom.Size = new System.Drawing.Size(75, 19);
+ this.lblRangeFrom.Size = new System.Drawing.Size(59, 13);
this.lblRangeFrom.TabIndex = 9;
this.lblRangeFrom.Text = "From (exc.)";
//
@@ -313,9 +344,9 @@ private void InitializeComponent()
//
this.txtFrom.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.txtFrom.Enabled = false;
- this.txtFrom.Location = new System.Drawing.Point(201, 3);
+ this.txtFrom.Location = new System.Drawing.Point(168, 5);
this.txtFrom.Name = "txtFrom";
- this.txtFrom.Size = new System.Drawing.Size(80, 26);
+ this.txtFrom.Size = new System.Drawing.Size(80, 20);
this.txtFrom.TabIndex = 8;
//
// btnChooseFromRevision
@@ -323,7 +354,7 @@ private void InitializeComponent()
this.btnChooseFromRevision.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.btnChooseFromRevision.Enabled = false;
this.btnChooseFromRevision.Image = global::GitUI.Properties.Images.SelectRevision;
- this.btnChooseFromRevision.Location = new System.Drawing.Point(287, 4);
+ this.btnChooseFromRevision.Location = new System.Drawing.Point(254, 3);
this.btnChooseFromRevision.Name = "btnChooseFromRevision";
this.btnChooseFromRevision.Size = new System.Drawing.Size(25, 24);
this.btnChooseFromRevision.TabIndex = 30;
@@ -334,9 +365,9 @@ private void InitializeComponent()
//
this.lblRangeTo.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblRangeTo.AutoSize = true;
- this.lblRangeTo.Location = new System.Drawing.Point(318, 6);
+ this.lblRangeTo.Location = new System.Drawing.Point(285, 8);
this.lblRangeTo.Name = "lblRangeTo";
- this.lblRangeTo.Size = new System.Drawing.Size(24, 19);
+ this.lblRangeTo.Size = new System.Drawing.Size(20, 13);
this.lblRangeTo.TabIndex = 11;
this.lblRangeTo.Text = "To";
//
@@ -347,18 +378,18 @@ private void InitializeComponent()
this.cboTo.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.cboTo.Enabled = false;
this.cboTo.FormattingEnabled = true;
- this.cboTo.Location = new System.Drawing.Point(348, 5);
+ this.cboTo.Location = new System.Drawing.Point(311, 4);
this.cboTo.Name = "cboTo";
- this.cboTo.Size = new System.Drawing.Size(184, 27);
+ this.cboTo.Size = new System.Drawing.Size(184, 21);
this.cboTo.TabIndex = 29;
//
// ShowOptions
//
this.ShowOptions.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.ShowOptions.AutoSize = true;
- this.ShowOptions.Location = new System.Drawing.Point(305, 4);
+ this.ShowOptions.Location = new System.Drawing.Point(292, 7);
this.ShowOptions.Name = "ShowOptions";
- this.ShowOptions.Size = new System.Drawing.Size(92, 19);
+ this.ShowOptions.Size = new System.Drawing.Size(71, 13);
this.ShowOptions.TabIndex = 27;
this.ShowOptions.TabStop = true;
this.ShowOptions.Text = "Show options";
@@ -367,19 +398,19 @@ private void InitializeComponent()
// patchGrid1
//
this.patchGrid1.Dock = System.Windows.Forms.DockStyle.Fill;
- this.patchGrid1.Location = new System.Drawing.Point(3, 190);
+ this.patchGrid1.Location = new System.Drawing.Point(3, 172);
this.patchGrid1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.patchGrid1.Name = "patchGrid1";
- this.patchGrid1.Size = new System.Drawing.Size(503, 274);
+ this.patchGrid1.Size = new System.Drawing.Size(678, 292);
this.patchGrid1.TabIndex = 16;
//
// label3
//
this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(3, 159);
+ this.label3.Location = new System.Drawing.Point(3, 147);
this.label3.Name = "label3";
this.label3.Padding = new System.Windows.Forms.Padding(0, 10, 0, 0);
- this.label3.Size = new System.Drawing.Size(139, 29);
+ this.label3.Size = new System.Drawing.Size(101, 23);
this.label3.TabIndex = 0;
this.label3.Text = "Commits to re-apply:";
//
@@ -429,7 +460,7 @@ private void InitializeComponent()
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 472F));
- this.tableLayoutPanel1.Size = new System.Drawing.Size(984, 472);
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(1159, 472);
this.tableLayoutPanel1.TabIndex = 19;
//
// helpImageDisplayUserControl1
@@ -445,7 +476,7 @@ private void InitializeComponent()
this.helpImageDisplayUserControl1.IsOnHoverShowImage2 = false;
this.helpImageDisplayUserControl1.IsOnHoverShowImage2NoticeText = "Hover to see scenario when fast forward is possible.";
this.helpImageDisplayUserControl1.Location = new System.Drawing.Point(3, 3);
- this.helpImageDisplayUserControl1.MinimumSize = new System.Drawing.Size(289, 422);
+ this.helpImageDisplayUserControl1.MinimumSize = new System.Drawing.Size(289, 418);
this.helpImageDisplayUserControl1.Name = "helpImageDisplayUserControl1";
this.helpImageDisplayUserControl1.Size = new System.Drawing.Size(289, 466);
this.helpImageDisplayUserControl1.TabIndex = 20;
@@ -468,7 +499,7 @@ private void InitializeComponent()
this.flowLayoutPanel1.Controls.Add(this.SolveMergeconflicts);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
- this.flowLayoutPanel1.Location = new System.Drawing.Point(813, 3);
+ this.flowLayoutPanel1.Location = new System.Drawing.Point(988, 3);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(168, 466);
this.flowLayoutPanel1.TabIndex = 1;
@@ -505,6 +536,16 @@ private void InitializeComponent()
this.panel3.Size = new System.Drawing.Size(10, 15);
this.panel3.TabIndex = 21;
//
+ // Commit
+ //
+ this.Commit.Location = new System.Drawing.Point(3, 198);
+ this.Commit.Name = "Commit";
+ this.Commit.Size = new System.Drawing.Size(162, 25);
+ this.Commit.TabIndex = 23;
+ this.Commit.Text = "Commit...";
+ this.Commit.UseVisualStyleBackColor = true;
+ this.Commit.Click += new System.EventHandler(this.Commit_Click);
+ //
// panel4
//
this.panel4.Location = new System.Drawing.Point(3, 229);
@@ -532,7 +573,7 @@ private void InitializeComponent()
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
- this.tableLayoutPanel3.Size = new System.Drawing.Size(509, 466);
+ this.tableLayoutPanel3.Size = new System.Drawing.Size(684, 466);
this.tableLayoutPanel3.TabIndex = 32;
//
// rebasePanel
@@ -542,30 +583,20 @@ private void InitializeComponent()
this.rebasePanel.Controls.Add(this.Branches);
this.rebasePanel.Controls.Add(this.ShowOptions);
this.rebasePanel.Dock = System.Windows.Forms.DockStyle.Fill;
- this.rebasePanel.Location = new System.Drawing.Point(3, 51);
+ this.rebasePanel.Location = new System.Drawing.Point(3, 39);
this.rebasePanel.Name = "rebasePanel";
- this.rebasePanel.Size = new System.Drawing.Size(503, 27);
+ this.rebasePanel.Size = new System.Drawing.Size(678, 27);
this.rebasePanel.TabIndex = 32;
//
- // Commit
- //
- this.Commit.Location = new System.Drawing.Point(3, 198);
- this.Commit.Name = "Commit";
- this.Commit.Size = new System.Drawing.Size(162, 25);
- this.Commit.TabIndex = 23;
- this.Commit.Text = "Commit...";
- this.Commit.UseVisualStyleBackColor = true;
- this.Commit.Click += new System.EventHandler(this.CommitButtonClick);
- //
// FormRebase
//
this.AcceptButton = this.Ok;
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
- this.ClientSize = new System.Drawing.Size(984, 472);
+ this.ClientSize = new System.Drawing.Size(1159, 472);
this.Controls.Add(this.tableLayoutPanel1);
- this.MinimumSize = new System.Drawing.Size(1000, 510);
+ this.MinimumSize = new System.Drawing.Size(1175, 510);
this.Name = "FormRebase";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Rebase";
@@ -634,5 +665,8 @@ private void InitializeComponent()
private Help.HelpImageDisplayUserControl helpImageDisplayUserControl1;
private System.Windows.Forms.CheckBox chkStash;
private System.Windows.Forms.Button Commit;
+ private System.Windows.Forms.CheckBox chkIgnoreDate;
+ private System.Windows.Forms.ToolTip toolTip1;
+ private System.Windows.Forms.CheckBox chkCommitterDateIsAuthorDate;
}
-}
\ No newline at end of file
+}
diff --git a/GitUI/CommandsDialogs/FormRebase.cs b/GitUI/CommandsDialogs/FormRebase.cs
index 97e878f7995..8828a1e38a7 100644
--- a/GitUI/CommandsDialogs/FormRebase.cs
+++ b/GitUI/CommandsDialogs/FormRebase.cs
@@ -177,11 +177,30 @@ private void MergetoolClick(object sender, EventArgs e)
EnableButtons();
}
- private void InteractiveRebaseClick(object sender, EventArgs e)
+ private void chkInteractive_CheckedChanged(object sender, EventArgs e)
{
chkAutosquash.Enabled = chkInteractive.Checked;
}
+ private void chkIgnoreDate_CheckedChanged(object sender, EventArgs e)
+ {
+ ToggleDateCheckboxMutualExclusions();
+ }
+
+ private void chkCommitterDateIsAuthorDate_CheckedChanged(object sender, EventArgs e)
+ {
+ ToggleDateCheckboxMutualExclusions();
+ }
+
+ private void ToggleDateCheckboxMutualExclusions()
+ {
+ chkCommitterDateIsAuthorDate.Enabled = !chkIgnoreDate.Checked;
+ chkIgnoreDate.Enabled = !chkCommitterDateIsAuthorDate.Checked;
+ chkInteractive.Enabled = !chkIgnoreDate.Checked && !chkCommitterDateIsAuthorDate.Checked;
+ chkPreserveMerges.Enabled = !chkIgnoreDate.Checked && !chkCommitterDateIsAuthorDate.Checked;
+ chkAutosquash.Enabled = chkInteractive.Checked && !chkIgnoreDate.Checked && !chkCommitterDateIsAuthorDate.Checked;
+ }
+
private void AddFilesClick(object sender, EventArgs e)
{
UICommands.StartAddFilesDialog(this);
@@ -259,13 +278,13 @@ private void OkClick(object sender, EventArgs e)
{
rebaseCmd = GitCommandHelpers.RebaseCmd(
cboTo.Text, chkInteractive.Checked, chkPreserveMerges.Checked,
- chkAutosquash.Checked, chkStash.Checked, txtFrom.Text, Branches.Text);
+ chkAutosquash.Checked, chkStash.Checked, chkIgnoreDate.Checked, chkCommitterDateIsAuthorDate.Checked, txtFrom.Text, Branches.Text);
}
else
{
rebaseCmd = GitCommandHelpers.RebaseCmd(
Branches.Text, chkInteractive.Checked,
- chkPreserveMerges.Checked, chkAutosquash.Checked, chkStash.Checked);
+ chkPreserveMerges.Checked, chkAutosquash.Checked, chkStash.Checked, chkIgnoreDate.Checked, chkCommitterDateIsAuthorDate.Checked);
}
string cmdOutput = FormProcess.ReadDialog(this, process: null, arguments: rebaseCmd, Module.WorkingDir, input: null, useDialogSettings: true);
@@ -314,10 +333,29 @@ private void btnChooseFromRevision_Click(object sender, EventArgs e)
}
}
- private void CommitButtonClick(object sender, EventArgs e)
+ private void Commit_Click(object sender, EventArgs e)
{
UICommands.StartCommitDialog(this);
EnableButtons();
}
+
+ internal TestAccessor GetTestAccessor() => new TestAccessor(this);
+
+ internal readonly struct TestAccessor
+ {
+ private readonly FormRebase _form;
+
+ public TestAccessor(FormRebase form)
+ {
+ _form = form;
+ }
+
+ public CheckBox chkInteractive => _form.chkInteractive;
+ public CheckBox chkPreserveMerges => _form.chkPreserveMerges;
+ public CheckBox chkAutosquash => _form.chkAutosquash;
+ public CheckBox chkStash => _form.chkStash;
+ public CheckBox chkIgnoreDate => _form.chkIgnoreDate;
+ public CheckBox chkCommitterDateIsAuthorDate => _form.chkCommitterDateIsAuthorDate;
+ }
}
}
diff --git a/GitUI/CommandsDialogs/FormRebase.resx b/GitUI/CommandsDialogs/FormRebase.resx
index d58980a38d7..9d9bc4df986 100644
--- a/GitUI/CommandsDialogs/FormRebase.resx
+++ b/GitUI/CommandsDialogs/FormRebase.resx
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/GitUI/Translation/English.xlf b/GitUI/Translation/English.xlf
index ba91acbc57e..5bd5aa7d750 100644
--- a/GitUI/Translation/English.xlf
+++ b/GitUI/Translation/English.xlf
@@ -5603,6 +5603,14 @@ Nothing to rebase.
Autosquash
+
+ Committer date is author date
+
+
+
+ Ignore date
+
+
Interactive Rebase
diff --git a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs
index 7076f209a07..ea38ceb3869 100644
--- a/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs
+++ b/GitUI/UserControls/RevisionGrid/RevisionGridControl.cs
@@ -2594,8 +2594,8 @@ private void LaunchRebase(string command)
}
string rebaseCmd = GitCommandHelpers.RebaseCmd(
- LatestSelectedRevision.FirstParentId?.ToString(),
- interactive: true, preserveMerges: false, autosquash: false, autoStash: true);
+ LatestSelectedRevision.FirstParentId?.ToString(), interactive: true, preserveMerges: false,
+ autosquash: false, autoStash: true, ignoreDate: false, committerDateIsAuthorDate: false);
using (var formProcess = new FormProcess(UICommands, process: null, arguments: rebaseCmd, Module.WorkingDir, input: null, useDialogSettings: true))
{
diff --git a/IntegrationTests/UI.IntegrationTests/CommandsDialogs/FormRebaseTests.cs b/IntegrationTests/UI.IntegrationTests/CommandsDialogs/FormRebaseTests.cs
new file mode 100644
index 00000000000..dbd51641fde
--- /dev/null
+++ b/IntegrationTests/UI.IntegrationTests/CommandsDialogs/FormRebaseTests.cs
@@ -0,0 +1,201 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using CommonTestUtils;
+using FluentAssertions;
+using GitUI;
+using GitUI.CommandsDialogs;
+using NUnit.Framework;
+
+namespace GitExtensions.UITests.CommandsDialogs
+{
+ [Apartment(ApartmentState.STA)]
+ public class FormRebaseTests
+ {
+ private ReferenceRepository _referenceRepository;
+ private GitUICommands _commands;
+
+ [SetUp]
+ public void SetUp()
+ {
+ if (_referenceRepository == null)
+ {
+ _referenceRepository = new ReferenceRepository();
+ }
+ else
+ {
+ _referenceRepository.Reset();
+ }
+
+ _commands = new GitUICommands(_referenceRepository.Module);
+ }
+
+ [Test]
+ public void Interactive_check_enables_autosquash()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+
+ accessor.chkInteractive.Checked = true;
+
+ accessor.chkAutosquash.Enabled.Should().BeTrue();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Interactive_uncheck_disables_autosquash()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+ accessor.chkInteractive.Checked = true;
+
+ accessor.chkInteractive.Checked = false;
+
+ accessor.chkAutosquash.Enabled.Should().BeFalse();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Ignore_date_check_disables_all_other_options()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+
+ accessor.chkIgnoreDate.Checked = true;
+
+ accessor.chkInteractive.Enabled.Should().BeFalse();
+ accessor.chkPreserveMerges.Enabled.Should().BeFalse();
+ accessor.chkAutosquash.Enabled.Should().BeFalse();
+ accessor.chkCommitterDateIsAuthorDate.Enabled.Should().BeFalse();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Ignore_date_uncheck_enables_all_options_if_interactive_checked()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+ accessor.chkInteractive.Checked = true;
+ accessor.chkIgnoreDate.Checked = true;
+
+ accessor.chkIgnoreDate.Checked = false;
+
+ accessor.chkInteractive.Enabled.Should().BeTrue();
+ accessor.chkPreserveMerges.Enabled.Should().BeTrue();
+ accessor.chkAutosquash.Enabled.Should().BeTrue();
+ accessor.chkCommitterDateIsAuthorDate.Enabled.Should().BeTrue();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Ignore_date_uncheck_enables_all_options_but_autosquash_if_interactive_not_checked()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+ accessor.chkIgnoreDate.Checked = true;
+
+ accessor.chkIgnoreDate.Checked = false;
+
+ accessor.chkInteractive.Enabled.Should().BeTrue();
+ accessor.chkPreserveMerges.Enabled.Should().BeTrue();
+ accessor.chkAutosquash.Enabled.Should().BeFalse();
+ accessor.chkCommitterDateIsAuthorDate.Enabled.Should().BeTrue();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Committer_date_check_disables_all_other_options()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+
+ accessor.chkCommitterDateIsAuthorDate.Checked = true;
+
+ accessor.chkInteractive.Enabled.Should().BeFalse();
+ accessor.chkPreserveMerges.Enabled.Should().BeFalse();
+ accessor.chkAutosquash.Enabled.Should().BeFalse();
+ accessor.chkIgnoreDate.Enabled.Should().BeFalse();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Committer_date_uncheck_enables_all_options_if_interactive_is_checked()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+ accessor.chkInteractive.Checked = true;
+ accessor.chkCommitterDateIsAuthorDate.Checked = true;
+
+ accessor.chkCommitterDateIsAuthorDate.Checked = false;
+
+ accessor.chkInteractive.Enabled.Should().BeTrue();
+ accessor.chkPreserveMerges.Enabled.Should().BeTrue();
+ accessor.chkAutosquash.Enabled.Should().BeTrue();
+ accessor.chkIgnoreDate.Enabled.Should().BeTrue();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ [Test]
+ public void Committer_date_uncheck_enables_all_options_but_autosquash_if_interactive_not_checked()
+ {
+ RunFormTest(
+ form =>
+ {
+ var accessor = form.GetTestAccessor();
+ accessor.chkCommitterDateIsAuthorDate.Checked = true;
+
+ accessor.chkCommitterDateIsAuthorDate.Checked = false;
+
+ accessor.chkInteractive.Enabled.Should().BeTrue();
+ accessor.chkPreserveMerges.Enabled.Should().BeTrue();
+ accessor.chkAutosquash.Enabled.Should().BeFalse();
+ accessor.chkIgnoreDate.Enabled.Should().BeTrue();
+ },
+ from: "", to: null, onto: null, interactive: false, startRebaseImmediately: false);
+ }
+
+ private void RunFormTest(Action testDriver, string from, string to, string onto,
+ bool interactive, bool startRebaseImmediately)
+ {
+ RunFormTest(
+ form =>
+ {
+ testDriver(form);
+ return Task.CompletedTask;
+ },
+ from, to, onto, interactive, startRebaseImmediately);
+ }
+
+ private void RunFormTest(Func testDriverAsync, string from, string to,
+ string onto, bool interactive, bool startRebaseImmediately)
+ {
+ UITest.RunForm(
+ () =>
+ {
+ _commands.StartRebaseDialog(owner: null, from, to, onto, interactive, startRebaseImmediately);
+ },
+ testDriverAsync);
+ }
+ }
+}
diff --git a/UnitTests/GitCommands.Tests/Git/GitCommandHelpersTest.cs b/UnitTests/GitCommands.Tests/Git/GitCommandHelpersTest.cs
index 37b84c0f4a9..7d5dfcac643 100644
--- a/UnitTests/GitCommands.Tests/Git/GitCommandHelpersTest.cs
+++ b/UnitTests/GitCommands.Tests/Git/GitCommandHelpersTest.cs
@@ -599,37 +599,58 @@ public void RebaseCmd()
{
Assert.AreEqual(
"-c rebase.autoSquash=false rebase \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
Assert.AreEqual(
"-c rebase.autoSquash=false rebase -i --no-autosquash \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: false, autosquash: false, autoStash: false).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
Assert.AreEqual(
GitVersion.Current.SupportRebaseMerges ? "-c rebase.autoSquash=false rebase --rebase-merges \"branch\"" : "-c rebase.autoSquash=false rebase --preserve-merges \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: true, autosquash: false, autoStash: false).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: true, autosquash: false, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
Assert.AreEqual(
"-c rebase.autoSquash=false rebase \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: true, autoStash: false).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: true, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
Assert.AreEqual(
"-c rebase.autoSquash=false rebase --autostash \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: true).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: true, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
Assert.AreEqual(
"-c rebase.autoSquash=false rebase -i --autosquash \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: false, autosquash: true, autoStash: false).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: false, autosquash: true, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --ignore-date \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: true, committerDateIsAuthorDate: false).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --committer-date-is-author-date \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: true).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --ignore-date --autostash \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: true, ignoreDate: true, committerDateIsAuthorDate: false).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --committer-date-is-author-date --autostash \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: true, ignoreDate: false, committerDateIsAuthorDate: true).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --ignore-date --autostash \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: true, autosquash: true, autoStash: true, ignoreDate: true, committerDateIsAuthorDate: false).Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --committer-date-is-author-date --autostash \"branch\"",
+ GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: true, autosquash: true, autoStash: true, ignoreDate: false, committerDateIsAuthorDate: true).Arguments);
Assert.AreEqual(
GitVersion.Current.SupportRebaseMerges ? "-c rebase.autoSquash=false rebase -i --autosquash --rebase-merges --autostash \"branch\"" : "-c rebase.autoSquash=false rebase -i --autosquash --preserve-merges --autostash \"branch\"",
- GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: true, autosquash: true, autoStash: true).Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: true, preserveMerges: true, autosquash: true, autoStash: true, ignoreDate: false, committerDateIsAuthorDate: false).Arguments);
// TODO quote 'onto'?
Assert.AreEqual(
"-c rebase.autoSquash=false rebase \"from\" \"branch\" --onto onto",
- GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, "from", "onto").Arguments);
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: false, committerDateIsAuthorDate: false, "from", "onto").Arguments);
+ Assert.AreEqual(
+ "-c rebase.autoSquash=false rebase --ignore-date \"from\" \"branch\" --onto onto",
+ GitCommandHelpers.RebaseCmd("branch", interactive: false, preserveMerges: false, autosquash: false, autoStash: false, ignoreDate: true, committerDateIsAuthorDate: false, "from", "onto").Arguments);
Assert.Throws(
- () => GitCommandHelpers.RebaseCmd("branch", false, false, false, false, from: null, onto: "onto"));
+ () => GitCommandHelpers.RebaseCmd("branch", false, false, false, false, false, false, from: null, onto: "onto"));
Assert.Throws(
- () => GitCommandHelpers.RebaseCmd("branch", false, false, false, false, from: "from", onto: null));
+ () => GitCommandHelpers.RebaseCmd("branch", false, false, false, false, false, false, from: "from", onto: null));
}
[TestCase(CleanMode.OnlyNonIgnored, true, false, null, "clean --dry-run")]