CloneCmd.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using qdr.app.tools.qfu.Commands.Aspects;
  2. using Quadarax.Foundation.Core.QConsole;
  3. using Quadarax.Foundation.Core.QConsole.Argument;
  4. using Quadarax.Foundation.Core.QConsole.Attributes;
  5. using Quadarax.Foundation.Core.Value;
  6. namespace qdr.app.tools.qfu.Commands
  7. {
  8. [CommandDefinition]
  9. internal class CloneCmd : BaseCmd
  10. {
  11. #region *** Constants ***
  12. private const string CMD_NAME = "clone";
  13. private const string CMD_DESCR = "Clone source file to files specified.";
  14. #endregion
  15. #region *** Properties ***
  16. public override string Name => CMD_NAME;
  17. public override string Description => CMD_DESCR;
  18. protected string[] TargetFiles { get; private set; } = Array.Empty<string>();
  19. protected bool IsEnsurePath { get; private set; } = false;
  20. protected bool IsForce { get; private set; } = false;
  21. #endregion
  22. #region *** Constructors ***
  23. public CloneCmd(Engine engine) : base(engine)
  24. {
  25. }
  26. #endregion
  27. #region *** Overrides ***
  28. #region **** EXECUTE ****
  29. protected override Result OnExecute()
  30. {
  31. WriteCaption($"Will be clonig file '{Source}' to {TargetFiles.Length} files {(IsForce ? "(with force)": string.Empty)}... ");
  32. var cnt = 0;
  33. var succ = 0;
  34. var bSucc = true;
  35. foreach (var file in TargetFiles)
  36. {
  37. cnt++;
  38. if (FileSystem.File.Exists(file) && !IsEnsurePath)
  39. {
  40. if (!IsForce)
  41. {
  42. WriteWarning($"[{cnt}] File '{file}' already exists. Skipping clone operation.");
  43. continue;
  44. }
  45. }
  46. try
  47. {
  48. FileSystem.File.Copy(Source, file, true);
  49. if (FileSystem.File.Exists(file))
  50. succ++;
  51. else
  52. WriteWarning($"[{cnt}] File '{file}' does not exist after copy operation.");
  53. WriteInfo($"[{cnt}] Cloned '{Source}' to '{file}' successfully.");
  54. }
  55. catch (Exception ex)
  56. {
  57. WriteError($"[{cnt}] Failed to clone '{Source}' to '{file}': {ex.Message}");
  58. bSucc = false;
  59. }
  60. }
  61. WriteCaption($"Succesfully cloned: {succ} of {cnt} files.");
  62. bSucc = succ == cnt;
  63. return bSucc ? new Result() : new Result(new Exception($"Failed to clone {TargetFiles.Length - succ} files from '{Source}'."));
  64. }
  65. #endregion
  66. #region **** Arguments ****
  67. protected override void OnValidateArguments()
  68. {
  69. base.OnValidateArguments();
  70. CheckSourceFileExists();
  71. TargetFiles = ListAspect.GetFiles(this, FileSystem, FilesAspect.GetFiles(this, FileSystem, false));
  72. IsEnsurePath = GetArgumentValueOrDefault<bool>(FilesAspect.ARG_PATHENS_NAME, false);
  73. IsForce = GetArgumentValueOrDefault<bool>(ForceAspect.ARG_FORCE_NAME, false);
  74. }
  75. protected override IEnumerable<AbstractArgument> OnSetupArguments()
  76. {
  77. var list = base.OnSetupArguments().ToList();
  78. list.AddRange(ListAspect.SetupArguments());
  79. list.AddRange(FilesAspect.SetupArguments());
  80. list.AddRange(ForceAspect.SetupArguments());
  81. return list;
  82. }
  83. #endregion
  84. #endregion
  85. }
  86. }