diff --git a/PMF/src/Managers/LocalPackageManager.cs b/PMF/src/Managers/LocalPackageManager.cs index 7cc47b4..83d6407 100644 --- a/PMF/src/Managers/LocalPackageManager.cs +++ b/PMF/src/Managers/LocalPackageManager.cs @@ -22,6 +22,7 @@ namespace PMF.Managers validateManifestFile(); var json = File.ReadAllText(Config.ManifestFileName); PackageManager.PackageList = JsonConvert.DeserializeObject>(json); + PMF.InvokePackageMessageEvent("Initialized PMF successfully"); } /// @@ -35,6 +36,7 @@ namespace PMF.Managers var json = JsonConvert.SerializeObject(PackageManager.PackageList); File.WriteAllText(Config.ManifestFileName, json); Directory.Delete(Config.TemporaryFolder, true); + PMF.InvokePackageMessageEvent("Successfully cleaned PMF"); } public static void validateManifestFile() @@ -83,10 +85,11 @@ namespace PMF.Managers { string packageDirectory = Path.Combine(Config.PackageInstallationFolder, id); Directory.Delete(packageDirectory, true); + PMF.InvokePackageMessageEvent($"Successfully removed package {id}"); } catch { - // Do nothing, user probably already deleted the folder + PMF.InvokePackageMessageEvent($"Couldn't find package with id of: {id}. Removing from package list"); } return PackageManager.PackageList.Remove(id); @@ -101,16 +104,23 @@ namespace PMF.Managers /// The package that was installed public static Package InstallPackage(Package remotePackage, Asset asset, string zipPath) { + PMF.InvokePackageMessageEvent("Extracting package"); ZipFile.ExtractToDirectory(Path.Combine(zipPath, asset.FileName), Path.Combine(Config.PackageInstallationFolder, remotePackage.ID)); + // Maybe a library folder and check if is installed foreach (var dependency in asset.Dependencies) + { + PMF.InvokePackageMessageEvent($"Extracting dependency with id: {dependency.ID}"); ZipFile.ExtractToDirectory(Path.Combine(zipPath, dependency.FileName), Path.Combine(Config.PackageInstallationFolder, remotePackage.ID, "Dependencies", dependency.ID)); + } remotePackage.Assets.Clear(); remotePackage.Assets.Add(asset); PackageManager.PackageList.Add(remotePackage); + PMF.InvokePackageMessageEvent($"Successfully installed {remotePackage.ID}@{asset.Version}"); + return remotePackage; } } diff --git a/PMF/src/Managers/PackageManager.cs b/PMF/src/Managers/PackageManager.cs index e4b97ad..0c9b266 100644 --- a/PMF/src/Managers/PackageManager.cs +++ b/PMF/src/Managers/PackageManager.cs @@ -26,12 +26,11 @@ namespace PMF.Managers { LocalPackageManager.Start(); initialized = true; - Console.WriteLine("PMF intialized succesfully"); } } catch (Exception ex) { - Console.Error.WriteLine($"PMF failed to initialize. \n${ex.InnerException.Message}\nClosing."); + PMF.InvokePackageMessageEvent($"PMF failed to initialize. \n${ex.InnerException.Message}\nClosing."); Environment.Exit(0); } } @@ -48,13 +47,18 @@ namespace PMF.Managers } catch (Exception ex) { - Console.Error.WriteLine($"Something failed while cleaning up PMF - \n{ex.InnerException.Message}"); + string message = null; + if (ex.InnerException != null) + message = ex.InnerException.Message; + else + message = ex.Message; + PMF.InvokePackageMessageEvent($"Something failed while cleaning up PMF - \n{message}"); } } private static void notInitialized() { - Console.WriteLine("You must initialize PMF first before using it.\nClosing"); + PMF.InvokePackageMessageEvent("You must initialize PMF first before using it.\nClosing"); Environment.Exit(0); } @@ -106,6 +110,7 @@ namespace PMF.Managers } else { + PMF.InvokePackageMessageEvent("Package already installed"); return PackageState.AlreadyInstalled; } } @@ -142,6 +147,7 @@ namespace PMF.Managers } else { + PMF.InvokePackageMessageEvent("Package already installed"); return PackageState.AlreadyInstalled; } } @@ -160,21 +166,26 @@ namespace PMF.Managers notInitialized(); // check if is already installed - if (LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + if (!LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + { + Package remotePackage = RemotePackageManager.GetPackageInfo(id); + + if (remotePackage == null) + return PackageState.NotExisting; + + Asset asset = RemotePackageManager.GetAssetLatestVersionBySdkVersion(remotePackage); + + if (asset == null) + return PackageState.VersionNotFound; + + package = remotePackage; + return InstallPackage(remotePackage, asset); + } + else + { + PMF.InvokePackageMessageEvent("Package already installed"); return PackageState.AlreadyInstalled; - - Package remotePackage = RemotePackageManager.GetPackageInfo(id); - - if (remotePackage == null) - return PackageState.NotExisting; - - Asset asset = RemotePackageManager.GetAssetLatestVersionBySdkVersion(remotePackage); - - if (asset == null) - return PackageState.VersionNotFound; - - package = remotePackage; - return InstallPackage(remotePackage, asset); + } } /// @@ -204,22 +215,27 @@ namespace PMF.Managers notInitialized(); // check if is already installed - if (!LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + if (LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + { + var remotePackage = RemotePackageManager.GetPackageInfo(id); + + if (remotePackage == null) + return PackageState.NotExisting; + + var asset = RemotePackageManager.GetAssetLatestVersion(remotePackage); + + // You already have the latest version + if (localPackage.Assets[0].Version == asset.Version) + return PackageState.UpToDate; + + Uninstall(id); + return InstallPackage(remotePackage, asset); + } + else + { + PMF.InvokePackageMessageEvent("Package not installed"); return PackageState.NotInstalled; - - var remotePackage = RemotePackageManager.GetPackageInfo(id); - - if (remotePackage == null) - return PackageState.NotExisting; - - var asset = RemotePackageManager.GetAssetLatestVersion(remotePackage); - - // You already have the latest version - if (localPackage.Assets[0].Version == asset.Version) - return PackageState.UpToDate; - - Uninstall(id); - return InstallPackage(remotePackage, asset); + } } /// @@ -236,24 +252,32 @@ namespace PMF.Managers notInitialized(); // check if is already installed - if (!LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + if (LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string packageDirectory)) + { + // Up to date + if (localPackage.Assets[0].Version == version) + { + PMF.InvokePackageMessageEvent("Already up to date"); + return PackageState.UpToDate; + } + + var remotePackage = RemotePackageManager.GetPackageInfo(id); + + if (remotePackage == null) + return PackageState.NotExisting; + + var asset = remotePackage.GetAssetVersion(version); + + // We don't want to check here if it was success, we just was to remove the package if it is installed + Uninstall(id); + + return InstallPackage(remotePackage, asset); + } + else + { + PMF.InvokePackageMessageEvent("Package not installed"); return PackageState.NotInstalled; - - // You already have the latest version - if (localPackage.Assets[0].Version == version) - return PackageState.UpToDate; - - var remotePackage = RemotePackageManager.GetPackageInfo(id); - - if (remotePackage == null) - return PackageState.NotExisting; - - var asset = remotePackage.GetAssetVersion(version); - - // We don't want to check here if it was success, we just was to remove the package if it is installed - Uninstall(id); - - return InstallPackage(remotePackage, asset); + } } /// @@ -270,7 +294,10 @@ namespace PMF.Managers notInitialized(); if (!LocalPackageManager.IsPackageInstalled(id, out Package localPackage, out string pd)) + { + PMF.InvokePackageMessageEvent("Already up to date"); return PackageState.NotInstalled; + } var remotePackage = RemotePackageManager.GetPackageInfo(id); @@ -281,11 +308,17 @@ namespace PMF.Managers // doesn't exist for provided sdk version if (asset == null) + { + PMF.InvokePackageMessageEvent("Package doesn't exist for provided SDK version"); return PackageState.NotExisting; + } // You already have the latest version if (localPackage.Assets[0].Version == asset.Version) + { + PMF.InvokePackageMessageEvent("Already up to date"); return PackageState.UpToDate; + } Uninstall(id); return InstallPackage(remotePackage, asset); diff --git a/PMF/src/Managers/RemotePackageManager.cs b/PMF/src/Managers/RemotePackageManager.cs index f948417..f4cb470 100644 --- a/PMF/src/Managers/RemotePackageManager.cs +++ b/PMF/src/Managers/RemotePackageManager.cs @@ -21,13 +21,15 @@ namespace PMF.Managers { using (WebClient client = new WebClient()) { + PMF.InvokePackageMessageEvent("Downloading package information"); string json = client.DownloadString($"{Config.RepositoryEndpoint}/{id}"); + PMF.InvokePackageMessageEvent("Parsing package information"); return JsonConvert.DeserializeObject(json); } } catch (WebException) { - Console.Error.WriteLine("Couldn't download information from the server"); + PMF.InvokePackageMessageEvent("Couldn't download information from the server"); return null; } } @@ -42,10 +44,19 @@ namespace PMF.Managers { using (WebClient client = new WebClient()) { + PMF.InvokePackageMessageEvent("Downloading asset"); + var zipPath = Path.Combine(Config.TemporaryFolder, id); client.DownloadFile(asset.Url, Path.Combine(zipPath, asset.FileName)); + foreach (var dependency in asset.Dependencies) + { + PMF.InvokePackageMessageEvent($"Downloading dependency with id: {dependency.ID}"); client.DownloadFile(dependency.Url, Path.Combine(zipPath, dependency.FileName)); + } + + PMF.InvokePackageMessageEvent("Finished downloading all required files"); + return zipPath; } } diff --git a/PMF/src/PMF.cs b/PMF/src/PMF.cs new file mode 100644 index 0000000..0608b2a --- /dev/null +++ b/PMF/src/PMF.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PMF +{ + public delegate void OnPackageMessage(string message); + + public static class PMF + { + public static event OnPackageMessage OnPackageMessage; + + internal static void InvokePackageMessageEvent(string message) + { + OnPackageMessage?.Invoke(message); + } + } +}