Upload via GUI (31 Dateien)
This commit is contained in:
+48
-14
@@ -16,6 +16,12 @@ const axiosInstance = axios.create({
|
||||
httpsAgent: ipv4HttpsAgent,
|
||||
});
|
||||
|
||||
// Kurzlebiger Cache für die Default-Branch-Auflösung (HEAD -> z.B. "main").
|
||||
// Verhindert, dass bei einem Ordner-Upload für jede einzelne Datei erneut
|
||||
// die Repo-Info vom Server geladen wird.
|
||||
const defaultBranchCache = new Map();
|
||||
const DEFAULT_BRANCH_TTL_MS = 60_000;
|
||||
|
||||
function normalizeAndValidateBaseUrl(rawUrl) {
|
||||
const value = (rawUrl || '').trim();
|
||||
if (!value) {
|
||||
@@ -685,23 +691,32 @@ async function uploadGiteaFile({ token, url, owner, repo, path, contentBase64, m
|
||||
// Behalte den branch so wie übergeben - aber 'HEAD' muss zum echten Branch aufgelöst werden
|
||||
let branchName = branch || 'HEAD';
|
||||
|
||||
// HEAD-Auflösung: Wenn branch === 'HEAD', den Default-Branch des Repos abrufen
|
||||
// HEAD-Auflösung: Wenn branch === 'HEAD', den Default-Branch des Repos abrufen.
|
||||
// Ergebnis kurz cachen, damit bei einem Ordner-Upload nicht für JEDE Datei
|
||||
// erneut die Repo-Info geladen wird (das war eine Hauptursache der Langsamkeit).
|
||||
if (branchName === 'HEAD') {
|
||||
try {
|
||||
const repoInfoUrl = `${base}/api/v1/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;
|
||||
const repoInfo = await tryRequest(repoInfoUrl, token);
|
||||
if (repoInfo.ok && repoInfo.data.default_branch) {
|
||||
branchName = repoInfo.data.default_branch;
|
||||
console.log(`[Upload Debug] HEAD aufgelöst zu: ${branchName}`);
|
||||
} else {
|
||||
// Fallback auf 'main' wenn Auflösung fehlschlägt
|
||||
const cacheKey = `${base}::${owner}/${repo}`;
|
||||
const cached = defaultBranchCache.get(cacheKey);
|
||||
if (cached && (Date.now() - cached.ts) < DEFAULT_BRANCH_TTL_MS) {
|
||||
branchName = cached.branch;
|
||||
} else {
|
||||
try {
|
||||
const repoInfoUrl = `${base}/api/v1/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`;
|
||||
const repoInfo = await tryRequest(repoInfoUrl, token);
|
||||
if (repoInfo.ok && repoInfo.data.default_branch) {
|
||||
branchName = repoInfo.data.default_branch;
|
||||
console.log(`[Upload Debug] HEAD aufgelöst zu: ${branchName}`);
|
||||
} else {
|
||||
// Fallback auf 'main' wenn Auflösung fehlschlägt
|
||||
branchName = 'main';
|
||||
console.warn(`[Upload Debug] HEAD-Auflösung fehlgeschlagen, verwende Fallback: ${branchName}`);
|
||||
}
|
||||
} catch (e) {
|
||||
// Fallback auf 'main' wenn Fehler
|
||||
branchName = 'main';
|
||||
console.warn(`[Upload Debug] HEAD-Auflösung fehlgeschlagen, verwende Fallback: ${branchName}`);
|
||||
console.warn(`[Upload Debug] HEAD-Auflösung fehlgeschlagen (${e.message}), verwende Fallback: ${branchName}`);
|
||||
}
|
||||
} catch (e) {
|
||||
// Fallback auf 'main' wenn Fehler
|
||||
branchName = 'main';
|
||||
console.warn(`[Upload Debug] HEAD-Auflösung fehlgeschlagen (${e.message}), verwende Fallback: ${branchName}`);
|
||||
defaultBranchCache.set(cacheKey, { branch: branchName, ts: Date.now() });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -767,6 +782,25 @@ async function uploadGiteaFile({ token, url, owner, repo, path, contentBase64, m
|
||||
} catch (err) {
|
||||
console.error(`Upload Attempt ${retryCount + 1} for ${path}:`, err.response ? err.response.data : err.message);
|
||||
|
||||
// Netzwerk-Timeout / abgebrochene Verbindung: mit Backoff erneut versuchen,
|
||||
// statt sofort abzubrechen. Deckt ECONNABORTED (axios-Timeout), ETIMEDOUT,
|
||||
// ECONNRESET und EPIPE ab.
|
||||
const netCode = err.code || '';
|
||||
const isNetworkTimeout = !err.response &&
|
||||
(netCode === 'ECONNABORTED' || netCode === 'ETIMEDOUT' ||
|
||||
netCode === 'ECONNRESET' || netCode === 'EPIPE' ||
|
||||
/timeout/i.test(String(err.message || '')));
|
||||
if (isNetworkTimeout) {
|
||||
if (retryCount < MAX_RETRIES) {
|
||||
retryCount++;
|
||||
const wait = 1000 * retryCount; // 1s, 2s, 3s ...
|
||||
console.warn(`-> Netzwerk-Timeout (${netCode || 'timeout'}). Erneuter Versuch in ${wait}ms... (Retry ${retryCount}/${MAX_RETRIES})`);
|
||||
await sleep(wait);
|
||||
continue;
|
||||
}
|
||||
throw new Error(`Zeitüberschreitung beim Hochladen von "${path}". Bitte Netzwerk/Server prüfen und erneut versuchen.`);
|
||||
}
|
||||
|
||||
// Behandle 500 Server-Fehler speziell
|
||||
if (err.response && err.response.status === 500) {
|
||||
const errorMsg = err.response.data?.message || err.message;
|
||||
|
||||
Reference in New Issue
Block a user