module Smeagol::Console
Console
encapsulates all the public methods smeagol is likely to need, generally it maps to all the CLI
commands.
Attributes
Local directory to house wiki repo.
The wiki git url.
Public Instance Methods
Run the auto update process.
# File lib/smeagol/console.rb, line 238 def auto_update(server_config) return unless server_config.auto_update Thread.new do while true do sleep 86400 server_config.repositories.each do |repository| next unless repository.auto_update? out = repository.update out = out[1] if Array === out if out.index('Already up-to-date').nil? $stderr.puts "== Repository updated at #{Time.new()} : #{repository.path} ==" end end end end end
Setup trap signals.
# File lib/smeagol/console.rb, line 218 def catch_signals Signal.trap('TERM') do Process.kill('KILL', 0) end end
Clear the caches.
# File lib/smeagol/console.rb, line 258 def clear_caches(server_config) server_config.repositories.each do |repository| Smeagol::Cache.new(Gollum::Wiki.new(repository.path)).clear() end end
If a wiki git URI is given, the clone the wiki.
@todo Use grit instead of shelling out.
# File lib/smeagol/console.rb, line 70 def clone_wiki system "git clone #{wiki_url} #{wiki_dir}" end
Copy assets to `assets` directory.
# File lib/smeagol/console.rb, line 91 def copy_assets dst_dir = File.join(wiki_dir, 'assets') src_dir = LIBDIR + '/public/assets' copy_dir(src_dir, dst_dir) end
# File lib/smeagol/console.rb, line 98 def copy_dir(src_dir, dst_dir) FileUtils.mkdir_p(dst_dir) Dir[File.join(src_dir, '**/*')].each do |src| next if File.directory?(src) dst = File.join(dst_dir, src.sub(src_dir, '')) copy_file(src, dst) end end
# File lib/smeagol/console.rb, line 109 def copy_file(src, dst) if File.exist?(dst) report " skip: #{dst.sub(Dir.pwd,'')}" else FileUtils.mkdir_p(File.dirname(dst)) FileUtils.cp(src, dst) report " copy: #{dst.sub(Dir.pwd,'')}" end end
Copy layout templates to `_layouts` directory and partial templates to `_partials`.
# File lib/smeagol/console.rb, line 78 def copy_layouts dst_dir = File.join(wiki_dir, '_layouts') src_dir = LIBDIR + '/templates/layouts' copy_dir(src_dir, dst_dir) dst_dir = File.join(wiki_dir, '_partials') src_dir = LIBDIR + '/templates/partials' copy_dir(src_dir, dst_dir) end
Git executable.
Returns git command path. [String]
# File lib/smeagol/console.rb, line 363 def git Smeagol.git end
Initialize Gollum
wiki for use with Smeagol
. This will clone the wiki repo, if given and it doesn't already exist and create `_settings.yml`, `_layouts/` and `assets/smeagol/`.
TODO: Perhaps use a supporting “managed copy” gem in future?
TODO: Add –force option to override skips?
Returns nothing.
# File lib/smeagol/console.rb, line 27 def init(*args) options = (Hash === args.last ? args.pop : {}) abort "Too many arguments." if args.size > 2 @wiki_url = args.shift @wiki_dir = args.shift if @wiki_url unless @wiki_dir @wiki_dir = File.basename(@wiki_url).chomp('.git') end @clone = true else @wiki_dir = Dir.pwd if File.exist?(File.join(@wiki_dir, '.git')) @wiki_url = wiki.repo.config['remote.origin.url'].to_s else abort "smeagol: not a git repo." end @clone = false end clone_wiki if @clone save_settings(options) save_gitignore copy_layouts unless options[:no_layouts] copy_assets unless options[:no_assets] end
When using init
, this provided the initial settings.
@returns [Settings]
# File lib/smeagol/console.rb, line 155 def initial_settings(options={}) options[:wiki_origin] = wiki_url options[:site_origin] = wiki_url.sub('.wiki', '') @settings = Settings.new(options) end
Preview current wiki (from working directory).
# File lib/smeagol/console.rb, line 173 def preview(options) repository = {} repository[:path] = Dir.pwd #repository[:cname] = options[:cname] if options[:cname] repository[:secret] = options.delete(:secret) if options.key?(:secret) options[:repositories] = [repository] config = Smeagol::Config.new(options) catch_signals show_repository(config) run_server(config) end
# File lib/smeagol/console.rb, line 11 def report(msg) $stderr.puts msg unless $QUIET end
Run the web server.
# File lib/smeagol/console.rb, line 267 def run_server(server_config) #Smeagol::App.set(:git, server_config.git) Smeagol::App.set(:repositories, server_config.repositories) Smeagol::App.set(:cache_enabled, server_config.cache_enabled) Smeagol::App.set(:mount_path, server_config.mount_path) Smeagol::App.run!(:port => server_config.port) end
Create or append `_site` to .gitignore file.
# File lib/smeagol/console.rb, line 122 def save_gitignore file = File.join(wiki_dir, '.gitignore') if File.exist?(file) File.open(file, 'a') do |f| f.write("_site") end else File.open(file, 'w') do |f| f.write("_site") end end end
Save settings.
# File lib/smeagol/console.rb, line 138 def save_settings(options) file = File.join(wiki_dir, "_settings.yml") if File.exist?(file) $stderr.puts " skip: #{file}" else text = Mustache.render(settings_template, initial_settings(options)) File.open(file, 'w') do |f| f.write(text) end end end
Serve up sites defined in smeagol config file.
# File lib/smeagol/console.rb, line 192 def serve(options) config_file = options[:config_file] config = Config.load(config_file) config.assign(options) abort "No repositories configured." if config.repositories.empty? # Set secret on all repositories if passed in by command line option # We can only assume they are all the same, in this case. # # TODO: Maybe only apply if no secret is given in config file? if options[:secret] config.repositories.each{ |r| r['secret'] = options['secret'] } end catch_signals show_repository(config) auto_update(config) clear_caches(config) run_server(config) end
Local wiki settings.
Returns wiki settings. [Settings]
# File lib/smeagol/console.rb, line 354 def settings @settings ||= Settings.load(wiki_dir) end
Read in the settings mustache template.
# File lib/smeagol/console.rb, line 165 def settings_template file = LIBDIR + '/templates/settings.yml' IO.read(file) end
Show repositories being served
# File lib/smeagol/console.rb, line 227 def show_repository(server_config) $stderr.puts "\n Now serving on port #{server_config.port} at /#{server_config.base_path}:" server_config.repositories.each do |repository| $stderr.puts " * #{repository.path} (#{repository.cname})" end $stderr.puts "\n" end
Site directory path.
Returns expanded site path. [String]
# File lib/smeagol/console.rb, line 318 def site_path settings.site_path end
Site repository.
Returns repository. [Repository]
# File lib/smeagol/console.rb, line 327 def site_repo settings.site_repo end
Update wiki repo(s).
# File lib/smeagol/console.rb, line 278 def update(*args) options = (Hash === args.last ? args.pop : {}) wiki_dir = args.first if wiki_dir dir = File.expand_path(wiki_dir) repo = Repository.new(:path=>dir) out = repo.update out = out[1] if Array === out report out else file = options[:config_file] config = Config.load(file) abort "No repositories configured." if config.repositories.empty? config.secret = options[:secret] config.repositories.each do |repository| report "Updating: #{repository.path}" out = repository.update out = out[1] if Array === out report out end end end
Get and cache Wiki
object.
Returns wiki. [Wiki]
# File lib/smeagol/console.rb, line 345 def wiki @wiki ||= Smeagol::Wiki.new(wiki_dir) end