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

Compare each .gitignore found with an appropiate relative path #3338

Merged
merged 6 commits into from Nov 8, 2022

Commits on Nov 2, 2022

  1. Apply .gitignore files considering their location

    When a .gitignore file contains the special rule to ignore every
    subfolder content (`*/*`) and the file is located in a subfolder
    relative to where the command is executed (root), the rule is
    incorrectly applied and ignores every file at the same level of the
    .gitignore file.
    
    The reason for this is that the `gitignore` variable accumulates the
    rules found in each .gitignore while traversing files and directories
    recursively. This makes sense and, in general, works as expected. The
    problem is that the gitignore rules are applied using as the relative
    path from root to target directory as a reference. This is the cause
    of the bug.
    
    The implemented solution keeps track of every .gitignore file found
    while traversing the targets and the absolute location of each
    .gitignore file. Then, when matching files to the .gitignore rules,
    compare each set of rules with the appropiate relative path to the
    candidate target file.
    
    To make this possible, we changed the single `gitignore` object with a
    dictionary of similar objects, where the corresponding key is the
    absolute path to the folder that contains that .gitignore file. This
    required changing the signature of the `get_sources` function. Also, we
    introduce a `is_ignored` function that compares a file with every set
    of rules. Finally, some tests required an update to pass the gitignore
    object in the new format.
    
    Signed-off-by: Antonio Ossa Guerra <aaossa@uc.cl>
    aaossa committed Nov 2, 2022
    Copy the full SHA
    f265a96 View commit details
    Browse the repository at this point in the history
  2. Test .gitignore with */* is applied correctly

    The test contains three cases: 1) when the .gitignore with the special
    rule to ignore every subfolder and its contents (*/*) is in the root,
    2) when the file is inside a subfolder relative to root (nested), and
    3) when the target folder contains the .gitignore and root is a parent
    folder of the target. In all of these cases, we compare the files that
    are visible by Black with a known list of paths containing the
    expected values.
    
    Before the fix introduced in the previous commit, these tests failed
    when the .gitignore file was nested (second case). Now, the test is
    passed for all cases.
    
    Signed-off-by: Antonio Ossa Guerra <aaossa@uc.cl>
    aaossa committed Nov 2, 2022
    Copy the full SHA
    9782c33 View commit details
    Browse the repository at this point in the history
  3. Update CHANGES.md

    Add entry about fixed bug and changes introduced: ignore files by
    considering the location of each .gitignore file and the relative path
    of each target
    
    Signed-off-by: Antonio Ossa Guerra <aaossa@uc.cl>
    aaossa committed Nov 2, 2022
    Copy the full SHA
    f97cccd View commit details
    Browse the repository at this point in the history

Commits on Nov 6, 2022

  1. Copy the full SHA
    320f582 View commit details
    Browse the repository at this point in the history

Commits on Nov 7, 2022

  1. Small refactor to improve code readability

    These changes are small improvements to improve code readability:
    rename a variable to a more descriptive name (from `exclude_is_None`
    to `using_default_exclude`), use a better syntax to include the type
    annotation for `gitignore` variable (from typing comment to
    Python-style typing annotation), and replace an if-else block with a
    single dictionary definition (in this case, we need to compare keys
    instead of values, meaning that the change works)
    
    Signed-off-by: Antonio Ossa Guerra <aaossa@uc.cl>
    aaossa committed Nov 7, 2022
    Copy the full SHA
    5aee3b7 View commit details
    Browse the repository at this point in the history

Commits on Nov 8, 2022

  1. Make nested function a top-level function

    The function to match a given path with every discovered .gitignore
    file does not need to be a nested function and can be a top-level
    function. The arguments did not change, but the naming of local
    variables was improved for readability.
    
    Signed-off-by: Antonio Ossa Guerra <aaossa@uc.cl>
    aaossa committed Nov 8, 2022
    Copy the full SHA
    c09a816 View commit details
    Browse the repository at this point in the history