Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Programming exercises: Fix inconsistencies between diff viewer and diff line stats #9984

Merged
merged 7 commits into from
Dec 20, 2024

Conversation

magaupp
Copy link
Contributor

@magaupp magaupp commented Dec 9, 2024

Checklist

General

Server

  • Important: I implemented the changes with a very good performance and prevented too many (unnecessary) and too complex database calls.
  • I strictly followed the server coding and design guidelines.
  • I added multiple integration tests (Spring) related to the features (with a high test coverage).
  • I documented the Java code using JavaDoc style.

Changes affecting Programming Exercises

  • High priority: I tested all changes and their related features with all corresponding user types on a test server configured with the integrated lifecycle setup (LocalVC and LocalCI).

Motivation and Context

The Monaco Editor ignores leading and trailing whitespace while computing the diff (see ignoreTrimWhitespace).
The displayed counts of added and removed lines are provided by the server.
The server-side diff does not ignore whitespace like the Monaco Editor.

The git-diff output allows its hunk headers to be annotated with the containing function if the diff attribute is set accordingly (see custom hunk headers).
Such blocks are not handled correctly by the server parser and are ignored.

Description

The GitDiffReportParserService is modified to optionally ignore diffs where the lines only differ in leading and trailing whitespace.
This option to ignore whitespace is enabled where the diff is used together with the diff viewer.
Hunk headers are handled correctly.

Closes #9928.

Steps for Testing

  1. Create a Java programming exercise
  2. Upload files to the template and solution repositories where the only differences in indentation
  3. Upload files with the appropriate file extensions to the template and solution repositories where the only difference is a line 10 lines below the start of its containing function
  4. Wait until the builds finish
  5. Click on "Review Changes"
  6. Verify that the indentation differences are not shown
  7. Verify that the shown differences are consistent with the displayed line counts
  8. Verify that the change deep within the function is shown

Testserver States

Note

These badges show the state of the test servers.
Green = Currently available, Red = Currently locked
Click on the badges to get to the test servers.







Review Progress

Code Review

  • Code Review 1
  • Code Review 2

Manual Tests

  • Test 1
  • Test 2

Test Coverage

Server

Class/File Line Coverage Confirmation (assert/expect)
CommitHistoryService.java 85%
ProgrammingExerciseGitDiffReportService.java 81%
GitDiffReportParserService.java 88%

Screenshots

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Enhanced git diff processing to include whitespace changes.
    • New test method added to validate report handling for whitespace-only differences.
  • Bug Fixes

    • Improved assertions in integration tests to validate report properties and entries.
  • Refactor

    • Method signatures updated for clarity and consistency across services.
  • Chores

    • Organizational change for test class package structure.

@github-actions github-actions bot added tests server Pull requests that update Java code. (Added Automatically!) atlas Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module labels Dec 9, 2024
@magaupp magaupp temporarily deployed to artemis-test1.artemis.cit.tum.de December 10, 2024 11:56 — with GitHub Actions Inactive
@magaupp magaupp marked this pull request as ready for review December 10, 2024 12:10
@magaupp magaupp requested a review from a team as a code owner December 10, 2024 12:10
Copy link

coderabbitai bot commented Dec 10, 2024

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 pmd (7.7.0)
src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java

The following rules are missing or misspelled in your ruleset file category/vm/bestpractices.xml: BooleanInstantiation, DontImportJavaLang, DuplicateImports, EmptyFinallyBlock, EmptyIfStmt, EmptyInitializer, EmptyStatementBlock, EmptyStatementNotInLoop, EmptySwitchStatements, EmptySynchronizedBlock, EmptyTryBlock, EmptyWhileStmt, ExcessiveClassLength, ExcessiveMethodLength, ImportFromSamePackage, MissingBreakInSwitch, SimplifyBooleanAssertion. Please check your ruleset configuration.

Walkthrough

The changes involve modifications to several classes and methods related to git diff reporting in a programming exercise context. Key updates include alterations to method signatures in the GitDiffReportParserService to accommodate an additional boolean parameter for whitespace handling. The CommitHistoryService and ProgrammingExerciseGitDiffReportService also reflect similar changes in their method calls. Additionally, tests have been updated or added to ensure correct functionality, particularly regarding whitespace differences in reports.

