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

install_addon() didn't take into account dir paths with trailing slashes #13694

Merged
merged 2 commits into from
Mar 26, 2024
Merged

install_addon() didn't take into account dir paths with trailing slashes #13694

merged 2 commits into from
Mar 26, 2024

Conversation

jkbzh
Copy link
Contributor

@jkbzh jkbzh commented Mar 14, 2024

User description

If install_addon() was called with a path argument pointing to to an extension directory and the path argument value itself ended with a trailing slash, install_addon() would eat the first character of each file it would be adding to the synthetized xpi file.

Fixes #13685

Thanks for contributing to Selenium!
A PR well described will help maintainers to quickly review and merge it

Before submitting your PR, please check our contributing guidelines.
Avoid large PRs, help reviewers by making them as simple and short as possible.

Description

install_addon() can be called given either a path to an xpi file or the path to the source code of an extension.
In the second case, install_addon() will create a temporary xpi file itself.

In the second case, if the given path ended with a slash, install_addon() would eat the first character
of each file that it was adding to the temporary xpi file.

The patch removes all trailing slashes from the path before processing, thus letting install_addon() work
regardless of whether a path pointing to a dir ends with a slash.

Motivation and Context

If the path ended with a slash, install_addon() would eat the first character of each file that it was adding to
the temporary xpi file.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist

  • I have read the contributing document.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing tests passed.

Type

bug_fix


Description

  • Fixes an issue in install_addon where paths with trailing slashes caused the first character of each file to be omitted when creating a temporary xpi file.
  • Ensures install_addon works correctly regardless of whether a directory path ends with a slash by stripping trailing slashes and adjusting path root calculation.

Changes walkthrough

Relevant files
Bug fix
webdriver.py
Fix Trailing Slash Issue in install_addon Method                 

