Dangerfile 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. ### Helper functions
  2. # Determine if any of the files were changed or deleted.
  3. # Taken from samdmarshall/danger
  4. def didModify(files_array)
  5. files_array.each do |file_name|
  6. if git.modified_files.include?(file_name) ||
  7. git.deleted_files.include?(file_name)
  8. return true
  9. end
  10. end
  11. return false
  12. end
  13. # Determine if there are changes in files matching any of the
  14. # path patterns provided.
  15. def hasChangesIn(paths)
  16. path_array = Array(paths)
  17. path_array.each do |dir|
  18. if !git.modified_files.grep(/#{dir}/).empty?
  19. return true
  20. end
  21. end
  22. return false
  23. end
  24. # Adds the provided labels to the current PR.
  25. def addLabels(label_array)
  26. issue_number = github.pr_json["number"]
  27. repo_name = "firebase/firebase-ios-sdk"
  28. github.api.add_labels_to_an_issue(repo_name, issue_number, label_array)
  29. end
  30. # Returns a list of all labels for a given PR. PRs that touch
  31. # multiple directories may have multiple labels.
  32. def labelsForModifiedFiles()
  33. labels = []
  34. labels.push("api: abtesting") if @has_abtesting_changes
  35. labels.push("api: appdistribution") if @has_appdistribution_changes
  36. labels.push("api: auth") if @has_auth_changes
  37. labels.push("api: core") if @has_core_changes
  38. labels.push("api: crashlytics") if @has_crashlytics_changes
  39. labels.push("api: database") if @has_database_changes
  40. labels.push("api: dynamiclinks") if @has_dynamiclinks_changes
  41. labels.push("api: firestore") if @has_firestore_changes
  42. labels.push("api: functions") if @has_functions_changes
  43. labels.push("api: inappmessaging") if @has_inappmessaging_changes
  44. labels.push("api: installations") if @has_installations_changes
  45. labels.push("api: instanceid") if @has_instanceid_changes
  46. labels.push("api: messaging") if @has_messaging_changes
  47. labels.push("api: remoteconfig") if @has_remoteconfig_changes
  48. labels.push("api: storage") if @has_storage_changes
  49. labels.push("GoogleDataTransport") if @has_gdt_changes
  50. labels.push("GoogleUtilities") if @has_googleutilities_changes
  51. labels.push("zip-builder") if @has_zipbuilder_changes
  52. labels.push("public-api-change") if @has_api_changes
  53. return labels
  54. end
  55. ### Definitions
  56. # Label for any change that shouldn't have an accompanying CHANGELOG entry,
  57. # including all changes that do not affect the compiled binary (i.e. script
  58. # changes, test-only changes)
  59. declared_trivial = github.pr_body.include? "#no-changelog"
  60. # Whether or not there are pending changes to any changelog file.
  61. has_changelog_changes = hasChangesIn(["CHANGELOG"])
  62. # Whether or not the LICENSE file has been modified or deleted.
  63. has_license_changes = didModify(["LICENSE"])
  64. ## Product directories
  65. @has_abtesting_changes = hasChangesIn("FirebaseABTesting/")
  66. @has_abtesting_api_changes = hasChangesIn("FirebaseABTesting/Sources/Public/")
  67. @has_appdistribution_changes = hasChangesIn("FirebaseAppDistribution/")
  68. @has_appdistribution_api_changes = hasChangesIn("FirebaseAppDistribution/Sources/Public")
  69. @has_auth_changes = hasChangesIn("FirebaseAuth")
  70. @has_auth_api_changes = hasChangesIn("FirebaseAuth/Sources/Public/")
  71. @has_core_changes = hasChangesIn([
  72. "FirebaseCore/",
  73. "Firebase/CoreDiagnostics/",
  74. "CoreOnly/"])
  75. @has_core_api_changes = hasChangesIn("FirebaseCore/Sources/Public/")
  76. @has_crashlytics_changes = hasChangesIn("Crashlytics/")
  77. @has_crashlytics_api_changes = hasChangesIn("Crashlytics/Crashlytics/Public/")
  78. @has_database_changes = hasChangesIn("FirebaseDatabase/")
  79. @has_database_api_changes = hasChangesIn("FirebaseDatabase/Sources/Public/")
  80. @has_dynamiclinks_changes = hasChangesIn("FirebaseDynamicLinks/")
  81. @has_dynamiclinks_api_changes = hasChangesIn("FirebaseDynamicLinks/Sources/Public/")
  82. @has_firestore_changes = hasChangesIn("Firestore/")
  83. @has_firestore_api_changes = hasChangesIn("Firestore/Source/Public/")
  84. @has_functions_changes = hasChangesIn("Functions/")
  85. @has_functions_api_changes = hasChangesIn("Functions/FirebaseFunctions/Public/")
  86. @has_inappmessaging_changes = hasChangesIn(["FirebaseInAppMessaging/"])
  87. @has_inappmessaging_api_changes = hasChangesIn(["FirebaseInAppMessaging/Sources/Public/"])
  88. @has_installations_changes = hasChangesIn("FirebaseInstallations/Source/")
  89. @has_installations_api_changes = hasChangesIn("FirebaseInstallations/Source/Library/Public/")
  90. @has_instanceid_changes = hasChangesIn("Firebase/InstanceID/")
  91. @has_instanceid_api_changes = hasChangesIn("Firebase/InstanceID/Public/")
  92. @has_messaging_changes = hasChangesIn("FirebaseMessaging/")
  93. @has_messaging_api_changes = hasChangesIn("FirebaseMessaging/Sources/Public/")
  94. @has_remoteconfig_changes = hasChangesIn("FirebaseRemoteConfig/")
  95. @has_remoteconfig_api_changes = hasChangesIn("FirebaseRemoteConfig/Sources/Public/")
  96. @has_storage_changes = hasChangesIn("FirebaseStorage/")
  97. @has_storage_api_changes = hasChangesIn("FirebaseStorage/Sources/Public/")
  98. @has_gdt_changes = hasChangesIn(["GoogleDataTransport/"])
  99. @has_gdt_api_changes = hasChangesIn("GoogleDataTransport/GDTCORLibrary/Public")
  100. @has_googleutilities_changes = hasChangesIn("GoogleUtilities/")
  101. @has_zipbuilder_changes = hasChangesIn("ZipBuilder/")
  102. # Convenient flag for all API changes.
  103. @has_api_changes = @has_abtesting_api_changes ||
  104. @has_auth_api_changes ||
  105. @has_appdistribution_api_changes ||
  106. @has_core_api_changes ||
  107. @has_crashlytics_api_changes ||
  108. @has_database_api_changes ||
  109. @has_dynamiclinks_api_changes ||
  110. @has_firestore_api_changes ||
  111. @has_functions_api_changes ||
  112. @has_inappmessaging_api_changes ||
  113. @has_installations_api_changes ||
  114. @has_instanceid_api_changes ||
  115. @has_messaging_api_changes ||
  116. @has_remoteconfig_api_changes ||
  117. @has_storage_api_changes ||
  118. @has_gdt_api_changes
  119. # A FileList containing ObjC, ObjC++ or C++ changes.
  120. sdk_changes = (git.modified_files +
  121. git.added_files +
  122. git.deleted_files).select do |line|
  123. line.end_with?(".h") ||
  124. line.end_with?(".m") ||
  125. line.end_with?(".mm") ||
  126. line.end_with?(".cc") ||
  127. line.end_with?(".swift")
  128. end
  129. # Whether or not the PR has modified SDK source files.
  130. has_sdk_changes = !sdk_changes.empty?
  131. ### Actions
  132. # Warn if a changelog is left out on a non-trivial PR that has modified
  133. # SDK source files (podspec, markdown, etc changes are excluded).
  134. if has_sdk_changes
  135. if !has_changelog_changes && !declared_trivial
  136. warning = "Did you forget to add a changelog entry? (Add #no-changelog"\
  137. " to the PR description to silence this warning.)"
  138. warn(warning)
  139. end
  140. end
  141. # Error on license edits
  142. fail("LICENSE changes are explicitly disallowed.") if has_license_changes
  143. # Label PRs based on diff files
  144. suggested_labels = labelsForModifiedFiles()
  145. if !suggested_labels.empty?
  146. addLabels(suggested_labels)
  147. end