Skip to content

Commit 8f1bf8d

Browse files
committed
rebase issues resolved
1 parent 9dd5454 commit 8f1bf8d

2 files changed

Lines changed: 41 additions & 5 deletions

File tree

apps/desktop/src/main/main.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ app.whenReady().then(async () => {
562562
let rebaseSuggestionService: ReturnType<typeof createRebaseSuggestionService> | null = null;
563563
let autoRebaseService: ReturnType<typeof createAutoRebaseService> | null = null;
564564
let humanWorkDigestService: ReturnType<typeof createHumanWorkDigestService> | null = null;
565+
let conflictServiceRef: ReturnType<typeof createConflictService> | null = null;
565566
let prServiceRef: ReturnType<typeof createPrService> | null = null;
566567
let prPollingServiceRef: ReturnType<typeof createPrPollingService> | null = null;
567568

@@ -622,7 +623,17 @@ app.whenReady().then(async () => {
622623
worktreesDir: adePaths.worktreesDir,
623624
operationService,
624625
onHeadChanged: handleHeadChanged,
625-
onRebaseEvent: (event) => emitProjectEvent(projectRoot, IPC.lanesRebaseEvent, event)
626+
onRebaseEvent: (event) => {
627+
emitProjectEvent(projectRoot, IPC.lanesRebaseEvent, event);
628+
if (event.type === "rebase-run-updated" && event.run.state !== "running") {
629+
void conflictServiceRef?.scanRebaseNeeds().catch((error) => {
630+
logger.warn("rebase.needs_refresh_failed", {
631+
runId: event.run.runId,
632+
error: error instanceof Error ? error.message : String(error),
633+
});
634+
});
635+
}
636+
}
626637
});
627638
await laneService.ensurePrimaryLane();
628639

@@ -775,6 +786,7 @@ app.whenReady().then(async () => {
775786
}
776787
}
777788
});
789+
conflictServiceRef = conflictService;
778790

779791
autoRebaseService = createAutoRebaseService({
780792
db,

apps/desktop/src/renderer/components/prs/tabs/RebaseTab.tsx

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ export function RebaseTab({
8787
const [selectedPushLaneIds, setSelectedPushLaneIds] = React.useState<string[]>([]);
8888
const activeRunIdRef = React.useRef<string | null>(null);
8989

90+
const refreshRebaseNeeds = React.useCallback(async () => {
91+
try {
92+
await window.ade.rebase.scanNeeds();
93+
} catch {
94+
/* best effort */
95+
}
96+
}, []);
97+
9098
// Drift commits state
9199
const [driftCommits, setDriftCommits] = React.useState<GitCommitSummary[]>([]);
92100
const [driftCommitsLoading, setDriftCommitsLoading] = React.useState(false);
@@ -177,6 +185,9 @@ export function RebaseTab({
177185
if (!selectedNeed || event.run.rootLaneId !== selectedNeed.laneId) return prev;
178186
return event.run;
179187
});
188+
if (event.run.state !== "running") {
189+
void refreshRebaseNeeds();
190+
}
180191
} else if (event.type === "rebase-run-log") {
181192
setRunLogs((prev) => {
182193
const activeRunId = activeRunIdRef.current;
@@ -188,7 +199,7 @@ export function RebaseTab({
188199
}
189200
});
190201
return unsubscribe;
191-
}, [selectedNeed]);
202+
}, [refreshRebaseNeeds, selectedNeed]);
192203

193204
// Fetch drift commits when selected need changes
194205
React.useEffect(() => {
@@ -268,6 +279,7 @@ export function RebaseTab({
268279
setActiveRun(pushed);
269280
setRunLogs((prev) => [...prev, `[${new Date().toLocaleTimeString()}] Push complete`].slice(-80));
270281
}
282+
await refreshRebaseNeeds();
271283
await onRefresh();
272284
} catch (err: unknown) {
273285
setRebaseError(err instanceof Error ? err.message : String(err));
@@ -276,6 +288,15 @@ export function RebaseTab({
276288
}
277289
};
278290
const selectedRunIsActive = activeRun?.state === "running";
291+
const selectedRunLane = React.useMemo(
292+
() => (selectedNeed ? activeRun?.lanes.find((lane) => lane.laneId === selectedNeed.laneId) ?? null : null),
293+
[activeRun, selectedNeed],
294+
);
295+
const selectedNeedResolvedByRun = Boolean(
296+
selectedRunLane
297+
&& activeRun?.state === "completed"
298+
&& (selectedRunLane.status === "succeeded" || selectedRunLane.status === "skipped"),
299+
);
279300

280301
const handleAbortRun = async () => {
281302
if (!activeRun) return;
@@ -284,6 +305,7 @@ export function RebaseTab({
284305
try {
285306
const next = await window.ade.lanes.rebaseAbort({ runId: activeRun.runId });
286307
setActiveRun(next);
308+
await refreshRebaseNeeds();
287309
await onRefresh();
288310
} catch (err: unknown) {
289311
setRebaseError(err instanceof Error ? err.message : String(err));
@@ -299,6 +321,7 @@ export function RebaseTab({
299321
try {
300322
const next = await window.ade.lanes.rebaseRollback({ runId: activeRun.runId });
301323
setActiveRun(next);
324+
await refreshRebaseNeeds();
302325
await onRefresh();
303326
} catch (err: unknown) {
304327
setRebaseError(err instanceof Error ? err.message : String(err));
@@ -314,6 +337,7 @@ export function RebaseTab({
314337
try {
315338
const next = await window.ade.lanes.rebasePush({ runId: activeRun.runId, laneIds: selectedPushLaneIds });
316339
setActiveRun(next);
340+
await refreshRebaseNeeds();
317341
await onRefresh();
318342
} catch (err: unknown) {
319343
setRebaseError(err instanceof Error ? err.message : String(err));
@@ -943,7 +967,7 @@ export function RebaseTab({
943967
<Button
944968
size="sm"
945969
variant="primary"
946-
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive}
970+
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun}
947971
onClick={() => void handleRebase(true)}
948972
style={{ borderRadius: 0 }}
949973
>
@@ -955,7 +979,7 @@ export function RebaseTab({
955979
<Button
956980
size="sm"
957981
variant="outline"
958-
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive}
982+
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun}
959983
onClick={() => void handleRebase(false, "none")}
960984
style={{ borderRadius: 0, borderColor: S.borderSubtle }}
961985
>
@@ -966,7 +990,7 @@ export function RebaseTab({
966990
<Button
967991
size="sm"
968992
variant="outline"
969-
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive}
993+
disabled={rebaseBusy || selectedNeed.behindBy === 0 || selectedRunIsActive || selectedNeedResolvedByRun}
970994
onClick={() => void handleRebase(false, "review_then_push")}
971995
style={{ borderRadius: 0, borderColor: S.borderSubtle }}
972996
>

0 commit comments

Comments
 (0)