From 2bb95a06a9a82f1e37a230ca9cd387a7e68b10c1 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 13 Nov 2013 17:43:35 +1100 Subject: [PATCH] initial commit for docker manager --- app/assets/javascripts/docker_manager.js | 0 .../docker_manager/admin_controller.rb | 10 +++ .../docker_manager/application_controller.rb | 15 +++++ .../docker_manager/admin/_git_status.html.erb | 10 +++ app/views/docker_manager/admin/index.html.erb | 22 ++++++ config/routes.rb | 3 + lib/docker_manager/git_repo.rb | 67 +++++++++++++++++++ plugin.rb | 20 ++++++ 8 files changed, 147 insertions(+) create mode 100644 app/assets/javascripts/docker_manager.js create mode 100644 app/controllers/docker_manager/admin_controller.rb create mode 100644 app/controllers/docker_manager/application_controller.rb create mode 100644 app/views/docker_manager/admin/_git_status.html.erb create mode 100644 app/views/docker_manager/admin/index.html.erb create mode 100644 config/routes.rb create mode 100644 lib/docker_manager/git_repo.rb create mode 100644 plugin.rb diff --git a/app/assets/javascripts/docker_manager.js b/app/assets/javascripts/docker_manager.js new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/docker_manager/admin_controller.rb b/app/controllers/docker_manager/admin_controller.rb new file mode 100644 index 0000000..a311c8d --- /dev/null +++ b/app/controllers/docker_manager/admin_controller.rb @@ -0,0 +1,10 @@ +module DockerManager + class AdminController < DockerManager::ApplicationController + layout nil + + def index + require_dependency 'docker_manager/git_repo' + @main_repo = DockerManager::GitRepo.new(Rails.root) + end + end +end diff --git a/app/controllers/docker_manager/application_controller.rb b/app/controllers/docker_manager/application_controller.rb new file mode 100644 index 0000000..47d8fd0 --- /dev/null +++ b/app/controllers/docker_manager/application_controller.rb @@ -0,0 +1,15 @@ +module DockerManager + class ApplicationController < ActionController::Base + + include CurrentUser + + before_filter :ensure_admin + + protected + + def ensure_admin + raise Discourse::InvalidAccess.new unless current_user.admin? + end + + end +end diff --git a/app/views/docker_manager/admin/_git_status.html.erb b/app/views/docker_manager/admin/_git_status.html.erb new file mode 100644 index 0000000..eb615dd --- /dev/null +++ b/app/views/docker_manager/admin/_git_status.html.erb @@ -0,0 +1,10 @@ +<% if repo.valid? %> + Current version: <%= repo.latest_local_commit %> (<%= time_ago_in_words repo.latest_local_commit_date %> ago), + Remote version: <%= repo.latest_origin_commit %> (<%= time_ago_in_words repo.latest_origin_commit_date %> ago) + <% if repo.commits_behind > 0 %> + commits behind: <%= repo.commits_behind %> + + <% end %> +<% else %> + Not under source control. +<% end %> diff --git a/app/views/docker_manager/admin/index.html.erb b/app/views/docker_manager/admin/index.html.erb new file mode 100644 index 0000000..fd38ec4 --- /dev/null +++ b/app/views/docker_manager/admin/index.html.erb @@ -0,0 +1,22 @@ + + +

Discourse

+

+<%= render partial: 'git_status', locals: {repo: @main_repo} %> +

+ +

Plugins

+ + +

Processes

+ +

Log

+ + diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..41c298c --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +DockerManager::Engine.routes.draw do + get "admin/docker" => "admin#index" +end diff --git a/lib/docker_manager/git_repo.rb b/lib/docker_manager/git_repo.rb new file mode 100644 index 0000000..bb60222 --- /dev/null +++ b/lib/docker_manager/git_repo.rb @@ -0,0 +1,67 @@ +# like Grit just very very minimal +class DockerManager::GitRepo + attr_reader :path + + def initialize(path) + @path = path + @memoize = {} + end + + def valid? + File.directory?("#{path}/.git") + end + + def latest_local_commit + run "rev-parse --short HEAD" + end + + def latest_origin_commit + run "rev-parse --short #{tracking_branch}" + end + + def latest_origin_commit_date + commit_date(latest_origin_commit) + end + + def latest_local_commit_date + commit_date(latest_local_commit) + end + + def commits_behind + run("rev-list --count #{tracking_branch}..HEAD").to_i + end + + def url + url = run "config --get remote.origin.url" + if url =~ /^git/ + # hack so it works with git urls + url = "https://github.com/#{url.split(":")[1]}" + end + end + + protected + + def commit_date(commit) + unix_timestamp = run('show -s --format="%ct" ' << commit).to_i + Time.at(unix_timestamp).to_datetime + end + + def tracking_branch + run "for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)" + end + + def ensure_updated + @updated ||= Thread.new do + # this is a very slow operation, make it async + `cd #{path} && git remote update` + end + end + + def run(cmd) + ensure_updated + @memoize[cmd] ||= `cd #{path} && git #{cmd}`.strip + rescue => e + p e + end + +end diff --git a/plugin.rb b/plugin.rb new file mode 100644 index 0000000..5b05510 --- /dev/null +++ b/plugin.rb @@ -0,0 +1,20 @@ +# name: docker_manager +# about: Docker manager for Discourse image +# version: 0.1 +# authors: Sam Saffron + +module ::DockerManager + class Engine < ::Rails::Engine + engine_name "docker_manager" + isolate_namespace DockerManager + end +end + +Rails.configuration.assets.precompile += ['docker_manager.js'] + +after_initialize do + + Discourse::Application.routes.append do + mount ::DockerManager::Engine, at: "/" + end +end