diff --git a/Userland/Utilities/diff.cpp b/Userland/Utilities/diff.cpp index bad475f161..d8fa733294 100644 --- a/Userland/Utilities/diff.cpp +++ b/Userland/Utilities/diff.cpp @@ -18,11 +18,14 @@ ErrorOr serenity_main(Main::Arguments arguments) TRY(Core::System::pledge("stdio rpath")); Core::ArgsParser parser; + + bool unified = false; StringView filename1; StringView filename2; parser.add_positional_argument(filename1, "First file to compare", "file1", Core::ArgsParser::Required::Yes); parser.add_positional_argument(filename2, "Second file to compare", "file2", Core::ArgsParser::Required::Yes); + parser.add_option(unified, "Write diff in unified format", nullptr, 'u'); parser.parse(arguments); auto file1 = TRY(Core::File::open(filename1, Core::File::OpenMode::Read)); @@ -31,9 +34,17 @@ ErrorOr serenity_main(Main::Arguments arguments) auto const color_output = TRY(Core::System::isatty(STDOUT_FILENO)) ? Diff::ColorOutput::Yes : Diff::ColorOutput::No; - auto hunks = TRY(Diff::from_text(TRY(file1->read_until_eof()), TRY(file2->read_until_eof()))); - for (auto const& hunk : hunks) - TRY(Diff::write_normal(hunk, *out, color_output)); + size_t context = unified ? 3 : 0; + auto hunks = TRY(Diff::from_text(TRY(file1->read_until_eof()), TRY(file2->read_until_eof()), context)); + + if (unified) { + TRY(Diff::write_unified_header(filename1, filename2, *out)); + for (auto const& hunk : hunks) + TRY(Diff::write_unified(hunk, *out, color_output)); + } else { + for (auto const& hunk : hunks) + TRY(Diff::write_normal(hunk, *out, color_output)); + } return hunks.is_empty() ? 0 : 1; }