Format.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
  3. * Copyright (c) 2021, Mustafa Quraish <mustafa@serenityos.org>
  4. * Copyright (c) 2023, Shannon Booth <shannon.ml.booth@gmail.com>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include "Format.h"
  9. #include <AK/DeprecatedString.h>
  10. #include <AK/Stream.h>
  11. #include <AK/StringBuilder.h>
  12. #include <AK/Vector.h>
  13. namespace Diff {
  14. DeprecatedString generate_only_additions(StringView text)
  15. {
  16. auto lines = text.split_view('\n', SplitBehavior::KeepEmpty);
  17. StringBuilder builder;
  18. builder.appendff("@@ -0,0 +1,{} @@\n", lines.size());
  19. for (auto const& line : lines) {
  20. builder.appendff("+{}\n", line);
  21. }
  22. return builder.to_deprecated_string();
  23. }
  24. ErrorOr<void> write_unified_header(StringView old_path, StringView new_path, Stream& stream)
  25. {
  26. TRY(stream.write_formatted("--- {}\n", old_path));
  27. TRY(stream.write_formatted("+++ {}\n", new_path));
  28. return {};
  29. }
  30. ErrorOr<void> write_unified(Hunk const& hunk, Stream& stream, ColorOutput color_output)
  31. {
  32. TRY(stream.write_formatted("{}\n", hunk.location));
  33. if (color_output == ColorOutput::Yes) {
  34. for (auto const& line : hunk.lines) {
  35. if (line.operation == Line::Operation::Addition)
  36. TRY(stream.write_formatted("\033[32;1m{}\033[0m\n", line));
  37. else if (line.operation == Line::Operation::Removal)
  38. TRY(stream.write_formatted("\033[31;1m{}\033[0m\n", line));
  39. else
  40. TRY(stream.write_formatted("{}\n", line));
  41. }
  42. } else {
  43. for (auto const& line : hunk.lines)
  44. TRY(stream.write_formatted("{}\n", line));
  45. }
  46. return {};
  47. }
  48. ErrorOr<void> write_normal(Hunk const& hunk, Stream& stream, ColorOutput color_output)
  49. {
  50. // Source line(s)
  51. TRY(stream.write_formatted("{}", hunk.location.old_range.start_line));
  52. if (hunk.location.old_range.number_of_lines > 1)
  53. TRY(stream.write_formatted(",{}", (hunk.location.old_range.start_line + hunk.location.old_range.number_of_lines - 1)));
  54. // Action
  55. if (hunk.location.old_range.number_of_lines > 0 && hunk.location.new_range.number_of_lines > 0)
  56. TRY(stream.write_formatted("c"));
  57. else if (hunk.location.new_range.number_of_lines > 0)
  58. TRY(stream.write_formatted("a"));
  59. else
  60. TRY(stream.write_formatted("d"));
  61. // Target line(s)
  62. TRY(stream.write_formatted("{}", hunk.location.new_range.start_line));
  63. if (hunk.location.new_range.number_of_lines > 1)
  64. TRY(stream.write_formatted(",{}", (hunk.location.new_range.start_line + hunk.location.new_range.number_of_lines - 1)));
  65. TRY(stream.write_formatted("\n"));
  66. for (auto const& line : hunk.lines) {
  67. VERIFY(line.operation == Line::Operation::Removal || line.operation == Line::Operation::Addition);
  68. if (line.operation == Line::Operation::Addition) {
  69. if (color_output == ColorOutput::Yes)
  70. TRY(stream.write_formatted("\033[32;1m> {}\033[0m\n", line.content));
  71. else
  72. TRY(stream.write_formatted("> {}\n", line.content));
  73. } else {
  74. if (color_output == ColorOutput::Yes)
  75. TRY(stream.write_formatted("\033[31;1m< {}\033[0m\n", line.content));
  76. else
  77. TRY(stream.write_formatted("< {}\n", line.content));
  78. }
  79. }
  80. return {};
  81. }
  82. }