Changes

File Change Summary
src/main/java/de/tum/cit/aet/artemis/programming/service/CommitHistoryService.java Updated createReport method to call extractDiffEntries with an additional boolean parameter.
src/main/java/de/tum/cit/aet/artemis/programming/service/hestia/ProgrammingExerciseGitDiffReportService.java Multiple method signature updates and internal logic changes, including additional parameters in extractDiffEntries.
src/main/java/de/tum/cit/aet/artemis/programming/web/GitDiffReportParserService.java Updated extractDiffEntries and related methods to include an ignoreWhitespace parameter; added new methods for whitespace handling.
src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java Enhanced assertions in test methods to validate report properties after fetching.
src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportServiceTest.java Added new test method gitDiffWhitespace to check handling of whitespace-only differences.
src/test/java/de/tum/cit/aet/artemis/atlas/UnionFindTest.java Changed package from de.tum.cit.aet.artemis to de.tum.cit.aet.artemis.atlas.

Assessment against linked issues

Objective Addressed Explanation
The number of added and deleted lines of code between the template and solution submission should be correct. (#9928)

Possibly related PRs

Suggested labels

ready for review, bugfix, client, code quality, refactoring, feature

Suggested reviewers

  • florian-glombik
  • JohannesStoehr
  • Hialus
  • BBesrour
  • az108
  • krusche

📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 234849c and a248dc8.

📒 Files selected for processing (1)
  • src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Experiment)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (8)
src/main/java/de/tum/cit/aet/artemis/programming/web/GitDiffReportParserService.java (3)

33-35: Update Javadoc to include the new ignoreWhitespace parameter

The extractDiffEntries method signature has been updated to include the ignoreWhitespace parameter. The Javadoc should be updated to reflect this addition and explain its purpose for clarity and maintenance.

Apply this diff to update the documentation:

 /**
  * Extracts the ProgrammingExerciseGitDiffEntry from the raw git-diff output
  *
  * @param diff                 The raw git-diff output
  * @param useAbsoluteLineCount Whether to use absolute line count or previous line count
+ * @param ignoreWhitespace     Whether to ignore entries where only leading and trailing whitespace differ
  * @return The extracted ProgrammingExerciseGitDiffEntries
  */

64-66: Consider refactoring duplication in diff handlers

The methods handleAddition, handleRemoval, and handleUnchanged now include additional logic that is somewhat repetitive. Refactor common functionality into a shared helper method to reduce code duplication and increase maintainability.


253-265: Initialize and clear addedLines and removedLines appropriately

In the ParserState class, the addedLines and removedLines lists are introduced for tracking changes. Make sure these lists are properly initialized and cleared at the right points in the parsing process to avoid residual data affecting subsequent diff entries.

src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportServiceTest.java (1)

139-146: Enhance test gitDiffWhitespace with additional assertions

The new test gitDiffWhitespace verifies that no diff entries are created when only whitespace changes occur. To strengthen the test, add an assertion to confirm that the report itself is not null for completeness.

Apply this diff to enhance the test:

 @Test
 @WithMockUser(username = TEST_PREFIX + "instructor1", roles = "INSTRUCTOR")
 void gitDiffWhitespace() throws Exception {
     exercise = hestiaUtilTestService.setupTemplate(FILE_NAME, "   ", exercise, templateRepo);
     exercise = hestiaUtilTestService.setupSolution(FILE_NAME, "\t", exercise, solutionRepo);
     var report = reportService.updateReport(exercise);
+    assertThat(report).isNotNull();
     assertThat(report.getEntries()).hasSize(0);
 }
src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java (3)

73-75: Refine assertions for report entries in getGitDiffAsATutor

The test checks that report.getEntries() is null. To improve clarity, consider checking if the entries are empty instead, as it provides better semantic meaning.

Apply this diff:

assertThat(report).isNotNull();
-assertThat(report.getEntries()).isNull();
+assertThat(report.getEntries()).isNullOrEmpty();