py/selenium/webdriver/firefox/webdriver.py

  • Removes trailing slashes from the path before processing in
    install_addon.
  • Adjusts path_root calculation to account for the removal of trailing
    slashes.
  • +4/-1     

    PR-Agent usage:
    Comment /help on the PR to get a list of all available PR-Agent tools and their descriptions

    @CLAassistant
    Copy link

    CLAassistant commented Mar 14, 2024

    CLA assistant check
    All committers have signed the CLA.

    Copy link
    Contributor

    PR Description updated to latest commit (2017708)

    Copy link
    Contributor

    PR Review

    ⏱️ Estimated effort to review [1-5]

    2, because the changes are localized to a specific function within a single file, and the logic is straightforward. The modification involves string manipulation and file handling which are basic operations. However, understanding the context of how paths are handled in the install_addon function and ensuring the fix does not introduce new edge cases requires some attention.

    🧪 Relevant tests

    No

    🔍 Possible issues

    Edge Case Handling: Ensure that the fix handles edge cases correctly, such as paths that contain multiple trailing slashes or no slashes at all. The use of rstrip(os.sep) should generally handle these cases, but it's important to consider any platform-specific behaviors or anomalies.

    Path Length Adjustment: The adjustment of path_root = len(path) + 1 assumes that os.walk() will add a trailing slash to the path. While this is a reasonable assumption, it's worth verifying across different operating systems to ensure consistency.

    🔒 Security concerns

    No


    ✨ Review tool usage guide:

    Overview:
    The review tool scans the PR code changes, and generates a PR review. The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on any PR.
    When commenting, to edit configurations related to the review tool (pr_reviewer section), use the following template:

    /review --pr_reviewer.some_config1=... --pr_reviewer.some_config2=...
    

    With a configuration file, use the following template:

    [pr_reviewer]
    some_config1=...
    some_config2=...
    
    Utilizing extra instructions

    The review tool can be configured with extra instructions, which can be used to guide the model to a feedback tailored to the needs of your project.

    Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify the relevant sub-tool, and the relevant aspects of the PR that you want to emphasize.

    Examples for extra instructions:

    [pr_reviewer] # /review #
    extra_instructions="""
    In the 'possible issues' section, emphasize the following:
    - Does the code logic cover relevant edge cases?
    - Is the code logic clear and easy to understand?
    - Is the code logic efficient?
    ...
    """
    

    Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable.

    How to enable\disable automation
    • When you first install PR-Agent app, the default mode for the review tool is:
    pr_commands = ["/review", ...]
    

    meaning the review tool will run automatically on every PR, with the default configuration.
    Edit this field to enable/disable the tool, or to change the used configurations

    Auto-labels

    The review tool can auto-generate two specific types of labels for a PR:

    • a possible security issue label, that detects possible security issues (enable_review_labels_security flag)
    • a Review effort [1-5]: x label, where x is the estimated effort to review the PR (enable_review_labels_effort flag)
    Extra sub-tools

    The review tool provides a collection of possible feedbacks about a PR.
    It is recommended to review the possible options, and choose the ones relevant for your use case.
    Some of the feature that are disabled by default are quite useful, and should be considered for enabling. For example:
    require_score_review, require_soc2_ticket, and more.

    Auto-approve PRs

    By invoking:

    /review auto_approve
    

    The tool will automatically approve the PR, and add a comment with the approval.

    To ensure safety, the auto-approval feature is disabled by default. To enable auto-approval, you need to actively set in a pre-defined configuration file the following:

    [pr_reviewer]
    enable_auto_approval = true
    

    (this specific flag cannot be set with a command line argument, only in the configuration file, committed to the repository)

    You can also enable auto-approval only if the PR meets certain requirements, such as that the estimated_review_effort is equal or below a certain threshold, by adjusting the flag:

    [pr_reviewer]
    maximal_review_effort = 5
    
    More PR-Agent commands

    To invoke the PR-Agent, add a comment using one of the following commands:

    • /review: Request a review of your Pull Request.
    • /describe: Update the PR title and description based on the contents of the PR.
    • /improve [--extended]: Suggest code improvements. Extended mode provides a higher quality feedback.
    • /ask <QUESTION>: Ask a question about the PR.
    • /update_changelog: Update the changelog based on the PR's contents.
    • /add_docs 💎: Generate docstring for new components introduced in the PR.
    • /generate_labels 💎: Generate labels for the PR based on the PR's contents.
    • /analyze 💎: Automatically analyzes the PR, and presents changes walkthrough for each component.

    See the tools guide for more details.
    To list the possible configuration parameters, add a /config comment.

    See the review usage page for a comprehensive guide on using this tool.

    Copy link
    Contributor

    codiumai-pr-agent-pro bot commented Mar 14, 2024

    PR Code Suggestions

    CategorySuggestions                                                                                                                                                       
    Enhancement
    Use os.path.normpath() for path normalization.

    Instead of manually adjusting the path to account for trailing slashes, consider using
    os.path.normpath() which normalizes the path by collapsing redundant separators and
    up-level references. This makes the path handling more robust and readable.

    py/selenium/webdriver/firefox/webdriver.py [129]

    -path = path.rstrip(os.sep)
    +path = os.path.normpath(path)
     
    Maintainability
    Ensure compatibility across different OS behaviors in path handling.

    The calculation of path_root seems to assume that os.walk() will add a trailing slash to
    the path, which is not explicitly guaranteed by the documentation. To make this more
    robust, consider using os.path.join(base, fyle) and then slicing from the normalized path
    length to ensure compatibility across different OS behaviors.

    py/selenium/webdriver/firefox/webdriver.py [131]

    -path_root = len(path) + 1
    +# This approach ensures compatibility across different OS behaviors
    +for base, _, files in os.walk(path):
    +    for fyle in files:
    +        file_path = os.path.join(base, fyle)
    +        arcname = file_path[len(os.path.normpath(path)) + 1:]
    +        zipped.write(file_path, arcname)
     

    ✨ Improve tool usage guide:

    Overview:
    The improve tool scans the PR code changes, and automatically generates suggestions for improving the PR code. The tool can be triggered automatically every time a new PR is opened, or can be invoked manually by commenting on a PR.
    When commenting, to edit configurations related to the improve tool (pr_code_suggestions section), use the following template:

    /improve --pr_code_suggestions.some_config1=... --pr_code_suggestions.some_config2=...
    

    With a configuration file, use the following template:

    [pr_code_suggestions]
    some_config1=...
    some_config2=...
    
    Enabling\disabling automation

    When you first install the app, the default mode for the improve tool is:

    pr_commands = ["/improve --pr_code_suggestions.summarize=true", ...]
    

    meaning the improve tool will run automatically on every PR, with summarization enabled. Delete this line to disable the tool from running automatically.

    Utilizing extra instructions

    Extra instructions are very important for the improve tool, since they enable to guide the model to suggestions that are more relevant to the specific needs of the project.

    Be specific, clear, and concise in the instructions. With extra instructions, you are the prompter. Specify relevant aspects that you want the model to focus on.

    Examples for extra instructions:

    [pr_code_suggestions] # /improve #
    extra_instructions="""
    Emphasize the following aspects:
    - Does the code logic cover relevant edge cases?
    - Is the code logic clear and easy to understand?
    - Is the code logic efficient?
    ...
    """
    

    Use triple quotes to write multi-line instructions. Use bullet points to make the instructions more readable.

    A note on code suggestions quality
    • While the current AI for code is getting better and better (GPT-4), it's not flawless. Not all the suggestions will be perfect, and a user should not accept all of them automatically.
    • Suggestions are not meant to be simplistic. Instead, they aim to give deep feedback and raise questions, ideas and thoughts to the user, who can then use his judgment, experience, and understanding of the code base.
    • Recommended to use the 'extra_instructions' field to guide the model to suggestions that are more relevant to the specific needs of the project, or use the custom suggestions 💎 tool
    • With large PRs, best quality will be obtained by using 'improve --extended' mode.
    More PR-Agent commands

    To invoke the PR-Agent, add a comment using one of the following commands:

    • /review: Request a review of your Pull Request.
    • /describe: Update the PR title and description based on the contents of the PR.
    • /improve [--extended]: Suggest code improvements. Extended mode provides a higher quality feedback.
    • /ask <QUESTION>: Ask a question about the PR.
    • /update_changelog: Update the changelog based on the PR's contents.
    • /add_docs 💎: Generate docstring for new components introduced in the PR.
    • /generate_labels 💎: Generate labels for the PR based on the PR's contents.
    • /analyze 💎: Automatically analyzes the PR, and presents changes walkthrough for each component.

    See the tools guide for more details.
    To list the possible configuration parameters, add a /config comment.

    See the improve usage page for a more comprehensive guide on using this tool.

    @jkbzh
    Copy link
    Contributor Author

    jkbzh commented Mar 20, 2024

    FYI, the related tests PR I sent were already merged:
    SeleniumHQ/seleniumhq.github.io#1609 (review)

    If install_addon() was called with a path argument pointing to
    to an extension directory and the path argument value itself ended
    with a trailing slash, install_addon() would eat the first
    character of each file it would be adding to the synthetized xpi file.
    
    Fixes #13685
    suggested by codiumai-pr-agent-pro
    Copy link
    Member

    @diemol diemol left a comment

    Choose a reason for hiding this comment

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

    Thank you, @jkbzh!

    @codecov-commenter
    Copy link

    Codecov Report

    Attention: Patch coverage is 0% with 2 lines in your changes are missing coverage. Please review.

    Project coverage is 58.47%. Comparing base (0e4e739) to head (0d1843c).

    ❗ Current head 0d1843c differs from pull request most recent head 7ebef21. Consider uploading reports for the commit 7ebef21 to get more accurate results

    Files Patch % Lines
    py/selenium/webdriver/firefox/webdriver.py 0.00% 2 Missing ⚠️

    ❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

    Additional details and impacted files
    @@            Coverage Diff             @@
    ##            trunk   #13694      +/-   ##
    ==========================================
    - Coverage   58.48%   58.47%   -0.02%     
    ==========================================
      Files          86       86              
      Lines        5270     5271       +1     
      Branches      220      220              
    ==========================================
      Hits         3082     3082              
    - Misses       1968     1969       +1     
      Partials      220      220              

    ☔ View full report in Codecov by Sentry.
    📢 Have feedback on the report? Share it here.

    @diemol diemol merged commit 18aec30 into SeleniumHQ:trunk Mar 26, 2024
    14 checks passed
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    4 participants