Add Gitea registry support and fix cross-device archiving

- Update docker-compose.yml to reference Gitea registry image
- Add docker-publish.cmd for building and pushing to Gitea
- Fix ArchiveService to handle cross-device moves by falling back
  to copy+delete when input and archive are on different volumes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-21 18:19:03 -05:00
parent 2633bbf37a
commit 2da546fbd5
3 changed files with 57 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
services:
discord-archive:
image: git.thecozycat.net/aj/discordarchivemanager:latest
build: .
volumes:
- ./input:/app/input

2
docker-publish.cmd Normal file
View File

@@ -0,0 +1,2 @@
docker build -t git.thecozycat.net/aj/discordarchivemanager:latest .
docker push git.thecozycat.net/aj/discordarchivemanager:latest

View File

@@ -36,7 +36,7 @@ public class ArchiveService
// Archive the JSON file
var archivedJsonPath = Path.Combine(archivePath, jsonFileName);
var uniqueJsonPath = GetUniquePath(archivedJsonPath);
File.Move(jsonFilePath, uniqueJsonPath);
MoveFile(jsonFilePath, uniqueJsonPath);
_logger.LogInformation("Archived JSON file to {Path}", uniqueJsonPath);
// Archive the _Files directory if it exists
@@ -45,7 +45,7 @@ public class ArchiveService
var filesDirectoryName = Path.GetFileName(filesDirectory);
var archivedFilesPath = Path.Combine(archivePath, filesDirectoryName);
var uniqueFilesPath = GetUniquePath(archivedFilesPath);
Directory.Move(filesDirectory, uniqueFilesPath);
MoveDirectory(filesDirectory, uniqueFilesPath);
_logger.LogInformation("Archived files directory to {Path}", uniqueFilesPath);
}
@@ -152,6 +152,58 @@ public class ArchiveService
}
}
/// <summary>
/// Moves a file, falling back to copy+delete for cross-device moves.
/// </summary>
private static void MoveFile(string source, string destination)
{
try
{
File.Move(source, destination);
}
catch (IOException)
{
File.Copy(source, destination);
File.Delete(source);
}
}
/// <summary>
/// Moves a directory, falling back to copy+delete for cross-device moves.
/// </summary>
private static void MoveDirectory(string source, string destination)
{
try
{
Directory.Move(source, destination);
}
catch (IOException)
{
CopyDirectory(source, destination);
Directory.Delete(source, true);
}
}
/// <summary>
/// Recursively copies a directory.
/// </summary>
private static void CopyDirectory(string source, string destination)
{
Directory.CreateDirectory(destination);
foreach (var file in Directory.GetFiles(source))
{
var destFile = Path.Combine(destination, Path.GetFileName(file));
File.Copy(file, destFile);
}
foreach (var dir in Directory.GetDirectories(source))
{
var destDir = Path.Combine(destination, Path.GetFileName(dir));
CopyDirectory(dir, destDir);
}
}
/// <summary>
/// Gets a unique file/directory path by appending a number if the path already exists.
/// </summary>