84-86: Refine assertions for report entries in getGitDiffAsAnEditor

Similar to the previous comment, adjust the assertion to check for empty entries.

Apply this diff:

assertThat(report).isNotNull();
-assertThat(report.getEntries()).isNull();
+assertThat(report.getEntries()).isNullOrEmpty();

95-97: Refine assertions for report entries in getGitDiffAsAnInstructor

Again, adjust the assertion for consistency and clarity.

Apply this diff:

assertThat(report).isNotNull();
-assertThat(report.getEntries()).isNull();
+assertThat(report.getEntries()).isNullOrEmpty();
src/main/java/de/tum/cit/aet/artemis/programming/service/hestia/ProgrammingExerciseGitDiffReportService.java (1)

237-237: Track LocalVC diff calculation enhancement

The TODO comment indicates a needed enhancement for calculating diffs in bare origin repository for LocalVC cases.

Would you like me to create a GitHub issue to track this enhancement? I can help draft the issue with:

  • Description of the problem
  • Technical requirements
  • Implementation suggestions
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 4ebb290 and 234849c.

📒 Files selected for processing (6)
  • src/main/java/de/tum/cit/aet/artemis/programming/service/CommitHistoryService.java (1 hunks)
  • src/main/java/de/tum/cit/aet/artemis/programming/service/hestia/ProgrammingExerciseGitDiffReportService.java (5 hunks)
  • src/main/java/de/tum/cit/aet/artemis/programming/web/GitDiffReportParserService.java (6 hunks)
  • src/test/java/de/tum/cit/aet/artemis/atlas/UnionFindTest.java (1 hunks)
  • src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java (6 hunks)
  • src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportServiceTest.java (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/test/java/de/tum/cit/aet/artemis/atlas/UnionFindTest.java
🧰 Additional context used
📓 Path-based instructions (5)
src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportServiceTest.java (1)

Pattern src/test/java/**/*.java: test_naming: descriptive; test_size: small_specific; fixed_data: true; junit5_features: true; assert_use: assertThat; assert_specificity: true; archunit_use: enforce_package_rules; db_query_count_tests: track_performance; util_service_factory_pattern: true; avoid_db_access: true; mock_strategy: static_mocks; context_restart_minimize: true

src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java (1)

Pattern src/test/java/**/*.java: test_naming: descriptive; test_size: small_specific; fixed_data: true; junit5_features: true; assert_use: assertThat; assert_specificity: true; archunit_use: enforce_package_rules; db_query_count_tests: track_performance; util_service_factory_pattern: true; avoid_db_access: true; mock_strategy: static_mocks; context_restart_minimize: true

src/main/java/de/tum/cit/aet/artemis/programming/service/CommitHistoryService.java (1)

Pattern src/main/java/**/*.java: naming:CamelCase; principles:{single_responsibility,small_methods,no_duplication}; db:{perf_queries,datetime_not_timestamp}; rest:{stateless,singleton,delegate_logic,http_only,minimal_dtos}; dtos:{java_records,no_entities,min_data,single_resp}; di:constructor_injection; kiss:simple_code; file_handling:os_indep_paths; practices:{least_access,avoid_transactions,code_reuse,static_member_ref,prefer_primitives}; sql:{param_annotation,uppercase,avoid_subqueries};java:avoid_star_imports

src/main/java/de/tum/cit/aet/artemis/programming/service/hestia/ProgrammingExerciseGitDiffReportService.java (1)

Pattern src/main/java/**/*.java: naming:CamelCase; principles:{single_responsibility,small_methods,no_duplication}; db:{perf_queries,datetime_not_timestamp}; rest:{stateless,singleton,delegate_logic,http_only,minimal_dtos}; dtos:{java_records,no_entities,min_data,single_resp}; di:constructor_injection; kiss:simple_code; file_handling:os_indep_paths; practices:{least_access,avoid_transactions,code_reuse,static_member_ref,prefer_primitives}; sql:{param_annotation,uppercase,avoid_subqueries};java:avoid_star_imports

src/main/java/de/tum/cit/aet/artemis/programming/web/GitDiffReportParserService.java (1)

Pattern src/main/java/**/*.java: naming:CamelCase; principles:{single_responsibility,small_methods,no_duplication}; db:{perf_queries,datetime_not_timestamp}; rest:{stateless,singleton,delegate_logic,http_only,minimal_dtos}; dtos:{java_records,no_entities,min_data,single_resp}; di:constructor_injection; kiss:simple_code; file_handling:os_indep_paths; practices:{least_access,avoid_transactions,code_reuse,static_member_ref,prefer_primitives}; sql:{param_annotation,uppercase,avoid_subqueries};java:avoid_star_imports

🔇 Additional comments (11)
src/main/java/de/tum/cit/aet/artemis/programming/web/GitDiffReportParserService.java (4)

26-26: Verify the updated regex pattern for gitDiffLinePattern

The addition of .* at the end of the regex pattern gitDiffLinePattern allows matching additional characters after the @@ markers. Please ensure that this change correctly handles cases where extra information is appended to the diff hunk headers and doesn't inadvertently match unintended lines.


60-60: Pass ignoreWhitespace parameter to handleNewDiffBlock

In the call to handleNewDiffBlock, ensure that the ignoreWhitespace parameter is correctly passed to consistently handle whitespace-only changes within new diff blocks.


107-117: Ensure correct state management in handleUnchanged method

The handleUnchanged method resets certain parser state variables and calls finalizeEntry. Verify that this approach correctly handles transitions between diff entries, especially when ignoreWhitespace is enabled, to prevent skipping or misprocessing entries.


165-186: ⚠️ Potential issue

Validate detection of whitespace-only changes

The new methods finalizeEntry and isWhitespaceOnlyChange are critical for filtering out entries that differ only by whitespace. Ensure that these methods accurately handle various cases, including different types of whitespace characters (spaces, tabs), line ending differences, and code with mixed indentation styles.

Consider adding comprehensive unit tests covering these scenarios to ensure reliability.

src/main/java/de/tum/cit/aet/artemis/programming/service/CommitHistoryService.java (1)

110-110: Clarify ignoreWhitespace setting in diff extraction

The extractDiffEntries method is called with ignoreWhitespace set to false. Confirm whether it's appropriate to consider whitespace changes in commit history diffs. If the intent is to ignore whitespace-only changes in this context, consider setting ignoreWhitespace to true.

src/test/java/de/tum/cit/aet/artemis/programming/hestia/ProgrammingExerciseGitDiffReportIntegrationTest.java (1)

107-110: Ensure appropriate access to report entries in getGitDiffBetweenTemplateAndSubmission

As an instructor, you may expect the report entries to be available. If getEntries() is null, verify whether this is the intended behavior or if entries should be accessible in this context.

src/main/java/de/tum/cit/aet/artemis/programming/service/hestia/ProgrammingExerciseGitDiffReportService.java (5)

112-112: LGTM! Style improvement

Removing redundant this keyword improves code readability.


167-167: LGTM! Consistent style improvement


310-312: LGTM! Improved parameter naming

The parameter names have been updated to be more descriptive and self-documenting:

  • repo1firstRepo
  • oldTreeParserfirstRepoTreeParser
  • newTreeParsersecondRepoTreeParser

318-323: Verify opposite whitespace handling parameter

The whitespace handling parameter is set to true here (extractDiffEntries(diff, false, true)), opposite to line 218 (extractDiffEntries(diff, true, false)). This difference needs verification.

Let's analyze the impact:

✅ Verification successful

Different whitespace handling is intentional and correct

The method signature in GitDiffReportParserService shows that ignoreWhitespace parameter determines "Whether to ignore entries where only leading and trailing whitespace differ". The different usage is intentional:

  • In createReport: Uses ignoreWhitespace=true because it's generating a diff report for display/review purposes where whitespace-only changes are less relevant
  • In line 218: Uses ignoreWhitespace=false because it's calculating the total number of diff lines for comparison purposes where every change, including whitespace, should be counted
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Analyze the context of different whitespace parameter usage
# Expected: Different whitespace handling for different use cases

# Search for the method definition to understand parameter meaning
ast-grep --pattern 'extractDiffEntries($diff, $count, $whitespace) {
  $$$
}'

