Skip to content

Commit fc3df6a

Browse files
authored
Merge pull request #26 from dmnyu/release-v0.2.5-alpha
Release v0.2.5 alpha
2 parents 78823d9 + dee3c28 commit fc3df6a

33 files changed

+619
-397
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: BagIt.NET CI
22

33
on:
44
push:
5-
branches: ["*"]
5+
branches: ["release-v*"]
66
pull_request:
77
branches: [ main ]
88

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
It allows you to create **BagIt bags**—structured file collections with checksums for reliable storage and transfer of digital content.
55
It currently consists of a core library (`bagit.net`) and a CLI application (`bagit.net.cli`) for Linux, MacOS, and Windows.
66

7-
[![Release](https://img.shields.io/badge/release-v0.2.3--alpha-blue)](https://github.com/dmnyu/bagit.net/releases/v0.2.3-alpha)
7+
[![Release](https://img.shields.io/badge/release-v0.2.5--alpha-blue)](https://github.com/dmnyu/bagit.net/releases/v0.2.5-alpha)
88
![BagIt.NET CI](https://github.com/dmnyu/bagit.net/actions/workflows/ci.yml/badge.svg)
99

1010
> ⚠️ **Note:** This project is in early development. It currently supports the creation and validation of **BagIt-formatted bags**.
@@ -80,8 +80,8 @@ bagit.net help
8080

8181
### Linux
8282
```bash
83-
wget https://github.com/dmnyu/bagit.net/releases/download/v0.2.4-alpha/bagit.net.cli-v0.2.4-alpha-linux-x64.tgz
84-
tar xvzf bagit.net.cli-v0.2.4-alpha-linux-x64.tgz
83+
wget https://github.com/dmnyu/bagit.net/releases/download/v0.2.5-alpha/bagit.net.cli-v0.2.5-alpha-linux-x64.tgz
84+
tar xvzf bagit.net.cli-v0.2.5-alpha-linux-x64.tgz
8585
cd bagit.net
8686
sudo ./install.sh
8787
bagit.net --help
@@ -95,8 +95,8 @@ On RHEL/CentOS systems with SELinux or `noexec` restrictions on `/tmp`, these bi
9595

9696
### Windows
9797
```powershell
98-
Invoke-WebRequest -Uri https://github.com/dmnyu/bagit.net/releases/download/v0.2.4-alpha/bagit.net.cli-v0.2.4-alpha-win-x64.zip -OutFile bagit.net.cli-v0.2.4-alpha-win-x64.zip
99-
Expand-Archive bagit.net.cli-v0.2.4-alpha-win-x64.zip -DestinationPath .
98+
Invoke-WebRequest -Uri https://github.com/dmnyu/bagit.net/releases/download/v0.2.5-alpha/bagit.net.cli-v0.2.5-alpha-win-x64.zip -OutFile bagit.net.cli-v0.2.5-alpha-win-x64.zip
99+
Expand-Archive bagit.net.cli-v0.2.5-alpha-win-x64.zip -DestinationPath .
100100
cd .\bagit.net
101101
.\bagit.net.exe --help
102102
.\install.ps1
@@ -108,8 +108,8 @@ cd .\bagit.net
108108

109109
### MacOS
110110
```bash
111-
wget https://github.com/dmnyu/bagit.net/releases/download/0.2.4-alpha/bagit.net.cli-v0.2.4-alpha-macos-arm64.tgz
112-
tar xvzf bagit.net.cli-v0.2.4-alpha-macos-arm64.tgz
111+
wget https://github.com/dmnyu/bagit.net/releases/download/v0.2.5-alpha/bagit.net.cli-v0.2.5-alpha-macos-arm64.tgz
112+
tar xvzf bagit.net.cli-v0.2.5-alpha-macos-arm64.tgz
113113
cd bagit.net
114114
sudo ./install.sh
115115
bagit.net --help

bagit.net.cli/Commands/BagCommand.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public class Settings : CommandSettings
1818
[CommandOption("--log")]
1919
public string? logFile { get; set; }
2020

21+
[CommandOption("--quiet")]
22+
public bool Quiet { get; set; }
23+
2124
[CommandArgument(0, "[directory]")]
2225
[Description("Path to the directory to bag.")]
2326
public string? Directory { get; set; }
@@ -30,7 +33,7 @@ public override int Execute(CommandContext context, Settings settings, Cancellat
3033
{
3134
var serviceProvider = ServiceConfigurator.BuildServiceProvider<Bagger>(settings.logFile);
3235
var bagger = serviceProvider.GetRequiredService<Bagger>();
33-
bagger.CreateBag(settings.Directory, settings.Algorithm, settings.logFile, cancellationToken);
36+
bagger.CreateBag(settings.Directory, settings.Algorithm, settings.Quiet, settings.logFile, cancellationToken);
3437
}
3538
catch (Exception ex) {
3639
AnsiConsole.MarkupLine($"[red][bold]ERROR:[/] {ex.Message}");

bagit.net.cli/Commands/ValidateCommand.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using bagit.net.cli.lib;
2-
using bagit.net.domain;
32
using Microsoft.Extensions.DependencyInjection;
43
using Spectre.Console;
54
using Spectre.Console.Cli;
@@ -20,6 +19,9 @@ public class Settings : CommandSettings
2019
[CommandOption("--complete")]
2120
public bool Completeness { get; set; }
2221

22+
[CommandOption("--quiet")]
23+
public bool Quiet { get; set; }
24+
2325
[CommandArgument(0, "[directory]")]
2426
[Description("Path to the bag directory to validate.")]
2527
public string? Directory { get; set; }
@@ -31,7 +33,7 @@ public override int Execute(CommandContext context, Settings settings, Cancellat
3133
{
3234
var serviceProvider = ServiceConfigurator.BuildServiceProvider<Validator>(settings.logFile);
3335
var validator = serviceProvider.GetRequiredService<Validator>();
34-
validator.ValidateBag(settings.Directory, settings.Fast, settings.Completeness, settings.logFile, cancellationToken);
36+
validator.ValidateBag(settings.Directory, settings.Fast, settings.Completeness, settings.Quiet, settings.logFile, cancellationToken);
3537
}
3638
catch (Exception ex) {
3739
AnsiConsole.MarkupLine($"[red][bold]ERROR:[/] {ex.Message}");

bagit.net.cli/dist/install scripts/install.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Usage: sudo ./install.sh
44

55
BINARY_NAME="bagit.net"
6-
TARGET_DIR="/usr/local/bin"
6+
TARGET_DIR="$HOME/bin"
77
TARGET_PATH="$TARGET_DIR/bagit.net"
88

99
# Check if the binary exists in the current directory

bagit.net.cli/lib/Bagger.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@ public class Bagger
99
{
1010
readonly ICreationService _creationService;
1111
readonly ILogger _logger;
12+
readonly IMessageService _messageService;
1213

13-
public Bagger(ILogger<Bagger> logger, ICreationService creationService)
14+
public Bagger(ILogger<Bagger> logger, ICreationService creationService, IMessageService messageService)
1415
{
1516
_logger = logger;
1617
_creationService = creationService;
18+
_messageService = messageService;
1719
}
1820

19-
public int CreateBag(string? dirLocation, string? checkSumAlgorithm, string? logFile, CancellationToken cancellationToken)
21+
public int CreateBag(string? dirLocation, string? checkSumAlgorithm, bool quiet, string? logFile, CancellationToken cancellationToken)
2022
{
23+
_messageService.Add(new MessageRecord(MessageLevel.INFO, $"using bagit.net v{Bagit.VERSION}"));
2124
if (string.IsNullOrWhiteSpace(dirLocation))
2225
{
2326
AnsiConsole.MarkupLine("[red][bold]ERROR:[/][/]");
@@ -61,6 +64,8 @@ public int CreateBag(string? dirLocation, string? checkSumAlgorithm, string? log
6164
}
6265

6366
_creationService.CreateBag(bagPath, algorithm);
67+
var messages = _messageService.GetAll();
68+
Logging.LogEvents(messages, quiet, _logger);
6469
return 0;
6570
}
6671
}

bagit.net.cli/lib/Logging.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using Serilog.Events;
22
using Serilog.Formatting;
3+
using bagit.net.domain;
4+
using Microsoft.Extensions.Logging;
5+
using Spectre.Console;
36

47
namespace bagit.net.cli.lib;
58

@@ -30,4 +33,56 @@ public void Format(LogEvent logEvent, TextWriter output)
3033
}
3134
}
3235

36+
public static class Logging
37+
{
38+
public static void LogEvent(MessageRecord messageRecord, ILogger logger)
39+
{
40+
switch(messageRecord.GetLevel()) {
41+
case MessageLevel.INFO:
42+
{
43+
logger.LogInformation(messageRecord.GetMessage());
44+
break;
45+
}
46+
case MessageLevel.ERROR:
47+
{
48+
logger.LogError(messageRecord.GetMessage());
49+
break;
50+
}
51+
case MessageLevel.WARNING:
52+
{
53+
logger.LogWarning(messageRecord.GetMessage());
54+
break;
55+
}
56+
default: throw new InvalidDataException("Unknown message level");
57+
}
58+
}
59+
60+
public static void LogEvents(IEnumerable<MessageRecord> records, bool quiet, ILogger logger) {
61+
62+
foreach (var messageRecord in records)
63+
{
64+
switch (messageRecord.GetLevel())
65+
{
66+
case MessageLevel.INFO:
67+
{
68+
if (!quiet)
69+
logger.LogInformation(messageRecord.GetMessage());
70+
break;
71+
}
72+
case MessageLevel.ERROR:
73+
{
74+
logger.LogError(messageRecord.GetMessage());
75+
break;
76+
}
77+
case MessageLevel.WARNING:
78+
{
79+
logger.LogWarning(messageRecord.GetMessage());
80+
break;
81+
}
82+
default: throw new InvalidDataException("Unknown message level");
83+
}
84+
}
85+
}
86+
}
87+
3388

bagit.net.cli/lib/ServiceConfigurator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static ServiceProvider BuildServiceProvider<TWorker>(string? logFile = ""
2222
}
2323
else
2424
{
25-
loggerConfig = loggerConfig.WriteTo.File(logFile);
25+
loggerConfig = loggerConfig.WriteTo.File(new ShortLevelFormatter(), logFile);
2626
}
2727

2828
Log.Logger = loggerConfig.CreateLogger();
@@ -35,6 +35,7 @@ public static ServiceProvider BuildServiceProvider<TWorker>(string? logFile = ""
3535
services.AddSingleton<IFileManagerService, FileManagerService>();
3636
services.AddSingleton<IValidationService, ValidationService>();
3737
services.AddSingleton<ICreationService, CreationService>();
38+
services.AddSingleton<IMessageService, MessageService>();
3839
services.AddTransient<TWorker>();
3940
return services.BuildServiceProvider();
4041
}

bagit.net.cli/lib/Validator.cs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,17 @@ public class Validator
99
{
1010
private readonly ILogger _logger;
1111
private readonly IValidationService _validationService;
12-
public Validator(ILogger<Validator> logger, IValidationService validationService)
12+
private readonly IMessageService _messageService;
13+
public Validator(ILogger<Validator> logger, IValidationService validationService, IMessageService messageService)
1314
{
1415
_logger = logger;
1516
_validationService = validationService;
17+
_messageService = messageService;
1618
}
17-
public int ValidateBag(string? bagPath, bool fast, bool complete, string? logFile, CancellationToken cancellationToken)
19+
20+
public int ValidateBag(string? bagPath, bool fast, bool complete, bool quiet, string? logFile, CancellationToken cancellationToken)
1821
{
19-
_logger.LogInformation($"Using bagit.net v{Bagit.VERSION}");
22+
_messageService.Add(new MessageRecord(MessageLevel.INFO, $"using bagit.net v{Bagit.VERSION}"));
2023

2124
if (fast && complete)
2225
{
@@ -25,7 +28,7 @@ public int ValidateBag(string? bagPath, bool fast, bool complete, string? logFil
2528
return 1;
2629
}
2730

28-
try
31+
try
2932
{
3033

3134
if (string.IsNullOrWhiteSpace(bagPath))
@@ -51,23 +54,38 @@ public int ValidateBag(string? bagPath, bool fast, bool complete, string? logFil
5154
AnsiConsole.MarkupLine($"Logging to {logFile}");
5255
}
5356

57+
List<MessageRecord> messages;
58+
5459
if (complete)
5560
{
56-
_validationService.ValidateCompleteness(bagPath);
57-
_logger.LogInformation($"{bagPath} is complete according to manifests files");
58-
return 0;
59-
}
61+
_validationService.ValidateBagCompleteness(bagPath);
62+
messages = _messageService.GetAll().ToList();
6063

61-
if (fast)
62-
{
64+
if(MessageHelpers.HasError(messages))
65+
{
66+
messages.Add(new MessageRecord(MessageLevel.ERROR, $"{bagPath} is not complete."));
67+
} else
68+
{
69+
messages.Add(new MessageRecord(MessageLevel.INFO, $"{bagPath} is complete."));
70+
}
71+
}
72+
else if (fast)
73+
{
6374
_validationService.ValidateBagFast(bagPath);
64-
_logger.LogInformation($"{bagPath} is valid according to Payload-Oxum");
65-
return 0;
75+
messages = _messageService.GetAll().ToList();
6676
}
67-
68-
_validationService.ValidateBag(bagPath);
69-
_logger.LogInformation($"{bagPath} is valid");
77+
else
78+
{
79+
_validationService.ValidateBag(bagPath);
80+
messages = _messageService.GetAll().ToList();
81+
if(!MessageHelpers.HasError(messages))
82+
{
83+
messages.Add(new MessageRecord(MessageLevel.INFO, "bag is valid"));
84+
}
85+
}
86+
Logging.LogEvents(messages, quiet, _logger);
7087
return 0;
88+
7189
} catch (Exception ex) {
7290
_logger.LogCritical(ex, "Failed to validate bag at {Path}", bagPath);
7391
AnsiConsole.MarkupLine("[red][bold]ERROR:[/][/]");

bagit.net.tests/TestServiceProviders.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static ServiceProvider BuildServiceProvider()
1717
var logger = DefaultLogger.GetDefaultLogger();
1818
services.AddLogging(builder => builder.AddSerilog(logger, dispose: true));
1919
services.AddSingleton<IChecksumService, ChecksumService>();
20+
services.AddSingleton<IMessageService, MessageService>();
2021
return services.BuildServiceProvider();
2122
}
2223
}
@@ -30,6 +31,7 @@ public static ServiceProvider BuildServiceProvider()
3031
services.AddLogging(builder => builder.AddSerilog(logger, dispose: true));
3132
services.AddSingleton<IManifestService, ManifestService>();
3233
services.AddSingleton<IChecksumService, ChecksumService>();
34+
services.AddSingleton<IMessageService, MessageService>();
3335
return services.BuildServiceProvider();
3436
}
3537
}
@@ -43,6 +45,7 @@ public static ServiceProvider BuildServiceProvider()
4345
services.AddLogging(builder => builder.AddSerilog(logger, dispose: true));
4446
services.AddSingleton<ITagFileService, TagFileService>();
4547
services.AddSingleton<IFileManagerService, FileManagerService>();
48+
services.AddSingleton<IMessageService, MessageService>();
4649
return services.BuildServiceProvider();
4750
}
4851
}
@@ -55,6 +58,7 @@ public static ServiceProvider BuildServiceProvider()
5558
var logger = DefaultLogger.GetDefaultLogger();
5659
services.AddLogging(builder => builder.AddSerilog(logger, dispose: true));
5760
services.AddSingleton<IFileManagerService, FileManagerService>();
61+
services.AddSingleton<IMessageService, MessageService>();
5862
return services.BuildServiceProvider();
5963
}
6064
}
@@ -71,6 +75,7 @@ public static ServiceProvider BuildServiceProvider()
7175
services.AddSingleton<IFileManagerService, FileManagerService>();
7276
services.AddSingleton<IManifestService, ManifestService>();
7377
services.AddSingleton<IChecksumService, ChecksumService>();
78+
services.AddSingleton<IMessageService, MessageService>();
7479
return services.BuildServiceProvider();
7580
}
7681
}
@@ -88,6 +93,7 @@ public static ServiceProvider BuildServiceProvider()
8893
services.AddSingleton<IFileManagerService, FileManagerService>();
8994
services.AddSingleton<IManifestService, ManifestService>();
9095
services.AddSingleton<IChecksumService, ChecksumService>();
96+
services.AddSingleton<IMessageService, MessageService>();
9197
return services.BuildServiceProvider();
9298
}
9399
}

0 commit comments

Comments
 (0)