Commit 6d763831 authored by James Lopez's avatar James Lopez

fixed a few MySQL issues and added changelog

parent 896e09d0
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
v 8.9.0 (unreleased) v 8.9.0 (unreleased)
- Set import_url validation to be more strict
- Fix error when CI job variables key specified but not defined - Fix error when CI job variables key specified but not defined
- Fix pipeline status when there are no builds in pipeline - Fix pipeline status when there are no builds in pipeline
- Fix Error 500 when using closes_issues API with an external issue tracker - Fix Error 500 when using closes_issues API with an external issue tracker
......
...@@ -22,6 +22,8 @@ class AddressableUrlValidator < ActiveModel::EachValidator ...@@ -22,6 +22,8 @@ class AddressableUrlValidator < ActiveModel::EachValidator
end end
end end
private
def valid_url?(value) def valid_url?(value)
return false unless value return false unless value
...@@ -32,8 +34,6 @@ class AddressableUrlValidator < ActiveModel::EachValidator ...@@ -32,8 +34,6 @@ class AddressableUrlValidator < ActiveModel::EachValidator
false false
end end
private
def default_options def default_options
@default_options ||= { protocols: %w(http https ssh git) } @default_options ||= { protocols: %w(http https ssh git) }
end end
...@@ -44,6 +44,6 @@ class AddressableUrlValidator < ActiveModel::EachValidator ...@@ -44,6 +44,6 @@ class AddressableUrlValidator < ActiveModel::EachValidator
def valid_protocol?(value) def valid_protocol?(value)
options = default_options.merge(self.options) options = default_options.merge(self.options)
value =~ /\A#{URI.regexp(options[:protocols])}\z/ !!(value =~ /\A#{URI.regexp(options[:protocols])}\z/)
end end
end end
# See http://doc.gitlab.com/ce/development/migration_style_guide.html # Updates project records containing invalid URLs using the AddressableUrlValidator.
# for more information on how to write migrations for GitLab. # This is optimized assuming the number of invalid records is low, but
# we still need to loop through all the projects with an +import_url+
# so we use batching for the latter.
#
# This migration is non-reversible as we would have to keep the old data.
class FixNoValidatableImportUrl < ActiveRecord::Migration class FixNoValidatableImportUrl < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers include Gitlab::Database::MigrationHelpers
...@@ -14,8 +18,8 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration ...@@ -14,8 +18,8 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration
@results = [] @results = []
end end
def next def next?
@results = ActiveRecord::Base.connection.execute(batched_sql) @results = ActiveRecord::Base.connection.exec_query(batched_sql)
@offset += @batch_size @offset += @batch_size
@results.any? @results.any?
end end
...@@ -23,11 +27,36 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration ...@@ -23,11 +27,36 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration
private private
def batched_sql def batched_sql
"#{@query} OFFSET #{@offset} LIMIT #{@batch_size}" "#{@query} LIMIT #{@batch_size} OFFSET #{@offset}"
end
end
# AddressableValidator - Snapshot of AddressableUrlValidator
module AddressableUrlValidatorSnap
extend self
def valid_url?(value)
return false unless value
value.strip!
valid_uri?(value) && valid_protocol?(value)
rescue Addressable::URI::InvalidURIError
false
end
def valid_uri?(value)
Addressable::URI.parse(value).is_a?(Addressable::URI)
end
def valid_protocol?(value)
!!(value =~ /\A#{URI.regexp(%w(http https ssh git))}\z/)
end end
end end
def up def up
say('Cleaning up invalid import URLs... This may take a few minutes if we have a large number of imported projects.')
invalid_import_url_project_ids.each { |project_id| cleanup_import_url(project_id) } invalid_import_url_project_ids.each { |project_id| cleanup_import_url(project_id) }
end end
...@@ -35,18 +64,20 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration ...@@ -35,18 +64,20 @@ class FixNoValidatableImportUrl < ActiveRecord::Migration
ids = [] ids = []
batches = SqlBatches.new(query: "SELECT id, import_url FROM projects WHERE import_url IS NOT NULL") batches = SqlBatches.new(query: "SELECT id, import_url FROM projects WHERE import_url IS NOT NULL")
while batches.nexts while batches.next?
ids += batches.results.map { |result| invalid_url?(result[:import_url]) ? result[:id] : nil } batches.results.each do |result|
ids << result['id'] unless valid_url?(result['import_url'])
end
end end
ids.compact ids
end end
def invalid_url?(url) def valid_url?(url)
AddressableUrlValidator.new({ attributes: 1 }).valid_url?(url) AddressableUrlValidatorSnap.valid_url?(url)
end end
def cleanup_import_url(project_id) def cleanup_import_url(project_id)
execute("UPDATE projects SET mirror = false, import_url = NULL WHERE id = #{project_id}") execute("UPDATE projects SET import_url = NULL WHERE id = #{project_id}")
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment