Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c58d9203bc | ||
|
|
f0006f8003 |
@ -1,7 +1,7 @@
|
|||||||
// Log-file mode resolution for fileuploader.log:
|
// Log-file mode resolution for fileuploader.log:
|
||||||
// - "single" → one file: fileuploader.log
|
// - "single" → one file: fileuploader.log
|
||||||
// - "daily" → per-day: fileuploader-YYYY-MM-DD.log
|
// - "daily" → per-day: fileuploader-YYYY-MM-DD.log
|
||||||
// - "session" → per-launch: DD-MM-YYYY-mdu-session-HH-MM.log
|
// - "session" → per-launch: DD-MM-YYYY-mdu-session-HH-MM-NNNNNN.log
|
||||||
//
|
//
|
||||||
// Pure functions only — no fs, no Date.now() at call time — so they unit-test
|
// Pure functions only — no fs, no Date.now() at call time — so they unit-test
|
||||||
// cleanly and the main.js call sites pass in `new Date()` + the session stamp.
|
// cleanly and the main.js call sites pass in `new Date()` + the session stamp.
|
||||||
@ -38,10 +38,11 @@
|
|||||||
return `${date.getFullYear()}-${_two(date.getMonth() + 1)}-${_two(date.getDate())}`;
|
return `${date.getFullYear()}-${_two(date.getMonth() + 1)}-${_two(date.getDate())}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatSessionStamp(date) {
|
function formatSessionStamp(date, rand) {
|
||||||
const d = `${_two(date.getDate())}-${_two(date.getMonth() + 1)}-${date.getFullYear()}`;
|
const d = `${_two(date.getDate())}-${_two(date.getMonth() + 1)}-${date.getFullYear()}`;
|
||||||
const t = `${_two(date.getHours())}-${_two(date.getMinutes())}`;
|
const t = `${_two(date.getHours())}-${_two(date.getMinutes())}`;
|
||||||
return `${d}-mdu-session-${t}`;
|
const r = (rand !== undefined && rand !== null && String(rand).trim()) ? `-${String(rand).trim()}` : '';
|
||||||
|
return `${d}-mdu-session-${t}${r}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,7 +84,7 @@
|
|||||||
*/
|
*/
|
||||||
function stripModeStampFromFileName(fileName) {
|
function stripModeStampFromFileName(fileName) {
|
||||||
if (!fileName || typeof fileName !== 'string') return fileName;
|
if (!fileName || typeof fileName !== 'string') return fileName;
|
||||||
const newSessionRe = /^\d{2}-\d{2}-\d{4}-mdu-session-\d{2}-\d{2}(\.[^.]+)?$/;
|
const newSessionRe = /^\d{2}-\d{2}-\d{4}-mdu-session-\d{2}-\d{2}(?:-\d+)?(\.[^.]+)?$/;
|
||||||
const mNew = fileName.match(newSessionRe);
|
const mNew = fileName.match(newSessionRe);
|
||||||
if (mNew) return `fileuploader${mNew[1] || ''}`;
|
if (mNew) return `fileuploader${mNew[1] || ''}`;
|
||||||
// Order matters: session first (longer, more specific) before daily.
|
// Order matters: session first (longer, more specific) before daily.
|
||||||
|
|||||||
6
main.js
6
main.js
@ -563,10 +563,10 @@ function getBaseLogFilePath() {
|
|||||||
// Log-mode bookkeeping. Three modes (see lib/log-mode.js): single, daily, session.
|
// Log-mode bookkeeping. Three modes (see lib/log-mode.js): single, daily, session.
|
||||||
// The session-id is stamped ONCE at main-process startup so every write of a
|
// The session-id is stamped ONCE at main-process startup so every write of a
|
||||||
// given session lands in the same file. A close→reopen of the app starts a new
|
// given session lands in the same file. A close→reopen of the app starts a new
|
||||||
// main process, so a new SESSION_ID, so a new session file. PID is appended as
|
// main process, so a new SESSION_ID, so a new session file. A 6-digit random is
|
||||||
// a cheap hedge against same-second restart collisions.
|
// appended as a cheap hedge against same-minute restart collisions.
|
||||||
const { resolveLogFileName, formatSessionStamp, formatDateStamp, stripModeStampFromFileName } = require('./lib/log-mode');
|
const { resolveLogFileName, formatSessionStamp, formatDateStamp, stripModeStampFromFileName } = require('./lib/log-mode');
|
||||||
const SESSION_ID = formatSessionStamp(new Date(), process.pid);
|
const SESSION_ID = formatSessionStamp(new Date(), String(Math.floor(100000 + Math.random() * 900000)));
|
||||||
let _activeLogKey = null; // remembers (mode + date-or-session) so cache rolls correctly
|
let _activeLogKey = null; // remembers (mode + date-or-session) so cache rolls correctly
|
||||||
let _activeLogPath = null;
|
let _activeLogPath = null;
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "multi-hoster-uploader",
|
"name": "multi-hoster-uploader",
|
||||||
"version": "3.3.107",
|
"version": "3.3.108",
|
||||||
"description": "Upload files to doodstream, voe, vidmoly, byse simultaneously",
|
"description": "Upload files to doodstream, voe, vidmoly, byse simultaneously",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@ -1,3 +1,17 @@
|
|||||||
|
# v3.3.108 — session log filename: 6-digit uniqueness suffix
|
||||||
|
|
||||||
|
User: append a generated 6-digit number to the session log filename, e.g.
|
||||||
|
26-06-2026-mdu-session-06-02-847581.log. Dropping seconds/pid in v3.3.107 reintroduced same-minute
|
||||||
|
collision risk on a fast close/reopen.
|
||||||
|
- formatSessionStamp(date, rand) appends `-${rand}` when rand is supplied (number or string), else unchanged.
|
||||||
|
- main.js stamps SESSION_ID = formatSessionStamp(new Date(), String(Math.floor(100000 + Math.random()*900000))).
|
||||||
|
- stripModeStampFromFileName newSessionRe gains an optional `(?:-\d+)?` so the suffix strips back to the base.
|
||||||
|
- Tests: stamp-with-rand (string + number), strip-with-suffix. 411 pass.
|
||||||
|
Shipped: gitea v3.3.108 (updater latest.yml verified) + GitHub mirror (lib/log-mode.js, main.js, package.json,
|
||||||
|
tests/log-mode.test.js only; tag repointed to the sanitized mirror commit, NOT the gitea history commit).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
# v3.3.107 — session log filename template → DD-MM-YYYY-mdu-session-HH-MM
|
# v3.3.107 — session log filename template → DD-MM-YYYY-mdu-session-HH-MM
|
||||||
|
|
||||||
User: change the session log filename from fileuploader-session-YYYY-MM-DD_HH-MM-SS-<pid>.log to
|
User: change the session log filename from fileuploader-session-YYYY-MM-DD_HH-MM-SS-<pid>.log to
|
||||||
|
|||||||
@ -69,6 +69,11 @@ test('formatSessionStamp: DD-MM-YYYY-mdu-session-HH-MM', () => {
|
|||||||
assert.equal(formatSessionStamp(new Date(2026, 5, 26, 6, 2, 36)), '26-06-2026-mdu-session-06-02');
|
assert.equal(formatSessionStamp(new Date(2026, 5, 26, 6, 2, 36)), '26-06-2026-mdu-session-06-02');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('formatSessionStamp: appends a 6-digit suffix when a rand is supplied', () => {
|
||||||
|
assert.equal(formatSessionStamp(new Date(2026, 5, 26, 6, 2, 36), '847581'), '26-06-2026-mdu-session-06-02-847581');
|
||||||
|
assert.equal(formatSessionStamp(new Date(2026, 5, 26, 6, 2, 36), 847581), '26-06-2026-mdu-session-06-02-847581');
|
||||||
|
});
|
||||||
|
|
||||||
test('resolveLogFileName: session mode with missing sessionId falls back to single (never emits malformed name)', () => {
|
test('resolveLogFileName: session mode with missing sessionId falls back to single (never emits malformed name)', () => {
|
||||||
assert.equal(
|
assert.equal(
|
||||||
resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'session' }),
|
resolveLogFileName({ baseName: 'fileuploader', ext: '.log', mode: 'session' }),
|
||||||
@ -109,6 +114,7 @@ test('stripModeStampFromFileName: strips a session-stamp suffix (with and withou
|
|||||||
|
|
||||||
test('stripModeStampFromFileName: new DD-MM-YYYY-mdu-session-HH-MM resets to the default base', () => {
|
test('stripModeStampFromFileName: new DD-MM-YYYY-mdu-session-HH-MM resets to the default base', () => {
|
||||||
assert.equal(stripModeStampFromFileName('26-06-2026-mdu-session-06-02.log'), 'fileuploader.log');
|
assert.equal(stripModeStampFromFileName('26-06-2026-mdu-session-06-02.log'), 'fileuploader.log');
|
||||||
|
assert.equal(stripModeStampFromFileName('26-06-2026-mdu-session-06-02-847581.log'), 'fileuploader.log');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('regression: resolveLogFileName(stripModeStampFromFileName(...)) is idempotent — persisting then re-resolving never compounds stamps', () => {
|
test('regression: resolveLogFileName(stripModeStampFromFileName(...)) is idempotent — persisting then re-resolving never compounds stamps', () => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user