# Search for all usages with context
rg -U "extractDiffEntries\([^)]+\)" --type java -B 5 -A 5

Length of output: 7298


218-218: Verify whitespace handling parameters

The new parameter added to extractDiffEntries(diff, true, false) affects whitespace handling in diffs. Please verify:

  1. First boolean (true): Appears to control line counting
  2. Second boolean (false): Appears to control whitespace ignoring

Let's verify the parameter usage across the codebase:

✅ Verification successful

Let me check the implementation of extractDiffEntries to understand the parameter usage:


Let me check the usage of these parameters in the helper methods to fully understand their impact:


Based on the implementation and usage across the codebase, I can now provide a final response:

Parameters in extractDiffEntries are used correctly

The parameters in extractDiffEntries(diff, true, false) are correctly used in this context:

  • useAbsoluteLineCount=true: Used to count lines in the current version of the file, which is appropriate for calculating total line changes
  • ignoreWhitespace=false: Ensures whitespace changes are counted, which is correct for accurate line counting

Other usages in the codebase are also consistent with their purposes:

  • extractDiffEntries(diff, false, true): Used when whitespace should be ignored and line counting is relative
  • extractDiffEntries(diffs.toString(), false, false): Used when both absolute counting and whitespace changes should be considered
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check all calls to extractDiffEntries to ensure consistent parameter usage
# Expected: All calls should have consistent whitespace handling parameters

