module Smeagol::Console

Console encapsulates all the public methods smeagol is likely to need, generally it maps to all the CLI commands.

Attributes

wiki_dir[RW]

Local directory to house wiki repo.

wiki_url[RW]

The wiki git url.

Public Instance Methods

auto_update(server_config) click to toggle source

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
catch_signals() click to toggle source

Setup trap signals.

# File lib/smeagol/console.rb, line 218
def catch_signals
  Signal.trap('TERM') do
    Process.kill('KILL', 0)
  end
end
clear_caches(server_config) click to toggle source

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
clone_wiki() click to toggle source

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() click to toggle source

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
copy_dir(src_dir, dst_dir) click to toggle source
# 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
copy_file(src, dst) click to toggle source
# 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_layouts() click to toggle source

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() click to toggle source

Git executable.

Returns git command path. [String]

# File lib/smeagol/console.rb, line 363
def git
  Smeagol.git
end
init(*args) click to toggle source

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
initial_settings(options={}) click to toggle source

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(options) click to toggle source

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
report(msg) click to toggle source
# File lib/smeagol/console.rb, line 11
def report(msg)
  $stderr.puts msg unless $QUIET
end
run_server(server_config) click to toggle source

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
save_gitignore() click to toggle source

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(options) click to toggle source

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(options) click to toggle source

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
settings() click to toggle source

Local wiki settings.

Returns wiki settings. [Settings]

# File lib/smeagol/console.rb, line 354
def settings
  @settings ||= Settings.load(wiki_dir)
end
settings_template() click to toggle source

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_repository(server_config) click to toggle source

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_path() click to toggle source

Site directory path.

Returns expanded site path. [String]

# File lib/smeagol/console.rb, line 318
def site_path
  settings.site_path
end
site_repo() click to toggle source

Site repository.

Returns repository. [Repository]

# File lib/smeagol/console.rb, line 327
def site_repo
  settings.site_repo 
end
update(*args) click to toggle source

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
wiki() click to toggle source

Get and cache Wiki object.

Returns wiki. [Wiki]

# File lib/smeagol/console.rb, line 345
def wiki
  @wiki ||= Smeagol::Wiki.new(wiki_dir)
end