ba781484c7
gitlab-org/gitlab-shell!166 added support for collecting push options from the environment, and passing them along to the /internal/post_receive API endpoint. This change handles the new push_options JSON element in the payload, and passes them on through to the GitPushService and GitTagPushService services. Futhermore, it adds support for the first push option, ci.skip. With this change, one can use 'git push -o ci.skip' to skip CI pipe execution. Note that the pipeline is still created, but in the "skipped" state, just like with the 'ci skip' commit message text. Implements #18667
47 lines
1.2 KiB
Ruby
47 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
class GitPostReceive
|
|
include Gitlab::Identifier
|
|
attr_reader :project, :identifier, :changes, :push_options
|
|
|
|
def initialize(project, identifier, changes, push_options)
|
|
@project = project
|
|
@identifier = identifier
|
|
@changes = deserialize_changes(changes)
|
|
@push_options = push_options
|
|
end
|
|
|
|
def identify
|
|
super(identifier)
|
|
end
|
|
|
|
def changes_refs
|
|
return changes unless block_given?
|
|
|
|
changes.each do |change|
|
|
change.strip!
|
|
oldrev, newrev, ref = change.split(' ')
|
|
|
|
yield oldrev, newrev, ref
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def deserialize_changes(changes)
|
|
utf8_encode_changes(changes).each_line
|
|
end
|
|
|
|
def utf8_encode_changes(changes)
|
|
changes.force_encoding('UTF-8')
|
|
return changes if changes.valid_encoding?
|
|
|
|
# Convert non-UTF-8 branch/tag names to UTF-8 so they can be dumped as JSON.
|
|
detection = CharlockHolmes::EncodingDetector.detect(changes)
|
|
return changes unless detection && detection[:encoding]
|
|
|
|
CharlockHolmes::Converter.convert(changes, detection[:encoding], 'UTF-8')
|
|
end
|
|
end
|
|
end
|