visualculture.prototype
clone your own copy | download snapshot

Snapshots | iceberg

No images in this repository’s iceberg at this time

Inside this repository

vc-server.rb
application/x-ruby

Download raw (4.7 KB)

# encoding: UTF-8
dir = File.dirname(__FILE__)
$:.unshift File.join(dir, "..", "views")
$:.unshift File.join(dir, "lib")
$:.unshift File.join(dir, "..")

require 'visualculture'

module VC
  class Server < Sinatra::Base
    set :public_folder, File.dirname(__FILE__) + '/..' + '/public'
    set :views, File.dirname(__FILE__) + '/..' + '/views'
    register Sinatra::Reloader
    mime_type :binary

    # Methods
    def initialize
      super
      # Get repo-paths from command line (1 or more):
      # or from settings (to be implemented)
      if VC.settings("repositories").length == 0
        raise "No repositories specified on either command-line or in the current config file."
      else  
        repo_paths = VC.settings("repositories")
      end

      # Create a hash to access repos through their slug:
      @repos = {}
      repo_paths.each do |repo_path|
        r = Grit::Repo.new(repo_path)
        unless r.commit('HEAD').nil?
          @repos[File.basename(repo_path, ".git")] = Grit::Repo.new(repo_path)
        end
        # Though creating all git_repo instances at initialisation
        # might be to heavy at some point
      end
      
      @sorted_repos = @repos.values.sort_by {|r| r.last_updated}.reverse
    end

    def get_commit(cat, id, commit_id, path)
      @repo_slug = 'osp' + '.' + cat + '.' + id
      @repo_path = cat + '/' + id
      @repo = @repos[@repo_slug]
      if commit_id == "latest"
        @commit = @repo.commit('HEAD')
        @commit_slug = "latest"
      else
        @commit = @repo.commit(commit_id)
        @commit_slug = @commit.id[0..10]
      end
      halt "No commit exists with id #{commit_id}" if @commit.nil?
      @object = (path == "" ? @commit.tree : @commit.tree / path)
      halt "No object exists with path #{path}" if @object.nil?
      
      # Set title
      if @repo
        @title += " :: " + @repo.category.capitalize + " :: " + @repo.title
      end
      if @commit
        @title += " :: " + ( @object.name ? @object.name : "/" )  + " @ " + @commit_slug 
      end
    end

    # Routes
    before do
	    print request.url
      @title = VC.settings("title")
    end

    get "/" do
      # 8 latest repos with an iceberg:
      @home_repos = @sorted_repos.map {|x| x.iceberg ? x : nil}.compact #[0..8]
      erb :home
    end

    get "/repos/" do
      erb :repos
    end

    get "/:cat/" do |cat|
      @title += " :: " + cat.capitalize
      @cat = cat
      erb :category
    end

    get "/:cat/:id/" do |cat, id|
      @repo_path = cat + '/' + id
      @repo_slug = 'osp' + '.' + cat + '.' + id
      @repo = @repos[@repo_slug]
      @title += " :: " + @repo.category.capitalize + " :: " + @repo.title
      erb :index
    end

    get "/:cat/:id/repo.json" do |cat, id|
      content_type "text/plain"
      @repo_path = cat + '/' + id
      @repo_slug = 'osp' + '.' + cat + '.' + id
      @repos[@repo_slug].to_json
    end

    get "/settings" do
    end

    get "/:cat/:id/render/:commit_id/*" do |cat, id, commit_id, path|
      get_commit cat, id, commit_id, path
      x = @object.transduce VC.settings("preview-image-size")
      if x
        send_file x
      else
        redirect "http://placehold.it/770x770&text=" + @object.name
      end
    end

    get "/:cat/:id/thumbnail/:commit_id/*" do |cat, id, commit_id, path|
      get_commit cat, id, commit_id, path
      if @object.is_a? Grit::Blob
        x = @object.transduce VC.settings("thumb-image-size")
        if x
          send_file x
        else
          redirect "http://placehold.it/180&text=" + @object.name
        end
      else
        # It’s a folder
        redirect "http://placehold.it/180&text=" + @object.name
      end
    end

    get "/:cat/:id/view/:commit_id/*" do |cat, id, commit_id, path|
      get_commit cat, id, commit_id, path
      if @object.is_a? Grit::Blob
        # Blob
        @path = path
        erb :blob
      else
        # Folder
        @tree = @object
        if path == ""
          @path = path
        else
          @path = path + "/"
        end
        @dir = true
        erb :dir
      end
    end

    get "/:cat/:id/raw/:commit_id/*" do |cat, id, commit_id, path|
      get_commit cat, id, commit_id, path
      if @object.is_a? Grit::Blob
        content_type @object.mime_type
        @object.data
      else
        halt "to implement raw tree?"
      end
    end
    
    # sweet, an api
    get "/repos.json" do
      content_type "text/plain"
      @sorted_repos.map {|repo| repo.to_hash}.to_json 
    end
    
    get "/commits.json" do
      content_type "text/plain"
      commits = []
      @repos.values.each do |repo|
        commits += repo.commit_overview
      end
      commits.sort_by {|r| r['date_iso']}[-10..-1].reverse.to_json 
    end
    
  end
end