#!/usr/bin/env ruby # frozen_string_literal: true require 'pathname' ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath) RAILS_ROOT = File.expand_path("../../", Pathname.new(__FILE__).realpath) require 'rubygems' require 'bundler/setup' require 'digest' dev_mode = false def ensure_cache_clean! all_plugin_directories = Pathname.new(RAILS_ROOT + '/plugins').children.select(&:directory?) core_git_sha = `git rev-parse HEAD` sorted_plugin_shas = all_plugin_directories.map do |plugin_dir| "#{plugin_dir}:" + `git ls-files -s #{plugin_dir} | git hash-object --stdin` end.sort supersha_hash = Digest::SHA1.hexdigest((sorted_plugin_shas + [core_git_sha]).join('|')) hash_file = "#{RAILS_ROOT}/tmp/plugin-hash" old_hash = File.exists?(hash_file) ? File.read(hash_file) : nil if old_hash && old_hash != supersha_hash puts "WARNING: It looks like your discourse plugins or core version have recently changed." puts "The tmp/cache directory will be wiped to avoid development issues." `rm -rf #{RAILS_ROOT}/tmp/cache` puts end FileUtils.mkdir_p(RAILS_ROOT + "/tmp") File.write(hash_file, supersha_hash) end # in development do some fussing around, to automate config if !ARGV.include?("-E") && !ARGV.include?("--env") && (ENV["RAILS_ENV"] == "development" || !ENV["RAILS_ENV"]) dev_mode = true ARGV.push("-N") if !ARGV.include?("-c") && !ARGV.include?("--config-file") ARGV.push("-c") ARGV.push(File.expand_path("../../config/unicorn.conf.rb", Pathname.new(__FILE__).realpath)) end # we do not want to listen on 2 ports, so lets fix it if (idx = ARGV.index("-p")) && (port = ARGV[idx + 1].to_i) > 0 ENV["UNICORN_PORT"] ||= port.to_s end ENV["UNICORN_PORT"] ||= "9292" if ARGV.delete("-x") puts "Running without sidekiq" ENV["UNICORN_SIDEKIQS"] = "0" end ENV["UNICORN_SIDEKIQS"] ||= "1" ensure_cache_clean! end if ARGV.include?("--help") fork do load Gem.bin_path('unicorn', 'unicorn') end Process.wait puts "Extra Discourse Options:" puts " -x run without sidekiq" exit end # this dev_mode hackery enables, the following to be used to restart unicorn: # # pkill -USR2 -f 'ruby bin/unicorn' # # This is handy if you want to bind a key to restarting unicorn in dev if dev_mode restart = true while restart restart = false pid = fork do load Gem.bin_path('unicorn', 'unicorn') end done = false Signal.trap('INT') do # wait for parent to be done end Signal.trap('USR2') do Process.kill('QUIT', pid) puts "RESTARTING UNICORN" restart = true end while !done sleep 1 done = Process.waitpid(pid, Process::WNOHANG) end end else load Gem.bin_path('unicorn', 'unicorn') end