+
+ protected
+
+ def load_job_specific_filters
+ # Convert Job-specific @filters entries into general SQL filters.
+ script_info = {"repository" => nil, "script" => nil}
+ script_range = {"exclude_versions" => []}
+ @filters.select! do |filter|
+ if (script_info.has_key? filter[0]) and (filter[1] == "=")
+ if script_info[filter[0]].nil?
+ script_info[filter[0]] = filter[2]
+ elsif script_info[filter[0]] != filter[2]
+ raise ArgumentError.new("incompatible #{filter[0]} filters")
+ end
+ end
+ case filter[0..1]
+ when ["script_version", "in git"]
+ script_range["min_version"] = filter.last
+ false
+ when ["script_version", "not in git"]
+ begin
+ script_range["exclude_versions"] += filter.last
+ rescue TypeError
+ script_range["exclude_versions"] << filter.last
+ end
+ false
+ when ["docker_image_locator", "in docker"], ["docker_image_locator", "not in docker"]
+ filter[1].sub!(/ docker$/, '')
+ search_list = filter[2].is_a?(Enumerable) ? filter[2] : [filter[2]]
+ filter[2] = search_list.flat_map do |search_term|
+ image_search, image_tag = search_term.split(':', 2)
+ Collection.uuids_for_docker_image(image_search, image_tag, @read_users)
+ end
+ true
+ else
+ true
+ end
+ end
+
+ # Build a real script_version filter from any "not? in git" filters.
+ if (script_range.size > 1) or script_range["exclude_versions"].any?
+ script_info.each_pair do |key, value|
+ if value.nil?
+ raise ArgumentError.new("script_version filter needs #{key} filter")
+ end
+ end
+ last_version = begin resource_attrs[:script_version] rescue "HEAD" end
+ version_range = Commit.find_commit_range(current_user,
+ script_info["repository"],
+ script_range["min_version"],
+ last_version,
+ script_range["exclude_versions"])
+ if version_range.nil?
+ raise ArgumentError.
+ new(["error searching #{script_info['repository']} from",
+ "#{script_range['min_version']} to #{last_version},",
+ "excluding #{script_range['exclude_versions']}"].join(" "))
+ end
+ @filters.append(["script_version", "in", version_range])
+ end
+ end
+
+ def load_filters_param
+ begin
+ super
+ load_job_specific_filters
+ rescue ArgumentError => error
+ send_error(error.message)
+ false
+ end
+ end