Skip to content

Commit dd53386

Browse files
committed
fix: expect only persistant commands to persist (do not fail assertion because of non-persistant ones)
root issue was noticed when doing a simple git-stacked-rebase and adding a `break` inside the git-rebase-todo file -- `--apply` would always fail because there'd be 1 less command than expected. Signed-off-by: Kipras Melnikovas <kipras@kipras.org>
1 parent 95c1a97 commit dd53386

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

parse-todo-of-stacked-rebase/parseNewGoodCommands.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@ import { filenames } from "../filenames";
1010
import { readRewrittenListNotAppliedOrAppliedOrError } from "../apply";
1111

1212
import { parseTodoOfStackedRebase } from "./parseTodoOfStackedRebase";
13-
import { GoodCommand, stackedRebaseCommands } from "./validator";
13+
import {
14+
GoodCommand, //
15+
namesOfRebaseCommandsThatWillDisappearFromCommandList,
16+
stackedRebaseCommands,
17+
} from "./validator";
1418

1519
export function parseNewGoodCommands(
1620
repo: Git.Repository,
@@ -95,6 +99,13 @@ export function parseNewGoodCommands(
9599

96100
const oldCommandAtIdx: GoodCommand = oldGoodCommands[goodCommandMinIndex];
97101

102+
if (namesOfRebaseCommandsThatWillDisappearFromCommandList.includes(oldCommandAtIdx.commandName)) {
103+
goodCommandMinIndex++; // the command should disappear,
104+
i--; // but the commit should not be lost.
105+
106+
continue;
107+
}
108+
98109
if (oldCommandAtIdx.commandName in stackedRebaseCommands) {
99110
goodNewCommands.push({
100111
...oldCommandAtIdx,
@@ -184,7 +195,10 @@ export function parseNewGoodCommands(
184195
["stackedRebaseCommandsNew.length"]: stackedRebaseCommandsNew.length,
185196
});
186197

187-
assert(stackedRebaseCommandsOld.length === stackedRebaseCommandsNew.length);
198+
const oldCommandCount: number = stackedRebaseCommandsOld.length;
199+
const newCommandCount: number = stackedRebaseCommandsNew.length;
200+
201+
assert.equal(oldCommandCount, newCommandCount);
188202

189203
return stackedRebaseCommandsNew;
190204
}

parse-todo-of-stacked-rebase/validator.ts

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ type Command = {
2727
parseTargets: ParseTargets;
2828

2929
makesGitRebaseExitToPause: boolean;
30+
willDisappearFromCommandsListInNextGitRebaseTodoFile: boolean;
3031
};
3132

3233
const createCommand = (
3334
nameButNeverAlias: string,
3435
{
3536
makesGitRebaseExitToPause,
37+
willDisappearFromCommandsListInNextGitRebaseTodoFile,
3638
parseTargets = ({ split }) => {
3739
assert(
3840
split.length >= 2,
@@ -57,6 +59,11 @@ const createCommand = (
5759
*/
5860
makesGitRebaseExitToPause: boolean;
5961

62+
/**
63+
* TODO RENAME
64+
*/
65+
willDisappearFromCommandsListInNextGitRebaseTodoFile: boolean;
66+
6067
// nameOrAlias: EitherRebaseEitherCommandOrAlias, //
6168
parseTargets?: Command["parseTargets"];
6269
maxUseCount?: number;
@@ -68,23 +75,33 @@ const createCommand = (
6875
nameButNeverAlias: nameButNeverAlias as EitherRebaseCommand, // TODO: TS
6976
parseTargets,
7077
makesGitRebaseExitToPause,
78+
willDisappearFromCommandsListInNextGitRebaseTodoFile,
7179
});
7280

7381
export const regularRebaseCommands = {
74-
pick: createCommand("pick", { makesGitRebaseExitToPause: false }),
82+
pick: createCommand("pick", {
83+
makesGitRebaseExitToPause: false,
84+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, //
85+
}),
7586
// p: standardCommand,
7687
reword: createCommand("reword", {
7788
makesGitRebaseExitToPause: false /** opens editor & then continues, w/o exiting in between */,
89+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
7890
}),
7991
// r: standardCommand,
80-
edit: createCommand("edit", { makesGitRebaseExitToPause: true }),
92+
edit: createCommand("edit", {
93+
makesGitRebaseExitToPause: true,
94+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, //
95+
}),
8196
// e: standardCommand,
8297
squash: createCommand("squash", {
8398
makesGitRebaseExitToPause: false /** opens editor & then continues, w/o exiting in between */,
99+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
84100
}),
85101
// s: standardCommand,
86102
fixup: createCommand("fixup", {
87103
makesGitRebaseExitToPause: false /** opens editor & then continues, w/o exiting in between */,
104+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
88105

89106
parseTargets: ({ split }) => {
90107
/**
@@ -102,20 +119,35 @@ export const regularRebaseCommands = {
102119
// f: standardCommand,
103120
exec: createCommand("exec", {
104121
makesGitRebaseExitToPause: false, //
122+
willDisappearFromCommandsListInNextGitRebaseTodoFile: true,
105123

106124
parseTargets: ({ rest }) => [rest],
107125
}),
108126
// x: standardCommand,
109-
break: createCommand("break", { makesGitRebaseExitToPause: true, parseTargets: () => null }),
127+
break: createCommand("break", {
128+
makesGitRebaseExitToPause: true,
129+
willDisappearFromCommandsListInNextGitRebaseTodoFile: true, //
130+
parseTargets: () => null,
131+
}),
110132
// b: standardCommand,
111-
drop: createCommand("drop", { makesGitRebaseExitToPause: false }),
133+
drop: createCommand("drop", {
134+
makesGitRebaseExitToPause: false,
135+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, // TODO
136+
}),
112137
// d: standardCommand,
113-
label: createCommand("label", { makesGitRebaseExitToPause: false /** TODO VERIFY */ }),
138+
label: createCommand("label", {
139+
makesGitRebaseExitToPause: false /** TODO VERIFY */,
140+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, // TODO VERIFY
141+
}),
114142
// l: standardCommand,
115-
reset: createCommand("reset", { makesGitRebaseExitToPause: false /** TODO VERIFY */ }),
143+
reset: createCommand("reset", {
144+
makesGitRebaseExitToPause: false /** TODO VERIFY */,
145+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, // TODO VERIFY
146+
}),
116147
// t: standardCommand,
117148
merge: createCommand("merge", {
118149
makesGitRebaseExitToPause: false /** TODO VERIFY */,
150+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false, // TODO VERIFY
119151

120152
parseTargets: ({ split }) => {
121153
if (["-C", "-c"].includes(split[1])) {
@@ -192,27 +224,31 @@ const branchValidator: Validator = ({ rest, reasonsIfBad: reasonsWhyInvalid }) =
192224
export const stackedRebaseCommands = {
193225
"branch-end": createCommand("branch-end", {
194226
makesGitRebaseExitToPause: false,
227+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
195228

196229
maxUseCount: Infinity,
197230
isRestValid: branchValidator,
198231
parseTargets: ({ rest }) => [rest],
199232
}),
200233
"branch-end-new": createCommand("branch-end-new", {
201234
makesGitRebaseExitToPause: false,
235+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
202236

203237
maxUseCount: Infinity,
204238
isRestValid: branchValidator,
205239
parseTargets: ({ rest }) => [rest],
206240
}),
207241
"branch-end-initial": createCommand("branch-end-initial", {
208242
makesGitRebaseExitToPause: false,
243+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
209244

210245
maxUseCount: 1,
211246
isRestValid: branchValidator,
212247
parseTargets: ({ rest }) => [rest],
213248
}),
214249
"branch-end-last": createCommand("branch-end-last", {
215250
makesGitRebaseExitToPause: false,
251+
willDisappearFromCommandsListInNextGitRebaseTodoFile: false,
216252

217253
maxUseCount: 1,
218254
isRestValid: branchValidator,
@@ -260,11 +296,17 @@ const allEitherRebaseCommandAliases = {
260296
export const rebaseCommandsThatMakeRebaseExitToPause: Command[] = Object.values(allEitherRebaseCommands).filter(
261297
(cmd) => cmd.makesGitRebaseExitToPause
262298
);
263-
264299
export const namesOfRebaseCommandsThatMakeRebaseExitToPause: EitherRebaseCommand[] = rebaseCommandsThatMakeRebaseExitToPause.map(
265300
(cmd) => cmd.nameButNeverAlias
266301
);
267302

303+
export const rebaseCommandsThatWillDisappearFromCommandList: Command[] = Object.values(allEitherRebaseCommands).filter(
304+
(cmd) => cmd.willDisappearFromCommandsListInNextGitRebaseTodoFile
305+
);
306+
export const namesOfRebaseCommandsThatWillDisappearFromCommandList: EitherRebaseCommand[] = rebaseCommandsThatWillDisappearFromCommandList.map(
307+
(cmd) => cmd.nameButNeverAlias
308+
);
309+
268310
type LineNr = {
269311
/**
270312
* indexed from 0.

0 commit comments

Comments
 (0)