hmgr 0.0.29 → 0.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/git.js +36 -1
- package/package.json +1 -1
package/dist/adapter/git.js
CHANGED
|
@@ -121,10 +121,39 @@ async function dateienAufPlatte(wurzel, unter = '') {
|
|
|
121
121
|
}
|
|
122
122
|
return dateien;
|
|
123
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Wartezeiten zwischen den Versuchen bei belegter git-Sperre (E99): 5 Versuche, zusammen rund 3 s.
|
|
126
|
+
* Tests übergeben kürzere über den Konstruktor.
|
|
127
|
+
*/
|
|
128
|
+
export const SPERRE_WARTEZEITEN_MS = [200, 400, 800, 1600];
|
|
129
|
+
/** Meldung, mit der git eine belegte Sperrdatei anzeigt (E99). */
|
|
130
|
+
const SPERRE_BELEGT = /Unable to create '[^']+\.lock': File exists/;
|
|
124
131
|
export class GitQuellen {
|
|
125
132
|
wurzel;
|
|
126
|
-
|
|
133
|
+
sperreWartezeitenMs;
|
|
134
|
+
constructor(wurzel, optionen = {}) {
|
|
127
135
|
this.wurzel = wurzel;
|
|
136
|
+
this.sperreWartezeitenMs = optionen.sperreWartezeitenMs ?? SPERRE_WARTEZEITEN_MS;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Wiederholt einen git-Aufruf, wenn eine fremde Sperre ihn blockiert (E99): GUI-Aktionen und der
|
|
140
|
+
* Start-Lauf rufen git parallel auf, und git bricht bei `….lock: File exists` sofort ab. Nur
|
|
141
|
+
* diese Meldung wird wiederholt, jeder andere Fehler gilt sofort. Nach dem letzten Versuch bleibt
|
|
142
|
+
* die bisherige Fehlermeldung. hmgr löscht fremde Sperren nie, auch keine verwaisten.
|
|
143
|
+
*/
|
|
144
|
+
async mitSperrWiederholung(aufruf) {
|
|
145
|
+
for (let versuch = 0;; versuch++) {
|
|
146
|
+
try {
|
|
147
|
+
return await aufruf();
|
|
148
|
+
}
|
|
149
|
+
catch (fehler) {
|
|
150
|
+
const wartezeit = this.sperreWartezeitenMs[versuch];
|
|
151
|
+
const meldung = fehler instanceof Error ? fehler.message : String(fehler);
|
|
152
|
+
if (wartezeit === undefined || !SPERRE_BELEGT.test(meldung))
|
|
153
|
+
throw fehler;
|
|
154
|
+
await new Promise((fertig) => setTimeout(fertig, wartezeit));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
128
157
|
}
|
|
129
158
|
/**
|
|
130
159
|
* stdin ist zu und git darf nicht nach Zugangsdaten fragen, sonst hängt ein wartender Aufruf
|
|
@@ -132,6 +161,9 @@ export class GitQuellen {
|
|
|
132
161
|
* als dort, ein erster Clone über ein langsames Netz braucht Zeit.
|
|
133
162
|
*/
|
|
134
163
|
async git(args, cwd) {
|
|
164
|
+
return await this.mitSperrWiederholung(() => this.gitEinmal(args, cwd));
|
|
165
|
+
}
|
|
166
|
+
async gitEinmal(args, cwd) {
|
|
135
167
|
return await new Promise((erfuellen, ablehnen) => {
|
|
136
168
|
const kind = spawn('git', args, {
|
|
137
169
|
cwd,
|
|
@@ -155,6 +187,9 @@ export class GitQuellen {
|
|
|
155
187
|
}
|
|
156
188
|
/** Wie `git`, aber mit Text auf stdin und Bytes als Ergebnis: `execFile` kennt keine Eingabe. */
|
|
157
189
|
async gitMitEingabe(args, cwd, eingabe) {
|
|
190
|
+
return await this.mitSperrWiederholung(() => this.gitMitEingabeEinmal(args, cwd, eingabe));
|
|
191
|
+
}
|
|
192
|
+
async gitMitEingabeEinmal(args, cwd, eingabe) {
|
|
158
193
|
return await new Promise((erfuellen, ablehnen) => {
|
|
159
194
|
const kind = spawn('git', args, { cwd, timeout: 300_000, killSignal: 'SIGKILL' });
|
|
160
195
|
const stuecke = [];
|