Upload via GUI (31 Dateien)

This commit is contained in:
Git Manager GUI
2026-07-16 08:01:04 +02:00
parent 3ed561fe78
commit 565835418e
7 changed files with 373 additions and 116 deletions
+48 -14
View File
@@ -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;