Skip to content

Commit bdb8200

Browse files
sergeibbbd13
authored andcommitted
Removes unreachable stashes from a branch when no reachable have found
(#4353, #4386)
1 parent c40c5a4 commit bdb8200

File tree

1 file changed

+24
-26
lines changed

1 file changed

+24
-26
lines changed

src/env/node/git/sub-providers/stash.ts

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -111,40 +111,38 @@ export class StashGitSubProvider implements GitStashSubProvider {
111111
);
112112

113113
const ancestors = result.stdout.trim().split('\n');
114-
if (ancestors?.length && (ancestors.length !== 1 || ancestors[0])) {
115-
const reachableCommits = new Set(ancestors);
116-
117-
if (reachableCommits.size) {
118-
const reachableStashes = new Set<string>();
114+
const reachableCommits =
115+
ancestors?.length && (ancestors.length !== 1 || ancestors[0]) ? new Set(ancestors) : undefined;
116+
if (reachableCommits?.size) {
117+
const reachableStashes = new Set<string>();
118+
119+
// First pass: mark directly reachable stashes
120+
for (const [sha, s] of stash.stashes) {
121+
if (s.parents.some(p => p === options.reachableFrom || reachableCommits.has(p))) {
122+
reachableStashes.add(sha);
123+
}
124+
}
119125

120-
// First pass: mark directly reachable stashes
126+
// Second pass: mark stashes that build upon reachable stashes
127+
let changed;
128+
do {
129+
changed = false;
121130
for (const [sha, s] of stash.stashes) {
122-
if (s.parents.some(p => p === options.reachableFrom || reachableCommits.has(p))) {
131+
if (!reachableStashes.has(sha) && s.parents.some(p => reachableStashes.has(p))) {
123132
reachableStashes.add(sha);
133+
changed = true;
124134
}
125135
}
136+
} while (changed);
126137

127-
// Second pass: mark stashes that build upon reachable stashes
128-
let changed;
129-
do {
130-
changed = false;
131-
for (const [sha, s] of stash.stashes) {
132-
if (!reachableStashes.has(sha) && s.parents.some(p => reachableStashes.has(p))) {
133-
reachableStashes.add(sha);
134-
changed = true;
135-
}
136-
}
137-
} while (changed);
138-
139-
// Remove unreachable stashes
140-
for (const [sha] of stash.stashes) {
141-
if (!reachableStashes.has(sha)) {
142-
stash.stashes.delete(sha);
143-
}
138+
// Remove unreachable stashes
139+
for (const [sha] of stash.stashes) {
140+
if (!reachableStashes.has(sha)) {
141+
stash.stashes.delete(sha);
144142
}
145-
} else {
146-
stash.stashes.clear();
147143
}
144+
} else {
145+
stash.stashes.clear();
148146
}
149147
}
150148

0 commit comments

Comments
 (0)