uboot: (firmwareOdroidC2/C4) don't invoke patch tool, use patches = [] instead
https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh#L948 this can do it nicely. Signed-off-by: Anton Arapov <anton@deadbeef.mx>
This commit is contained in:
commit
56de2bcd43
30691 changed files with 3076956 additions and 0 deletions
12
pkgs/servers/web-apps/discourse/action_mailer_ca_cert.patch
Normal file
12
pkgs/servers/web-apps/discourse/action_mailer_ca_cert.patch
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
diff --git a/config/environments/production.rb b/config/environments/production.rb
|
||||
index a523888a8d..422c2c1ee8 100644
|
||||
--- a/config/environments/production.rb
|
||||
+++ b/config/environments/production.rb
|
||||
@@ -32,6 +32,7 @@ Discourse::Application.configure do
|
||||
user_name: GlobalSetting.smtp_user_name,
|
||||
password: GlobalSetting.smtp_password,
|
||||
authentication: GlobalSetting.smtp_authentication,
|
||||
+ ca_file: "/etc/ssl/certs/ca-certificates.crt",
|
||||
enable_starttls_auto: GlobalSetting.smtp_enable_start_tls
|
||||
}
|
||||
|
||||
48
pkgs/servers/web-apps/discourse/admin_create.patch
Normal file
48
pkgs/servers/web-apps/discourse/admin_create.patch
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
diff --git a/lib/tasks/admin.rake b/lib/tasks/admin.rake
|
||||
index 37ef651f2b..b775129498 100644
|
||||
--- a/lib/tasks/admin.rake
|
||||
+++ b/lib/tasks/admin.rake
|
||||
@@ -107,3 +107,43 @@ task "admin:create" => :environment do
|
||||
end
|
||||
|
||||
end
|
||||
+
|
||||
+desc "Creates a forum administrator noninteractively"
|
||||
+task "admin:create_noninteractively" => :environment do
|
||||
+ email = ENV["ADMIN_EMAIL"]
|
||||
+ existing_user = User.find_by_email(email)
|
||||
+
|
||||
+ # check if user account already exixts
|
||||
+ if existing_user
|
||||
+ admin = existing_user
|
||||
+ else
|
||||
+ # create new user
|
||||
+ admin = User.new
|
||||
+ end
|
||||
+
|
||||
+ admin.email = email
|
||||
+ admin.name = ENV["ADMIN_NAME"]
|
||||
+ admin.username = ENV["ADMIN_USERNAME"]
|
||||
+
|
||||
+ password = ENV["ADMIN_PASSWORD"]
|
||||
+ unless admin.confirm_password?(password)
|
||||
+ admin.password = password
|
||||
+ puts "Admin password set!"
|
||||
+ end
|
||||
+
|
||||
+ admin.active = true
|
||||
+
|
||||
+ # save/update user account
|
||||
+ saved = admin.save
|
||||
+ raise admin.errors.full_messages.join("\n") unless saved
|
||||
+
|
||||
+ puts "Account created successfully with username #{admin.username}" unless existing_user
|
||||
+
|
||||
+ # grant admin privileges
|
||||
+ admin.grant_admin!
|
||||
+ if admin.trust_level < 1
|
||||
+ admin.change_trust_level!(1)
|
||||
+ end
|
||||
+ admin.email_tokens.update_all confirmed: true
|
||||
+ admin.activate
|
||||
+end
|
||||
13
pkgs/servers/web-apps/discourse/assets_rake_command.patch
Normal file
13
pkgs/servers/web-apps/discourse/assets_rake_command.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
|
||||
index 68b5db61ac..d460b5753e 100644
|
||||
--- a/lib/tasks/assets.rake
|
||||
+++ b/lib/tasks/assets.rake
|
||||
@@ -19,7 +19,7 @@ task 'assets:precompile:before' do
|
||||
|
||||
if only_assets_precompile_remaining
|
||||
# Using exec to free up Rails app memory during ember build
|
||||
- exec "#{compile_command} && EMBER_CLI_COMPILE_DONE=1 bin/rake assets:precompile"
|
||||
+ exec "#{compile_command} && EMBER_CLI_COMPILE_DONE=1 bundle exec rake assets:precompile"
|
||||
else
|
||||
system compile_command
|
||||
end
|
||||
13
pkgs/servers/web-apps/discourse/auto_generated_path.patch
Normal file
13
pkgs/servers/web-apps/discourse/auto_generated_path.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
|
||||
index 8482ff0210..826d111d65 100644
|
||||
--- a/lib/plugin/instance.rb
|
||||
+++ b/lib/plugin/instance.rb
|
||||
@@ -455,7 +455,7 @@ class Plugin::Instance
|
||||
end
|
||||
|
||||
def auto_generated_path
|
||||
- File.dirname(path) << "/auto_generated"
|
||||
+ "#{Rails.root}/public/assets/auto_generated_plugin_assets/#{name}"
|
||||
end
|
||||
|
||||
def after_initialize(&block)
|
||||
353
pkgs/servers/web-apps/discourse/default.nix
Normal file
353
pkgs/servers/web-apps/discourse/default.nix
Normal file
|
|
@ -0,0 +1,353 @@
|
|||
{ stdenv, pkgs, makeWrapper, runCommand, lib, writeShellScript
|
||||
, fetchFromGitHub, bundlerEnv, callPackage
|
||||
|
||||
, ruby, replace, gzip, gnutar, git, cacert, util-linux, gawk, nettools
|
||||
, imagemagick, optipng, pngquant, libjpeg, jpegoptim, gifsicle, jhead
|
||||
, oxipng, libpsl, redis, postgresql, which, brotli, procps, rsync, icu
|
||||
, fetchYarnDeps, yarn, fixup_yarn_lock, nodePackages, nodejs-14_x
|
||||
, nodejs-16_x
|
||||
|
||||
, plugins ? []
|
||||
}@args:
|
||||
|
||||
let
|
||||
version = "2.9.0.beta4";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-DpUEBGLgjcroVzdDG8/nGvC+ym19ZkGa7qvHKZZ1mH4=";
|
||||
};
|
||||
|
||||
runtimeDeps = [
|
||||
# For backups, themes and assets
|
||||
rubyEnv.wrappedRuby
|
||||
rsync
|
||||
gzip
|
||||
gnutar
|
||||
git
|
||||
brotli
|
||||
|
||||
# Misc required system utils
|
||||
which
|
||||
procps # For ps and kill
|
||||
util-linux # For renice
|
||||
gawk
|
||||
nettools # For hostname
|
||||
|
||||
# Image optimization
|
||||
imagemagick
|
||||
optipng
|
||||
oxipng
|
||||
pngquant
|
||||
libjpeg
|
||||
jpegoptim
|
||||
gifsicle
|
||||
nodePackages.svgo
|
||||
jhead
|
||||
];
|
||||
|
||||
runtimeEnv = {
|
||||
HOME = "/run/discourse/home";
|
||||
RAILS_ENV = "production";
|
||||
UNICORN_LISTENER = "/run/discourse/sockets/unicorn.sock";
|
||||
};
|
||||
|
||||
mkDiscoursePlugin =
|
||||
{ name ? null
|
||||
, pname ? null
|
||||
, version ? null
|
||||
, meta ? null
|
||||
, bundlerEnvArgs ? {}
|
||||
, preserveGemsDir ? false
|
||||
, src
|
||||
, ...
|
||||
}@args:
|
||||
let
|
||||
rubyEnv = bundlerEnv (bundlerEnvArgs // {
|
||||
inherit name pname version ruby;
|
||||
});
|
||||
in
|
||||
stdenv.mkDerivation (builtins.removeAttrs args [ "bundlerEnvArgs" ] // {
|
||||
pluginName = if name != null then name else "${pname}-${version}";
|
||||
dontConfigure = true;
|
||||
dontBuild = true;
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
mkdir -p $out
|
||||
cp -r * $out/
|
||||
'' + lib.optionalString (bundlerEnvArgs != {}) (
|
||||
if preserveGemsDir then ''
|
||||
cp -r ${rubyEnv}/lib/ruby/gems/* $out/gems/
|
||||
''
|
||||
else ''
|
||||
if [[ -e $out/gems ]]; then
|
||||
echo "Warning: The repo contains a 'gems' directory which will be removed!"
|
||||
echo " If you need to preserve it, set 'preserveGemsDir = true'."
|
||||
rm -r $out/gems
|
||||
fi
|
||||
ln -sf ${rubyEnv}/lib/ruby/gems $out/gems
|
||||
'' + ''
|
||||
runHook postInstall
|
||||
'');
|
||||
});
|
||||
|
||||
rake = runCommand "discourse-rake" {
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
} ''
|
||||
mkdir -p $out/bin
|
||||
makeWrapper ${rubyEnv}/bin/rake $out/bin/discourse-rake \
|
||||
${lib.concatStrings (lib.mapAttrsToList (name: value: "--set ${name} '${value}' ") runtimeEnv)} \
|
||||
--prefix PATH : ${lib.makeBinPath runtimeDeps} \
|
||||
--set RAKEOPT '-f ${discourse}/share/discourse/Rakefile' \
|
||||
--chdir '${discourse}/share/discourse'
|
||||
'';
|
||||
|
||||
rubyEnv = bundlerEnv {
|
||||
name = "discourse-ruby-env-${version}";
|
||||
inherit version ruby;
|
||||
gemdir = ./rubyEnv;
|
||||
gemset =
|
||||
let
|
||||
gems = import ./rubyEnv/gemset.nix;
|
||||
in
|
||||
gems // {
|
||||
mini_racer = gems.mini_racer // {
|
||||
buildInputs = [ icu ];
|
||||
dontBuild = false;
|
||||
NIX_LDFLAGS = "-licui18n";
|
||||
};
|
||||
libv8-node =
|
||||
let
|
||||
noopScript = writeShellScript "noop" "exit 0";
|
||||
linkFiles = writeShellScript "link-files" ''
|
||||
cd ../..
|
||||
|
||||
mkdir -p vendor/v8/${stdenv.hostPlatform.system}/libv8/obj/
|
||||
ln -s "${nodejs-16_x.libv8}/lib/libv8.a" vendor/v8/${stdenv.hostPlatform.system}/libv8/obj/libv8_monolith.a
|
||||
|
||||
ln -s ${nodejs-16_x.libv8}/include vendor/v8/include
|
||||
|
||||
mkdir -p ext/libv8-node
|
||||
echo '--- !ruby/object:Libv8::Node::Location::Vendor {}' >ext/libv8-node/.location.yml
|
||||
'';
|
||||
in gems.libv8-node // {
|
||||
dontBuild = false;
|
||||
postPatch = ''
|
||||
cp ${noopScript} libexec/build-libv8
|
||||
cp ${noopScript} libexec/build-monolith
|
||||
cp ${noopScript} libexec/download-node
|
||||
cp ${noopScript} libexec/extract-node
|
||||
cp ${linkFiles} libexec/inject-libv8
|
||||
'';
|
||||
};
|
||||
mini_suffix = gems.mini_suffix // {
|
||||
propagatedBuildInputs = [ libpsl ];
|
||||
dontBuild = false;
|
||||
# Use our libpsl instead of the vendored one, which isn't
|
||||
# available for aarch64. It has to be called
|
||||
# libpsl.x86_64.so or it isn't found.
|
||||
postPatch = ''
|
||||
cp $(readlink -f ${libpsl}/lib/libpsl.so) vendor/libpsl.x86_64.so
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
groups = [
|
||||
"default" "assets" "development" "test"
|
||||
];
|
||||
};
|
||||
|
||||
yarnOfflineCache = fetchYarnDeps {
|
||||
yarnLock = src + "/app/assets/javascripts/yarn.lock";
|
||||
sha256 = "1l4nfc14cm42lkilsawfhdcnv1ln7m7bpan9a804abv4hwrs3f52";
|
||||
};
|
||||
|
||||
assets = stdenv.mkDerivation {
|
||||
pname = "discourse-assets";
|
||||
inherit version src;
|
||||
|
||||
nativeBuildInputs = runtimeDeps ++ [
|
||||
postgresql
|
||||
redis
|
||||
nodePackages.uglify-js
|
||||
nodePackages.terser
|
||||
yarn
|
||||
nodejs-14_x
|
||||
];
|
||||
|
||||
patches = [
|
||||
# Use the Ruby API version in the plugin gem path, to match the
|
||||
# one constructed by bundlerEnv
|
||||
./plugin_gem_api_version.patch
|
||||
|
||||
# Change the path to the auto generated plugin assets, which
|
||||
# defaults to the plugin's directory and isn't writable at the
|
||||
# time of asset generation
|
||||
./auto_generated_path.patch
|
||||
|
||||
# Fix the rake command used to recursively execute itself in the
|
||||
# assets precompilation task.
|
||||
./assets_rake_command.patch
|
||||
];
|
||||
|
||||
# We have to set up an environment that is close enough to
|
||||
# production ready or the assets:precompile task refuses to
|
||||
# run. This means that Redis and PostgreSQL has to be running and
|
||||
# database migrations performed.
|
||||
preBuild = ''
|
||||
# Yarn wants a real home directory to write cache, config, etc to
|
||||
export HOME=$NIX_BUILD_TOP/fake_home
|
||||
|
||||
# Make yarn install packages from our offline cache, not the registry
|
||||
yarn config --offline set yarn-offline-mirror ${yarnOfflineCache}
|
||||
|
||||
# Fixup "resolved"-entries in yarn.lock to match our offline cache
|
||||
${fixup_yarn_lock}/bin/fixup_yarn_lock app/assets/javascripts/yarn.lock
|
||||
|
||||
export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
|
||||
|
||||
yarn install --offline --cwd app/assets/javascripts/discourse
|
||||
|
||||
patchShebangs app/assets/javascripts/node_modules/
|
||||
|
||||
redis-server >/dev/null &
|
||||
|
||||
initdb -A trust $NIX_BUILD_TOP/postgres >/dev/null
|
||||
postgres -D $NIX_BUILD_TOP/postgres -k $NIX_BUILD_TOP >/dev/null &
|
||||
export PGHOST=$NIX_BUILD_TOP
|
||||
|
||||
echo "Waiting for Redis and PostgreSQL to be ready.."
|
||||
while ! redis-cli --scan >/dev/null || ! psql -l >/dev/null; do
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
psql -d postgres -tAc 'CREATE USER "discourse"'
|
||||
psql -d postgres -tAc 'CREATE DATABASE "discourse" OWNER "discourse"'
|
||||
psql 'discourse' -tAc "CREATE EXTENSION IF NOT EXISTS pg_trgm"
|
||||
psql 'discourse' -tAc "CREATE EXTENSION IF NOT EXISTS hstore"
|
||||
|
||||
# Create a temporary home dir to stop bundler from complaining
|
||||
mkdir $NIX_BUILD_TOP/tmp_home
|
||||
export HOME=$NIX_BUILD_TOP/tmp_home
|
||||
|
||||
${lib.concatMapStringsSep "\n" (p: "ln -sf ${p} plugins/${p.pluginName or ""}") plugins}
|
||||
|
||||
export RAILS_ENV=production
|
||||
|
||||
bundle exec rake db:migrate >/dev/null
|
||||
chmod -R +w tmp
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
bundle exec rake assets:precompile
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mv public/assets $out
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
passthru = {
|
||||
inherit yarnOfflineCache;
|
||||
};
|
||||
};
|
||||
|
||||
discourse = stdenv.mkDerivation {
|
||||
pname = "discourse";
|
||||
inherit version src;
|
||||
|
||||
buildInputs = [
|
||||
rubyEnv rubyEnv.wrappedRuby rubyEnv.bundler
|
||||
];
|
||||
|
||||
patches = [
|
||||
# Load a separate NixOS site settings file
|
||||
./nixos_defaults.patch
|
||||
|
||||
# Add a noninteractive admin creation task
|
||||
./admin_create.patch
|
||||
|
||||
# Add the path to the CA cert bundle to make TLS work
|
||||
./action_mailer_ca_cert.patch
|
||||
|
||||
# Log Unicorn messages to the journal and make request timeout
|
||||
# configurable
|
||||
./unicorn_logging_and_timeout.patch
|
||||
|
||||
# Use the Ruby API version in the plugin gem path, to match the
|
||||
# one constructed by bundlerEnv
|
||||
./plugin_gem_api_version.patch
|
||||
|
||||
# Change the path to the auto generated plugin assets, which
|
||||
# defaults to the plugin's directory and isn't writable at the
|
||||
# time of asset generation
|
||||
./auto_generated_path.patch
|
||||
|
||||
# Make sure the notification email setting applies
|
||||
./notification_email.patch
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
# Always require lib-files and application.rb through their store
|
||||
# path, not their relative state directory path. This gets rid of
|
||||
# warnings and means we don't have to link back to lib from the
|
||||
# state directory.
|
||||
find config -type f -execdir sed -Ei "s,(\.\./)+(lib|app)/,$out/share/discourse/\2/," {} \;
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
runHook preBuild
|
||||
|
||||
mv config config.dist
|
||||
mv public public.dist
|
||||
|
||||
runHook postBuild
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
mkdir -p $out/share
|
||||
cp -r . $out/share/discourse
|
||||
rm -r $out/share/discourse/log
|
||||
ln -sf /var/log/discourse $out/share/discourse/log
|
||||
ln -sf /var/lib/discourse/tmp $out/share/discourse/tmp
|
||||
ln -sf /run/discourse/config $out/share/discourse/config
|
||||
ln -sf /run/discourse/assets/javascripts/plugins $out/share/discourse/app/assets/javascripts/plugins
|
||||
ln -sf /run/discourse/public $out/share/discourse/public
|
||||
ln -sf ${assets} $out/share/discourse/public.dist/assets
|
||||
${lib.concatMapStringsSep "\n" (p: "ln -sf ${p} $out/share/discourse/plugins/${p.pluginName or ""}") plugins}
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://www.discourse.org/";
|
||||
platforms = platforms.linux;
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.gpl2Plus;
|
||||
description = "Discourse is an open source discussion platform";
|
||||
};
|
||||
|
||||
passthru = {
|
||||
inherit rubyEnv runtimeEnv runtimeDeps rake mkDiscoursePlugin assets;
|
||||
enabledPlugins = plugins;
|
||||
plugins = callPackage ./plugins/all-plugins.nix { inherit mkDiscoursePlugin; };
|
||||
ruby = rubyEnv.wrappedRuby;
|
||||
tests = import ../../../../nixos/tests/discourse.nix {
|
||||
inherit (stdenv) system;
|
||||
inherit pkgs;
|
||||
package = pkgs.discourse.override args;
|
||||
};
|
||||
};
|
||||
};
|
||||
in discourse
|
||||
39
pkgs/servers/web-apps/discourse/mail_receiver/default.nix
Normal file
39
pkgs/servers/web-apps/discourse/mail_receiver/default.nix
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
{ stdenv, lib, fetchFromGitHub, ruby, makeWrapper, replace }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "discourse-mail-receiver";
|
||||
version = "4.0.7";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "mail-receiver";
|
||||
rev = "v${version}";
|
||||
sha256 = "0grifm5qyqazq63va3w26xjqnxwmfixhx0fx0zy7kd39378wwa6i";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ replace ];
|
||||
buildInputs = [ ruby makeWrapper ];
|
||||
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
|
||||
replace-literal -f -r -e /etc/postfix /run/discourse-mail-receiver .
|
||||
|
||||
cp -r receive-mail discourse-smtp-fast-rejection $out/bin/
|
||||
cp -r lib $out/
|
||||
|
||||
wrapProgram $out/bin/receive-mail --set RUBYLIB $out/lib
|
||||
wrapProgram $out/bin/discourse-smtp-fast-rejection --set RUBYLIB $out/lib
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://www.discourse.org/";
|
||||
platforms = platforms.linux;
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "A helper program which receives incoming mail for Discourse";
|
||||
};
|
||||
|
||||
}
|
||||
13
pkgs/servers/web-apps/discourse/nixos_defaults.patch
Normal file
13
pkgs/servers/web-apps/discourse/nixos_defaults.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/app/models/site_setting.rb b/app/models/site_setting.rb
|
||||
index a6641f967a..a45353504a 100644
|
||||
--- a/app/models/site_setting.rb
|
||||
+++ b/app/models/site_setting.rb
|
||||
@@ -21,6 +21,8 @@ class SiteSetting < ActiveRecord::Base
|
||||
end
|
||||
end
|
||||
|
||||
+ load_settings(File.join(Rails.root, 'config', 'nixos_site_settings.json'))
|
||||
+
|
||||
setup_deprecated_methods
|
||||
client_settings << :available_locales
|
||||
|
||||
18
pkgs/servers/web-apps/discourse/notification_email.patch
Normal file
18
pkgs/servers/web-apps/discourse/notification_email.patch
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
diff --git a/db/fixtures/990_settings.rb b/db/fixtures/990_settings.rb
|
||||
deleted file mode 100644
|
||||
index 6f21e58813..0000000000
|
||||
--- a/db/fixtures/990_settings.rb
|
||||
+++ /dev/null
|
||||
@@ -1,12 +0,0 @@
|
||||
-# frozen_string_literal: true
|
||||
-
|
||||
-if SiteSetting.notification_email == SiteSetting.defaults[:notification_email]
|
||||
- # don't crash for invalid hostname, which is possible in dev
|
||||
- begin
|
||||
- SiteSetting.notification_email = "noreply@#{Discourse.current_hostname}"
|
||||
- rescue Discourse::InvalidParameters
|
||||
- if Rails.env.production?
|
||||
- STDERR.puts "WARNING: Discourse hostname: #{Discourse.current_hostname} is not a valid domain for emails!"
|
||||
- end
|
||||
- end
|
||||
-end
|
||||
13
pkgs/servers/web-apps/discourse/plugin_gem_api_version.patch
Normal file
13
pkgs/servers/web-apps/discourse/plugin_gem_api_version.patch
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
diff --git a/lib/plugin_gem.rb b/lib/plugin_gem.rb
|
||||
index 49882b2cd9..96672df2ea 100644
|
||||
--- a/lib/plugin_gem.rb
|
||||
+++ b/lib/plugin_gem.rb
|
||||
@@ -4,7 +4,7 @@ module PluginGem
|
||||
def self.load(path, name, version, opts = nil)
|
||||
opts ||= {}
|
||||
|
||||
- gems_path = File.dirname(path) + "/gems/#{RUBY_VERSION}"
|
||||
+ gems_path = File.dirname(path) + "/gems/#{Gem.ruby_api_version}"
|
||||
|
||||
spec_path = gems_path + "/specifications"
|
||||
|
||||
4
pkgs/servers/web-apps/discourse/plugins/README
Normal file
4
pkgs/servers/web-apps/discourse/plugins/README
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Run the nixpkgs/pkgs/servers/web-apps/discourse/update.py script to
|
||||
update plugins! See the Plugins section of the Discourse chapter in
|
||||
the NixOS manual (https://nixos.org/manual/nixos/unstable/index.html#module-services-discourse)
|
||||
for more info.
|
||||
24
pkgs/servers/web-apps/discourse/plugins/all-plugins.nix
Normal file
24
pkgs/servers/web-apps/discourse/plugins/all-plugins.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{ mkDiscoursePlugin, newScope, fetchFromGitHub, ... }@args:
|
||||
let
|
||||
callPackage = newScope args;
|
||||
in
|
||||
{
|
||||
discourse-assign = callPackage ./discourse-assign {};
|
||||
discourse-calendar = callPackage ./discourse-calendar {};
|
||||
discourse-canned-replies = callPackage ./discourse-canned-replies {};
|
||||
discourse-chat-integration = callPackage ./discourse-chat-integration {};
|
||||
discourse-checklist = callPackage ./discourse-checklist {};
|
||||
discourse-data-explorer = callPackage ./discourse-data-explorer {};
|
||||
discourse-docs = callPackage ./discourse-docs {};
|
||||
discourse-github = callPackage ./discourse-github {};
|
||||
discourse-ldap-auth = callPackage ./discourse-ldap-auth {};
|
||||
discourse-math = callPackage ./discourse-math {};
|
||||
discourse-migratepassword = callPackage ./discourse-migratepassword {};
|
||||
discourse-openid-connect = callPackage ./discourse-openid-connect {};
|
||||
discourse-prometheus = callPackage ./discourse-prometheus {};
|
||||
discourse-saved-searches = callPackage ./discourse-saved-searches {};
|
||||
discourse-solved = callPackage ./discourse-solved {};
|
||||
discourse-spoiler-alert = callPackage ./discourse-spoiler-alert {};
|
||||
discourse-voting = callPackage ./discourse-voting {};
|
||||
discourse-yearly-review = callPackage ./discourse-yearly-review {};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-assign";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-assign";
|
||||
rev = "7a854fe5046783bcff6cc24fca818056e1b9414a";
|
||||
sha256 = "sha256-SGGwj0V4mTXD33tLnH76tQD/f6IvDbacq23XbaRdLsI=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-docs";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.mit;
|
||||
description = "Discourse Plugin for assigning users to a topic";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
# gem "rails"
|
||||
gem 'rrule', '0.4.4', require: false
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (7.0.2.3)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
concurrent-ruby (1.1.10)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
minitest (5.15.0)
|
||||
rrule (0.4.4)
|
||||
activesupport (>= 2.3)
|
||||
tzinfo (2.0.4)
|
||||
concurrent-ruby (~> 1.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
rrule (= 0.4.4)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-calendar";
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-calendar";
|
||||
rev = "eb8bc3e864c6f735fa5a005e854f8c37411b6288";
|
||||
sha256 = "sha256-fc3oQj2NqaTfmokJUryd2oBd/eVAcNOMMT0ZT45bU28=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-calendar";
|
||||
maintainers = with maintainers; [ ryantm ];
|
||||
license = licenses.mit;
|
||||
description = "Adds the ability to create a dynamic calendar in the first post of a topic";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
activesupport = {
|
||||
dependencies = ["concurrent-ruby" "i18n" "minitest" "tzinfo"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1jpydd414j0fig3r0f6ci67mchclg6cq2qgqbq9zplrbg40pzfi8";
|
||||
type = "gem";
|
||||
};
|
||||
version = "7.0.2.3";
|
||||
};
|
||||
concurrent-ruby = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0s4fpn3mqiizpmpy2a24k4v365pv75y50292r8ajrv4i1p5b2k14";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.10";
|
||||
};
|
||||
i18n = {
|
||||
dependencies = ["concurrent-ruby"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0b2qyvnk4yynlg17ymkq4g5xgr275637fhl1mjh0valw3cb1fhhg";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.10.0";
|
||||
};
|
||||
minitest = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "06xf558gid4w8lwx13jwfdafsch9maz8m0g85wnfymqj63x5nbbd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "5.15.0";
|
||||
};
|
||||
rrule = {
|
||||
dependencies = ["activesupport"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "04h3q0ws0wswqj3mwjyv44yx59d9ima9a820ay9w5bwnlb73syj2";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.4.4";
|
||||
};
|
||||
tzinfo = {
|
||||
dependencies = ["concurrent-ruby"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "10qp5x7f9hvlc0psv9gsfbxg4a7s0485wsbq1kljkxq94in91l4z";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.0.4";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-canned-replies";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-canned-replies";
|
||||
rev = "18af3367d9eda8842e8ff0de96c90aa2f0bdb0a3";
|
||||
sha256 = "sha256-v8QOR0/9RUJ1zFmzhKYe/GEev3Jl4AlXWkQyuquyuJY=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-canned-replies";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.gpl2Only;
|
||||
description = "Adds support for inserting a canned reply into the composer window via a UI";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-chat-integration";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-chat-integration";
|
||||
rev = "eaa7de8c2b659d107c2b16ac0d469592aff79d7c";
|
||||
sha256 = "sha256-7anXDbltMBM22dBnE5FFwNk7IJEUFZgDzR4Q/AYn6ng=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-chat-integration";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.mit;
|
||||
description = "This plugin integrates Discourse with a number of external chatroom systems";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-checklist";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-checklist";
|
||||
rev = "68941e370e132c17fc2aa21ac40c033df72c9771";
|
||||
sha256 = "sha256-jJM/01fKxc1RBcSPt9/KDxMkBMH2AOp9dINxSneNhAs=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-checklist";
|
||||
maintainers = with maintainers; [ ryantm ];
|
||||
license = licenses.gpl2Only;
|
||||
description = "A simple checklist rendering plugin for discourse ";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-data-explorer";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-data-explorer";
|
||||
rev = "baaac7ce671e716559329ae756988cc395d7079e";
|
||||
sha256 = "sha256-bUCRfbKXdNbiJnU3xPMhG3s8kH7wQQoS2kV7ScHGOMQ=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-data-explorer";
|
||||
maintainers = with maintainers; [ ryantm ];
|
||||
license = licenses.mit;
|
||||
description = "SQL Queries for admins in Discourse";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-docs";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-docs";
|
||||
rev = "72b2e87e84221588bc2ff08961a492044f1f8237";
|
||||
sha256 = "sha256-moR4TJYffh6JwC7oxeS4+Cyngi88Ht2eTbSEJJ4JKdY=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-docs";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.mit;
|
||||
description = "Find and filter knowledge base topics";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
# gem "rails"
|
||||
gem 'sawyer', '0.8.2'
|
||||
gem 'octokit', '4.22.0'
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
faraday (1.10.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.0)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
faraday-retry (~> 1.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.3)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
multipart-post (2.1.1)
|
||||
octokit (4.22.0)
|
||||
faraday (>= 0.9)
|
||||
sawyer (~> 0.8.0, >= 0.5.3)
|
||||
public_suffix (4.0.7)
|
||||
ruby2_keywords (0.0.5)
|
||||
sawyer (0.8.2)
|
||||
addressable (>= 2.3.5)
|
||||
faraday (> 0.8, < 2.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
octokit (= 4.22.0)
|
||||
sawyer (= 0.8.2)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-github";
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-github";
|
||||
rev = "36cbacdd32916435391b4700c024074da3bcbe74";
|
||||
sha256 = "sha256-R4Kp7NFMIXYDcAZlOUdhNdN/mmQMgXlLFolzo2OZahw=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-github";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "Adds GitHub badges and linkback functionality";
|
||||
};
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
{
|
||||
addressable = {
|
||||
dependencies = ["public_suffix"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "022r3m9wdxljpbya69y2i3h9g3dhhfaqzidf95m6qjzms792jvgp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.8.0";
|
||||
};
|
||||
faraday = {
|
||||
dependencies = ["faraday-em_http" "faraday-em_synchrony" "faraday-excon" "faraday-httpclient" "faraday-multipart" "faraday-net_http" "faraday-net_http_persistent" "faraday-patron" "faraday-rack" "faraday-retry" "ruby2_keywords"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "00palwawk897p5gypw5wjrh93d4p0xz2yl9w93yicb4kq7amh8d4";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.10.0";
|
||||
};
|
||||
faraday-em_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "12cnqpbak4vhikrh2cdn94assh3yxza8rq2p9w2j34bqg5q4qgbs";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-em_synchrony = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vgrbhkp83sngv6k4mii9f2s9v5lmp693hylfxp2ssfc60fas3a6";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-excon = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0h09wkb0k0bhm6dqsd47ac601qiaah8qdzjh8gvxfd376x1chmdh";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.0";
|
||||
};
|
||||
faraday-httpclient = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0fyk0jd3ks7fdn8nv3spnwjpzx2lmxmg2gh4inz3by1zjzqg33sc";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-multipart = {
|
||||
dependencies = ["multipart-post"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "03qfi9020ynf7hkdiaq01sd2mllvw7fg4qiin3pk028b4wv23j3j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.3";
|
||||
};
|
||||
faraday-net_http = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1fi8sda5hc54v1w3mqfl5yz09nhx35kglyx72w7b8xxvdr0cwi9j";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.1";
|
||||
};
|
||||
faraday-net_http_persistent = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0dc36ih95qw3rlccffcb0vgxjhmipsvxhn6cw71l7ffs0f7vq30b";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.2.0";
|
||||
};
|
||||
faraday-patron = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "19wgsgfq0xkski1g7m96snv39la3zxz6x7nbdgiwhg5v82rxfb6w";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-rack = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1h184g4vqql5jv9s9im6igy00jp6mrah2h14py6mpf9bkabfqq7g";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.0";
|
||||
};
|
||||
faraday-retry = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "153i967yrwnswqgvnnajgwp981k9p50ys1h80yz3q94rygs59ldd";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.3";
|
||||
};
|
||||
multipart-post = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1zgw9zlwh2a6i1yvhhc4a84ry1hv824d6g2iw2chs3k5aylpmpfj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.1.1";
|
||||
};
|
||||
octokit = {
|
||||
dependencies = ["faraday" "sawyer"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nmdd7klyinvrrv2mggwwmc99ykaq7i379j00i37hvvaqx4giifj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.22.0";
|
||||
};
|
||||
public_suffix = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1f3knlwfwm05sfbaihrxm4g772b79032q14c16q4b38z8bi63qcb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "4.0.7";
|
||||
};
|
||||
ruby2_keywords = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vz322p8n39hz3b4a9gkmz9y7a5jaz41zrm2ywf31dvkqm03glgz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.5";
|
||||
};
|
||||
sawyer = {
|
||||
dependencies = ["addressable" "faraday"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0yrdchs3psh583rjapkv33mljdivggqn99wkydkjdckcjn43j3cz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.8.2";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
# gem "rails"
|
||||
gem 'pyu-ruby-sasl', '0.0.3.3', require: false
|
||||
gem 'rubyntlm', '0.3.4', require: false
|
||||
gem 'net-ldap', '0.14.0'
|
||||
gem 'omniauth-ldap', '1.0.5'
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
hashie (5.0.0)
|
||||
net-ldap (0.14.0)
|
||||
omniauth (1.9.1)
|
||||
hashie (>= 3.4.6)
|
||||
rack (>= 1.6.2, < 3)
|
||||
omniauth-ldap (1.0.5)
|
||||
net-ldap (~> 0.12)
|
||||
omniauth (~> 1.0)
|
||||
pyu-ruby-sasl (~> 0.0.3.2)
|
||||
rubyntlm (~> 0.3.4)
|
||||
pyu-ruby-sasl (0.0.3.3)
|
||||
rack (2.2.3)
|
||||
rubyntlm (0.3.4)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
net-ldap (= 0.14.0)
|
||||
omniauth-ldap (= 1.0.5)
|
||||
pyu-ruby-sasl (= 0.0.3.3)
|
||||
rubyntlm (= 0.3.4)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-ldap-auth";
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
src = fetchFromGitHub {
|
||||
owner = "jonmbake";
|
||||
repo = "discourse-ldap-auth";
|
||||
rev = "a7a2e35eb5a8f6ee3b90bf48424efcb2a66c9989";
|
||||
sha256 = "sha256-Dsb12bZEZlNjFGw1GX7zt2hDVM9Ua+MDWSmBn4HEvs0=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/jonmbake/discourse-ldap-auth";
|
||||
maintainers = with maintainers; [ ryantm ];
|
||||
license = licenses.mit;
|
||||
description = "Discourse plugin to enable LDAP/Active Directory authentication.";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
hashie = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nh3arcrbz1rc1cr59qm53sdhqm137b258y8rcb4cvd3y98lwv4x";
|
||||
type = "gem";
|
||||
};
|
||||
version = "5.0.0";
|
||||
};
|
||||
net-ldap = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "18fyxfbh32ai72cwgz8s9w0fg0xq7j534y217flw54mmzsj8i6qp";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.14.0";
|
||||
};
|
||||
omniauth = {
|
||||
dependencies = ["hashie" "rack"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "002vi9gwamkmhf0dsj2im1d47xw2n1jfhnzl18shxf3ampkqfmyz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.9.1";
|
||||
};
|
||||
omniauth-ldap = {
|
||||
dependencies = ["net-ldap" "omniauth" "pyu-ruby-sasl" "rubyntlm"];
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1ld3mx46xa1qhc0cpnck1n06xcxs0ag4n41zgabxri27a772f9wz";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.0.5";
|
||||
};
|
||||
pyu-ruby-sasl = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1rcpjiz9lrvyb3rd8k8qni0v4ps08psympffyldmmnrqayyad0sn";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.0.3.3";
|
||||
};
|
||||
rack = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0i5vs0dph9i5jn8dfc6aqd6njcafmb20rwqngrf759c9cvmyff16";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.3";
|
||||
};
|
||||
rubyntlm = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "18d1lxhx62swggf4cqg76h7hp04f5801c8h07w08cm9xng2niqby";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.3.4";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-math";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-math";
|
||||
rev = "b875a21b4d5225b61cb525531d30eaf852db6237";
|
||||
sha256 = "sha256-UKba9ZaVjIxOqUYdl00Z2sLt3Y+exBX7MJax8EzXB1Q=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-math";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "Official MathJax support for Discourse";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem 'bcrypt', '3.1.3'
|
||||
gem 'unix-crypt', '1.3.0'
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
bcrypt (3.1.3)
|
||||
unix-crypt (1.3.0)
|
||||
|
||||
PLATFORMS
|
||||
x86_64-linux
|
||||
|
||||
DEPENDENCIES
|
||||
bcrypt (= 3.1.3)
|
||||
unix-crypt (= 1.3.0)
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.20
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-migratepassword";
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
src = fetchFromGitHub {
|
||||
owner = "communiteq";
|
||||
repo = "discourse-migratepassword";
|
||||
rev = "91d6a008de91853becca01846aa4662bd227670e";
|
||||
sha256 = "sha256-aKj0zXyXDnG20qVdhGvn4fwXiBeHFj2pv4bTUP81MP0=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/communiteq/discourse-migratepassword";
|
||||
maintainers = with maintainers; [ ryantm ];
|
||||
license = licenses.gpl2Only;
|
||||
description = "Support migrated password hashes";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
bcrypt = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1d2gqv8vry4ps0asb7nn1z4zxi3mcscy7yrim0npdd294ffyinvj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.1.3";
|
||||
};
|
||||
unix-crypt = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1wflipsmmicmgvqilp9pml4x19b337kh6p6jgrzqrzpkq2z52gdq";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.3.0";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
||||
group :development do
|
||||
gem 'rubocop-discourse'
|
||||
end
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
ast (2.4.1)
|
||||
parallel (1.19.2)
|
||||
parser (2.7.2.0)
|
||||
ast (~> 2.4.1)
|
||||
rainbow (3.0.0)
|
||||
regexp_parser (1.8.1)
|
||||
rexml (3.2.5)
|
||||
rubocop (0.93.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 2.7.1.5)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8)
|
||||
rexml
|
||||
rubocop-ast (>= 0.6.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 2.0)
|
||||
rubocop-ast (0.7.1)
|
||||
parser (>= 2.7.1.5)
|
||||
rubocop-discourse (2.3.2)
|
||||
rubocop (>= 0.69.0)
|
||||
rubocop-rspec (>= 1.39.0)
|
||||
rubocop-rspec (1.43.2)
|
||||
rubocop (~> 0.87)
|
||||
ruby-progressbar (1.10.1)
|
||||
unicode-display_width (1.7.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
rubocop-discourse
|
||||
|
||||
BUNDLED WITH
|
||||
2.1.4
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-openid-connect";
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-openid-connect";
|
||||
rev = "e897702139b9c0dca40b9385427ba8bad0e1eae9";
|
||||
sha256 = "sha256-miosXf4to60BqGsbXYEL37G38uVHrz2/2Pizn0Rlp2o=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-openid-connect";
|
||||
maintainers = with maintainers; [ mkg20001 ];
|
||||
license = licenses.mit;
|
||||
description = "Discourse plugin to integrate Discourse with an openid-connect login provider.";
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
{
|
||||
ast = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1l3468czzjmxl93ap40hp7z94yxp4nbag0bxqs789bm30md90m2a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.4.1";
|
||||
};
|
||||
parallel = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "17b127xxmm2yqdz146qwbs57046kn0js1h8synv01dwqz2z1kp2l";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.19.2";
|
||||
};
|
||||
parser = {
|
||||
dependencies = ["ast"];
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1f7gmm60yla325wlnd3qkxs59qm2y0aan8ljpg6k18rwzrrfil6z";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.7.2.0";
|
||||
};
|
||||
rainbow = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0bb2fpjspydr6x0s8pn1pqkzmxszvkfapv0p4627mywl7ky4zkhk";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.0.0";
|
||||
};
|
||||
regexp_parser = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0n9d14ppshnx71i3mi1pnm3hwhcbb6m6vsc0b0dqgsab8r2rs96n";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.8.1";
|
||||
};
|
||||
rexml = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
|
||||
type = "gem";
|
||||
};
|
||||
version = "3.2.5";
|
||||
};
|
||||
rubocop = {
|
||||
dependencies = ["parallel" "parser" "rainbow" "regexp_parser" "rexml" "rubocop-ast" "ruby-progressbar" "unicode-display_width"];
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nrv7i81549addig09grw17qkab3l4319dcsf9y7psl7aa76ng3a";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.93.0";
|
||||
};
|
||||
rubocop-ast = {
|
||||
dependencies = ["parser"];
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "129hgz4swc8n0g01715v7y00k0h4mlzkxh63q7z27q7mjp54rl74";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.7.1";
|
||||
};
|
||||
rubocop-discourse = {
|
||||
dependencies = ["rubocop" "rubocop-rspec"];
|
||||
groups = ["development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "10l2wwnvd4xccgqsyhxrhc5bw10b7an4awl0v90fw5xf2qdjiflw";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.3.2";
|
||||
};
|
||||
rubocop-rspec = {
|
||||
dependencies = ["rubocop"];
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1sc0bwdxzfr8byxzwvfyf22lwzqcaa6ca7wzxx31mk7vvy7r7dhl";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.43.2";
|
||||
};
|
||||
ruby-progressbar = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1k77i0d4wsn23ggdd2msrcwfy0i376cglfqypkk2q77r2l3408zf";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.10.1";
|
||||
};
|
||||
unicode-display_width = {
|
||||
groups = ["default" "development"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "06i3id27s60141x6fdnjn5rar1cywdwy64ilc59cz937303q3mna";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.7.0";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
# gem "rails"
|
||||
gem 'prometheus_exporter', File.read(File.expand_path("../prometheus_exporter_version", __FILE__)).strip
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
prometheus_exporter (0.5.0)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
prometheus_exporter (= 0.5.0)
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
{ lib, stdenv, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
bundlerEnvArgs.gemdir = ./.;
|
||||
name = "discourse-prometheus";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-prometheus";
|
||||
rev = "43536e4a4977718972a673dc2475ae07df9a0a45";
|
||||
sha256 = "sha256-7sQldPLY7YW/sr4WBHWxJVvhvRK0LwO3+52HAIJFvY4=";
|
||||
};
|
||||
|
||||
patches = [
|
||||
# The metrics collector tries to run git to get the commit id but fails
|
||||
# because we don't run Discourse from a Git repository.
|
||||
./no-git-version.patch
|
||||
./spec-import-fix-abi-version.patch
|
||||
];
|
||||
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-prometheus";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.mit;
|
||||
description = "Official Discourse Plugin for Prometheus Monitoring";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
prometheus_exporter = {
|
||||
groups = ["default"];
|
||||
platforms = [];
|
||||
source = {
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1kmabnxz466zqnyqlzc693ny4l7i0rxvmc0znswvizc0zg4pri80";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.5.0";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
diff --git a/lib/internal_metric/global.rb b/lib/internal_metric/global.rb
|
||||
index 682571b..7bdd431 100644
|
||||
--- a/lib/internal_metric/global.rb
|
||||
+++ b/lib/internal_metric/global.rb
|
||||
@@ -30,30 +30,7 @@ module DiscoursePrometheus::InternalMetric
|
||||
@active_app_reqs = 0
|
||||
@queued_app_reqs = 0
|
||||
@fault_logged = {}
|
||||
-
|
||||
- begin
|
||||
- @@version = nil
|
||||
-
|
||||
- out, error, status = Open3.capture3('git rev-parse HEAD')
|
||||
-
|
||||
- if status.success?
|
||||
- @@version ||= out.chomp
|
||||
- else
|
||||
- raise error
|
||||
- end
|
||||
- rescue => e
|
||||
- if defined?(::Discourse)
|
||||
- Discourse.warn_exception(e, message: "Failed to calculate discourse_version_info metric")
|
||||
- else
|
||||
- STDERR.puts "Failed to calculate discourse_version_info metric: #{e}\n#{e.backtrace.join("\n")}"
|
||||
- end
|
||||
-
|
||||
- @@retries ||= 10
|
||||
- @@retries -= 1
|
||||
- if @@retries < 0
|
||||
- @@version = -1
|
||||
- end
|
||||
- end
|
||||
+ @@version = -1
|
||||
end
|
||||
|
||||
def collect
|
||||
|
|
@ -0,0 +1 @@
|
|||
0.5.0
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
diff --git a/bin/collector b/bin/collector
|
||||
index 4fec65e..e59eac7 100755
|
||||
--- a/bin/collector
|
||||
+++ b/bin/collector
|
||||
@@ -3,8 +3,10 @@
|
||||
|
||||
Process.setproctitle("discourse prometheus-collector")
|
||||
|
||||
+# We need the ABI version {MAJOR}.{MINOR}.0 here.
|
||||
+abi_version = ENV['GEM_PATH'].split("/")[-1]
|
||||
version = File.read(File.expand_path("../../prometheus_exporter_version", __FILE__)).strip
|
||||
-spec_file = File.expand_path("../../gems/#{RUBY_VERSION}/specifications/prometheus_exporter-#{version}.gemspec", __FILE__)
|
||||
+spec_file = File.expand_path("../../gems/#{abi_version}/specifications/prometheus_exporter-#{version}.gemspec", __FILE__)
|
||||
|
||||
spec = Gem::Specification.load spec_file
|
||||
spec.activate
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-saved-searches";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-saved-searches";
|
||||
rev = "f008809ee3bf3a8a5c11daff0807d59ab4336a0c";
|
||||
sha256 = "sha256-/OyFL/9fLdVpsFQIlnjQ6ser6hdEs4X434nAaqKCTUE=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-saved-searches";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.mit;
|
||||
description = "Allow users to save searches and be notified of new results";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-solved";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-solved";
|
||||
rev = "17ba805a06ddfc27c6435eb20c0f8466f1708be8";
|
||||
sha256 = "sha256-G48c1khRVnCPXA8ujpDmEzL10uLC9e2sYVLVEXWIk0s=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-solved";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "Allow accepted answers on topics";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-spoiler-alert";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-spoiler-alert";
|
||||
rev = "4a07519cf9d7ac713f5e21ba770adb127524a22d";
|
||||
sha256 = "sha256-pMTXdjqI4GrLNfZMbyPdeW+Jwieh6I4O/pT2Yyf4ltA=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-spoiler-alert";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "Hide spoilers behind the spoiler-alert jQuery plugin";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-voting";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-voting";
|
||||
rev = "1da667721269ca01ef53c35ec0470486b490e72c";
|
||||
sha256 = "sha256-VCMv6YWHY24v9KyO4q0YSSYK+mszOVqP46slOh8okvY=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-voting";
|
||||
maintainers = with maintainers; [ dpausp ];
|
||||
license = licenses.gpl2Only;
|
||||
description = "Adds the ability for voting on a topic within a specified category in Discourse";
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{ lib, mkDiscoursePlugin, fetchFromGitHub }:
|
||||
|
||||
mkDiscoursePlugin {
|
||||
name = "discourse-yearly-review";
|
||||
src = fetchFromGitHub {
|
||||
owner = "discourse";
|
||||
repo = "discourse-yearly-review";
|
||||
rev = "ef4855f6afa16ef86013bba7da8e50a63e11b493";
|
||||
sha256 = "sha256-IVKGysAKr+lKV1CO1JJIMLtzcvpK8joWjx8Bfy+dx8Y=";
|
||||
};
|
||||
meta = with lib; {
|
||||
homepage = "https://github.com/discourse/discourse-yearly-review";
|
||||
maintainers = with maintainers; [ talyz ];
|
||||
license = licenses.mit;
|
||||
description = "Publishes an automated Year in Review topic";
|
||||
};
|
||||
}
|
||||
268
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile
Normal file
268
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile
Normal file
|
|
@ -0,0 +1,268 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
source 'https://rubygems.org'
|
||||
# if there is a super emergency and rubygems is playing up, try
|
||||
#source 'http://production.cf.rubygems.org'
|
||||
|
||||
gem 'bootsnap', require: false, platform: :mri
|
||||
|
||||
def rails_master?
|
||||
ENV["RAILS_MASTER"] == '1'
|
||||
end
|
||||
|
||||
if rails_master?
|
||||
gem 'arel', git: 'https://github.com/rails/arel.git'
|
||||
gem 'rails', git: 'https://github.com/rails/rails.git'
|
||||
else
|
||||
# NOTE: Until rubygems gives us optional dependencies we are stuck with this needing to be explicit
|
||||
# this allows us to include the bits of rails we use without pieces we do not.
|
||||
#
|
||||
# To issue a rails update bump the version number here
|
||||
rails_version = '6.1.4.7'
|
||||
gem 'actionmailer', rails_version
|
||||
gem 'actionpack', rails_version
|
||||
gem 'actionview', rails_version
|
||||
gem 'activemodel', rails_version
|
||||
gem 'activerecord', rails_version
|
||||
gem 'activesupport', rails_version
|
||||
gem 'railties', rails_version
|
||||
gem 'sprockets-rails'
|
||||
end
|
||||
|
||||
gem 'json'
|
||||
|
||||
gem 'sprockets'
|
||||
|
||||
# this will eventually be added to rails,
|
||||
# allows us to precompile all our templates in the unicorn master
|
||||
gem 'actionview_precompiler', require: false
|
||||
|
||||
gem 'seed-fu'
|
||||
|
||||
gem 'mail', git: 'https://github.com/discourse/mail.git', require: false
|
||||
gem 'mini_mime'
|
||||
gem 'mini_suffix'
|
||||
|
||||
gem 'redis'
|
||||
|
||||
# This is explicitly used by Sidekiq and is an optional dependency.
|
||||
# We tell Sidekiq to use the namespace "sidekiq" which triggers this
|
||||
# gem to be used. There is no explicit dependency in sidekiq cause
|
||||
# redis namespace support is optional
|
||||
# We already namespace stuff in DiscourseRedis, so we should consider
|
||||
# just using a single implementation in core vs having 2 namespace implementations
|
||||
gem 'redis-namespace'
|
||||
|
||||
# NOTE: AM serializer gets a lot slower with recent updates
|
||||
# we used an old branch which is the fastest one out there
|
||||
# are long term goal here is to fork this gem so we have a
|
||||
# better maintained living fork
|
||||
gem 'active_model_serializers', '~> 0.8.3'
|
||||
|
||||
gem 'http_accept_language', require: false
|
||||
|
||||
# Ember related gems need to be pinned cause they control client side
|
||||
# behavior, we will push these versions up when upgrading ember
|
||||
gem 'discourse-ember-rails', '0.18.6', require: 'ember-rails'
|
||||
gem 'discourse-ember-source', '~> 3.12.2'
|
||||
gem 'ember-handlebars-template', '0.8.0'
|
||||
gem 'discourse-fonts'
|
||||
|
||||
gem 'barber'
|
||||
|
||||
gem 'message_bus'
|
||||
|
||||
gem 'rails_multisite'
|
||||
|
||||
gem 'fast_xs', platform: :ruby
|
||||
|
||||
gem 'xorcist'
|
||||
|
||||
gem 'fastimage'
|
||||
|
||||
gem 'aws-sdk-s3', require: false
|
||||
gem 'aws-sdk-sns', require: false
|
||||
gem 'excon', require: false
|
||||
gem 'unf', require: false
|
||||
|
||||
gem 'email_reply_trimmer'
|
||||
|
||||
gem 'image_optim'
|
||||
gem 'multi_json'
|
||||
gem 'mustache'
|
||||
gem 'nokogiri'
|
||||
gem 'loofah'
|
||||
gem 'css_parser', require: false
|
||||
|
||||
gem 'omniauth'
|
||||
gem 'omniauth-facebook'
|
||||
gem 'omniauth-twitter'
|
||||
gem 'omniauth-github'
|
||||
|
||||
gem 'omniauth-oauth2', require: false
|
||||
|
||||
gem 'omniauth-google-oauth2'
|
||||
|
||||
gem 'oj'
|
||||
|
||||
gem 'pg'
|
||||
gem 'mini_sql'
|
||||
gem 'pry-rails', require: false
|
||||
gem 'pry-byebug', require: false
|
||||
gem 'r2', require: false
|
||||
gem 'rake'
|
||||
|
||||
gem 'thor', require: false
|
||||
gem 'diffy', require: false
|
||||
gem 'rinku'
|
||||
gem 'sidekiq'
|
||||
gem 'mini_scheduler'
|
||||
|
||||
gem 'execjs', require: false
|
||||
gem 'mini_racer'
|
||||
|
||||
gem 'highline', require: false
|
||||
|
||||
gem 'rack'
|
||||
|
||||
gem 'rack-protection' # security
|
||||
gem 'cbor', require: false
|
||||
gem 'cose', require: false
|
||||
gem 'addressable'
|
||||
gem 'json_schemer'
|
||||
|
||||
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.1")
|
||||
# net-smtp, net-imap and net-pop were removed from default gems in Ruby 3.1
|
||||
gem "net-smtp", "~> 0.2.1", require: false
|
||||
gem "net-imap", "~> 0.2.1", require: false
|
||||
gem "net-pop", "~> 0.1.1", require: false
|
||||
gem "digest", "3.0.0", require: false
|
||||
end
|
||||
|
||||
# Gems used only for assets and not required in production environments by default.
|
||||
# Allow everywhere for now cause we are allowing asset debugging in production
|
||||
group :assets do
|
||||
gem 'uglifier'
|
||||
gem 'rtlit', require: false # for css rtling
|
||||
end
|
||||
|
||||
group :test do
|
||||
gem 'webmock', require: false
|
||||
gem 'fakeweb', require: false
|
||||
gem 'minitest', require: false
|
||||
gem 'simplecov', require: false
|
||||
gem "test-prof"
|
||||
end
|
||||
|
||||
group :test, :development do
|
||||
gem 'rspec'
|
||||
gem 'listen', require: false
|
||||
gem 'certified', require: false
|
||||
gem 'fabrication', require: false
|
||||
gem 'mocha', require: false
|
||||
|
||||
gem 'rb-fsevent', require: RUBY_PLATFORM =~ /darwin/i ? 'rb-fsevent' : false
|
||||
|
||||
gem 'rspec-rails'
|
||||
|
||||
gem 'shoulda-matchers', require: false
|
||||
gem 'rspec-html-matchers'
|
||||
gem 'byebug', require: ENV['RM_INFO'].nil?, platform: :mri
|
||||
gem "rubocop-discourse", require: false
|
||||
gem 'parallel_tests'
|
||||
|
||||
gem 'rswag-specs'
|
||||
|
||||
gem 'annotate'
|
||||
end
|
||||
|
||||
group :development do
|
||||
gem 'ruby-prof', require: false, platform: :mri
|
||||
gem 'bullet', require: !!ENV['BULLET']
|
||||
gem 'better_errors', platform: :mri, require: !!ENV['BETTER_ERRORS']
|
||||
gem 'binding_of_caller'
|
||||
gem 'yaml-lint'
|
||||
end
|
||||
|
||||
if ENV["ALLOW_DEV_POPULATE"] == "1"
|
||||
gem 'discourse_dev_assets'
|
||||
gem 'faker', "~> 2.16"
|
||||
else
|
||||
group :development do
|
||||
gem 'discourse_dev_assets'
|
||||
gem 'faker', "~> 2.16"
|
||||
end
|
||||
end
|
||||
|
||||
# this is an optional gem, it provides a high performance replacement
|
||||
# to String#blank? a method that is called quite frequently in current
|
||||
# ActiveRecord, this may change in the future
|
||||
gem 'fast_blank', platform: :ruby
|
||||
|
||||
# this provides a very efficient lru cache
|
||||
gem 'lru_redux'
|
||||
|
||||
gem 'htmlentities', require: false
|
||||
|
||||
# IMPORTANT: mini profiler monkey patches, so it better be required last
|
||||
# If you want to amend mini profiler to do the monkey patches in the railties
|
||||
# we are open to it. by deferring require to the initializer we can configure discourse installs without it
|
||||
|
||||
gem 'rack-mini-profiler', require: ['enable_rails_patches']
|
||||
|
||||
gem 'unicorn', require: false, platform: :ruby
|
||||
gem 'puma', require: false
|
||||
gem 'rbtrace', require: false, platform: :mri
|
||||
gem 'gc_tracer', require: false, platform: :mri
|
||||
|
||||
# required for feed importing and embedding
|
||||
gem 'ruby-readability', require: false
|
||||
|
||||
# rss gem is a bundled gem from Ruby 3 onwards
|
||||
gem 'rss', require: false
|
||||
|
||||
gem 'stackprof', require: false, platform: :mri
|
||||
gem 'memory_profiler', require: false, platform: :mri
|
||||
|
||||
gem 'cppjieba_rb', require: false
|
||||
|
||||
gem 'lograge', require: false
|
||||
gem 'logstash-event', require: false
|
||||
gem 'logstash-logger', require: false
|
||||
gem 'logster'
|
||||
|
||||
# NOTE: later versions of sassc are causing a segfault, possibly dependent on processer architecture
|
||||
# and until resolved should be locked at 2.0.1
|
||||
gem 'sassc', '2.0.1', require: false
|
||||
gem "sassc-rails"
|
||||
|
||||
gem 'rotp', require: false
|
||||
|
||||
gem 'rqrcode'
|
||||
|
||||
gem 'rubyzip', require: false
|
||||
|
||||
gem 'sshkey', require: false
|
||||
|
||||
gem 'rchardet', require: false
|
||||
gem 'lz4-ruby', require: false, platform: :ruby
|
||||
|
||||
gem 'sanitize'
|
||||
|
||||
if ENV["IMPORT"] == "1"
|
||||
gem 'mysql2'
|
||||
gem 'redcarpet'
|
||||
|
||||
# NOTE: in import mode the version of sqlite can matter a lot, so we stick it to a specific one
|
||||
gem 'sqlite3', '~> 1.3', '>= 1.3.13'
|
||||
gem 'ruby-bbcode-to-md', git: 'https://github.com/nlalonde/ruby-bbcode-to-md'
|
||||
gem 'reverse_markdown'
|
||||
gem 'tiny_tds'
|
||||
gem 'csv'
|
||||
end
|
||||
|
||||
gem 'webpush', require: false
|
||||
gem 'colored2', require: false
|
||||
gem 'maxminddb'
|
||||
|
||||
gem 'rails_failover', require: false
|
||||
601
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile.lock
Normal file
601
pkgs/servers/web-apps/discourse/rubyEnv/Gemfile.lock
Normal file
|
|
@ -0,0 +1,601 @@
|
|||
GIT
|
||||
remote: https://github.com/discourse/mail.git
|
||||
revision: 5b700fc95ee66378e0cf2559abc73c8bc3062a4b
|
||||
specs:
|
||||
mail (2.8.0.edge)
|
||||
mini_mime (>= 0.1.1)
|
||||
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
actionmailer (6.1.4.7)
|
||||
actionpack (= 6.1.4.7)
|
||||
actionview (= 6.1.4.7)
|
||||
activejob (= 6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (6.1.4.7)
|
||||
actionview (= 6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
rack (~> 2.0, >= 2.0.9)
|
||||
rack-test (>= 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||
actionview (6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
builder (~> 3.1)
|
||||
erubi (~> 1.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
||||
actionview_precompiler (0.2.3)
|
||||
actionview (>= 6.0.a)
|
||||
active_model_serializers (0.8.4)
|
||||
activemodel (>= 3.0)
|
||||
activejob (6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
activerecord (6.1.4.7)
|
||||
activemodel (= 6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
activesupport (6.1.4.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 1.6, < 2)
|
||||
minitest (>= 5.1)
|
||||
tzinfo (~> 2.0)
|
||||
zeitwerk (~> 2.3)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
annotate (3.2.0)
|
||||
activerecord (>= 3.2, < 8.0)
|
||||
rake (>= 10.4, < 14.0)
|
||||
ast (2.4.2)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.516.0)
|
||||
aws-sdk-core (3.121.2)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.44.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.96.1)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-sns (1.46.0)
|
||||
aws-sdk-core (~> 3, >= 3.121.2)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.4.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
barber (0.12.2)
|
||||
ember-source (>= 1.0, < 3.1)
|
||||
execjs (>= 1.2, < 3)
|
||||
better_errors (2.9.1)
|
||||
coderay (>= 1.0.0)
|
||||
erubi (>= 1.0.0)
|
||||
rack (>= 0.9.0)
|
||||
binding_of_caller (1.0.0)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bootsnap (1.11.1)
|
||||
msgpack (~> 1.2)
|
||||
builder (3.2.4)
|
||||
bullet (7.0.1)
|
||||
activesupport (>= 3.0.0)
|
||||
uniform_notifier (~> 1.11)
|
||||
byebug (11.1.3)
|
||||
cbor (0.5.9.6)
|
||||
certified (1.0.0)
|
||||
chunky_png (1.4.0)
|
||||
coderay (1.1.3)
|
||||
colored2 (3.1.2)
|
||||
concurrent-ruby (1.1.10)
|
||||
connection_pool (2.2.5)
|
||||
cose (1.2.0)
|
||||
cbor (~> 0.5.9)
|
||||
openssl-signature_algorithm (~> 1.0)
|
||||
cppjieba_rb (0.4.2)
|
||||
crack (0.4.5)
|
||||
rexml
|
||||
crass (1.0.6)
|
||||
css_parser (1.11.0)
|
||||
addressable
|
||||
debug_inspector (1.1.0)
|
||||
diff-lcs (1.5.0)
|
||||
diffy (3.4.0)
|
||||
discourse-ember-rails (0.18.6)
|
||||
active_model_serializers
|
||||
ember-data-source (>= 1.0.0.beta.5)
|
||||
ember-handlebars-template (>= 0.1.1, < 1.0)
|
||||
ember-source (>= 1.1.0)
|
||||
jquery-rails (>= 1.0.17)
|
||||
railties (>= 3.1)
|
||||
discourse-ember-source (3.12.2.3)
|
||||
discourse-fonts (0.0.9)
|
||||
discourse_dev_assets (0.0.3)
|
||||
faker (~> 2.16)
|
||||
literate_randomizer
|
||||
docile (1.4.0)
|
||||
ecma-re-validator (0.4.0)
|
||||
regexp_parser (~> 2.2)
|
||||
email_reply_trimmer (0.1.13)
|
||||
ember-data-source (3.0.2)
|
||||
ember-source (>= 2, < 3.0)
|
||||
ember-handlebars-template (0.8.0)
|
||||
barber (>= 0.11.0)
|
||||
sprockets (>= 3.3, < 4.1)
|
||||
ember-source (2.18.2)
|
||||
erubi (1.10.0)
|
||||
excon (0.92.2)
|
||||
execjs (2.8.1)
|
||||
exifr (1.3.9)
|
||||
fabrication (2.28.0)
|
||||
faker (2.20.0)
|
||||
i18n (>= 1.8.11, < 2)
|
||||
fakeweb (1.3.0)
|
||||
faraday (1.10.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.0)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
faraday-retry (~> 1.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.3)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
fast_blank (1.0.1)
|
||||
fast_xs (0.8.0)
|
||||
fastimage (2.2.6)
|
||||
ffi (1.15.5)
|
||||
fspath (3.1.2)
|
||||
gc_tracer (1.5.1)
|
||||
globalid (1.0.0)
|
||||
activesupport (>= 5.0)
|
||||
guess_html_encoding (0.0.11)
|
||||
hana (1.3.7)
|
||||
hashdiff (1.0.1)
|
||||
hashie (5.0.0)
|
||||
highline (2.0.3)
|
||||
hkdf (0.3.0)
|
||||
htmlentities (4.3.4)
|
||||
http_accept_language (2.1.1)
|
||||
i18n (1.10.0)
|
||||
concurrent-ruby (~> 1.0)
|
||||
image_optim (0.31.1)
|
||||
exifr (~> 1.2, >= 1.2.2)
|
||||
fspath (~> 3.0)
|
||||
image_size (>= 1.5, < 4)
|
||||
in_threads (~> 1.3)
|
||||
progress (~> 3.0, >= 3.0.1)
|
||||
image_size (3.0.1)
|
||||
in_threads (1.6.0)
|
||||
ipaddr (1.2.4)
|
||||
jmespath (1.6.1)
|
||||
jquery-rails (4.4.0)
|
||||
rails-dom-testing (>= 1, < 3)
|
||||
railties (>= 4.2.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
json (2.6.1)
|
||||
json-schema (2.8.1)
|
||||
addressable (>= 2.4)
|
||||
json_schemer (0.2.20)
|
||||
ecma-re-validator (~> 0.3)
|
||||
hana (~> 1.3)
|
||||
regexp_parser (~> 2.0)
|
||||
uri_template (~> 0.7)
|
||||
jwt (2.3.0)
|
||||
kgio (2.11.4)
|
||||
libv8-node (16.10.0.0)
|
||||
listen (3.7.1)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
literate_randomizer (0.4.0)
|
||||
lograge (0.12.0)
|
||||
actionpack (>= 4)
|
||||
activesupport (>= 4)
|
||||
railties (>= 4)
|
||||
request_store (~> 1.0)
|
||||
logstash-event (1.2.02)
|
||||
logstash-logger (0.26.1)
|
||||
logstash-event (~> 1.2)
|
||||
logster (2.11.0)
|
||||
loofah (2.16.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
lru_redux (1.1.0)
|
||||
lz4-ruby (0.3.3)
|
||||
maxminddb (0.1.22)
|
||||
memory_profiler (1.0.0)
|
||||
message_bus (4.2.0)
|
||||
rack (>= 1.1.3)
|
||||
method_source (1.0.0)
|
||||
mini_mime (1.1.2)
|
||||
mini_portile2 (2.8.0)
|
||||
mini_racer (0.6.2)
|
||||
libv8-node (~> 16.10.0.0)
|
||||
mini_scheduler (0.13.0)
|
||||
sidekiq (>= 4.2.3)
|
||||
mini_sql (1.4.0)
|
||||
mini_suffix (0.3.3)
|
||||
ffi (~> 1.9)
|
||||
minitest (5.15.0)
|
||||
mocha (1.13.0)
|
||||
msgpack (1.5.1)
|
||||
multi_json (1.15.0)
|
||||
multi_xml (0.6.0)
|
||||
multipart-post (2.1.1)
|
||||
mustache (1.1.1)
|
||||
nio4r (2.5.8)
|
||||
nokogiri (1.13.4)
|
||||
mini_portile2 (~> 2.8.0)
|
||||
racc (~> 1.4)
|
||||
oauth (0.5.8)
|
||||
oauth2 (1.4.7)
|
||||
faraday (>= 0.8, < 2.0)
|
||||
jwt (>= 1.0, < 3.0)
|
||||
multi_json (~> 1.3)
|
||||
multi_xml (~> 0.5)
|
||||
rack (>= 1.2, < 3)
|
||||
oj (3.13.11)
|
||||
omniauth (1.9.1)
|
||||
hashie (>= 3.4.6)
|
||||
rack (>= 1.6.2, < 3)
|
||||
omniauth-facebook (9.0.0)
|
||||
omniauth-oauth2 (~> 1.2)
|
||||
omniauth-github (1.4.0)
|
||||
omniauth (~> 1.5)
|
||||
omniauth-oauth2 (>= 1.4.0, < 2.0)
|
||||
omniauth-google-oauth2 (0.8.2)
|
||||
jwt (>= 2.0)
|
||||
oauth2 (~> 1.1)
|
||||
omniauth (~> 1.1)
|
||||
omniauth-oauth2 (>= 1.6)
|
||||
omniauth-oauth (1.2.0)
|
||||
oauth
|
||||
omniauth (>= 1.0, < 3)
|
||||
omniauth-oauth2 (1.7.2)
|
||||
oauth2 (~> 1.4)
|
||||
omniauth (>= 1.9, < 3)
|
||||
omniauth-twitter (1.4.0)
|
||||
omniauth-oauth (~> 1.1)
|
||||
rack
|
||||
openssl (2.2.1)
|
||||
ipaddr
|
||||
openssl-signature_algorithm (1.1.1)
|
||||
openssl (~> 2.0)
|
||||
optimist (3.0.1)
|
||||
parallel (1.22.1)
|
||||
parallel_tests (3.8.1)
|
||||
parallel
|
||||
parser (3.1.2.0)
|
||||
ast (~> 2.4.1)
|
||||
pg (1.3.5)
|
||||
progress (3.6.0)
|
||||
pry (0.13.1)
|
||||
coderay (~> 1.1)
|
||||
method_source (~> 1.0)
|
||||
pry-byebug (3.9.0)
|
||||
byebug (~> 11.0)
|
||||
pry (~> 0.13.0)
|
||||
pry-rails (0.3.9)
|
||||
pry (>= 0.10.4)
|
||||
public_suffix (4.0.7)
|
||||
puma (5.6.4)
|
||||
nio4r (~> 2.0)
|
||||
r2 (0.2.7)
|
||||
racc (1.6.0)
|
||||
rack (2.2.3)
|
||||
rack-mini-profiler (3.0.0)
|
||||
rack (>= 1.2.0)
|
||||
rack-protection (2.2.0)
|
||||
rack
|
||||
rack-test (1.1.0)
|
||||
rack (>= 1.0, < 3)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.4.2)
|
||||
loofah (~> 2.3)
|
||||
rails_failover (0.8.1)
|
||||
activerecord (> 6.0, < 7.1)
|
||||
concurrent-ruby
|
||||
railties (> 6.0, < 7.1)
|
||||
rails_multisite (4.0.1)
|
||||
activerecord (> 5.0, < 7.1)
|
||||
railties (> 5.0, < 7.1)
|
||||
railties (6.1.4.7)
|
||||
actionpack (= 6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
method_source
|
||||
rake (>= 0.13)
|
||||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
raindrops (0.20.0)
|
||||
rake (13.0.6)
|
||||
rb-fsevent (0.11.1)
|
||||
rb-inotify (0.10.1)
|
||||
ffi (~> 1.0)
|
||||
rbtrace (0.4.14)
|
||||
ffi (>= 1.0.6)
|
||||
msgpack (>= 0.4.3)
|
||||
optimist (>= 3.0.0)
|
||||
rchardet (1.8.0)
|
||||
redis (4.5.1)
|
||||
redis-namespace (1.8.2)
|
||||
redis (>= 3.0.4)
|
||||
regexp_parser (2.3.0)
|
||||
request_store (1.5.1)
|
||||
rack (>= 1.4)
|
||||
rexml (3.2.5)
|
||||
rinku (2.0.6)
|
||||
rotp (6.2.0)
|
||||
rqrcode (2.1.1)
|
||||
chunky_png (~> 1.0)
|
||||
rqrcode_core (~> 1.0)
|
||||
rqrcode_core (1.2.0)
|
||||
rspec (3.11.0)
|
||||
rspec-core (~> 3.11.0)
|
||||
rspec-expectations (~> 3.11.0)
|
||||
rspec-mocks (~> 3.11.0)
|
||||
rspec-core (3.11.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-expectations (3.11.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-html-matchers (0.9.4)
|
||||
nokogiri (~> 1)
|
||||
rspec (>= 3.0.0.a, < 4)
|
||||
rspec-mocks (3.11.1)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.11.0)
|
||||
rspec-rails (5.1.1)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
railties (>= 5.2)
|
||||
rspec-core (~> 3.10)
|
||||
rspec-expectations (~> 3.10)
|
||||
rspec-mocks (~> 3.10)
|
||||
rspec-support (~> 3.10)
|
||||
rspec-support (3.11.0)
|
||||
rss (0.2.9)
|
||||
rexml
|
||||
rswag-specs (2.5.1)
|
||||
activesupport (>= 3.1, < 7.1)
|
||||
json-schema (~> 2.2)
|
||||
railties (>= 3.1, < 7.1)
|
||||
rtlit (0.0.5)
|
||||
rubocop (1.27.0)
|
||||
parallel (~> 1.10)
|
||||
parser (>= 3.1.0.0)
|
||||
rainbow (>= 2.2.2, < 4.0)
|
||||
regexp_parser (>= 1.8, < 3.0)
|
||||
rexml
|
||||
rubocop-ast (>= 1.16.0, < 2.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (>= 1.4.0, < 3.0)
|
||||
rubocop-ast (1.17.0)
|
||||
parser (>= 3.1.1.0)
|
||||
rubocop-discourse (2.5.0)
|
||||
rubocop (>= 1.1.0)
|
||||
rubocop-rspec (>= 2.0.0)
|
||||
rubocop-rspec (2.9.0)
|
||||
rubocop (~> 1.19)
|
||||
ruby-prof (1.4.3)
|
||||
ruby-progressbar (1.11.0)
|
||||
ruby-readability (0.7.0)
|
||||
guess_html_encoding (>= 0.0.4)
|
||||
nokogiri (>= 1.6.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
sanitize (6.0.0)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
sassc (2.0.1)
|
||||
ffi (~> 1.9)
|
||||
rake
|
||||
sassc-rails (2.1.2)
|
||||
railties (>= 4.0.0)
|
||||
sassc (>= 2.0)
|
||||
sprockets (> 3.0)
|
||||
sprockets-rails
|
||||
tilt
|
||||
seed-fu (2.3.9)
|
||||
activerecord (>= 3.1)
|
||||
activesupport (>= 3.1)
|
||||
shoulda-matchers (5.1.0)
|
||||
activesupport (>= 5.2.0)
|
||||
sidekiq (6.4.1)
|
||||
connection_pool (>= 2.2.2)
|
||||
rack (~> 2.0)
|
||||
redis (>= 4.2.0)
|
||||
simplecov (0.21.2)
|
||||
docile (~> 1.1)
|
||||
simplecov-html (~> 0.11)
|
||||
simplecov_json_formatter (~> 0.1)
|
||||
simplecov-html (0.12.3)
|
||||
simplecov_json_formatter (0.1.4)
|
||||
sprockets (4.0.3)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.4.2)
|
||||
actionpack (>= 5.2)
|
||||
activesupport (>= 5.2)
|
||||
sprockets (>= 3.0.0)
|
||||
sshkey (2.0.0)
|
||||
stackprof (0.2.19)
|
||||
test-prof (1.0.8)
|
||||
thor (1.2.1)
|
||||
tilt (2.0.10)
|
||||
tzinfo (2.0.4)
|
||||
concurrent-ruby (~> 1.0)
|
||||
uglifier (4.2.0)
|
||||
execjs (>= 0.3.0, < 3)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8.1)
|
||||
unicode-display_width (2.1.0)
|
||||
unicorn (6.1.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
uniform_notifier (1.16.0)
|
||||
uri_template (0.7.0)
|
||||
webmock (3.14.0)
|
||||
addressable (>= 2.8.0)
|
||||
crack (>= 0.3.2)
|
||||
hashdiff (>= 0.4.0, < 2.0.0)
|
||||
webpush (1.1.0)
|
||||
hkdf (~> 0.2)
|
||||
jwt (~> 2.0)
|
||||
xorcist (1.1.2)
|
||||
yaml-lint (0.0.10)
|
||||
zeitwerk (2.5.4)
|
||||
|
||||
PLATFORMS
|
||||
ruby
|
||||
|
||||
DEPENDENCIES
|
||||
actionmailer (= 6.1.4.7)
|
||||
actionpack (= 6.1.4.7)
|
||||
actionview (= 6.1.4.7)
|
||||
actionview_precompiler
|
||||
active_model_serializers (~> 0.8.3)
|
||||
activemodel (= 6.1.4.7)
|
||||
activerecord (= 6.1.4.7)
|
||||
activesupport (= 6.1.4.7)
|
||||
addressable
|
||||
annotate
|
||||
aws-sdk-s3
|
||||
aws-sdk-sns
|
||||
barber
|
||||
better_errors
|
||||
binding_of_caller
|
||||
bootsnap
|
||||
bullet
|
||||
byebug
|
||||
cbor
|
||||
certified
|
||||
colored2
|
||||
cose
|
||||
cppjieba_rb
|
||||
css_parser
|
||||
diffy
|
||||
discourse-ember-rails (= 0.18.6)
|
||||
discourse-ember-source (~> 3.12.2)
|
||||
discourse-fonts
|
||||
discourse_dev_assets
|
||||
email_reply_trimmer
|
||||
ember-handlebars-template (= 0.8.0)
|
||||
excon
|
||||
execjs
|
||||
fabrication
|
||||
faker (~> 2.16)
|
||||
fakeweb
|
||||
fast_blank
|
||||
fast_xs
|
||||
fastimage
|
||||
gc_tracer
|
||||
highline
|
||||
htmlentities
|
||||
http_accept_language
|
||||
image_optim
|
||||
json
|
||||
json_schemer
|
||||
listen
|
||||
lograge
|
||||
logstash-event
|
||||
logstash-logger
|
||||
logster
|
||||
loofah
|
||||
lru_redux
|
||||
lz4-ruby
|
||||
mail!
|
||||
maxminddb
|
||||
memory_profiler
|
||||
message_bus
|
||||
mini_mime
|
||||
mini_racer
|
||||
mini_scheduler
|
||||
mini_sql
|
||||
mini_suffix
|
||||
minitest
|
||||
mocha
|
||||
multi_json
|
||||
mustache
|
||||
nokogiri
|
||||
oj
|
||||
omniauth
|
||||
omniauth-facebook
|
||||
omniauth-github
|
||||
omniauth-google-oauth2
|
||||
omniauth-oauth2
|
||||
omniauth-twitter
|
||||
parallel_tests
|
||||
pg
|
||||
pry-byebug
|
||||
pry-rails
|
||||
puma
|
||||
r2
|
||||
rack
|
||||
rack-mini-profiler
|
||||
rack-protection
|
||||
rails_failover
|
||||
rails_multisite
|
||||
railties (= 6.1.4.7)
|
||||
rake
|
||||
rb-fsevent
|
||||
rbtrace
|
||||
rchardet
|
||||
redis
|
||||
redis-namespace
|
||||
rinku
|
||||
rotp
|
||||
rqrcode
|
||||
rspec
|
||||
rspec-html-matchers
|
||||
rspec-rails
|
||||
rss
|
||||
rswag-specs
|
||||
rtlit
|
||||
rubocop-discourse
|
||||
ruby-prof
|
||||
ruby-readability
|
||||
rubyzip
|
||||
sanitize
|
||||
sassc (= 2.0.1)
|
||||
sassc-rails
|
||||
seed-fu
|
||||
shoulda-matchers
|
||||
sidekiq
|
||||
simplecov
|
||||
sprockets
|
||||
sprockets-rails
|
||||
sshkey
|
||||
stackprof
|
||||
test-prof
|
||||
thor
|
||||
uglifier
|
||||
unf
|
||||
unicorn
|
||||
webmock
|
||||
webpush
|
||||
xorcist
|
||||
yaml-lint
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.9
|
||||
2441
pkgs/servers/web-apps/discourse/rubyEnv/gemset.nix
Normal file
2441
pkgs/servers/web-apps/discourse/rubyEnv/gemset.nix
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,25 @@
|
|||
diff --git a/config/unicorn.conf.rb b/config/unicorn.conf.rb
|
||||
index e69979adfe..68cb04a036 100644
|
||||
--- a/config/unicorn.conf.rb
|
||||
+++ b/config/unicorn.conf.rb
|
||||
@@ -27,18 +27,10 @@ pid (ENV["UNICORN_PID_PATH"] || "#{discourse_path}/tmp/pids/unicorn.pid")
|
||||
|
||||
if ENV["RAILS_ENV"] != "production"
|
||||
logger Logger.new(STDOUT)
|
||||
- # we want a longer timeout in dev cause first request can be really slow
|
||||
- timeout (ENV["UNICORN_TIMEOUT"] && ENV["UNICORN_TIMEOUT"].to_i || 60)
|
||||
-else
|
||||
- # By default, the Unicorn logger will write to stderr.
|
||||
- # Additionally, some applications/frameworks log to stderr or stdout,
|
||||
- # so prevent them from going to /dev/null when daemonized here:
|
||||
- stderr_path "#{discourse_path}/log/unicorn.stderr.log"
|
||||
- stdout_path "#{discourse_path}/log/unicorn.stdout.log"
|
||||
- # nuke workers after 30 seconds instead of 60 seconds (the default)
|
||||
- timeout 30
|
||||
end
|
||||
|
||||
+timeout (ENV["UNICORN_TIMEOUT"] && ENV["UNICORN_TIMEOUT"].to_i || 60)
|
||||
+
|
||||
# important for Ruby 2.0
|
||||
preload_app true
|
||||
|
||||
436
pkgs/servers/web-apps/discourse/update.py
Executable file
436
pkgs/servers/web-apps/discourse/update.py
Executable file
|
|
@ -0,0 +1,436 @@
|
|||
#!/usr/bin/env nix-shell
|
||||
#! nix-shell -i python3 -p bundix bundler nix-update nix-universal-prefetch python3 python3Packages.requests python3Packages.click python3Packages.click-log prefetch-yarn-deps
|
||||
from __future__ import annotations
|
||||
|
||||
import click
|
||||
import click_log
|
||||
import shutil
|
||||
import tempfile
|
||||
import re
|
||||
import logging
|
||||
import subprocess
|
||||
import os
|
||||
import stat
|
||||
import json
|
||||
import requests
|
||||
import textwrap
|
||||
from functools import total_ordering
|
||||
from distutils.version import LooseVersion
|
||||
from itertools import zip_longest
|
||||
from pathlib import Path
|
||||
from typing import Union, Iterable
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@total_ordering
|
||||
class DiscourseVersion:
|
||||
"""Represents a Discourse style version number and git tag.
|
||||
|
||||
This takes either a tag or version string as input and
|
||||
extrapolates the other. Sorting is implemented to work as expected
|
||||
in regard to A.B.C.betaD version numbers - 2.0.0.beta1 is
|
||||
considered lower than 2.0.0.
|
||||
|
||||
"""
|
||||
|
||||
tag: str = ""
|
||||
version: str = ""
|
||||
split_version: Iterable[Union[None, int, str]] = []
|
||||
|
||||
def __init__(self, version: str):
|
||||
"""Take either a tag or version number, calculate the other."""
|
||||
if version.startswith('v'):
|
||||
self.tag = version
|
||||
self.version = version.lstrip('v')
|
||||
else:
|
||||
self.tag = 'v' + version
|
||||
self.version = version
|
||||
self.split_version = LooseVersion(self.version).version
|
||||
|
||||
def __eq__(self, other: DiscourseVersion):
|
||||
"""Versions are equal when their individual parts are."""
|
||||
return self.split_version == other.split_version
|
||||
|
||||
def __gt__(self, other: DiscourseVersion):
|
||||
"""Check if this version is greater than the other.
|
||||
|
||||
Goes through the parts of the version numbers from most to
|
||||
least significant, only continuing on to the next if the
|
||||
numbers are equal and no decision can be made. If one version
|
||||
ends in 'betaX' and the other doesn't, all else being equal,
|
||||
the one without 'betaX' is considered greater, since it's the
|
||||
release version.
|
||||
|
||||
"""
|
||||
for (this_ver, other_ver) in zip_longest(self.split_version, other.split_version):
|
||||
if this_ver == other_ver:
|
||||
continue
|
||||
if type(this_ver) is int and type(other_ver) is int:
|
||||
return this_ver > other_ver
|
||||
elif 'beta' in [this_ver, other_ver]:
|
||||
# release version (None) is greater than beta
|
||||
return this_ver is None
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class DiscourseRepo:
|
||||
version_regex = re.compile(r'^v\d+\.\d+\.\d+(\.beta\d+)?$')
|
||||
_latest_commit_sha = None
|
||||
|
||||
def __init__(self, owner: str = 'discourse', repo: str = 'discourse'):
|
||||
self.owner = owner
|
||||
self.repo = repo
|
||||
|
||||
@property
|
||||
def versions(self) -> Iterable[str]:
|
||||
r = requests.get(f'https://api.github.com/repos/{self.owner}/{self.repo}/git/refs/tags').json()
|
||||
tags = [x['ref'].replace('refs/tags/', '') for x in r]
|
||||
|
||||
# filter out versions not matching version_regex
|
||||
versions = filter(self.version_regex.match, tags)
|
||||
versions = [DiscourseVersion(x) for x in versions]
|
||||
versions.sort(reverse=True)
|
||||
return versions
|
||||
|
||||
@property
|
||||
def latest_commit_sha(self) -> str:
|
||||
if self._latest_commit_sha is None:
|
||||
r = requests.get(f'https://api.github.com/repos/{self.owner}/{self.repo}/commits?per_page=1')
|
||||
r.raise_for_status()
|
||||
self._latest_commit_sha = r.json()[0]['sha']
|
||||
|
||||
return self._latest_commit_sha
|
||||
|
||||
def get_yarn_lock_hash(self, rev: str):
|
||||
yarnLockText = self.get_file('app/assets/javascripts/yarn.lock', rev)
|
||||
with tempfile.NamedTemporaryFile(mode='w') as lockFile:
|
||||
lockFile.write(yarnLockText)
|
||||
return subprocess.check_output(['prefetch-yarn-deps', lockFile.name]).decode('utf-8').strip()
|
||||
|
||||
def get_file(self, filepath, rev):
|
||||
"""Return file contents at a given rev.
|
||||
|
||||
:param str filepath: the path to the file, relative to the repo root
|
||||
:param str rev: the rev to fetch at :return:
|
||||
|
||||
"""
|
||||
r = requests.get(f'https://raw.githubusercontent.com/{self.owner}/{self.repo}/{rev}/{filepath}')
|
||||
r.raise_for_status()
|
||||
return r.text
|
||||
|
||||
|
||||
def _call_nix_update(pkg, version):
|
||||
"""Call nix-update from nixpkgs root dir."""
|
||||
nixpkgs_path = Path(__file__).parent / '../../../../'
|
||||
return subprocess.check_output(['nix-update', pkg, '--version', version], cwd=nixpkgs_path)
|
||||
|
||||
|
||||
def _nix_eval(expr: str):
|
||||
nixpkgs_path = Path(__file__).parent / '../../../../'
|
||||
try:
|
||||
output = subprocess.check_output(['nix-instantiate', '--strict', '--json', '--eval', '-E', f'(with import {nixpkgs_path} {{}}; {expr})'], text=True)
|
||||
except subprocess.CalledProcessError:
|
||||
return None
|
||||
return json.loads(output)
|
||||
|
||||
|
||||
def _get_current_package_version(pkg: str):
|
||||
return _nix_eval(f'{pkg}.version')
|
||||
|
||||
|
||||
def _diff_file(filepath: str, old_version: DiscourseVersion, new_version: DiscourseVersion):
|
||||
repo = DiscourseRepo()
|
||||
|
||||
current_dir = Path(__file__).parent
|
||||
|
||||
old = repo.get_file(filepath, old_version.tag)
|
||||
new = repo.get_file(filepath, new_version.tag)
|
||||
|
||||
if old == new:
|
||||
click.secho(f'{filepath} is unchanged', fg='green')
|
||||
return
|
||||
|
||||
with tempfile.NamedTemporaryFile(mode='w') as o, tempfile.NamedTemporaryFile(mode='w') as n:
|
||||
o.write(old), n.write(new)
|
||||
width = shutil.get_terminal_size((80, 20)).columns
|
||||
diff_proc = subprocess.run(
|
||||
['diff', '--color=always', f'--width={width}', '-y', o.name, n.name],
|
||||
stdout=subprocess.PIPE,
|
||||
cwd=current_dir,
|
||||
text=True
|
||||
)
|
||||
|
||||
click.secho(f'Diff for {filepath} ({old_version.version} -> {new_version.version}):', fg='bright_blue', bold=True)
|
||||
click.echo(diff_proc.stdout + '\n')
|
||||
return
|
||||
|
||||
|
||||
def _remove_platforms(rubyenv_dir: Path):
|
||||
for platform in ['arm64-darwin-20', 'x86_64-darwin-18',
|
||||
'x86_64-darwin-19', 'x86_64-darwin-20',
|
||||
'x86_64-linux', 'aarch64-linux']:
|
||||
with open(rubyenv_dir / 'Gemfile.lock', 'r') as f:
|
||||
for line in f:
|
||||
if platform in line:
|
||||
subprocess.check_output(
|
||||
['bundle', 'lock', '--remove-platform', platform], cwd=rubyenv_dir)
|
||||
break
|
||||
|
||||
|
||||
@click_log.simple_verbosity_option(logger)
|
||||
|
||||
|
||||
@click.group()
|
||||
def cli():
|
||||
pass
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('rev', default='latest')
|
||||
@click.option('--reverse/--no-reverse', default=False, help='Print diffs from REV to current.')
|
||||
def print_diffs(rev, reverse):
|
||||
"""Print out diffs for files used as templates for the NixOS module.
|
||||
|
||||
The current package version found in the nixpkgs worktree the
|
||||
script is run from will be used to download the "from" file and
|
||||
REV used to download the "to" file for the diff, unless the
|
||||
'--reverse' flag is specified.
|
||||
|
||||
REV should be the git rev to find changes in ('vX.Y.Z') or
|
||||
'latest'; defaults to 'latest'.
|
||||
|
||||
"""
|
||||
if rev == 'latest':
|
||||
repo = DiscourseRepo()
|
||||
rev = repo.versions[0].tag
|
||||
|
||||
old_version = DiscourseVersion(_get_current_package_version('discourse'))
|
||||
new_version = DiscourseVersion(rev)
|
||||
|
||||
if reverse:
|
||||
old_version, new_version = new_version, old_version
|
||||
|
||||
for f in ['config/nginx.sample.conf', 'config/discourse_defaults.conf']:
|
||||
_diff_file(f, old_version, new_version)
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('rev', default='latest')
|
||||
def update(rev):
|
||||
"""Update gem files and version.
|
||||
|
||||
REV: the git rev to update to ('vX.Y.Z[.betaA]') or
|
||||
'latest'; defaults to 'latest'.
|
||||
|
||||
"""
|
||||
repo = DiscourseRepo()
|
||||
|
||||
if rev == 'latest':
|
||||
version = repo.versions[0]
|
||||
else:
|
||||
version = DiscourseVersion(rev)
|
||||
|
||||
logger.debug(f"Using rev {version.tag}")
|
||||
logger.debug(f"Using version {version.version}")
|
||||
|
||||
rubyenv_dir = Path(__file__).parent / "rubyEnv"
|
||||
|
||||
for fn in ['Gemfile.lock', 'Gemfile']:
|
||||
with open(rubyenv_dir / fn, 'w') as f:
|
||||
f.write(repo.get_file(fn, version.tag))
|
||||
|
||||
subprocess.check_output(['bundle', 'lock'], cwd=rubyenv_dir)
|
||||
_remove_platforms(rubyenv_dir)
|
||||
subprocess.check_output(['bundix'], cwd=rubyenv_dir)
|
||||
|
||||
_call_nix_update('discourse', version.version)
|
||||
|
||||
old_yarn_hash = _nix_eval('discourse.assets.yarnOfflineCache.outputHash')
|
||||
new_yarn_hash = repo.get_yarn_lock_hash(version.tag)
|
||||
click.echo(f"Updating yarn lock hash, {old_yarn_hash} -> {new_yarn_hash}")
|
||||
with open(Path(__file__).parent / "default.nix", 'r+') as f:
|
||||
content = f.read()
|
||||
content = content.replace(old_yarn_hash, new_yarn_hash)
|
||||
f.seek(0)
|
||||
f.write(content)
|
||||
f.truncate()
|
||||
|
||||
|
||||
@cli.command()
|
||||
@click.argument('rev', default='latest')
|
||||
def update_mail_receiver(rev):
|
||||
"""Update discourse-mail-receiver.
|
||||
|
||||
REV: the git rev to update to ('vX.Y.Z') or 'latest'; defaults to
|
||||
'latest'.
|
||||
|
||||
"""
|
||||
repo = DiscourseRepo(repo="mail-receiver")
|
||||
|
||||
if rev == 'latest':
|
||||
version = repo.versions[0]
|
||||
else:
|
||||
version = DiscourseVersion(rev)
|
||||
|
||||
_call_nix_update('discourse-mail-receiver', version.version)
|
||||
|
||||
|
||||
@cli.command()
|
||||
def update_plugins():
|
||||
"""Update plugins to their latest revision."""
|
||||
plugins = [
|
||||
{'name': 'discourse-assign'},
|
||||
{'name': 'discourse-calendar'},
|
||||
{'name': 'discourse-canned-replies'},
|
||||
{'name': 'discourse-chat-integration'},
|
||||
{'name': 'discourse-checklist'},
|
||||
{'name': 'discourse-data-explorer'},
|
||||
{'name': 'discourse-docs'},
|
||||
{'name': 'discourse-github'},
|
||||
{'name': 'discourse-ldap-auth', 'owner': 'jonmbake'},
|
||||
{'name': 'discourse-math'},
|
||||
{'name': 'discourse-migratepassword', 'owner': 'discoursehosting'},
|
||||
{'name': 'discourse-prometheus'},
|
||||
{'name': 'discourse-openid-connect'},
|
||||
{'name': 'discourse-saved-searches'},
|
||||
{'name': 'discourse-solved'},
|
||||
{'name': 'discourse-spoiler-alert'},
|
||||
{'name': 'discourse-voting'},
|
||||
{'name': 'discourse-yearly-review'},
|
||||
]
|
||||
|
||||
for plugin in plugins:
|
||||
fetcher = plugin.get('fetcher') or "fetchFromGitHub"
|
||||
owner = plugin.get('owner') or "discourse"
|
||||
name = plugin.get('name')
|
||||
repo_name = plugin.get('repo_name') or name
|
||||
|
||||
repo = DiscourseRepo(owner=owner, repo=repo_name)
|
||||
|
||||
# implement the plugin pinning algorithm laid out here:
|
||||
# https://meta.discourse.org/t/pinning-plugin-and-theme-versions-for-older-discourse-installs/156971
|
||||
# this makes sure we don't upgrade plugins to revisions that
|
||||
# are incompatible with the packaged Discourse version
|
||||
try:
|
||||
compatibility_spec = repo.get_file('.discourse-compatibility', repo.latest_commit_sha)
|
||||
versions = [(DiscourseVersion(discourse_version), plugin_rev.strip(' '))
|
||||
for [discourse_version, plugin_rev]
|
||||
in [line.split(':')
|
||||
for line
|
||||
in compatibility_spec.splitlines()]]
|
||||
discourse_version = DiscourseVersion(_get_current_package_version('discourse'))
|
||||
versions = list(filter(lambda ver: ver[0] >= discourse_version, versions))
|
||||
if versions == []:
|
||||
rev = repo.latest_commit_sha
|
||||
else:
|
||||
rev = versions[0][1]
|
||||
print(rev)
|
||||
except requests.exceptions.HTTPError:
|
||||
rev = repo.latest_commit_sha
|
||||
|
||||
filename = _nix_eval(f'builtins.unsafeGetAttrPos "src" discourse.plugins.{name}')
|
||||
if filename is None:
|
||||
filename = Path(__file__).parent / 'plugins' / name / 'default.nix'
|
||||
filename.parent.mkdir()
|
||||
|
||||
has_ruby_deps = False
|
||||
for line in repo.get_file('plugin.rb', rev).splitlines():
|
||||
if 'gem ' in line:
|
||||
has_ruby_deps = True
|
||||
break
|
||||
|
||||
with open(filename, 'w') as f:
|
||||
f.write(textwrap.dedent(f"""
|
||||
{{ lib, mkDiscoursePlugin, fetchFromGitHub }}:
|
||||
|
||||
mkDiscoursePlugin {{
|
||||
name = "{name}";"""[1:] + ("""
|
||||
bundlerEnvArgs.gemdir = ./.;""" if has_ruby_deps else "") + f"""
|
||||
src = {fetcher} {{
|
||||
owner = "{owner}";
|
||||
repo = "{repo_name}";
|
||||
rev = "replace-with-git-rev";
|
||||
sha256 = "replace-with-sha256";
|
||||
}};
|
||||
meta = with lib; {{
|
||||
homepage = "";
|
||||
maintainers = with maintainers; [ ];
|
||||
license = licenses.mit; # change to the correct license!
|
||||
description = "";
|
||||
}};
|
||||
}}"""))
|
||||
|
||||
all_plugins_filename = Path(__file__).parent / 'plugins' / 'all-plugins.nix'
|
||||
with open(all_plugins_filename, 'r+') as f:
|
||||
content = f.read()
|
||||
pos = -1
|
||||
while content[pos] != '}':
|
||||
pos -= 1
|
||||
content = content[:pos] + f' {name} = callPackage ./{name} {{}};' + os.linesep + content[pos:]
|
||||
f.seek(0)
|
||||
f.write(content)
|
||||
f.truncate()
|
||||
|
||||
else:
|
||||
filename = filename['file']
|
||||
|
||||
prev_commit_sha = _nix_eval(f'discourse.plugins.{name}.src.rev')
|
||||
|
||||
if prev_commit_sha == rev:
|
||||
click.echo(f'Plugin {name} is already at the latest revision')
|
||||
continue
|
||||
|
||||
prev_hash = _nix_eval(f'discourse.plugins.{name}.src.outputHash')
|
||||
new_hash = subprocess.check_output([
|
||||
'nix-universal-prefetch', fetcher,
|
||||
'--owner', owner,
|
||||
'--repo', repo_name,
|
||||
'--rev', rev,
|
||||
], text=True).strip("\n")
|
||||
|
||||
click.echo(f"Update {name}, {prev_commit_sha} -> {rev} in {filename}")
|
||||
|
||||
with open(filename, 'r+') as f:
|
||||
content = f.read()
|
||||
content = content.replace(prev_commit_sha, rev)
|
||||
content = content.replace(prev_hash, new_hash)
|
||||
f.seek(0)
|
||||
f.write(content)
|
||||
f.truncate()
|
||||
|
||||
rubyenv_dir = Path(filename).parent
|
||||
gemfile = rubyenv_dir / "Gemfile"
|
||||
version_file_regex = re.compile(r'.*File\.expand_path\("\.\./(.*)", __FILE__\)')
|
||||
gemfile_text = ''
|
||||
for line in repo.get_file('plugin.rb', rev).splitlines():
|
||||
if 'gem ' in line:
|
||||
gemfile_text = gemfile_text + line + os.linesep
|
||||
|
||||
version_file_match = version_file_regex.match(line)
|
||||
if version_file_match is not None:
|
||||
filename = version_file_match.groups()[0]
|
||||
content = repo.get_file(filename, rev)
|
||||
with open(rubyenv_dir / filename, 'w') as f:
|
||||
f.write(content)
|
||||
|
||||
if len(gemfile_text) > 0:
|
||||
if os.path.isfile(gemfile):
|
||||
os.remove(gemfile)
|
||||
|
||||
subprocess.check_output(['bundle', 'init'], cwd=rubyenv_dir)
|
||||
os.chmod(gemfile, stat.S_IREAD | stat.S_IWRITE | stat.S_IRGRP | stat.S_IROTH)
|
||||
|
||||
with open(gemfile, 'a') as f:
|
||||
f.write(gemfile_text)
|
||||
|
||||
subprocess.check_output(['bundle', 'lock', '--add-platform', 'ruby'], cwd=rubyenv_dir)
|
||||
subprocess.check_output(['bundle', 'lock', '--update'], cwd=rubyenv_dir)
|
||||
_remove_platforms(rubyenv_dir)
|
||||
subprocess.check_output(['bundix'], cwd=rubyenv_dir)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
cli()
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
diff --git a/lib/discourse.rb b/lib/discourse.rb
|
||||
index ea2a3cbafd..66454d9157 100644
|
||||
--- a/lib/discourse.rb
|
||||
+++ b/lib/discourse.rb
|
||||
@@ -62,7 +62,7 @@ module Discourse
|
||||
fd.fsync()
|
||||
end
|
||||
|
||||
- File.rename(temp_destination, destination)
|
||||
+ FileUtils.mv(temp_destination, destination)
|
||||
|
||||
nil
|
||||
end
|
||||
@@ -76,7 +76,7 @@ module Discourse
|
||||
FileUtils.mkdir_p(File.join(Rails.root, 'tmp'))
|
||||
temp_destination = File.join(Rails.root, 'tmp', SecureRandom.hex)
|
||||
execute_command('ln', '-s', source, temp_destination)
|
||||
- File.rename(temp_destination, destination)
|
||||
+ FileUtils.mv(temp_destination, destination)
|
||||
|
||||
nil
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue