diff --git a/gradle/lib/dependabot/gradle/file_fetcher.rb b/gradle/lib/dependabot/gradle/file_fetcher.rb index 42b974fb23..27606d9721 100644 --- a/gradle/lib/dependabot/gradle/file_fetcher.rb +++ b/gradle/lib/dependabot/gradle/file_fetcher.rb @@ -8,12 +8,20 @@ module Gradle class FileFetcher < Dependabot::FileFetchers::Base require_relative "file_fetcher/settings_file_parser" + SUPPORTED_BUILD_FILE_NAMES = + %w(build.gradle build.gradle.kts).freeze + + SUPPORTED_SETTINGS_FILE_NAMES = + %w(settings.gradle settings.gradle.kts).freeze + def self.required_files_in?(filenames) - filenames.include?("build.gradle") + filenames.any? do |filename| + SUPPORTED_BUILD_FILE_NAMES.include?(filename) + end end def self.required_files_message - "Repo must contain a build.gradle." + "Repo must contain a build.gradle / build.gradle.kts file." end private @@ -27,7 +35,11 @@ def fetch_files end def buildfile - @buildfile ||= fetch_file_from_host("build.gradle") + @buildfile ||= begin + file = supported_build_file + @buildfile_name ||= file.name if file + fetch_file_from_host(file.name) if file + end end def subproject_buildfiles @@ -39,7 +51,7 @@ def subproject_buildfiles subproject_paths subproject_paths.map do |path| - fetch_file_from_host(File.join(path, "build.gradle")) + fetch_file_from_host(File.join(path, @buildfile_name)) rescue Dependabot::DependencyFileNotFound # Gradle itself doesn't worry about missing subprojects, so we don't nil @@ -74,8 +86,28 @@ def file_exists_in_submodule?(path) end def settings_file - @settings_file ||= fetch_file_from_host("settings.gradle") - rescue Dependabot::DependencyFileNotFound + @settings_file ||= begin + file = supported_settings_file + fetch_file_from_host(file.name) if file + rescue Dependabot::DependencyFileNotFound + nil + end + end + + def supported_build_file + supported_file(SUPPORTED_BUILD_FILE_NAMES) + end + + def supported_settings_file + supported_file(SUPPORTED_SETTINGS_FILE_NAMES) + end + + def supported_file(supported_file_names) + supported_file_names.each do |supported_file_name| + file = fetch_file_if_present(supported_file_name) + return file if file + end + nil end end diff --git a/gradle/lib/dependabot/gradle/file_parser.rb b/gradle/lib/dependabot/gradle/file_parser.rb index 423c97b9b1..6721821e67 100644 --- a/gradle/lib/dependabot/gradle/file_parser.rb +++ b/gradle/lib/dependabot/gradle/file_parser.rb @@ -18,6 +18,8 @@ class FileParser < Dependabot::FileParsers::Base require "dependabot/file_parsers/base/dependency_set" require_relative "file_parser/property_value_finder" + SUPPORTED_BUILD_FILE_NAMES = %w(build.gradle build.gradle.kts).freeze + PROPERTY_REGEX = / (?:\$\{property\((?[^:\s]*?)\)\})| @@ -36,6 +38,7 @@ class FileParser < Dependabot::FileParsers::Base PLUGIN_BLOCK_DECLARATION_REGEX = /(?:^|\s)plugins\s*\{/.freeze PLUGIN_BLOCK_ENTRY_REGEX = /id\s+"(?#{PART})"\s+version\s+"(?#{VSN_PART})"/.freeze + PLUGIN_ID_REGEX = /['"](?#{PART})['"]/.freeze def parse dependency_set = DependencySet.new @@ -51,7 +54,7 @@ def parse private def map_value_regex(key) - /(?:^|\s|,|\()#{Regexp.quote(key)}:\s*['"](?[^'"]+)['"]/ + /(?:^|\s|,|\()#{Regexp.quote(key)}(\s*=|:)\s*['"](?[^'"]+)['"]/ end def buildfile_dependencies(buildfile) @@ -146,10 +149,11 @@ def plugin_dependencies(buildfile) plugin_blocks.each do |blk| blk.lines.each do |line| - name = line.match(/id\s+['"](?#{PART})['"]/)&. - named_captures&.fetch("id") - version = line.match(/version\s+['"](?#{VSN_PART})['"]/)&. - named_captures&.fetch("version") + name_regex = /id(\s+#{PLUGIN_ID_REGEX}|\(#{PLUGIN_ID_REGEX}\))/ + name = line.match(name_regex)&.named_captures&.fetch("id") + version_regex = /version\s+['"](?#{VSN_PART})['"]/ + version = line.match(version_regex)&.named_captures&. + fetch("version") next unless name && version details = { name: name, group: "plugins", version: version } @@ -288,15 +292,16 @@ def closing_bracket_index(string) end def buildfiles - @buildfiles ||= - dependency_files.select { |f| f.name.end_with?("build.gradle") } + @buildfiles ||= dependency_files.select do |f| + f.name.end_with?(*SUPPORTED_BUILD_FILE_NAMES) + end end def script_plugin_files @script_plugin_files ||= buildfiles.flat_map do |buildfile| buildfile.content. - scan(/apply from:\s+['"]([^'"]+)['"]/).flatten. + scan(/apply from(\s+=|:)\s+['"]([^'"]+)['"]/).flatten. map { |f| dependency_files.find { |bf| bf.name == f } }. compact end. @@ -304,7 +309,13 @@ def script_plugin_files end def check_required_files - raise "No build.gradle!" unless get_original_file("build.gradle") + raise "No build.gradle or build.gradle.kts!" unless original_file + end + + def original_file + dependency_files.find do |f| + SUPPORTED_BUILD_FILE_NAMES.include?(f.name) + end end end end diff --git a/gradle/lib/dependabot/gradle/file_parser/property_value_finder.rb b/gradle/lib/dependabot/gradle/file_parser/property_value_finder.rb index 39aa2d7511..67e0a30635 100644 --- a/gradle/lib/dependabot/gradle/file_parser/property_value_finder.rb +++ b/gradle/lib/dependabot/gradle/file_parser/property_value_finder.rb @@ -7,6 +7,8 @@ module Gradle class FileParser class PropertyValueFinder # rubocop:disable Layout/LineLength + SUPPORTED_BUILD_FILE_NAMES = %w(build.gradle build.gradle.kts).freeze + QUOTED_VALUE_REGEX = /\s*['"][^\s]+['"]\s*/.freeze @@ -15,20 +17,63 @@ class PropertyValueFinder /\s*project\.findProperty\(#{QUOTED_VALUE_REGEX}\)\s*\?:/.freeze # project.hasProperty('property') ? project.getProperty('property') : - HAS_PROPERTY_REGEX = + GROOVY_HAS_PROPERTY_REGEX = /\s*project\.hasProperty\(#{QUOTED_VALUE_REGEX}\)\s*\?\s*project\.getProperty\(#{QUOTED_VALUE_REGEX}\)\s*:/.freeze + # if(project.hasProperty("property")) project.getProperty("property") else + KOTLIN_HAS_PROPERTY_REGEX = + /\s*if\s*\(project\.hasProperty\(#{QUOTED_VALUE_REGEX}\)\)\s+project\.getProperty\(#{QUOTED_VALUE_REGEX}\)\s+else\s+/.freeze + + GROOVY_PROPERTY_DECLARATION_AS_DEFAULTS_REGEX = + /(?:#{FIND_PROPERTY_REGEX}|#{GROOVY_HAS_PROPERTY_REGEX})?/.freeze + + KOTLIN_PROPERTY_DECLARATION_AS_DEFAULTS_REGEX = + /(?:#{FIND_PROPERTY_REGEX}|#{KOTLIN_HAS_PROPERTY_REGEX})?/.freeze + PROPERTY_DECLARATION_AS_DEFAULTS_REGEX = - /(?:#{FIND_PROPERTY_REGEX}|#{HAS_PROPERTY_REGEX})?/.freeze + /(#{GROOVY_PROPERTY_DECLARATION_AS_DEFAULTS_REGEX}|#{KOTLIN_PROPERTY_DECLARATION_AS_DEFAULTS_REGEX})?/.freeze + + VALUE_REGEX = + /#{PROPERTY_DECLARATION_AS_DEFAULTS_REGEX}\s*['"](?[^\s]+)['"]/.freeze + + GROOVY_SINGLE_PROPERTY_DECLARATION_REGEX = + /(?:^|\s+|ext.)(?[^\s=]+)\s*=#{VALUE_REGEX}/.freeze + + KOTLIN_SINGLE_PROPERTY_INDEX_DECLARATION_REGEX = + /\s*extra\[['"](?[^\s=]+)['"]\]\s*=#{VALUE_REGEX}/.freeze + + KOTLIN_SINGLE_PROPERTY_SET_REGEX = + /\s*set\(['"](?[^\s=]+)['"]\s*,#{VALUE_REGEX}\)/.freeze + + KOTLIN_SINGLE_PROPERTY_SET_DECLARATION_REGEX = + /\s*extra\.#{KOTLIN_SINGLE_PROPERTY_SET_REGEX}/.freeze + + KOTLIN_SINGLE_PROPERTY_DECLARATION_REGEX = + /(#{KOTLIN_SINGLE_PROPERTY_INDEX_DECLARATION_REGEX}|#{KOTLIN_SINGLE_PROPERTY_SET_DECLARATION_REGEX})/.freeze SINGLE_PROPERTY_DECLARATION_REGEX = - /(?:^|\s+|ext.)(?[^\s=]+)\s*=#{PROPERTY_DECLARATION_AS_DEFAULTS_REGEX}\s*['"](?[^\s]+)['"]/.freeze + /(#{KOTLIN_SINGLE_PROPERTY_DECLARATION_REGEX}|#{GROOVY_SINGLE_PROPERTY_DECLARATION_REGEX})/.freeze - MULTI_PROPERTY_DECLARATION_REGEX = + GROOVY_MULTI_PROPERTY_DECLARATION_REGEX = /(?:^|\s+|ext.)(?[^\s=]+)\s*=\s*\[(?[^\]]+)\]/m.freeze + KOTLIN_BLOCK_PROPERTY_DECLARATION_REGEX = + /\s*(?[^\s=]+)\.apply\s*{(?[^\]]+)}/m.freeze + + KOTLIN_MULTI_PROPERTY_DECLARATION_REGEX = + /\s*extra\[['"](?[^\s=]+)['"]\]\s*=\s*mapOf\((?[^\]]+)\)/m.freeze + + MULTI_PROPERTY_DECLARATION_REGEX = + /(#{KOTLIN_MULTI_PROPERTY_DECLARATION_REGEX}|#{GROOVY_MULTI_PROPERTY_DECLARATION_REGEX})/.freeze + + KOTLIN_MAP_NAMESPACED_DECLARATION_REGEX = + /(?:^|\s+)['"](?[^\s:]+)['"]\s*to#{VALUE_REGEX}\s*/.freeze + + REGULAR_NAMESPACED_DECLARATION_REGEX = + /(?:^|\s+)(?[^\s:]+)\s*[:=]#{VALUE_REGEX}\s*/.freeze + NAMESPACED_DECLARATION_REGEX = - /(?:^|\s+)(?[^\s:]+)\s*:#{PROPERTY_DECLARATION_AS_DEFAULTS_REGEX}\s*['"](?[^\s]+)['"]\s*/.freeze + /(#{REGULAR_NAMESPACED_DECLARATION_REGEX}|#{KOTLIN_MAP_NAMESPACED_DECLARATION_REGEX})/.freeze # rubocop:enable Layout/LineLength def initialize(dependency_files:) @@ -82,6 +127,9 @@ def properties(buildfile) @properties[buildfile.name]. merge!(fetch_single_property_declarations(buildfile)) + @properties[buildfile.name]. + merge!(fetch_kotlin_block_property_declarations(buildfile)) + @properties[buildfile.name]. merge!(fetch_multi_property_declarations(buildfile)) @@ -108,6 +156,36 @@ def fetch_single_property_declarations(buildfile) properties end + def fetch_kotlin_block_property_declarations(buildfile) + properties = {} + + prepared_content(buildfile). + scan(KOTLIN_BLOCK_PROPERTY_DECLARATION_REGEX) do + captures = Regexp.last_match.named_captures + namespace = captures.fetch("namespace") + + captures.fetch("values"). + scan(KOTLIN_SINGLE_PROPERTY_SET_REGEX) do + declaration_string = Regexp.last_match.to_s.strip + sub_captures = Regexp.last_match.named_captures + name = sub_captures.fetch("name") + full_name = if namespace == "extra" + name + else + [namespace, name].join(".") + end + + properties[full_name] = { + value: sub_captures.fetch("value"), + declaration_string: declaration_string, + file: buildfile.name + } + end + end + + properties + end + def fetch_multi_property_declarations(buildfile) properties = {} @@ -140,8 +218,9 @@ def prepared_content(buildfile) end def top_level_buildfile - @top_level_buildfile ||= - dependency_files.find { |f| f.name == "build.gradle" } + @top_level_buildfile ||= dependency_files.find do |f| + SUPPORTED_BUILD_FILE_NAMES.include?(f.name) + end end end end diff --git a/gradle/lib/dependabot/gradle/file_parser/repositories_finder.rb b/gradle/lib/dependabot/gradle/file_parser/repositories_finder.rb index 0979a46583..d2a82be827 100644 --- a/gradle/lib/dependabot/gradle/file_parser/repositories_finder.rb +++ b/gradle/lib/dependabot/gradle/file_parser/repositories_finder.rb @@ -6,15 +6,24 @@ module Dependabot module Gradle class FileParser class RepositoriesFinder + SUPPORTED_BUILD_FILE_NAMES = %w(build.gradle build.gradle.kts).freeze + # The Central Repo doesn't have special status for Gradle, but until # we're confident we're selecting repos correctly it's wise to include # it as a default. CENTRAL_REPO_URL = "https://repo.maven.apache.org/maven2" REPOSITORIES_BLOCK_START = /(?:^|\s)repositories\s*\{/.freeze - MAVEN_REPO_REGEX = + + GROOVY_MAVEN_REPO_REGEX = /maven\s*\{[^\}]*\surl[\s\(]\s*['"](?[^'"]+)['"]/.freeze + KOTLIN_MAVEN_REPO_REGEX = + /maven\(['"](?[^'"]+)['"]\)/.freeze + + MAVEN_REPO_REGEX = + /(#{KOTLIN_MAVEN_REPO_REGEX}|#{GROOVY_MAVEN_REPO_REGEX})/.freeze + def initialize(dependency_files:, target_dependency_file:) @dependency_files = dependency_files @target_dependency_file = target_dependency_file @@ -136,8 +145,9 @@ def comment_free_content(buildfile) end def top_level_buildfile - @top_level_buildfile ||= - dependency_files.find { |f| f.name == "build.gradle" } + @top_level_buildfile ||= dependency_files.find do |f| + SUPPORTED_BUILD_FILE_NAMES.include?(f.name) + end end end end diff --git a/gradle/lib/dependabot/gradle/file_updater.rb b/gradle/lib/dependabot/gradle/file_updater.rb index 00f4984da8..633e8b01fa 100644 --- a/gradle/lib/dependabot/gradle/file_updater.rb +++ b/gradle/lib/dependabot/gradle/file_updater.rb @@ -10,8 +10,10 @@ class FileUpdater < Dependabot::FileUpdaters::Base require_relative "file_updater/dependency_set_updater" require_relative "file_updater/property_value_updater" + SUPPORTED_BUILD_FILE_NAMES = %w(build.gradle build.gradle.kts).freeze + def self.updated_files_regex - [/^build\.gradle$/, %r{/build\.gradle$}] + [/^build\.gradle(\.kts)?$/, %r{/build\.gradle(\.kts)?$}] end def updated_dependency_files @@ -38,7 +40,13 @@ def updated_dependency_files private def check_required_files - raise "No build.gradle!" unless get_original_file("build.gradle") + raise "No build.gradle or build.gradle.kts!" unless original_file + end + + def original_file + dependency_files.find do |f| + SUPPORTED_BUILD_FILE_NAMES.include?(f.name) + end end def update_buildfiles_for_dependency(buildfiles:, dependency:) @@ -133,7 +141,8 @@ def original_buildfile_declaration(dependency, requirement) next false unless line.include?(dependency.name.split(":").first) next false unless line.include?(dependency.name.split(":").last) else - name_regex = /id\s+['"]#{Regexp.quote(dependency.name)}['"]/ + name_regex_value = /['"]#{Regexp.quote(dependency.name)}['"]/ + name_regex = /id(\s+#{name_regex_value}|\(#{name_regex_value}\))/ next false unless line.match?(name_regex) end diff --git a/gradle/spec/dependabot/gradle/file_fetcher/settings_file_parser_spec.rb b/gradle/spec/dependabot/gradle/file_fetcher/settings_file_parser_spec.rb index ebb2d47cdc..17eb1029a5 100644 --- a/gradle/spec/dependabot/gradle/file_fetcher/settings_file_parser_spec.rb +++ b/gradle/spec/dependabot/gradle/file_fetcher/settings_file_parser_spec.rb @@ -24,6 +24,20 @@ it "includes the additional declarations" do expect(subproject_paths).to match_array(%w(app)) end + + context "when kotlin" do + let(:settings_file) do + Dependabot::DependencyFile.new( + name: "settings.gradle.kts", + content: fixture("settings_files", fixture_name) + ) + end + let(:fixture_name) { "settings.gradle.kts" } + + it "includes the additional declarations" do + expect(subproject_paths).to match_array(%w(app)) + end + end end context "with commented out subproject declarations" do diff --git a/gradle/spec/dependabot/gradle/file_fetcher_spec.rb b/gradle/spec/dependabot/gradle/file_fetcher_spec.rb index 7b60651294..7d0f7163a8 100644 --- a/gradle/spec/dependabot/gradle/file_fetcher_spec.rb +++ b/gradle/spec/dependabot/gradle/file_fetcher_spec.rb @@ -33,6 +33,13 @@ context "with a basic buildfile" do before do + stub_request(:get, url + "?ref=sha"). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_java_with_subdir.json"), + headers: { "content-type" => "application/json" } + ) stub_request(:get, File.join(url, "build.gradle?ref=sha")). with(headers: { "Authorization" => "token token" }). to_return( @@ -89,10 +96,70 @@ end end end + + context "with kotlin" do + before do + stub_request(:get, url + "?ref=sha"). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_kotlin_with_subdir.json"), + headers: { "content-type" => "application/json" } + ) + stub_request(:get, File.join(url, "build.gradle.kts?ref=sha")). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_kotlin_basic_buildfile.json"), + headers: { "content-type" => "application/json" } + ) + stub_request(:get, File.join(url, "settings.gradle.kts?ref=sha")). + with(headers: { "Authorization" => "token token" }). + to_return(status: 404) + end + + it "fetches the buildfile" do + expect(file_fetcher_instance.files.count).to eq(1) + expect(file_fetcher_instance.files.map(&:name)). + to match_array(%w(build.gradle.kts)) + end + + context "with a settings.gradle.kts" do + before do + stub_request(:get, File.join(url, "settings.gradle.kts?ref=sha")). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_kotlin_simple_settings.json"), + headers: { "content-type" => "application/json" } + ) + stub_request(:get, File.join(url, "app/build.gradle.kts?ref=sha")). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_kotlin_basic_buildfile.json"), + headers: { "content-type" => "application/json" } + ) + end + + it "fetches the main buildfile and subproject buildfile" do + expect(file_fetcher_instance.files.count).to eq(2) + expect(file_fetcher_instance.files.map(&:name)). + to match_array(%w(build.gradle.kts app/build.gradle.kts)) + end + end + end end context "with a script plugin" do before do + stub_request(:get, url + "?ref=sha"). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_java_with_subdir.json"), + headers: { "content-type" => "application/json" } + ) stub_request(:get, File.join(url, "build.gradle?ref=sha")). with(headers: { "Authorization" => "token token" }). to_return( @@ -123,6 +190,13 @@ context "that can't be found" do before do + stub_request(:get, url + "?ref=sha"). + with(headers: { "Authorization" => "token token" }). + to_return( + status: 200, + body: fixture("github", "contents_java_with_subdir.json"), + headers: { "content-type" => "application/json" } + ) stub_request( :get, File.join(url, "gradle/dependencies.gradle?ref=sha") diff --git a/gradle/spec/dependabot/gradle/file_parser/property_value_finder_spec.rb b/gradle/spec/dependabot/gradle/file_parser/property_value_finder_spec.rb index 57ce35f293..9724fb2bc7 100644 --- a/gradle/spec/dependabot/gradle/file_parser/property_value_finder_spec.rb +++ b/gradle/spec/dependabot/gradle/file_parser/property_value_finder_spec.rb @@ -188,5 +188,175 @@ end end end + + context "with kotlin" do + let(:buildfile) do + Dependabot::DependencyFile.new( + name: "build.gradle.kts", + content: fixture("buildfiles", buildfile_fixture_name) + ) + end + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + + context "with a single buildfile" do + context "when the property is declared in the calling buildfile" do + let(:property_name) { "kotlinVersion" } + let(:callsite_buildfile) { buildfile } + + its([:value]) { is_expected.to eq("1.2.61") } + its([:declaration_string]) do + is_expected.to eq('extra["kotlinVersion"] = "1.2.61"') + end + its([:file]) { is_expected.to eq("build.gradle.kts") } + + context "and the property name has a `project.` prefix" do + let(:property_name) { "project.kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("build.gradle.kts") } + end + + context "and the property name has a `rootProject.` prefix" do + let(:property_name) { "rootProject.kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("build.gradle.kts") } + end + + context "and tricky properties" do + context "and the property is declared with extra[key] = value" do + let(:property_name) { "kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:declaration_string]) do + is_expected.to eq('extra["kotlinVersion"] = "1.2.61"') + end + end + + context "and the property is declared with extra.set(key, value)" do + let(:property_name) { "javaVersion" } + its([:value]) { is_expected.to eq("11") } + its([:declaration_string]) do + is_expected.to eq('extra.set("javaVersion", "11")') + end + end + + context "and the property is declared in an extra.apply block" do + let(:property_name) { "buildToolsVersion" } + its([:value]) { is_expected.to eq("27.0.3") } + its([:declaration_string]) do + is_expected.to eq('set("buildToolsVersion", "27.0.3")') + end + end + + context "and the property is preceded by a comment" do + # This is important because the declaration string must + # not include whitespace that will be different to when + # the FileUpdater uses it (i.e., before the comments + # are stripped out) + let(:property_name) { "supportVersion" } + its([:value]) { is_expected.to eq("27.1.1") } + its([:declaration_string]) do + is_expected.to eq('set("supportVersion", "27.1.1")') + end + end + + context "and the property is using findProperty syntax" do + let(:property_name) { "findPropertyVersion" } + its([:value]) { is_expected.to eq("27.1.1") } + its([:declaration_string]) do + is_expected.to eq('set("findPropertyVersion", project.findProperty("findPropertyVersion") ?: "27.1.1")') + end + end + + context "and the property is using hasProperty syntax" do + let(:property_name) { "hasPropertyVersion" } + its([:value]) { is_expected.to eq("27.1.1") } + its([:declaration_string]) do + # rubocop:disable Layout/LineLength + is_expected.to eq('set("hasPropertyVersion", if(project.hasProperty("hasPropertyVersion")) project.getProperty("hasPropertyVersion") else "27.1.1")') + # rubocop:enable Layout/LineLength + end + end + + context "and the property is commented out" do + let(:property_name) { "commentedVersion" } + it { is_expected.to be_nil } + end + + context "and the property is declared within a namespace" do + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + let(:property_name) { "versions.okhttp" } + + its([:value]) { is_expected.to eq("3.12.1") } + its([:declaration_string]) do + is_expected.to eq('"okhttp" to "3.12.1"') + end + context "and the property is using findProperty syntax" do + let(:property_name) { "versions.findPropertyVersion" } + its([:value]) { is_expected.to eq("1.0.0") } + its([:declaration_string]) do + # rubocop:disable Layout/LineLength + is_expected.to eq('"findPropertyVersion" to project.findProperty("findPropertyVersion") ?: "1.0.0"') + # rubocop:enable Layout/LineLength + end + end + + context "and the property is using hasProperty syntax" do + let(:property_name) { "versions.hasPropertyVersion" } + its([:value]) { is_expected.to eq("1.0.0") } + its([:declaration_string]) do + # rubocop:disable Layout/LineLength + is_expected.to eq('"hasPropertyVersion" to if(project.hasProperty("hasPropertyVersion")) project.getProperty("hasPropertyVersion") else "1.0.0"') + # rubocop:enable Layout/LineLength + end + end + end + end + end + end + + context "with multiple buildfiles" do + let(:dependency_files) { [buildfile, callsite_buildfile] } + let(:property_name) { "kotlinVersion" } + let(:callsite_buildfile) do + Dependabot::DependencyFile.new( + name: "myapp/build.gradle.kts", + content: fixture("buildfiles", callsite_fixture_name) + ) + end + let(:callsite_fixture_name) { "build.gradle.kts" } + + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("build.gradle.kts") } + + context "and the property name has a `project.` prefix" do + let(:property_name) { "project.kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("build.gradle.kts") } + end + + context "and the property name has a `rootProject.` prefix" do + let(:property_name) { "rootProject.kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("build.gradle.kts") } + end + + context "with a property that only appears in the callsite buildfile" do + let(:buildfile_fixture_name) { "build.gradle.kts" } + let(:callsite_fixture_name) { "root_build.gradle.kts" } + + context "and the property name has a `project.` prefix" do + let(:property_name) { "project.kotlinVersion" } + its([:value]) { is_expected.to eq("1.2.61") } + its([:file]) { is_expected.to eq("myapp/build.gradle.kts") } + end + + context "and the property name has a `rootProject.` prefix" do + let(:property_name) { "rootProject.kotlinVersion" } + # We wouldn't normally expect this to be `nil` - it's more likely + # to be another version specified in the root project file. + it { is_expected.to be_nil } + end + end + end + end end end diff --git a/gradle/spec/dependabot/gradle/file_parser/repositories_finder_spec.rb b/gradle/spec/dependabot/gradle/file_parser/repositories_finder_spec.rb index 92103aa544..6a01158146 100644 --- a/gradle/spec/dependabot/gradle/file_parser/repositories_finder_spec.rb +++ b/gradle/spec/dependabot/gradle/file_parser/repositories_finder_spec.rb @@ -102,6 +102,20 @@ ) end end + + context "with kotlin" do + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + + it "includes the additional declarations" do + expect(repository_urls).to match_array( + %w( + https://jcenter.bintray.com + https://dl.bintray.com/magnusja/maven + https://maven.google.com + ) + ) + end + end end end end diff --git a/gradle/spec/dependabot/gradle/file_parser_spec.rb b/gradle/spec/dependabot/gradle/file_parser_spec.rb index ac26b7d681..dc8ee89af6 100644 --- a/gradle/spec/dependabot/gradle/file_parser_spec.rb +++ b/gradle/spec/dependabot/gradle/file_parser_spec.rb @@ -399,5 +399,289 @@ end end end + + context "with kotlin" do + let(:buildfile) do + Dependabot::DependencyFile.new( + name: "build.gradle.kts", + content: fixture("buildfiles", buildfile_fixture_name) + ) + end + let(:buildfile_fixture_name) { "build.gradle.kts" } + + its(:length) { is_expected.to eq(19) } + + describe "the first dependency" do + subject(:dependency) { dependencies.first } + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name).to eq("co.aikar:acf-paper") + expect(dependency.version).to eq("0.5.0-SNAPSHOT") + expect(dependency.requirements).to eq( + [{ + requirement: "0.5.0-SNAPSHOT", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: nil + }] + ) + end + end + + context "specified in short form" do + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + + its(:length) { is_expected.to eq(31) } + + it "handles packaging types" do + expect(dependencies.map(&:name)). + to include("com.sparkjava:spark-core") + + dep = dependencies.find { |d| d.name == "com.sparkjava:spark-core" } + expect(dep.version).to eq("2.5.4") + end + + it "includes property dependencies" do + expect(dependencies.map(&:name)). + to include("org.jetbrains.kotlin:kotlin-stdlib-jre8") + end + + describe "the property dependency" do + subject(:dependency) do + dependencies.find do |dep| + dep.name == "org.jetbrains.kotlin:kotlin-stdlib-jre8" + end + end + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("org.jetbrains.kotlin:kotlin-stdlib-jre8") + expect(dependency.version).to eq("1.2.61") + expect(dependency.requirements).to eq( + [{ + requirement: "1.2.61", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: { property_name: "kotlinVersion" } + }] + ) + end + end + + describe "the git dependency" do + subject(:dependency) do + dependencies.find do |dep| + dep.name == "com.github.heremaps:oksse" + end + end + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("com.github.heremaps:oksse") + expect(dependency.version).to eq( + "be5d2cd6deb8cf3ca2c9a740bdacec816871d4f7" + ) + expect(dependency.requirements).to eq( + [{ + requirement: "be5d2cd6deb8cf3ca2c9a740bdacec816871d4f7", + file: "build.gradle.kts", + groups: [], + source: { + type: "git", + url: "https://github.com/heremaps/oksse", + branch: nil, + ref: "be5d2cd6deb8cf3ca2c9a740bdacec816871d4f7" + }, + metadata: nil + }] + ) + end + end + end + + context "specified in a dependencySet" do + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + + its(:length) { is_expected.to eq(31) } + + describe "a dependencySet dependency" do + subject(:dependency) do + dependencies.find { |d| d.name == "io.grpc:grpc-netty" } + end + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("io.grpc:grpc-netty") + expect(dependency.version).to eq("1.15.1") + expect(dependency.requirements).to eq( + [{ + requirement: "1.15.1", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: { + dependency_set: { + group: "io.grpc", + version: "1.15.1" + } + } + }] + ) + end + end + + describe "a plugin dependency" do + subject(:dependency) do + dependencies.find { |d| d.name == "org.springframework.boot" } + end + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name).to eq("org.springframework.boot") + expect(dependency.version).to eq("2.0.5.RELEASE") + expect(dependency.requirements).to eq( + [{ + requirement: "2.0.5.RELEASE", + file: "build.gradle.kts", + groups: ["plugins"], + source: nil, + metadata: nil + }] + ) + end + end + end + + context "various different specifications" do + let(:buildfile_fixture_name) { "duck_duck_go_build.gradle.kts" } + + its(:length) { is_expected.to eq(37) } + + describe "the first dependency" do + subject(:dependency) { dependencies.first } + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("com.squareup.leakcanary:leakcanary-android") + expect(dependency.version).to eq("1.5.4") + expect(dependency.requirements).to eq( + [{ + requirement: "1.5.4", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: nil + }] + ) + end + end + + describe "the repeated dependency" do + subject(:dependency) do + dependencies. + find { |d| d.name == "com.nhaarman:mockito-kotlin-kt1.1" } + end + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("com.nhaarman:mockito-kotlin-kt1.1") + expect(dependency.version).to eq("1.5.0") + expect(dependency.requirements).to eq( + [{ + requirement: "1.5.0", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: nil + }] + ) + end + end + end + + context "with multiple buildfiles" do + let(:files) { [buildfile, subproject_buildfile] } + let(:subproject_buildfile) do + Dependabot::DependencyFile.new( + name: "app/build.gradle.kts", + content: fixture("buildfiles", buildfile_fixture_name) + ) + end + + its(:length) { is_expected.to eq(19) } + + describe "the first dependency" do + subject(:dependency) { dependencies.first } + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name).to eq("co.aikar:acf-paper") + expect(dependency.version).to eq("0.5.0-SNAPSHOT") + expect(dependency.requirements).to eq( + [{ + requirement: "0.5.0-SNAPSHOT", + file: "build.gradle.kts", + groups: [], + source: nil, + metadata: nil + }, { + requirement: "0.5.0-SNAPSHOT", + file: "app/build.gradle.kts", + groups: [], + source: nil, + metadata: nil + }] + ) + end + end + end + + context "with a script plugin" do + let(:files) { [buildfile, script_plugin] } + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + let(:script_plugin) do + Dependabot::DependencyFile.new( + name: "gradle/dependencies.gradle.kts", + content: fixture("script_plugins", "dependencies.gradle.kts") + ) + end + + its(:length) { is_expected.to eq(40) } + + describe "the last dependency" do + subject(:dependency) { dependencies.last } + + it "has the right details" do + expect(dependency).to be_a(Dependabot::Dependency) + expect(dependency.name). + to eq("org.jetbrains.kotlinx:kotlinx-coroutines-core") + expect(dependency.version).to eq("0.19.3") + expect(dependency.requirements).to eq( + [{ + requirement: "0.19.3", + file: "gradle/dependencies.gradle.kts", + groups: [], + source: nil, + metadata: nil + }, { + requirement: "0.26.1-eap13", + file: "gradle/dependencies.gradle.kts", + groups: [], + source: nil, + metadata: nil + }] + ) + end + end + end + end end end diff --git a/gradle/spec/dependabot/gradle/file_updater/property_value_updater_spec.rb b/gradle/spec/dependabot/gradle/file_updater/property_value_updater_spec.rb index b90498ee6f..5cbe6724b5 100644 --- a/gradle/spec/dependabot/gradle/file_updater/property_value_updater_spec.rb +++ b/gradle/spec/dependabot/gradle/file_updater/property_value_updater_spec.rb @@ -57,5 +57,34 @@ to include("ext.kotlin_version = '1.1.4-3'") end end + + context "with kotlin" do + let(:buildfile) do + Dependabot::DependencyFile.new( + name: "build.gradle.kts", + content: fixture("buildfiles", buildfile_fixture_name) + ) + end + let(:subproject_buildfile) do + Dependabot::DependencyFile.new( + name: "build.gradle.kts", + content: fixture("buildfiles", subproject_fixture_name) + ) + end + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + let(:subproject_fixture_name) { "build.gradle.kts" } + let(:callsite_buildfile) { buildfile } + let(:property_name) { "kotlinVersion" } + let(:previous_value) { "1.2.61" } + let(:updated_value) { "3.2.1" } + + its(:length) { is_expected.to eq(2) } + + it "updates the files correctly" do + expect(updated_files.last).to eq(dependency_files.last) + expect(updated_files.first.content). + to include('extra["kotlinVersion"] = "3.2.1"') + end + end end end diff --git a/gradle/spec/dependabot/gradle/file_updater_spec.rb b/gradle/spec/dependabot/gradle/file_updater_spec.rb index 03966f9db3..76decca1df 100644 --- a/gradle/spec/dependabot/gradle/file_updater_spec.rb +++ b/gradle/spec/dependabot/gradle/file_updater_spec.rb @@ -63,7 +63,9 @@ describe "the updated build.gradle file" do subject(:updated_buildfile) do - updated_files.find { |f| f.name == "build.gradle" } + updated_files.find do |f| + %w(build.gradle build.gradle.kts).include?(f.name) + end end its(:content) do @@ -74,6 +76,17 @@ end its(:content) { is_expected.to include "version: '4.2.0'" } + context "with kotlin" do + let(:buildfile_fixture_name) { "build.gradle.kts" } + + its(:content) do + is_expected.to include( + 'implementation(group = "co.aikar", name = "acf-paper", version = "0.6.0-SNAPSHOT", changing: true)' + ) + end + its(:content) { is_expected.to include 'version = "4.2.0"' } + end + context "with a plugin" do let(:buildfile_fixture_name) { "dependency_set.gradle" } let(:dependency) do @@ -103,6 +116,81 @@ 'id "org.springframework.boot" version "2.1.4.RELEASE" apply false' ) end + + context "with kotlin" do + let(:buildfile_fixture_name) { "root_build.gradle.kts" } + + its(:content) do + is_expected.to include( + 'id("org.springframework.boot") version "2.1.4.RELEASE" apply false' + ) + end + + context "with a dependency version defined by a property" do + let(:buildfile) do + Dependabot::DependencyFile.new( + name: "build.gradle.kts", + content: fixture("buildfiles", buildfile_fixture_name) + ) + end + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "org.jetbrains.kotlin:kotlin-gradle-plugin", + version: "23.6-jre", + previous_version: "1.2.61", + requirements: [{ + file: "build.gradle.kts", + requirement: "23.6-jre", + groups: [], + source: { + type: "maven_repo", + url: "https://repo.maven.apache.org/maven2" + }, + metadata: { property_name: "kotlinVersion" } + }], + previous_requirements: [{ + file: "build.gradle.kts", + requirement: "1.2.61", + groups: [], + source: nil, + metadata: { property_name: "kotlinVersion" } + }], + package_manager: "gradle" + ), + Dependabot::Dependency.new( + name: "org.jetbrains.kotlin:kotlin-stdlib-jre8", + version: "23.6-jre", + previous_version: "1.2.61", + requirements: [{ + file: "build.gradle.kts", + requirement: "23.6-jre", + groups: [], + source: { + type: "maven_repo", + url: "https://repo.maven.apache.org/maven2" + }, + metadata: { property_name: "kotlinVersion" } + }], + previous_requirements: [{ + file: "build.gradle.kts", + requirement: "1.2.61", + groups: [], + source: nil, + metadata: { property_name: "kotlinVersion" } + }], + package_manager: "gradle" + ) + ] + end + + it "updates the version in the build.gradle.kts" do + expect(updated_files.map(&:name)).to eq(["build.gradle.kts"]) + expect(updated_files.first.content). + to include('extra["kotlinVersion"] = "23.6-jre"') + end + end + end end context "with multiple buildfiles" do diff --git a/gradle/spec/fixtures/buildfiles/build.gradle.kts b/gradle/spec/fixtures/buildfiles/build.gradle.kts new file mode 100644 index 0000000000..08a3a5e40b --- /dev/null +++ b/gradle/spec/fixtures/buildfiles/build.gradle.kts @@ -0,0 +1,69 @@ +group "me.minidigger" + +apply(plugin = "com.github.johnrengelman.shadow") + +task copyToServer(type: Copy) { + from shadowJar + into testServerFolder +} + +shadowJar { + mergeServiceFiles() + configurations = listOf(project.configurations.compile) + + //relocate "org.bstats", "com.voxelgameslib.voxelgameslib.metrics" TODO relocate bstats + + manifest { + attributes "Implementation-Version": project.version + "@" + revision + } +} + +val devNull = new OutputStream() { + @Override + public void write(int b) {} +} + + +build.dependsOn shadowJar + +dependencies { + implementation(project(":ChatMenuAPI")) + + // Some details about "co.aikar:acf-paper", version = "0.5.0-SNAPSHOT" + implementation(group = "co.aikar", name = "acf-paper", version = "0.5.0-SNAPSHOT", changing: true) + implementation(group = "com.google.inject", name = "guice", version = "4.2.0") + implementation(group = "com.google.code.findbugs", name = "jsr305", version = "3.0.2") + implementation(group = "de.davidbilge", name = "jskill", version = "1.1-SNAPSHOT") + implementation(group = "net.lingala.zip4j", name = "zip4j", version = "1.3.2") + implementation(group = "co.aikar", name = "taskchain-bukkit", version = "3.6.0") + implementation(group = "net.kyori", name = "text", version = "1.12-1.4.0") + implementation(group = "org.bstats", name = "bstats-bukkit", version = "1.2") + implementation(group = "com.bugsnag", name = "bugsnag", version = "3.1.5") + implementation(group = "com.zaxxer", name = "HikariCP", version = "2.7.8") + implementation(group = "org.eclipse.jgit", name = "org.eclipse.jgit", version = "4.11.0.201803080745-r") + implementation(group = "org.hibernate", name = "hibernate-core", version = "5.3.0.CR1") + implementation(group = "com.dumptruckman.minecraft", name = "JsonConfiguration", version = "1.1") + implementation(group = "org.inventivetalent", name = "mc-wrappers", version = "1.0.3-SNAPSHOT") + implementation(group = "io.github.lukehutch", name = "fast-classpath-scanner", version = "2.18.1") + implementation(group = "org.objenesis", name = "objenesis", version = "2.6") + + implementation((group = "org.inventivetalent", name = "menubuilder", version = "1.0.2") { + exclude group = "org.bukkit" + }) + implementation((group = "org.mineskin", name = "java-client", version = "1.0.1-SNAPSHOT") { + exclude group = "junit" + }) + implementation((group = "org.inventivetalent", name = "reflectionhelper", version = "1.13.0-SNAPSHOT") { + exclude group = "junit" + }) +} + +task createPom() { + pom { + project { + groupId "com.voxelgameslib" + artifactId "dependencies" + version version + } + }.writeTo("pom.xml") +} diff --git a/gradle/spec/fixtures/buildfiles/duck_duck_go_build.gradle.kts b/gradle/spec/fixtures/buildfiles/duck_duck_go_build.gradle.kts new file mode 100644 index 0000000000..1b0f045cd7 --- /dev/null +++ b/gradle/spec/fixtures/buildfiles/duck_duck_go_build.gradle.kts @@ -0,0 +1,159 @@ +import org.jetbrains.kotlin.config.KotlinCompilerVersion + +apply(plugin = "com.android.application") + +plugins { + id("kotlin-android") + id("kotlin-android-extensions") + id("kotlin-kapt") +} +apply from = "../versioning.gradle" + +ext { + VERSION_NAME = "5.3.1" + USE_ORCHESTRATOR = project.hasProperty("orchestrator") ? project.property("orchestrator") : false +} + +android { + compileSdkVersion(27) + defaultConfig { + applicationId = "com.duckduckgo.mobile.android" + minSdkVersion(21) + targetSdkVersion(27) + versionCode = buildVersionCode() + versionName = VERSION_NAME + testInstrumentationRunner = "com.duckduckgo.app.TestRunner" + archivesBaseName = "duckduckgo-$versionName" = versionName" + + javaCompileOptions { + annotationProcessor { + arguments = mapOf("room.schemaLocation" to "$projectDir/schemas".toString()) + } + } + sourceSets { + androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) + } + } + signingConfigs { + release + } + buildTypes { + named("debug"){ + } + named("release"){ + isMinifyEnabled = false + setProguardFiles(listOf(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")) + signingConfig = signingConfigs.getByName("release") + } + } + externalNativeBuild { + + cmake { + path "CMakeLists.txt" + } + } + lintOptions { + isAbortOnError = false + } + testOptions { + unitTests.returnDefaultValues = true + + if (USE_ORCHESTRATOR) { + execution "ANDROID_TEST_ORCHESTRATOR" + } + } + + val staticConfigPath = "${System.getenv("HOME")}/jenkins_static/com.duckduckgo.mobile.android" + val propertiesPath = "${staticConfigPath}/ddg_android_build.properties" + val propertiesFile = new File(propertiesPath) + if (propertiesFile.exists()) { + println "Signing properties found" + val props = new Properties() + props.load(new FileInputStream(propertiesFile)) + android.signingConfigs.release.storeFile = file("${staticConfigPath}/${propslistOf("key.store")}") + android.signingConfigs.release.storePassword = propslistOf("key.store.password") + android.signingConfigs.release.keyAlias = propslistOf("key.alias") + android.signingConfigs.release.keyPassword = propslistOf("key.alias.password") + } else { + println "Signing properties not found at ${propertiesPath}, releases will NOT succeed" + android.buildTypes.release.signingConfig = null + } +} + +ext { + supportLibrary = "27.1.1" + architectureComponents = "1.0.0" + architectureComponentsExtensions = "1.1.1" + androidKtx = "0.3" + dagger = "2.14.1" + retrofit = "2.3.0" + ankoVersion = "0.10.4" + glide = "4.6.1" + androidTestRunner = "1.0.2" +} + + +dependencies { + debugImplementation("com.squareup.leakcanary:leakcanary-android:1.5.4") + releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:1.5.4" + + implementation(fileTree(dir = "libs", include: listOf("*.jar"))) + implementation(kotlin("stdlib", KotlinCompilerVersion.VERSION)) + implementation("com.android.support:appcompat-v7:$supportLibrary") + implementation("com.android.support:design:$supportLibrary") + implementation("com.android.support.constraint:constraint-layout:1.1.0") + implementation("com.squareup.okhttp3:okhttp:3.10.0") + implementation("com.squareup.retrofit2:retrofit:$retrofit") + implementation("com.squareup.retrofit2:converter-moshi:$retrofit") + implementation("com.squareup.retrofit2:adapter-rxjava2:$retrofit") + implementation("io.reactivex.rxjava2:rxjava:2.1.10") + implementation("io.reactivex.rxjava2:rxandroid:2.0.2") + implementation("com.jakewharton.timber:timber:4.6.1") + implementation("com.google.dagger:dagger-android:$dagger") + implementation("com.google.dagger:dagger-android-support:$dagger") + releaseImplementation "com.faendir:acra:4.10.0" + + // RxRelay + implementation("com.jakewharton.rxrelay2:rxrelay:2.0.0") + + // Anko + implementation("org.jetbrains.anko:anko-commons:$ankoVersion") + implementation("org.jetbrains.anko:anko-design:$ankoVersion") + + // Android KTX + implementation("androidx.core:core-ktx:$androidKtx") + + // ViewModel and LiveData + implementation("android.arch.lifecycle:extensions:$architectureComponentsExtensions") + kapt("android.arch.lifecycle:compiler:$architectureComponents") + testImplementation("android.arch.core:core-testing:$architectureComponents") + androidTestImplementation("android.arch.core:core-testing:$architectureComponents") + + // Room + implementation("android.arch.persistence.room:runtime:$architectureComponents") + kapt("android.arch.persistence.room:compiler:$architectureComponents") + testImplementation("android.arch.persistence.room:testing:$architectureComponents") + androidTestImplementation("android.arch.persistence.room:testing:$architectureComponents") + + // Dagger + kapt("com.google.dagger:dagger-android-processor:$dagger") + kapt("com.google.dagger:dagger-compiler:$dagger") + kapt(AndroidTest "com.google.dagger:dagger-android-processor:$dagger") + kapt(AndroidTest "com.google.dagger:dagger-compiler:$dagger") + + // Glide + implementation("com.github.bumptech.glide:glide:$glide") + kapt("com.github.bumptech.glide:compiler:$glide") + + testImplementation("org.mockito:mockito-core:2.15.0") + testImplementation("com.nhaarman:mockito-kotlin-kt1.1:1.5.0") + testImplementation("junit:junit:4.12") + + androidTestImplementation("com.android.support.test:runner:$androidTestRunner") + androidTestImplementation("com.android.support.test:rules:$androidTestRunner") + androidTestUtil "com.android.support.test:orchestrator:1.0.2" + androidTestImplementation("com.android.support.test.espresso:espresso-core:3.0.2") + androidTestImplementation("org.mockito:mockito-android:2.15.0") + androidTestImplementation("com.nhaarman:mockito-kotlin-kt1.1:1.5.0") + +} diff --git a/gradle/spec/fixtures/buildfiles/kotlin_build.gradle.kts b/gradle/spec/fixtures/buildfiles/kotlin_build.gradle.kts deleted file mode 100644 index c054fde319..0000000000 --- a/gradle/spec/fixtures/buildfiles/kotlin_build.gradle.kts +++ /dev/null @@ -1,62 +0,0 @@ -import org.gradle.gradlebuild.unittestandcompile.ModuleType - -/* - * Copyright 2017 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -plugins { - `java-library` - id("gradlebuild.strict-compile") - id("gradlebuild.classycle") - -} - -dependencies { - api(project(":baseServices")) - api(library("inject")) - - implementation(project(":messaging")) - implementation(project(":native")) - implementation(project(":persistentCache")) - implementation(project(":resources")) - implementation(project(":logging")) - - implementation(library("commons_io")) - - jmh(library("ant")) { - version { - prefer(libraryVersion("ant")) - } - } - - jmh(library("commons_compress")) { - version { - prefer(libraryVersion("commons_compress")) - } - } - - jmh("io.airlift:aircompressor:0.8") - jmh("org.iq80.snappy:snappy:0.4") - jmh("org.kamranzafar:jtar:2.3") -} - -gradlebuildJava { - moduleType = ModuleType.CORE -} - - -testFixtures { - from(":core") - from(":baseServices") -} diff --git a/gradle/spec/fixtures/buildfiles/root_build.gradle.kts b/gradle/spec/fixtures/buildfiles/root_build.gradle.kts new file mode 100644 index 0000000000..5cb88665e9 --- /dev/null +++ b/gradle/spec/fixtures/buildfiles/root_build.gradle.kts @@ -0,0 +1,162 @@ +import org.jetbrains.kotlin.config.KotlinCompilerVersion + +group "de.fhaachen" +version "1.0-SNAPSHOT" + +plugins { + id("kotlin") + id("com.github.johnrengelman.shadow") + id("org.springframework.boot") version "2.0.5.RELEASE" apply false + id("com.google.protobuf") version "0.8.4" apply false +} + +buildscript { + extra["kotlinVersion"] = "1.2.61" + + repositories { + jcenter() + maven("https://dl.bintray.com/magnusja/maven") + google() + } + dependencies { + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") + classpath("com.github.jengelman.gradle.plugins:shadow:2.0.2") + classpath("com.android.tools.build:gradle:3.1.2") + } +} + +val kotlinVersion: String by extra + +apply from = "gradle/dependencies.gradle.kts" + +allprojects { + repositories { + jcenter() + maven("https://dl.bintray.com/magnusja/maven") + google() + } + + task downloadDependencies { + doLast { + configurations.all { + try { + it.files + } catch (e) { + project.logger.info(e.message) + } + } + } + } +} + +// Here to ensure we don"t parse SCM URLs as dependency declarations +scm { + url "scm:git@github.com:mapfish/mapfish-print.git" + connection "scm:git@github.com:mapfish/mapfish-print.git" + developerConnection "scm:git@github.com:mapfish/mapfish-print.git" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlinVersion") + implementation("com.sparkjava:spark-core:2.5.4@jar") + implementation("org.slf4j:slf4j-simple:1.7.21") + implementation("com.github.jeremyh:jBCrypt:master-SNAPSHOT") + implementation("com.github.salomonbrys.kotson:kotson:2.5.0") + implementation("mysql:mysql-connector-java:5.1.6") + implementation("com.github.heremaps:oksse:be5d2cd6deb8cf3ca2c9a740bdacec816871d4f7") +} + +jar { + manifest { + attributes "Main-Class" = "de.fhaachen.cryptoclicker.MainKt" + } +} + +shadowJar { + mergeServiceFiles() + configurations = listOf(project.configurations.compile) +} + +compileKotlin { + kotlinOptions.jvmTarget = "1.8" +} +compileTestKotlin { + kotlinOptions.jvmTarget = "1.8" +} +build.dependsOn shadowJar + +configure(subprojects.findAll { !it.name.startsWith("examples/") }) { + apply(plugin = "io.spring.dependency-management") + apply(plugin = "maven") + + repositories { + jcenter() + } + + project.afterEvaluate { + project.tasks.findByName("install")?.dependsOn(tasks.findByName("assemble")) + } + + dependencyManagement { + overriddenByDependencies = false + + imports { + mavenBom "org.junit:junit-bom:5.3.1" + mavenBom "org.springframework.boot:spring-boot-dependencies:2.0.5.RELEASE" + mavenBom "org.testcontainers:testcontainers-bom:1.9.1" + } + + dependencies { + dependency "org.projectlombok:lombok:1.18.2" + + dependency "org.lognet:grpc-spring-boot-starter:2.4.2" + + dependency "org.pf4j:pf4j:2.4.0" + + dependencySet(group = "com.google.protobuf", version = "3.6.1") { + entry "protoc" + entry "protobuf-java" + entry "protobuf-java-util" + } + + dependency "org.apache.kafka:kafka-clients:3.6.1" + + dependency "com.google.auto.service:auto-service:1.0-rc4" + + dependencySet(group = "io.grpc", version = "1.15.1") { + entry "grpc-netty" + entry "grpc-core" + entry "grpc-services" + entry "grpc-protobuf" + entry "grpc-stub" + entry "protoc-gen-grpc-java" + } + + dependency "com.salesforce.servicelibs:reactor-grpc-stub:0.9.0" + + dependency "org.awaitility:awaitility:3.1.2" + } + } +} + +extra.apply { + set("compileSdkVersion", 27) + set("buildToolsVersion", "27.0.3") + + // Support + set("supportVersion", "27.1.1") + + // set("commentedVersion", "27.1.1") + + set("findPropertyVersion", project.findProperty("findPropertyVersion") ?: "27.1.1") + + set("hasPropertyVersion", if(project.hasProperty("hasPropertyVersion")) project.getProperty("hasPropertyVersion") else "27.1.1") +} + +extra.set("javaVersion", "11") + +extra["versions"] = mapOf( + "okhttp" to "3.12.1", + "findPropertyVersion" to project.findProperty("findPropertyVersion") ?: "1.0.0", + "hasPropertyVersion" to if(project.hasProperty("hasPropertyVersion")) project.getProperty("hasPropertyVersion") else "1.0.0" +) diff --git a/gradle/spec/fixtures/github/contents_java_with_subdir.json b/gradle/spec/fixtures/github/contents_java_with_subdir.json index 8a73ea1776..a295a874ac 100644 --- a/gradle/spec/fixtures/github/contents_java_with_subdir.json +++ b/gradle/spec/fixtures/github/contents_java_with_subdir.json @@ -1,4 +1,40 @@ [ + { + "name": "build.gradle", + "path": "build.gradle", + "sha": "5dbaa74de419bb77b47d054a3374e309aa91eeab", + "size": 2354, + "url": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle?ref=master", + "html_url": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle", + "git_url": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "download_url": "https://raw.githubusercontent.com/VoxelGamesLib/dependencies/master/build.gradle", + "type": "file", + "content": "Z3JvdXAgJ21lLm1pbmlkaWdnZXInCgphcHBseSBwbHVnaW46ICdjb20uZ2l0\naHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JwoKdGFzayBjb3B5VG9TZXJ2ZXIo\ndHlwZTogQ29weSkgewogICAgZnJvbSBzaGFkb3dKYXIKICAgIGludG8gdGVz\ndFNlcnZlckZvbGRlcgp9CgpzaGFkb3dKYXIgewogICAgbWVyZ2VTZXJ2aWNl\nRmlsZXMoKQogICAgY29uZmlndXJhdGlvbnMgPSBbcHJvamVjdC5jb25maWd1\ncmF0aW9ucy5jb21waWxlXQoKICAgIC8vcmVsb2NhdGUgJ29yZy5ic3RhdHMn\nLCAnY29tLnZveGVsZ2FtZXNsaWIudm94ZWxnYW1lc2xpYi5tZXRyaWNzJyBU\nT0RPIHJlbG9jYXRlIGJzdGF0cwoKICAgIG1hbmlmZXN0IHsKICAgICAgICBh\ndHRyaWJ1dGVzICdJbXBsZW1lbnRhdGlvbi1WZXJzaW9uJzogcHJvamVjdC52\nZXJzaW9uICsgIkAiICsgcmV2aXNpb24KICAgIH0KfQoKYnVpbGQuZGVwZW5k\nc09uIHNoYWRvd0phcgoKZGVwZW5kZW5jaWVzIHsKICAgIGNvbXBpbGUgcHJv\namVjdCgiOkNoYXRNZW51QVBJIikKCiAgICBjb21waWxlIGdyb3VwOiAnY28u\nYWlrYXInLCBuYW1lOiAnYWNmLXBhcGVyJywgdmVyc2lvbjogJzAuNS4wLVNO\nQVBTSE9UJywgY2hhbmdpbmc6IHRydWUKICAgIGNvbXBpbGUgZ3JvdXA6ICdj\nb20uZ29vZ2xlLmluamVjdCcsIG5hbWU6ICdndWljZScsIHZlcnNpb246ICc0\nLjIuMCcKICAgIGNvbXBpbGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmNvZGUuZmlu\nZGJ1Z3MnLCBuYW1lOiAnanNyMzA1JywgdmVyc2lvbjogJzMuMC4yJwogICAg\nY29tcGlsZSBncm91cDogJ2RlLmRhdmlkYmlsZ2UnLCBuYW1lOiAnanNraWxs\nJywgdmVyc2lvbjogJzEuMS1TTkFQU0hPVCcKICAgIGNvbXBpbGUgZ3JvdXA6\nICduZXQubGluZ2FsYS56aXA0aicsIG5hbWU6ICd6aXA0aicsIHZlcnNpb246\nICcxLjMuMicKICAgIGNvbXBpbGUgZ3JvdXA6ICdjby5haWthcicsIG5hbWU6\nICd0YXNrY2hhaW4tYnVra2l0JywgdmVyc2lvbjogJzMuNi4wJwogICAgY29t\ncGlsZSBncm91cDogJ25ldC5reW9yaScsIG5hbWU6ICd0ZXh0JywgdmVyc2lv\nbjogJzEuMTItMS40LjAnCiAgICBjb21waWxlIGdyb3VwOiAnb3JnLmJzdGF0\ncycsIG5hbWU6ICdic3RhdHMtYnVra2l0JywgdmVyc2lvbjogJzEuMicKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uYnVnc25hZycsIG5hbWU6ICdidWdzbmFn\nJywgdmVyc2lvbjogJzMuMS41JwogICAgY29tcGlsZSBncm91cDogJ2NvbS56\nYXh4ZXInLCBuYW1lOiAnSGlrYXJpQ1AnLCB2ZXJzaW9uOiAnMi43LjgnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmVjbGlwc2UuamdpdCcsIG5hbWU6ICdv\ncmcuZWNsaXBzZS5qZ2l0JywgdmVyc2lvbjogJzQuMTEuMC4yMDE4MDMwODA3\nNDUtcicKICAgIGNvbXBpbGUgZ3JvdXA6ICdvcmcuaGliZXJuYXRlJywgbmFt\nZTogJ2hpYmVybmF0ZS1jb3JlJywgdmVyc2lvbjogJzUuMy4wLkNSMScKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uZHVtcHRydWNrbWFuLm1pbmVjcmFmdCcs\nIG5hbWU6ICdKc29uQ29uZmlndXJhdGlvbicsIHZlcnNpb246ICcxLjEnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6\nICdtYy13cmFwcGVycycsIHZlcnNpb246ICcxLjAuMy1TTkFQU0hPVCcKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdpby5naXRodWIubHVrZWh1dGNoJywgbmFtZTog\nJ2Zhc3QtY2xhc3NwYXRoLXNjYW5uZXInLCB2ZXJzaW9uOiAnMi4xOC4xJwog\nICAgY29tcGlsZSBncm91cDogJ29yZy5vYmplbmVzaXMnLCBuYW1lOiAnb2Jq\nZW5lc2lzJywgdmVyc2lvbjogJzIuNicKCiAgICBjb21waWxlKGdyb3VwOiAn\nb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6ICdtZW51YnVpbGRlcicsIHZl\ncnNpb246ICcxLjAuMicpIHsKICAgICAgICBleGNsdWRlIGdyb3VwOiAnb3Jn\nLmJ1a2tpdCcKICAgIH0KICAgIGNvbXBpbGUoZ3JvdXA6ICdvcmcubWluZXNr\naW4nLCBuYW1lOiAnamF2YS1jbGllbnQnLCB2ZXJzaW9uOiAnMS4wLjEtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQogICAgY29tcGlsZShncm91cDogJ29yZy5pbnZlbnRpdmV0YWxlbnQnLCBu\nYW1lOiAncmVmbGVjdGlvbmhlbHBlcicsIHZlcnNpb246ICcxLjEzLjAtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQp9Cgp0YXNrIGNyZWF0ZVBvbSgpIHsKICAgIHBvbSB7CiAgICAgICAgcHJv\namVjdCB7CiAgICAgICAgICAgIGdyb3VwSWQgJ2NvbS52b3hlbGdhbWVzbGli\nJwogICAgICAgICAgICBhcnRpZmFjdElkICdkZXBlbmRlbmNpZXMnCiAgICAg\nICAgICAgIHZlcnNpb24gdmVyc2lvbgogICAgICAgIH0KICAgIH0ud3JpdGVU\nbygicG9tLnhtbCIpCn0=\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle?ref=master", + "git": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "html": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle" + } + }, + { + "name": "settings.gradle", + "path": "settings.gradle", + "sha": "e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "size": 15, + "url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle?ref=develop", + "html_url": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle", + "git_url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "download_url": "https://raw.githubusercontent.com/Samourai-Wallet/samourai-wallet-android/develop/settings.gradle", + "type": "file", + "content": "aW5jbHVkZSAnOmFwcCcK\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle?ref=develop", + "git": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "html": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle" + } + }, { "name": ".github", "path": ".github", diff --git a/gradle/spec/fixtures/github/contents_kotlin_basic_buildfile.json b/gradle/spec/fixtures/github/contents_kotlin_basic_buildfile.json new file mode 100644 index 0000000000..711b8fdcb8 --- /dev/null +++ b/gradle/spec/fixtures/github/contents_kotlin_basic_buildfile.json @@ -0,0 +1,18 @@ +{ + "name": "build.gradle.kts", + "path": "build.gradle.kts", + "sha": "5dbaa74de419bb77b47d054a3374e309aa91eeab", + "size": 2354, + "url": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle.kts?ref=master", + "html_url": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle.kts", + "git_url": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "download_url": "https://raw.githubusercontent.com/VoxelGamesLib/dependencies/master/build.gradle.kts", + "type": "file", + "content": "Z3JvdXAgJ21lLm1pbmlkaWdnZXInCgphcHBseSBwbHVnaW46ICdjb20uZ2l0\naHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JwoKdGFzayBjb3B5VG9TZXJ2ZXIo\ndHlwZTogQ29weSkgewogICAgZnJvbSBzaGFkb3dKYXIKICAgIGludG8gdGVz\ndFNlcnZlckZvbGRlcgp9CgpzaGFkb3dKYXIgewogICAgbWVyZ2VTZXJ2aWNl\nRmlsZXMoKQogICAgY29uZmlndXJhdGlvbnMgPSBbcHJvamVjdC5jb25maWd1\ncmF0aW9ucy5jb21waWxlXQoKICAgIC8vcmVsb2NhdGUgJ29yZy5ic3RhdHMn\nLCAnY29tLnZveGVsZ2FtZXNsaWIudm94ZWxnYW1lc2xpYi5tZXRyaWNzJyBU\nT0RPIHJlbG9jYXRlIGJzdGF0cwoKICAgIG1hbmlmZXN0IHsKICAgICAgICBh\ndHRyaWJ1dGVzICdJbXBsZW1lbnRhdGlvbi1WZXJzaW9uJzogcHJvamVjdC52\nZXJzaW9uICsgIkAiICsgcmV2aXNpb24KICAgIH0KfQoKYnVpbGQuZGVwZW5k\nc09uIHNoYWRvd0phcgoKZGVwZW5kZW5jaWVzIHsKICAgIGNvbXBpbGUgcHJv\namVjdCgiOkNoYXRNZW51QVBJIikKCiAgICBjb21waWxlIGdyb3VwOiAnY28u\nYWlrYXInLCBuYW1lOiAnYWNmLXBhcGVyJywgdmVyc2lvbjogJzAuNS4wLVNO\nQVBTSE9UJywgY2hhbmdpbmc6IHRydWUKICAgIGNvbXBpbGUgZ3JvdXA6ICdj\nb20uZ29vZ2xlLmluamVjdCcsIG5hbWU6ICdndWljZScsIHZlcnNpb246ICc0\nLjIuMCcKICAgIGNvbXBpbGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmNvZGUuZmlu\nZGJ1Z3MnLCBuYW1lOiAnanNyMzA1JywgdmVyc2lvbjogJzMuMC4yJwogICAg\nY29tcGlsZSBncm91cDogJ2RlLmRhdmlkYmlsZ2UnLCBuYW1lOiAnanNraWxs\nJywgdmVyc2lvbjogJzEuMS1TTkFQU0hPVCcKICAgIGNvbXBpbGUgZ3JvdXA6\nICduZXQubGluZ2FsYS56aXA0aicsIG5hbWU6ICd6aXA0aicsIHZlcnNpb246\nICcxLjMuMicKICAgIGNvbXBpbGUgZ3JvdXA6ICdjby5haWthcicsIG5hbWU6\nICd0YXNrY2hhaW4tYnVra2l0JywgdmVyc2lvbjogJzMuNi4wJwogICAgY29t\ncGlsZSBncm91cDogJ25ldC5reW9yaScsIG5hbWU6ICd0ZXh0JywgdmVyc2lv\nbjogJzEuMTItMS40LjAnCiAgICBjb21waWxlIGdyb3VwOiAnb3JnLmJzdGF0\ncycsIG5hbWU6ICdic3RhdHMtYnVra2l0JywgdmVyc2lvbjogJzEuMicKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uYnVnc25hZycsIG5hbWU6ICdidWdzbmFn\nJywgdmVyc2lvbjogJzMuMS41JwogICAgY29tcGlsZSBncm91cDogJ2NvbS56\nYXh4ZXInLCBuYW1lOiAnSGlrYXJpQ1AnLCB2ZXJzaW9uOiAnMi43LjgnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmVjbGlwc2UuamdpdCcsIG5hbWU6ICdv\ncmcuZWNsaXBzZS5qZ2l0JywgdmVyc2lvbjogJzQuMTEuMC4yMDE4MDMwODA3\nNDUtcicKICAgIGNvbXBpbGUgZ3JvdXA6ICdvcmcuaGliZXJuYXRlJywgbmFt\nZTogJ2hpYmVybmF0ZS1jb3JlJywgdmVyc2lvbjogJzUuMy4wLkNSMScKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uZHVtcHRydWNrbWFuLm1pbmVjcmFmdCcs\nIG5hbWU6ICdKc29uQ29uZmlndXJhdGlvbicsIHZlcnNpb246ICcxLjEnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6\nICdtYy13cmFwcGVycycsIHZlcnNpb246ICcxLjAuMy1TTkFQU0hPVCcKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdpby5naXRodWIubHVrZWh1dGNoJywgbmFtZTog\nJ2Zhc3QtY2xhc3NwYXRoLXNjYW5uZXInLCB2ZXJzaW9uOiAnMi4xOC4xJwog\nICAgY29tcGlsZSBncm91cDogJ29yZy5vYmplbmVzaXMnLCBuYW1lOiAnb2Jq\nZW5lc2lzJywgdmVyc2lvbjogJzIuNicKCiAgICBjb21waWxlKGdyb3VwOiAn\nb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6ICdtZW51YnVpbGRlcicsIHZl\ncnNpb246ICcxLjAuMicpIHsKICAgICAgICBleGNsdWRlIGdyb3VwOiAnb3Jn\nLmJ1a2tpdCcKICAgIH0KICAgIGNvbXBpbGUoZ3JvdXA6ICdvcmcubWluZXNr\naW4nLCBuYW1lOiAnamF2YS1jbGllbnQnLCB2ZXJzaW9uOiAnMS4wLjEtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQogICAgY29tcGlsZShncm91cDogJ29yZy5pbnZlbnRpdmV0YWxlbnQnLCBu\nYW1lOiAncmVmbGVjdGlvbmhlbHBlcicsIHZlcnNpb246ICcxLjEzLjAtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQp9Cgp0YXNrIGNyZWF0ZVBvbSgpIHsKICAgIHBvbSB7CiAgICAgICAgcHJv\namVjdCB7CiAgICAgICAgICAgIGdyb3VwSWQgJ2NvbS52b3hlbGdhbWVzbGli\nJwogICAgICAgICAgICBhcnRpZmFjdElkICdkZXBlbmRlbmNpZXMnCiAgICAg\nICAgICAgIHZlcnNpb24gdmVyc2lvbgogICAgICAgIH0KICAgIH0ud3JpdGVU\nbygicG9tLnhtbCIpCn0=\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle.kts?ref=master", + "git": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "html": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle.kts" + } +} diff --git a/gradle/spec/fixtures/github/contents_kotlin_simple_settings.json b/gradle/spec/fixtures/github/contents_kotlin_simple_settings.json new file mode 100644 index 0000000000..c5ac429b5c --- /dev/null +++ b/gradle/spec/fixtures/github/contents_kotlin_simple_settings.json @@ -0,0 +1,18 @@ +{ + "name": "settings.gradle.kts", + "path": "settings.gradle.kts", + "sha": "e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "size": 15, + "url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle.kts?ref=develop", + "html_url": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle.kts", + "git_url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "download_url": "https://raw.githubusercontent.com/Samourai-Wallet/samourai-wallet-android/develop/settings.gradle.kts", + "type": "file", + "content": "aW5jbHVkZSAnOmFwcCcK\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle.kts?ref=develop", + "git": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "html": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle.kts" + } +} diff --git a/gradle/spec/fixtures/github/contents_kotlin_with_subdir.json b/gradle/spec/fixtures/github/contents_kotlin_with_subdir.json new file mode 100644 index 0000000000..be69eb740b --- /dev/null +++ b/gradle/spec/fixtures/github/contents_kotlin_with_subdir.json @@ -0,0 +1,742 @@ +[ + { + "name": "build.gradle.kts", + "path": "build.gradle.kts", + "sha": "5dbaa74de419bb77b47d054a3374e309aa91eeab", + "size": 2354, + "url": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle?ref=master", + "html_url": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle.kts", + "git_url": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "download_url": "https://raw.githubusercontent.com/VoxelGamesLib/dependencies/master/build.gradle.kts", + "type": "file", + "content": "Z3JvdXAgJ21lLm1pbmlkaWdnZXInCgphcHBseSBwbHVnaW46ICdjb20uZ2l0\naHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JwoKdGFzayBjb3B5VG9TZXJ2ZXIo\ndHlwZTogQ29weSkgewogICAgZnJvbSBzaGFkb3dKYXIKICAgIGludG8gdGVz\ndFNlcnZlckZvbGRlcgp9CgpzaGFkb3dKYXIgewogICAgbWVyZ2VTZXJ2aWNl\nRmlsZXMoKQogICAgY29uZmlndXJhdGlvbnMgPSBbcHJvamVjdC5jb25maWd1\ncmF0aW9ucy5jb21waWxlXQoKICAgIC8vcmVsb2NhdGUgJ29yZy5ic3RhdHMn\nLCAnY29tLnZveGVsZ2FtZXNsaWIudm94ZWxnYW1lc2xpYi5tZXRyaWNzJyBU\nT0RPIHJlbG9jYXRlIGJzdGF0cwoKICAgIG1hbmlmZXN0IHsKICAgICAgICBh\ndHRyaWJ1dGVzICdJbXBsZW1lbnRhdGlvbi1WZXJzaW9uJzogcHJvamVjdC52\nZXJzaW9uICsgIkAiICsgcmV2aXNpb24KICAgIH0KfQoKYnVpbGQuZGVwZW5k\nc09uIHNoYWRvd0phcgoKZGVwZW5kZW5jaWVzIHsKICAgIGNvbXBpbGUgcHJv\namVjdCgiOkNoYXRNZW51QVBJIikKCiAgICBjb21waWxlIGdyb3VwOiAnY28u\nYWlrYXInLCBuYW1lOiAnYWNmLXBhcGVyJywgdmVyc2lvbjogJzAuNS4wLVNO\nQVBTSE9UJywgY2hhbmdpbmc6IHRydWUKICAgIGNvbXBpbGUgZ3JvdXA6ICdj\nb20uZ29vZ2xlLmluamVjdCcsIG5hbWU6ICdndWljZScsIHZlcnNpb246ICc0\nLjIuMCcKICAgIGNvbXBpbGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmNvZGUuZmlu\nZGJ1Z3MnLCBuYW1lOiAnanNyMzA1JywgdmVyc2lvbjogJzMuMC4yJwogICAg\nY29tcGlsZSBncm91cDogJ2RlLmRhdmlkYmlsZ2UnLCBuYW1lOiAnanNraWxs\nJywgdmVyc2lvbjogJzEuMS1TTkFQU0hPVCcKICAgIGNvbXBpbGUgZ3JvdXA6\nICduZXQubGluZ2FsYS56aXA0aicsIG5hbWU6ICd6aXA0aicsIHZlcnNpb246\nICcxLjMuMicKICAgIGNvbXBpbGUgZ3JvdXA6ICdjby5haWthcicsIG5hbWU6\nICd0YXNrY2hhaW4tYnVra2l0JywgdmVyc2lvbjogJzMuNi4wJwogICAgY29t\ncGlsZSBncm91cDogJ25ldC5reW9yaScsIG5hbWU6ICd0ZXh0JywgdmVyc2lv\nbjogJzEuMTItMS40LjAnCiAgICBjb21waWxlIGdyb3VwOiAnb3JnLmJzdGF0\ncycsIG5hbWU6ICdic3RhdHMtYnVra2l0JywgdmVyc2lvbjogJzEuMicKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uYnVnc25hZycsIG5hbWU6ICdidWdzbmFn\nJywgdmVyc2lvbjogJzMuMS41JwogICAgY29tcGlsZSBncm91cDogJ2NvbS56\nYXh4ZXInLCBuYW1lOiAnSGlrYXJpQ1AnLCB2ZXJzaW9uOiAnMi43LjgnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmVjbGlwc2UuamdpdCcsIG5hbWU6ICdv\ncmcuZWNsaXBzZS5qZ2l0JywgdmVyc2lvbjogJzQuMTEuMC4yMDE4MDMwODA3\nNDUtcicKICAgIGNvbXBpbGUgZ3JvdXA6ICdvcmcuaGliZXJuYXRlJywgbmFt\nZTogJ2hpYmVybmF0ZS1jb3JlJywgdmVyc2lvbjogJzUuMy4wLkNSMScKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdjb20uZHVtcHRydWNrbWFuLm1pbmVjcmFmdCcs\nIG5hbWU6ICdKc29uQ29uZmlndXJhdGlvbicsIHZlcnNpb246ICcxLjEnCiAg\nICBjb21waWxlIGdyb3VwOiAnb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6\nICdtYy13cmFwcGVycycsIHZlcnNpb246ICcxLjAuMy1TTkFQU0hPVCcKICAg\nIGNvbXBpbGUgZ3JvdXA6ICdpby5naXRodWIubHVrZWh1dGNoJywgbmFtZTog\nJ2Zhc3QtY2xhc3NwYXRoLXNjYW5uZXInLCB2ZXJzaW9uOiAnMi4xOC4xJwog\nICAgY29tcGlsZSBncm91cDogJ29yZy5vYmplbmVzaXMnLCBuYW1lOiAnb2Jq\nZW5lc2lzJywgdmVyc2lvbjogJzIuNicKCiAgICBjb21waWxlKGdyb3VwOiAn\nb3JnLmludmVudGl2ZXRhbGVudCcsIG5hbWU6ICdtZW51YnVpbGRlcicsIHZl\ncnNpb246ICcxLjAuMicpIHsKICAgICAgICBleGNsdWRlIGdyb3VwOiAnb3Jn\nLmJ1a2tpdCcKICAgIH0KICAgIGNvbXBpbGUoZ3JvdXA6ICdvcmcubWluZXNr\naW4nLCBuYW1lOiAnamF2YS1jbGllbnQnLCB2ZXJzaW9uOiAnMS4wLjEtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQogICAgY29tcGlsZShncm91cDogJ29yZy5pbnZlbnRpdmV0YWxlbnQnLCBu\nYW1lOiAncmVmbGVjdGlvbmhlbHBlcicsIHZlcnNpb246ICcxLjEzLjAtU05B\nUFNIT1QnKSB7CiAgICAgICAgZXhjbHVkZSBncm91cDogJ2p1bml0JwogICAg\nfQp9Cgp0YXNrIGNyZWF0ZVBvbSgpIHsKICAgIHBvbSB7CiAgICAgICAgcHJv\namVjdCB7CiAgICAgICAgICAgIGdyb3VwSWQgJ2NvbS52b3hlbGdhbWVzbGli\nJwogICAgICAgICAgICBhcnRpZmFjdElkICdkZXBlbmRlbmNpZXMnCiAgICAg\nICAgICAgIHZlcnNpb24gdmVyc2lvbgogICAgICAgIH0KICAgIH0ud3JpdGVU\nbygicG9tLnhtbCIpCn0=\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/VoxelGamesLib/dependencies/contents/build.gradle.kts?ref=master", + "git": "https://api.github.com/repos/VoxelGamesLib/dependencies/git/blobs/5dbaa74de419bb77b47d054a3374e309aa91eeab", + "html": "https://github.com/VoxelGamesLib/dependencies/blob/master/build.gradle.kts" + } + }, + { + "name": "settings.gradle.kts", + "path": "settings.gradle.kts", + "sha": "e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "size": 15, + "url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle.kts?ref=develop", + "html_url": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle.kts", + "git_url": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "download_url": "https://raw.githubusercontent.com/Samourai-Wallet/samourai-wallet-android/develop/settings.gradle.kts", + "type": "file", + "content": "aW5jbHVkZSAnOmFwcCcK\n", + "encoding": "base64", + "_links": { + "self": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/contents/settings.gradle.kts?ref=develop", + "git": "https://api.github.com/repos/Samourai-Wallet/samourai-wallet-android/git/blobs/e7b4def49cb53d9aa04228dd3edb14c9e635e003", + "html": "https://github.com/Samourai-Wallet/samourai-wallet-android/blob/develop/settings.gradle.kts" + } + }, + { + "name": ".github", + "path": ".github", + "sha": "b299789c6bfc7349b72c398bdcb071f719889ba6", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/.github?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/.github", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/b299789c6bfc7349b72c398bdcb071f719889ba6", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/.github?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/b299789c6bfc7349b72c398bdcb071f719889ba6", + "html": "https://github.com/togglz/togglz/tree/master/.github" + } + }, + { + "name": ".gitignore", + "path": ".gitignore", + "sha": "20230aa16244078ace4458e930ffc2a45c56cc8a", + "size": 145, + "url": "https://api.github.com/repos/togglz/togglz/contents/.gitignore?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/.gitignore", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/20230aa16244078ace4458e930ffc2a45c56cc8a", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/.gitignore", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/.gitignore?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/20230aa16244078ace4458e930ffc2a45c56cc8a", + "html": "https://github.com/togglz/togglz/blob/master/.gitignore" + } + }, + { + "name": ".travis-sonatype-deploy.sh", + "path": ".travis-sonatype-deploy.sh", + "sha": "abf276d323e124d03ee0190402e9b8805a9ab881", + "size": 644, + "url": "https://api.github.com/repos/togglz/togglz/contents/.travis-sonatype-deploy.sh?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/.travis-sonatype-deploy.sh", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/abf276d323e124d03ee0190402e9b8805a9ab881", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/.travis-sonatype-deploy.sh", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/.travis-sonatype-deploy.sh?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/abf276d323e124d03ee0190402e9b8805a9ab881", + "html": "https://github.com/togglz/togglz/blob/master/.travis-sonatype-deploy.sh" + } + }, + { + "name": ".travis-sonatype-settings.xml", + "path": ".travis-sonatype-settings.xml", + "sha": "43e2471062e9579c0a71a6030fe0f95ba18c8374", + "size": 447, + "url": "https://api.github.com/repos/togglz/togglz/contents/.travis-sonatype-settings.xml?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/.travis-sonatype-settings.xml", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/43e2471062e9579c0a71a6030fe0f95ba18c8374", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/.travis-sonatype-settings.xml", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/.travis-sonatype-settings.xml?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/43e2471062e9579c0a71a6030fe0f95ba18c8374", + "html": "https://github.com/togglz/togglz/blob/master/.travis-sonatype-settings.xml" + } + }, + { + "name": ".travis.yml", + "path": ".travis.yml", + "sha": "8a56336c28e136a8baa5074f72570e8585b068db", + "size": 810, + "url": "https://api.github.com/repos/togglz/togglz/contents/.travis.yml?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/.travis.yml", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/8a56336c28e136a8baa5074f72570e8585b068db", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/.travis.yml", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/.travis.yml?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/8a56336c28e136a8baa5074f72570e8585b068db", + "html": "https://github.com/togglz/togglz/blob/master/.travis.yml" + } + }, + { + "name": "LICENSE.txt", + "path": "LICENSE.txt", + "sha": "d645695673349e3947e8e5ae42332d0ac3164cd7", + "size": 11358, + "url": "https://api.github.com/repos/togglz/togglz/contents/LICENSE.txt?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/LICENSE.txt", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/d645695673349e3947e8e5ae42332d0ac3164cd7", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/LICENSE.txt", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/LICENSE.txt?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/d645695673349e3947e8e5ae42332d0ac3164cd7", + "html": "https://github.com/togglz/togglz/blob/master/LICENSE.txt" + } + }, + { + "name": "README.md", + "path": "README.md", + "sha": "2af3b486333f374378bb5a91b3fb1a8fa3a7f8c7", + "size": 3322, + "url": "https://api.github.com/repos/togglz/togglz/contents/README.md?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/README.md", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/2af3b486333f374378bb5a91b3fb1a8fa3a7f8c7", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/README.md", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/README.md?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/2af3b486333f374378bb5a91b3fb1a8fa3a7f8c7", + "html": "https://github.com/togglz/togglz/blob/master/README.md" + } + }, + { + "name": "amazon-s3", + "path": "amazon-s3", + "sha": "1584516b5b8a0d49abbf3822f242205a438a82ff", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/amazon-s3?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/amazon-s3", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/1584516b5b8a0d49abbf3822f242205a438a82ff", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/amazon-s3?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/1584516b5b8a0d49abbf3822f242205a438a82ff", + "html": "https://github.com/togglz/togglz/tree/master/amazon-s3" + } + }, + { + "name": "appengine", + "path": "appengine", + "sha": "cefff4ff6d86e4fcfdb604f73e3404f6f2e71f4f", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/appengine?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/appengine", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/cefff4ff6d86e4fcfdb604f73e3404f6f2e71f4f", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/appengine?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/cefff4ff6d86e4fcfdb604f73e3404f6f2e71f4f", + "html": "https://github.com/togglz/togglz/tree/master/appengine" + } + }, + { + "name": "archaius", + "path": "archaius", + "sha": "2ab0f1f8dc424819c1dc98ebf1e4e0b5fc7ca560", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/archaius?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/archaius", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/2ab0f1f8dc424819c1dc98ebf1e4e0b5fc7ca560", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/archaius?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/2ab0f1f8dc424819c1dc98ebf1e4e0b5fc7ca560", + "html": "https://github.com/togglz/togglz/tree/master/archaius" + } + }, + { + "name": "benchmarks", + "path": "benchmarks", + "sha": "c6c126795c68e1aed43a8e870cbaace9f6f66f69", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/benchmarks?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/benchmarks", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/c6c126795c68e1aed43a8e870cbaace9f6f66f69", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/benchmarks?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/c6c126795c68e1aed43a8e870cbaace9f6f66f69", + "html": "https://github.com/togglz/togglz/tree/master/benchmarks" + } + }, + { + "name": "cassandra", + "path": "cassandra", + "sha": "d25c3045807fe152af6c3d4e6027d00766a79ad4", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/cassandra?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/cassandra", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/d25c3045807fe152af6c3d4e6027d00766a79ad4", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/cassandra?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/d25c3045807fe152af6c3d4e6027d00766a79ad4", + "html": "https://github.com/togglz/togglz/tree/master/cassandra" + } + }, + { + "name": "cdi", + "path": "cdi", + "sha": "ac9ff941d164713c854c39ec362a4caf542c71e5", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/cdi?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/cdi", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/ac9ff941d164713c854c39ec362a4caf542c71e5", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/cdi?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/ac9ff941d164713c854c39ec362a4caf542c71e5", + "html": "https://github.com/togglz/togglz/tree/master/cdi" + } + }, + { + "name": "cloud-datastore", + "path": "cloud-datastore", + "sha": "a783f8812ce7c5dc03cf5c8d0824cd62b660fefa", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/cloud-datastore?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/cloud-datastore", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/a783f8812ce7c5dc03cf5c8d0824cd62b660fefa", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/cloud-datastore?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/a783f8812ce7c5dc03cf5c8d0824cd62b660fefa", + "html": "https://github.com/togglz/togglz/tree/master/cloud-datastore" + } + }, + { + "name": "okhttp", + "path": "okhttp", + "sha": "56c97f938438c0e332d382f6e67a15a465a53b99", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/okhttp?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/okhttp", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/56c97f938438c0e332d382f6e67a15a465a53b99", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/okhttp?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/56c97f938438c0e332d382f6e67a15a465a53b99", + "html": "https://github.com/togglz/togglz/tree/master/okhttp" + } + }, + { + "name": "core", + "path": "core", + "sha": "d7667586041549a0df20c25aef4f4f469682f1fa", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/core?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/core", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/d7667586041549a0df20c25aef4f4f469682f1fa", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/core?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/d7667586041549a0df20c25aef4f4f469682f1fa", + "html": "https://github.com/togglz/togglz/tree/master/core" + } + }, + { + "name": "deltaspike", + "path": "deltaspike", + "sha": "be502be8169ffe2afe346a384c946d6a9db5f0de", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/deltaspike?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/deltaspike", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/be502be8169ffe2afe346a384c946d6a9db5f0de", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/deltaspike?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/be502be8169ffe2afe346a384c946d6a9db5f0de", + "html": "https://github.com/togglz/togglz/tree/master/deltaspike" + } + }, + { + "name": "distribution", + "path": "distribution", + "sha": "0953eb75ca0d56a9c59d5ac88b9ef30fa5fdb594", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/distribution?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/distribution", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/0953eb75ca0d56a9c59d5ac88b9ef30fa5fdb594", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/distribution?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/0953eb75ca0d56a9c59d5ac88b9ef30fa5fdb594", + "html": "https://github.com/togglz/togglz/tree/master/distribution" + } + }, + { + "name": "dynamodb", + "path": "dynamodb", + "sha": "f61f575faf58287eb417e9d1b721cf5a5197ba29", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/dynamodb?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/dynamodb", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/f61f575faf58287eb417e9d1b721cf5a5197ba29", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/dynamodb?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/f61f575faf58287eb417e9d1b721cf5a5197ba29", + "html": "https://github.com/togglz/togglz/tree/master/dynamodb" + } + }, + { + "name": "eclipse-code-format.xml", + "path": "eclipse-code-format.xml", + "sha": "d7ed1408f4906291502329e1f9c26d0290a5c643", + "size": 30884, + "url": "https://api.github.com/repos/togglz/togglz/contents/eclipse-code-format.xml?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/eclipse-code-format.xml", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/d7ed1408f4906291502329e1f9c26d0290a5c643", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/eclipse-code-format.xml", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/eclipse-code-format.xml?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/d7ed1408f4906291502329e1f9c26d0290a5c643", + "html": "https://github.com/togglz/togglz/blob/master/eclipse-code-format.xml" + } + }, + { + "name": "guice", + "path": "guice", + "sha": "96a515df38e692044988a2739079a35ff78785c2", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/guice?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/guice", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/96a515df38e692044988a2739079a35ff78785c2", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/guice?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/96a515df38e692044988a2739079a35ff78785c2", + "html": "https://github.com/togglz/togglz/tree/master/guice" + } + }, + { + "name": "hazelcast", + "path": "hazelcast", + "sha": "c91fbb840d3b80f10c2fe764c8e5cbbf4b460721", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/hazelcast?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/hazelcast", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/c91fbb840d3b80f10c2fe764c8e5cbbf4b460721", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/hazelcast?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/c91fbb840d3b80f10c2fe764c8e5cbbf4b460721", + "html": "https://github.com/togglz/togglz/tree/master/hazelcast" + } + }, + { + "name": "java6-server.profile", + "path": "java6-server.profile", + "sha": "dc47aa20fb21ba11a2fa4e1c61b6ba939cb2b857", + "size": 5471, + "url": "https://api.github.com/repos/togglz/togglz/contents/java6-server.profile?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/java6-server.profile", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/dc47aa20fb21ba11a2fa4e1c61b6ba939cb2b857", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/java6-server.profile", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/java6-server.profile?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/dc47aa20fb21ba11a2fa4e1c61b6ba939cb2b857", + "html": "https://github.com/togglz/togglz/blob/master/java6-server.profile" + } + }, + { + "name": "jsf", + "path": "jsf", + "sha": "e85791bff58450def029ddac16a553e1918ac52d", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/jsf?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/jsf", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/e85791bff58450def029ddac16a553e1918ac52d", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/jsf?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/e85791bff58450def029ddac16a553e1918ac52d", + "html": "https://github.com/togglz/togglz/tree/master/jsf" + } + }, + { + "name": "jsp", + "path": "jsp", + "sha": "bfa857edd8608193f3ee2f21517ead5846fe138b", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/jsp?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/jsp", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/bfa857edd8608193f3ee2f21517ead5846fe138b", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/jsp?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/bfa857edd8608193f3ee2f21517ead5846fe138b", + "html": "https://github.com/togglz/togglz/tree/master/jsp" + } + }, + { + "name": "junit", + "path": "junit", + "sha": "bc7163277e6205d3d02bd52ab4727bba7add0668", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/junit?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/junit", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/bc7163277e6205d3d02bd52ab4727bba7add0668", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/junit?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/bc7163277e6205d3d02bd52ab4727bba7add0668", + "html": "https://github.com/togglz/togglz/tree/master/junit" + } + }, + { + "name": "junit5", + "path": "junit5", + "sha": "251747e6fddca4a3accc2f8ee16d6e6fe45bbb94", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/junit5?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/junit5", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/251747e6fddca4a3accc2f8ee16d6e6fe45bbb94", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/junit5?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/251747e6fddca4a3accc2f8ee16d6e6fe45bbb94", + "html": "https://github.com/togglz/togglz/tree/master/junit5" + } + }, + { + "name": "microprofile-config", + "path": "microprofile-config", + "sha": "24f0c5d43e0cca86f7f8110c5fcfdd2a78cc386a", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/microprofile-config?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/microprofile-config", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/24f0c5d43e0cca86f7f8110c5fcfdd2a78cc386a", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/microprofile-config?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/24f0c5d43e0cca86f7f8110c5fcfdd2a78cc386a", + "html": "https://github.com/togglz/togglz/tree/master/microprofile-config" + } + }, + { + "name": "mongodb", + "path": "mongodb", + "sha": "ed5f22db54d75f601ad1b0aeccd04919f01745f2", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/mongodb?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/mongodb", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/ed5f22db54d75f601ad1b0aeccd04919f01745f2", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/mongodb?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/ed5f22db54d75f601ad1b0aeccd04919f01745f2", + "html": "https://github.com/togglz/togglz/tree/master/mongodb" + } + }, + { + "name": "pom.xml", + "path": "pom.xml", + "sha": "6b053457793f1e3ec05ad64cbf40b69e348c339f", + "size": 15577, + "url": "https://api.github.com/repos/togglz/togglz/contents/pom.xml?ref=master", + "html_url": "https://github.com/togglz/togglz/blob/master/pom.xml", + "git_url": "https://api.github.com/repos/togglz/togglz/git/blobs/6b053457793f1e3ec05ad64cbf40b69e348c339f", + "download_url": "https://raw.githubusercontent.com/togglz/togglz/master/pom.xml", + "type": "file", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/pom.xml?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/blobs/6b053457793f1e3ec05ad64cbf40b69e348c339f", + "html": "https://github.com/togglz/togglz/blob/master/pom.xml" + } + }, + { + "name": "redis", + "path": "redis", + "sha": "2c7224d98c64522d875a07d316aa16129d0dd778", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/redis?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/redis", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/2c7224d98c64522d875a07d316aa16129d0dd778", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/redis?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/2c7224d98c64522d875a07d316aa16129d0dd778", + "html": "https://github.com/togglz/togglz/tree/master/redis" + } + }, + { + "name": "seam-security", + "path": "seam-security", + "sha": "fa8ab36d185e9df67c9aefd4d2117c75c32738e5", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/seam-security?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/seam-security", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/fa8ab36d185e9df67c9aefd4d2117c75c32738e5", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/seam-security?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/fa8ab36d185e9df67c9aefd4d2117c75c32738e5", + "html": "https://github.com/togglz/togglz/tree/master/seam-security" + } + }, + { + "name": "servlet", + "path": "servlet", + "sha": "121cdbc5188d02c5ec9a8ff6f1c74f989acbaa79", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/servlet?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/servlet", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/121cdbc5188d02c5ec9a8ff6f1c74f989acbaa79", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/servlet?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/121cdbc5188d02c5ec9a8ff6f1c74f989acbaa79", + "html": "https://github.com/togglz/togglz/tree/master/servlet" + } + }, + { + "name": "shiro", + "path": "shiro", + "sha": "b4bb53d03d2e0132fbc99deab1556de1eb3cdc35", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/shiro?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/shiro", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/b4bb53d03d2e0132fbc99deab1556de1eb3cdc35", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/shiro?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/b4bb53d03d2e0132fbc99deab1556de1eb3cdc35", + "html": "https://github.com/togglz/togglz/tree/master/shiro" + } + }, + { + "name": "slack", + "path": "slack", + "sha": "e5eb78761df8437a82b1ebd87b196a8b0d3f62f4", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/slack?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/slack", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/e5eb78761df8437a82b1ebd87b196a8b0d3f62f4", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/slack?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/e5eb78761df8437a82b1ebd87b196a8b0d3f62f4", + "html": "https://github.com/togglz/togglz/tree/master/slack" + } + }, + { + "name": "slf4j", + "path": "slf4j", + "sha": "cb01551b173bc0977b87a48317a0921e2942f0d5", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/slf4j?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/slf4j", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/cb01551b173bc0977b87a48317a0921e2942f0d5", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/slf4j?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/cb01551b173bc0977b87a48317a0921e2942f0d5", + "html": "https://github.com/togglz/togglz/tree/master/slf4j" + } + }, + { + "name": "spring-boot", + "path": "spring-boot", + "sha": "76524de3b2e6c25f1c4e1a4ae9e9c4b14375fc6d", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/spring-boot?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/spring-boot", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/76524de3b2e6c25f1c4e1a4ae9e9c4b14375fc6d", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/spring-boot?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/76524de3b2e6c25f1c4e1a4ae9e9c4b14375fc6d", + "html": "https://github.com/togglz/togglz/tree/master/spring-boot" + } + }, + { + "name": "spring-core", + "path": "spring-core", + "sha": "532d99b6db8ba806c34f9dd4327a8442e3b58406", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/spring-core?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/spring-core", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/532d99b6db8ba806c34f9dd4327a8442e3b58406", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/spring-core?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/532d99b6db8ba806c34f9dd4327a8442e3b58406", + "html": "https://github.com/togglz/togglz/tree/master/spring-core" + } + }, + { + "name": "spring-mobile", + "path": "spring-mobile", + "sha": "50f50240fa66c64af21606d4d18735018c431555", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/spring-mobile?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/spring-mobile", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/50f50240fa66c64af21606d4d18735018c431555", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/spring-mobile?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/50f50240fa66c64af21606d4d18735018c431555", + "html": "https://github.com/togglz/togglz/tree/master/spring-mobile" + } + }, + { + "name": "spring-security", + "path": "spring-security", + "sha": "81f8befeab21e3da9884118697df3998ce910128", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/spring-security?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/spring-security", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/81f8befeab21e3da9884118697df3998ce910128", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/spring-security?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/81f8befeab21e3da9884118697df3998ce910128", + "html": "https://github.com/togglz/togglz/tree/master/spring-security" + } + }, + { + "name": "spring-web", + "path": "spring-web", + "sha": "24971e43826da703f969a79d37b536c310b3572a", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/spring-web?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/spring-web", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/24971e43826da703f969a79d37b536c310b3572a", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/spring-web?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/24971e43826da703f969a79d37b536c310b3572a", + "html": "https://github.com/togglz/togglz/tree/master/spring-web" + } + }, + { + "name": "test-harness", + "path": "test-harness", + "sha": "1874c19063dfda7abb4186d2532cc44c968caa0a", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/test-harness?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/test-harness", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/1874c19063dfda7abb4186d2532cc44c968caa0a", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/test-harness?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/1874c19063dfda7abb4186d2532cc44c968caa0a", + "html": "https://github.com/togglz/togglz/tree/master/test-harness" + } + }, + { + "name": "testing", + "path": "testing", + "sha": "90dde28cfdab3d749bc758d0a1ab900794d9d275", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/testing?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/testing", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/90dde28cfdab3d749bc758d0a1ab900794d9d275", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/testing?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/90dde28cfdab3d749bc758d0a1ab900794d9d275", + "html": "https://github.com/togglz/togglz/tree/master/testing" + } + }, + { + "name": "zookeeper", + "path": "zookeeper", + "sha": "ccf154c0bd6af10c22e504fc5a6378ec66172ef7", + "size": 0, + "url": "https://api.github.com/repos/togglz/togglz/contents/zookeeper?ref=master", + "html_url": "https://github.com/togglz/togglz/tree/master/zookeeper", + "git_url": "https://api.github.com/repos/togglz/togglz/git/trees/ccf154c0bd6af10c22e504fc5a6378ec66172ef7", + "download_url": null, + "type": "dir", + "_links": { + "self": "https://api.github.com/repos/togglz/togglz/contents/zookeeper?ref=master", + "git": "https://api.github.com/repos/togglz/togglz/git/trees/ccf154c0bd6af10c22e504fc5a6378ec66172ef7", + "html": "https://github.com/togglz/togglz/tree/master/zookeeper" + } + } +] diff --git a/gradle/spec/fixtures/script_plugins/dependencies.gradle.kts b/gradle/spec/fixtures/script_plugins/dependencies.gradle.kts new file mode 100644 index 0000000000..189862b7e9 --- /dev/null +++ b/gradle/spec/fixtures/script_plugins/dependencies.gradle.kts @@ -0,0 +1,37 @@ +val libraries = mutableMapOf() + +val versions = mapOf( + "bytebuddy" to "1.9.7", + "junitJupiter" to "5.1.1" +) + +libraries["junit4"] = "junit:junit:4.12" +libraries["junitJupiterApi"] = "org.junit.jupiter:junit-jupiter-api(:${versions.junitJupiter}") +libraries["junitPlatformLauncher"] = "org.junit.platform:junit-platform-launcher:1.1.0" +libraries["junitJupiterEngine"] = "org.junit.jupiter:junit-jupiter-engine:${versions.junitJupiter}" +libraries["assertj"] = "org.assertj:assertj-core:2.9.0" +libraries["hamcrest"] = "org.hamcrest:hamcrest-core:1.3" + +libraries["bytebuddy"] = "net.bytebuddy:byte-buddy:${versions.bytebuddy}" +libraries["bytebuddyagent"] = "net.bytebuddy:byte-buddy-agent:${versions.bytebuddy}" +libraries["bytebuddyandroid"] = "net.bytebuddy:byte-buddy-android:${versions.bytebuddy}" + +libraries["errorprone"] = "com.google.errorprone:error_prone_core:2.3.2" + +// objenesis 3.x with full Java 11 support requires Java 8, bump version when Java 7 support is dropped +libraries["objenesis"] = "org.objenesis:objenesis:2.6" + +libraries["asm"] = "org.ow2.asm:asm:7.0" + +val kotlinVersion = "1.2.10" +val kotlinVersion_1_3 = "1.3.0-rc-57" +libraries["kotlin"] = mapOf( + "version" to kotlinVersion, + "version_1_3" to kotlinVersion_1_3, + + "stdlib" to "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}", + "coroutines" to "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.19.3", + + "stdlib_1_3" to "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion_1_3", + "releaseCoroutines" to "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.26.1-eap13" +) diff --git a/gradle/spec/fixtures/settings_files/settings.gradle.kts b/gradle/spec/fixtures/settings_files/settings.gradle.kts new file mode 100644 index 0000000000..15a801b10a --- /dev/null +++ b/gradle/spec/fixtures/settings_files/settings.gradle.kts @@ -0,0 +1 @@ +include(":app")