Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2018-02-23 16:58:57 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2018-02-26 17:06:49 +0300
commit645dceb0a233fc523ac16611fa3fec317d29a7e1 (patch)
tree4bfc439d7720d8e7f715c749d5837088641418f2 /lib/gitlab/plugin.rb
parenteff5746b5e7cf4075edd6d1c76fdcd24c1603bb4 (diff)
Run plugins as separate process and pass data via STDIN
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'lib/gitlab/plugin.rb')
-rw-r--r--lib/gitlab/plugin.rb28
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/gitlab/plugin.rb b/lib/gitlab/plugin.rb
index 9604cac4b20..1035d258907 100644
--- a/lib/gitlab/plugin.rb
+++ b/lib/gitlab/plugin.rb
@@ -1,23 +1,35 @@
module Gitlab
module Plugin
def self.files
- Dir.glob(Rails.root.join('plugins', '*_plugin.rb'))
+ Dir.glob(Rails.root.join('plugins/enabled/*'))
end
def self.execute_all_async(data)
files.each do |file|
+ puts file
PluginWorker.perform_async(file, data)
end
end
def self.execute(file, data)
- # TODO: Implement
- #
- # Reuse some code from gitlab-shell https://gitlab.com/gitlab-org/gitlab-shell/blob/master/lib/gitlab_custom_hook.rb#L40
- # Pass data as STDIN (or JSON encode?)
- #
- # 1. Return true if 0 exit code
- # 2. Return false if non-zero exit code
+ # Prepare the hook subprocess. Attach a pipe to its stdin, and merge
+ # both its stdout and stderr into our own stdout.
+ stdin_reader, stdin_writer = IO.pipe
+ hook_pid = spawn({}, file, in: stdin_reader, err: :out)
+ stdin_reader.close
+
+ # Submit changes to the hook via its stdin.
+ begin
+ IO.copy_stream(StringIO.new(data.to_json), stdin_writer)
+ rescue Errno::EPIPE
+ # It is not an error if the hook does not consume all of its input.
+ end
+
+ # Close the pipe to let the hook know there is no further input.
+ stdin_writer.close
+
+ Process.wait(hook_pid)
+ $?.success?
end
end
end