From 422909352e6167c8d3c79802f87daf115e1c4e5d Mon Sep 17 00:00:00 2001 From: ProfessionalUwU Date: Fri, 16 Jun 2023 01:58:35 +0200 Subject: [PATCH 1/4] Find new packages We find new packages by getting the folder names in the DBPath local --- src/Pacserver/Pacserver.cs | 20 +++++++++++++++++--- src/Pacserver/Program.cs | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/Pacserver/Pacserver.cs b/src/Pacserver/Pacserver.cs index 5fc9a72..8ce63f4 100644 --- a/src/Pacserver/Pacserver.cs +++ b/src/Pacserver/Pacserver.cs @@ -3,8 +3,8 @@ using System.Text.RegularExpressions; namespace Pacserver.Utils; public class PacserverUtils { - public string pacmanCacheDirectory { get; set; } = string.Empty; - public static string pacmanDatabaseDirectory { get; set; } = string.Empty; + public string pacmanCacheDirectory = string.Empty; + public static string pacmanDatabaseDirectory = string.Empty; public static List pathsToDetermine = new List() { "CacheDir", "DBPath" }; public void readPacmanConfig() { using (StreamReader file = new StreamReader("/etc/pacman.conf")) { @@ -36,8 +36,22 @@ public class PacserverUtils { } } - public void checkForNewerPackagesAndDatabases() { + private List packageNamesAndVersion = new List(); + public void getEveryPackageNameAndVersionViaFolderName(string filePath) { + string[] directories = Directory.GetDirectories(pacmanDatabaseDirectory + "local/"); + foreach (string directory in directories) { + packageNamesAndVersion.Add(new DirectoryInfo(directory).Name); + } + File.WriteAllLines(filePath, packageNamesAndVersion); + } + public List newerPackages = new List(); + public void checkForNewerPackages() { + if (File.Exists("/tmp/before_update.txt") && File.Exists("/tmp/after_update.txt")) { + newerPackages = File.ReadAllLines("/tmp/after_update.txt").Except(File.ReadLines("/tmp/before_update.txt")).ToList(); + } else { + throw new FileNotFoundException("Necessary files could not be found"); + } } private static List newerPackagesAndDatabases = new List(); diff --git a/src/Pacserver/Program.cs b/src/Pacserver/Program.cs index 9840ca8..c66eb3c 100644 --- a/src/Pacserver/Program.cs +++ b/src/Pacserver/Program.cs @@ -10,12 +10,25 @@ public class Program { return; } + PacserverUtils utils = new PacserverUtils(); + switch (args[0]) { case "determinePacmanCacheDirectory": - PacserverUtils utils = new PacserverUtils(); utils.readPacmanConfig(); Console.WriteLine(utils.pacmanCacheDirectory); break; + case "before": + utils.readPacmanConfig(); + utils.getEveryPackageNameAndVersionViaFolderName("/tmp/before_update.txt"); + break; + case "after": + utils.readPacmanConfig(); + utils.getEveryPackageNameAndVersionViaFolderName("/tmp/after_update.txt"); + break; + case "diff": + utils.checkForNewerPackages(); + Console.WriteLine(utils.newerPackages); + break; default: Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(args[0] + " is not a recognized option."); From a1c1a0d5b0b5914f7021157dbbdcfb73f2473a59 Mon Sep 17 00:00:00 2001 From: ProfessionalUwU Date: Sat, 17 Jun 2023 00:41:56 +0200 Subject: [PATCH 2/4] Add fluentassertions test framework --- src/Pacserver.Tests/Pacserver.Tests.csproj | 1 + src/Pacserver.Tests/Usings.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Pacserver.Tests/Pacserver.Tests.csproj b/src/Pacserver.Tests/Pacserver.Tests.csproj index 01cafe4..3c29118 100644 --- a/src/Pacserver.Tests/Pacserver.Tests.csproj +++ b/src/Pacserver.Tests/Pacserver.Tests.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Pacserver.Tests/Usings.cs b/src/Pacserver.Tests/Usings.cs index 8c927eb..7fef4b0 100644 --- a/src/Pacserver.Tests/Usings.cs +++ b/src/Pacserver.Tests/Usings.cs @@ -1 +1,2 @@ -global using Xunit; \ No newline at end of file +global using Xunit; +global using FluentAssertions; \ No newline at end of file From 51aca7a2c2bf723d7795e30f667d32e7604bc594 Mon Sep 17 00:00:00 2001 From: ProfessionalUwU Date: Sat, 17 Jun 2023 02:47:35 +0200 Subject: [PATCH 3/4] Major advancements Added a couple of test to check for acurate behavior in certain conditions Added the capability to check if a database was modified New commandline arguments --- src/Pacserver.Tests/checkForNewerStuffTest.cs | 60 +++++++++++++++++ src/Pacserver/Pacserver.cs | 67 +++++++++++++++++-- src/Pacserver/Program.cs | 26 +++++-- 3 files changed, 140 insertions(+), 13 deletions(-) create mode 100644 src/Pacserver.Tests/checkForNewerStuffTest.cs diff --git a/src/Pacserver.Tests/checkForNewerStuffTest.cs b/src/Pacserver.Tests/checkForNewerStuffTest.cs new file mode 100644 index 0000000..71d9efe --- /dev/null +++ b/src/Pacserver.Tests/checkForNewerStuffTest.cs @@ -0,0 +1,60 @@ +using Pacserver.Utils; + +namespace Pacserver.Tests; + +public class checkForNewerStuffTest { + [Fact] + public void checkForNewerPackages_throwsExceptionIfNoFilesExist() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + + // Act + Action act = () => utils.diff("/tmp/before_update.txt", "/tmp/after_update.txt"); + + // Assert + act.Should().Throw().WithMessage("Necessary files could not be found"); + } + + [Fact] + public void getEveryPackageNameAndVersionViaFolderName_createsFiles() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + utils.readPacmanConfig(); + + // Act + utils.getEveryPackageNameAndVersionViaFolderName("/tmp/before_update.txt"); + utils.getEveryPackageNameAndVersionViaFolderName("/tmp/after_update.txt"); + + // Assert + File.Exists("/tmp/before_update.txt").Should().BeTrue(); + File.Exists("/tmp/after_update.txt").Should().BeTrue(); + } + + [Fact] + public void packageNamesAndVersion_notEmpty() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + utils.readPacmanConfig(); + utils.getEveryPackageNameAndVersionViaFolderName("/tmp/before_update.txt"); + + // Act + List packageList = utils.packageNamesAndVersion; + + // Assert + packageList.Should().NotBeNullOrEmpty(); + } + + [Fact] + public void getEveryPackageNameAndVersionViaFolderName_throwsExceptionIfListIsEmpty() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + Directory.CreateDirectory("/tmp/local"); + utils.pacmanDatabaseDirectory = "/tmp/"; + + // Act + Action act = () => utils.getEveryPackageNameAndVersionViaFolderName("/tmp/before_update.txt"); + + // Assert + act.Should().Throw().WithMessage("How did you execute this without any packages?"); + } +} \ No newline at end of file diff --git a/src/Pacserver/Pacserver.cs b/src/Pacserver/Pacserver.cs index 8ce63f4..7f1155b 100644 --- a/src/Pacserver/Pacserver.cs +++ b/src/Pacserver/Pacserver.cs @@ -4,7 +4,7 @@ using System.Text.RegularExpressions; namespace Pacserver.Utils; public class PacserverUtils { public string pacmanCacheDirectory = string.Empty; - public static string pacmanDatabaseDirectory = string.Empty; + public string pacmanDatabaseDirectory = string.Empty; public static List pathsToDetermine = new List() { "CacheDir", "DBPath" }; public void readPacmanConfig() { using (StreamReader file = new StreamReader("/etc/pacman.conf")) { @@ -36,24 +36,77 @@ public class PacserverUtils { } } - private List packageNamesAndVersion = new List(); + public List packageNamesAndVersion = new List(); public void getEveryPackageNameAndVersionViaFolderName(string filePath) { string[] directories = Directory.GetDirectories(pacmanDatabaseDirectory + "local/"); foreach (string directory in directories) { packageNamesAndVersion.Add(new DirectoryInfo(directory).Name); } - File.WriteAllLines(filePath, packageNamesAndVersion); + + if (packageNamesAndVersion.Capacity > 0) { + File.WriteAllLines(filePath, packageNamesAndVersion); + } else { + throw new Exception("How did you execute this without any packages?"); + } } - public List newerPackages = new List(); - public void checkForNewerPackages() { - if (File.Exists("/tmp/before_update.txt") && File.Exists("/tmp/after_update.txt")) { - newerPackages = File.ReadAllLines("/tmp/after_update.txt").Except(File.ReadLines("/tmp/before_update.txt")).ToList(); + public List diffOfPackagesOrDatabases = new List(); + public void diff(string before, string after) { + if (File.Exists(before) && File.Exists(after)) { + diffOfPackagesOrDatabases = File.ReadAllLines(after).Except(File.ReadLines(before)).ToList(); } else { throw new FileNotFoundException("Necessary files could not be found"); } } + public List databases = new List(); + public void checkIfDatabasesWereModified(string mode, string filePath) { + string[] databases = Directory.GetFiles(pacmanDatabaseDirectory + "sync/"); + + // if (mode == "nuke") { + // using (File.Open(filePath, FileMode.Truncate, FileAccess.ReadWrite, FileShare.Delete)) { + // File.Delete(filePath); + // } + // } + + foreach (string database in databases) { + switch (mode) { + case "before": + if (!File.Exists(filePath)) { + using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (StreamWriter sw = new StreamWriter(filePath)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } + } + } else if (File.Exists(filePath)) { + using (File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (var sw = new StreamWriter(filePath, true)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } + } + } + break; + case "after": + if (!File.Exists(filePath)) { + using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (StreamWriter sw = new StreamWriter(filePath)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } + } + } else if (File.Exists(filePath)) { + using (File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (var sw = new StreamWriter(filePath, true)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } + } + } + break; + default: + throw new ArgumentException("No valid mode was selected"); + } + } + } + private static List newerPackagesAndDatabases = new List(); public async void transferPacmanCache() { HttpClient client = new HttpClient(); diff --git a/src/Pacserver/Program.cs b/src/Pacserver/Program.cs index c66eb3c..e549736 100644 --- a/src/Pacserver/Program.cs +++ b/src/Pacserver/Program.cs @@ -6,7 +6,7 @@ public class Program { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Please specify an option."); Console.ResetColor(); - Console.WriteLine("Possible options are: determinePacmanCacheDirectory"); + Console.WriteLine("Possible options are: determinePacmanCacheDirectory, packagesBefore, packagesAfter, diffPackages, databasesBefore, databasesAfter, diffDatabases"); return; } @@ -17,17 +17,31 @@ public class Program { utils.readPacmanConfig(); Console.WriteLine(utils.pacmanCacheDirectory); break; - case "before": + case "packagesBefore": utils.readPacmanConfig(); utils.getEveryPackageNameAndVersionViaFolderName("/tmp/before_update.txt"); break; - case "after": + case "packagesAfter": utils.readPacmanConfig(); utils.getEveryPackageNameAndVersionViaFolderName("/tmp/after_update.txt"); break; - case "diff": - utils.checkForNewerPackages(); - Console.WriteLine(utils.newerPackages); + case "diffPackages": + utils.diff("/tmp/before_update.txt", "/tmp/after_update.txt"); + string packages = string.Join(",", utils.diffOfPackagesOrDatabases); + Console.WriteLine(packages); + break; + case "databasesBefore": + utils.readPacmanConfig(); + utils.checkIfDatabasesWereModified("before", "/tmp/databases_before.txt"); + break; + case "databasesAfter": + utils.readPacmanConfig(); + utils.checkIfDatabasesWereModified("after", "/tmp/databases_after.txt"); + break; + case "diffDatabases": + utils.diff("/tmp/databases_before.txt", "/tmp/databases_after.txt"); + string databases = string.Join(",", utils.diffOfPackagesOrDatabases); + Console.WriteLine(databases); break; default: Console.ForegroundColor = ConsoleColor.Red; From 1994e92e9e57e1dc234d87591a91e3949e565e9d Mon Sep 17 00:00:00 2001 From: ProfessionalUwU Date: Sun, 18 Jun 2023 17:24:56 +0200 Subject: [PATCH 4/4] Minor changes && Add tests Made a seperate method for writing the database access time files Added tests for checkIfDatabasesWereModified --- .../checkIfDatabasesWereModifiedTest.cs | 31 +++++++++++ src/Pacserver/Pacserver.cs | 52 +++++++------------ 2 files changed, 50 insertions(+), 33 deletions(-) create mode 100644 src/Pacserver.Tests/checkIfDatabasesWereModifiedTest.cs diff --git a/src/Pacserver.Tests/checkIfDatabasesWereModifiedTest.cs b/src/Pacserver.Tests/checkIfDatabasesWereModifiedTest.cs new file mode 100644 index 0000000..d4ef46e --- /dev/null +++ b/src/Pacserver.Tests/checkIfDatabasesWereModifiedTest.cs @@ -0,0 +1,31 @@ +using Pacserver.Utils; + +namespace Pacserver.Tests; + +public class checkIfDatabasesWereModifiedTest { + [Fact] + public void checkIfDatabasesWereModified_throwsExceptionIfNoValidModeIsGiven() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + utils.readPacmanConfig(); + + // Act + Action act = () => utils.checkIfDatabasesWereModified("test", "/tmp/test.txt"); + + // Assert + act.Should().Throw().WithMessage("No valid mode was given. Valid modes are before and after"); + } + + [Fact] + public void checkIfDatabasesWereModified_throwsNoExceptionIfValidModeIsGiven() { + // Arrange + PacserverUtils utils = new PacserverUtils(); + utils.readPacmanConfig(); + + // Act + Action act = () => utils.checkIfDatabasesWereModified("before", "/tmp/test.txt"); + + // Assert + act.Should().NotThrow(); + } +} \ No newline at end of file diff --git a/src/Pacserver/Pacserver.cs b/src/Pacserver/Pacserver.cs index 7f1155b..985bc11 100644 --- a/src/Pacserver/Pacserver.cs +++ b/src/Pacserver/Pacserver.cs @@ -63,46 +63,32 @@ public class PacserverUtils { public void checkIfDatabasesWereModified(string mode, string filePath) { string[] databases = Directory.GetFiles(pacmanDatabaseDirectory + "sync/"); - // if (mode == "nuke") { - // using (File.Open(filePath, FileMode.Truncate, FileAccess.ReadWrite, FileShare.Delete)) { - // File.Delete(filePath); - // } - // } - foreach (string database in databases) { switch (mode) { case "before": - if (!File.Exists(filePath)) { - using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { - using (StreamWriter sw = new StreamWriter(filePath)) { - sw.WriteLine(database + " " + File.GetLastAccessTime(database)); - } - } - } else if (File.Exists(filePath)) { - using (File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { - using (var sw = new StreamWriter(filePath, true)) { - sw.WriteLine(database + " " + File.GetLastAccessTime(database)); - } - } - } + writeDatabaseAccessTimeToFile(filePath, database); break; case "after": - if (!File.Exists(filePath)) { - using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { - using (StreamWriter sw = new StreamWriter(filePath)) { - sw.WriteLine(database + " " + File.GetLastAccessTime(database)); - } - } - } else if (File.Exists(filePath)) { - using (File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { - using (var sw = new StreamWriter(filePath, true)) { - sw.WriteLine(database + " " + File.GetLastAccessTime(database)); - } - } - } + writeDatabaseAccessTimeToFile(filePath, database); break; default: - throw new ArgumentException("No valid mode was selected"); + throw new ArgumentException("No valid mode was given. Valid modes are before and after"); + } + } + } + + public void writeDatabaseAccessTimeToFile(string filePath, string database) { + if (!File.Exists(filePath)) { + using (File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (StreamWriter sw = new StreamWriter(filePath)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } + } + } else if (File.Exists(filePath)) { + using (File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)) { + using (var sw = new StreamWriter(filePath, true)) { + sw.WriteLine(database + " " + File.GetLastAccessTime(database)); + } } } }