# Search for all method calls
rg -U "extractDiffEntries\([^)]+\)" --type java

Length of output: 975


Script:

#!/bin/bash
# Get the implementation of extractDiffEntries and surrounding context
ast-grep --pattern 'public List<ProgrammingExerciseGitDiffEntry> extractDiffEntries(String diff, boolean useAbsoluteLineCount, boolean ignoreWhitespace) {
  $$$
}'

Length of output: 6797


Script:

#!/bin/bash
# Get the implementation of handleUnchanged and handleRemoval methods
ast-grep --pattern 'private void handleUnchanged($$$) {
  $$$
}'

ast-grep --pattern 'private void handleRemoval($$$) {
  $$$
}'

Length of output: 6194

@magaupp magaupp marked this pull request as draft December 10, 2024 12:16
@magaupp magaupp marked this pull request as ready for review December 10, 2024 13:11
@HawKhiem HawKhiem temporarily deployed to artemis-test1.artemis.cit.tum.de December 10, 2024 18:00 — with GitHub Actions Inactive
Copy link

@sachmii sachmii left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested on TS1, line stats are consistent.

Copy link
Contributor

@eceeeren eceeeren left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works in TS6, works as expected!

Just as a side note: I would prefer if you could create testing steps a bit more detailed and maybe add screenshots :) I think not everyone knows where every button is placed in the application. For example, for a long time, I searched for the "Review Changes" button. It also could be nice to see the expected output. Just a friendly request :)

Copy link

@sawys777 sawys777 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested on TS5, everything works fine.

Copy link

@alekspetrov9e alekspetrov9e left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tested on TS2. Indentation differences are not shown and the shown differences are consistent with the displayed line counts. Works as expected.

Copy link
Contributor

@AjayvirS AjayvirS left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code

Copy link
Contributor

@coolchock coolchock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code

@krusche krusche added this to the 7.8.0 milestone Dec 20, 2024
@krusche krusche self-assigned this Dec 20, 2024
@krusche krusche merged commit 88c9be6 into develop Dec 20, 2024
131 of 138 checks passed
@krusche krusche deleted the feature/programming/diff-whitespace-option branch December 20, 2024 15:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
atlas Pull requests that affect the corresponding module programming Pull requests that affect the corresponding module ready to merge server Pull requests that update Java code. (Added Automatically!) tests
Projects
Status: Merged
Status: Done
Development

Successfully merging this pull request may close these issues.

Programming Exercise: Git diff between template and solution shows incorrect number of changes