ashfurrow / danger-ruby-swiftlint

A Danger plugin for SwiftLint.
https://rubygems.org/gems/danger-swiftlint
MIT License
203 stars 80 forks source link

'No such file or directory' when the Gemfile and Dangerfile is in a different location than the root #175

Open ghost opened 2 years ago

ghost commented 2 years ago

I am using Bitrise as a CI/CD tool and I have an issue when I am running Danger-swiftlint for my project:

error opening input file '/Users/vagrant/git/ios/ios/Main/fileFolder/fileWithLintError.swift' (No such file or directory)
Most rules will be skipped because sourcekitd has failed.
SourceKittenFramework/File.swift:20: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=260 "The file “fileWithLintError.swift” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/vagrant/git/ios/ios//Main/fileFolder/fileWithLintError.swift, NSUnderlyingError=0x7fac62b05480 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

The cause of this issue probably is a double ios value in the path because when I moved Danger and Gemfile file into the root folder it works. We are using Kotlin Multiplatform and our root folder for iOS is project_catalouge/ios/ and there is no possibility to keep these files there.

Is there any workaround for this or a way to pass a different execution path?

My Danger file setup:

swiftlint.config_file = '.swiftlint.yml'
swiftlint.binary_path = 'ios/Pods/SwiftLint/swiftlint'
swiftlint.lint_files fail_on_error: true, inline_mode: true

Bitrise job for running Danger:

    - script:
        run_if: ".IsPR"
        inputs:
        - content: |-
            #!/bin/bash
            set -ex
            bundle exec danger --fail-on-errors=true
        - working_dir: "$BITRISE_SOURCE_DIR/ios"
Skoti commented 2 years ago

This is actually an issue in Danger itself. This plugin uses Git module from Danger. So here the git.renamed_files, git.modified_files and git.added_files already return incorrect paths (basically with the subdir path added again unnecessarily). So in your case ios is added twice as this is probably the directory where your Dangerfile is located. https://github.com/ashfurrow/danger-ruby-swiftlint/blob/00dabeb5af5cf6e6628716a20daa607e94f35b2c/lib/danger_plugin.rb#L211-L216

So you can either provide the paths to files yourself or temporary workaround by linting all files instead of only modified in the PR. Set swiftlint.lint_all_files = true and it will omit the part of code that uses flawed Danger methods.: https://github.com/ashfurrow/danger-ruby-swiftlint/blob/00dabeb5af5cf6e6628716a20daa607e94f35b2c/lib/danger_plugin.rb#L104-L113