diff --git a/Userland/Libraries/LibDiff/Format.cpp b/Userland/Libraries/LibDiff/Format.cpp index 2d8f607960..9efc6871b5 100644 --- a/Userland/Libraries/LibDiff/Format.cpp +++ b/Userland/Libraries/LibDiff/Format.cpp @@ -1,11 +1,14 @@ /* * Copyright (c) 2020, Itamar S. + * Copyright (c) 2021, Mustafa Quraish + * Copyright (c) 2023, Shannon Booth * * SPDX-License-Identifier: BSD-2-Clause */ #include "Format.h" #include +#include #include #include @@ -20,4 +23,53 @@ DeprecatedString generate_only_additions(StringView text) } return builder.to_deprecated_string(); } -}; + +ErrorOr write_normal(Hunk const& hunk, Stream& stream, ColorOutput color_output) +{ + auto original_start = hunk.original_start_line; + auto target_start = hunk.target_start_line; + auto num_added = hunk.added_lines.size(); + auto num_removed = hunk.removed_lines.size(); + + // Source line(s) + TRY(stream.write_formatted("{}", original_start)); + + if (num_removed > 1) + TRY(stream.write_formatted(",{}", original_start + num_removed - 1)); + + // Action + if (num_added > 0 && num_removed > 0) + TRY(stream.write_formatted("c")); + else if (num_added > 0) + TRY(stream.write_formatted("a")); + else + TRY(stream.write_formatted("d")); + + // Target line(s) + TRY(stream.write_formatted("{}", target_start)); + if (num_added > 1) + TRY(stream.write_formatted(",{}", target_start + num_added - 1)); + + TRY(stream.write_formatted("\n")); + + for (auto const& line : hunk.removed_lines) { + if (color_output == ColorOutput::Yes) + TRY(stream.write_formatted("\033[31;1m< {}\033[0m\n", line)); + else + TRY(stream.write_formatted("< {}\n", line)); + } + + if (num_added > 0 && num_removed > 0) + TRY(stream.write_formatted("---\n")); + + for (auto const& line : hunk.added_lines) { + if (color_output == ColorOutput::Yes) + TRY(stream.write_formatted("\033[32;1m> {}\033[0m\n", line)); + else + TRY(stream.write_formatted("> {}\n", line)); + } + + return {}; +} + +} diff --git a/Userland/Libraries/LibDiff/Format.h b/Userland/Libraries/LibDiff/Format.h index c8740eef08..f221b84e9f 100644 --- a/Userland/Libraries/LibDiff/Format.h +++ b/Userland/Libraries/LibDiff/Format.h @@ -1,13 +1,25 @@ /* * Copyright (c) 2020, Itamar S. + * Copyright (c) 2023, Shannon Booth * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include +#include +#include +#include namespace Diff { + DeprecatedString generate_only_additions(StringView); + +enum class ColorOutput { + Yes, + No, }; + +ErrorOr write_normal(Hunk const& hunk, Stream& stream, ColorOutput color_output = ColorOutput::No); + +}