pax_global_header00006660000000000000000000000064122036224110014503gustar00rootroot0000000000000052 comment=6db4fdcad851eeaff6382a9eb6748455c3818c3e ruby-git-1.2.6/000077500000000000000000000000001220362241100132535ustar00rootroot00000000000000ruby-git-1.2.6/.gitignore000066400000000000000000000000731220362241100152430ustar00rootroot00000000000000*.gem *.kpf *.sw? .DS_Store coverage pkg rdoc Gemfile.lock ruby-git-1.2.6/.jrubyrc000066400000000000000000000000221220362241100147260ustar00rootroot00000000000000cext.enabled=true ruby-git-1.2.6/.travis.yml000066400000000000000000000002421220362241100153620ustar00rootroot00000000000000language: ruby rvm: - 1.8.7 - 1.9.2 - 1.9.3 - 2.0.0 - jruby-18mode - jruby-19mode - jruby-head - rbx-18mode - rbx-19mode - ree # - ruby-head ruby-git-1.2.6/Gemfile000066400000000000000000000000661220362241100145500ustar00rootroot00000000000000source 'https://rubygems.org' gemspec :name => 'git' ruby-git-1.2.6/History.txt000066400000000000000000000016321220362241100154570ustar00rootroot00000000000000== 1.2.6 * Ruby 1.9.X/2.0 fully supported * JRuby 1.8/1.9 support * Rubinius support * Git.clone - supporting --recursive and --config * Git.log - supporting last and [] over the results * Git.add_remote - supporting -f and -t * Git.add - supporting --fore * Git.init - supporting --bare * Git.commit - supporting --all and --amend * Added Git.remote_remote, Git.revert and Git.clean * Added Bundler to the formula * Travis configuration * Licence included with the gem == 1.0.4 * added camping/gitweb.rb frontend * added a number of speed-ups == 1.0.3 * Sped up most of the operations * Added some predicate functions (commit?, tree?, etc) * Added a number of lower level operations (read-tree, write-tree, checkout-index, etc) * Fixed a bug with using bare repositories * Updated a good amount of the documentation == 1.0.2 * Added methods to the git objects that might be helpful == 1.0.1 * Initial version ruby-git-1.2.6/LICENSE000066400000000000000000000020611220362241100142570ustar00rootroot00000000000000The MIT License Copyright (c) 2008 Scott Chacon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ruby-git-1.2.6/README.md000066400000000000000000000163701220362241100145410ustar00rootroot00000000000000# Git Library for Ruby Library for using Git in Ruby. ## Homepage Git public hosting of the project source code is at: http://github.com/schacon/ruby-git ## Install You can install Ruby/Git like this: $ sudo gem install git ## Code Status * [![Build Status](https://api.travis-ci.org/schacon/ruby-git.png)](https://travis-ci.org/schacon/ruby-git) * [![Code Climate](https://codeclimate.com/github/schacon/ruby-git.png)](https://codeclimate.com/github/schacon/ruby-git) * [![Dependencies](https://gemnasium.com/schacon/ruby-git.png?travis)](https://gemnasium.com/schacon/ruby-git) ## Major Objects **Git::Base** - The object returned from a `Git.open` or `Git.clone`. Most major actions are called from this object. **Git::Object** - The base object for your tree, blob and commit objects, returned from `@git.gtree` or `@git.object` calls. the `Git::AbstractObject` will have most of the calls in common for all those objects. **Git::Diff** - returns from a `@git.diff` command. It is an Enumerable that returns `Git::Diff:DiffFile` objects from which you can get per file patches and insertion/deletion statistics. You can also get total statistics from the Git::Diff object directly. **Git::Status** - returns from a `@git.status` command. It is an Enumerable that returns `Git:Status::StatusFile` objects for each object in git, which includes files in the working directory, in the index and in the repository. Similar to running 'git status' on the command line to determine untracked and changed files. **Git::Branches** - Enumerable object that holds `Git::Branch objects`. You can call .local or .remote on it to filter to just your local or remote branches. **Git::Remote**- A reference to a remote repository that is tracked by this repository. **Git::Log** - An Enumerable object that references all the `Git::Object::Commit` objects that encompass your log query, which can be constructed through methods on the `Git::Log object`, like: `@git.log(20).object("some_file").since("2 weeks ago").between('v2.6', 'v2.7').each { |commit| [block] }` ## Examples Here are a bunch of examples of how to use the Ruby/Git package. Ruby < 1.9 will require rubygems to be loaded. ```ruby require 'rubygems' ``` Require the 'git' gem. ```ruby require 'git' ``` Here are the operations that need read permission only. ```ruby g = Git.open(working_dir, :log => Logger.new(STDOUT)) g.index g.index.readable? g.index.writable? g.repo g.dir g.log # returns array of Git::Commit objects g.log.since('2 weeks ago') g.log.between('v2.5', 'v2.6') g.log.each {|l| puts l.sha } g.gblob('v2.5:Makefile').log.since('2 weeks ago') g.object('HEAD^').to_s # git show / git rev-parse g.object('HEAD^').contents g.object('v2.5:Makefile').size g.object('v2.5:Makefile').sha g.gtree(treeish) g.gblob(treeish) g.gcommit(treeish) commit = g.gcommit('1cc8667014381') commit.gtree commit.parent.sha commit.parents.size commit.author.name commit.author.email commit.author.date.strftime("%m-%d-%y") commit.committer.name commit.date.strftime("%m-%d-%y") commit.message tree = g.gtree("HEAD^{tree}") tree.blobs tree.subtrees tree.children # blobs and subtrees g.revparse('v2.5:Makefile') g.branches # returns Git::Branch objects g.branches.local g.branches.remote g.branches[:master].gcommit g.branches['origin/master'].gcommit g.grep('hello') # implies HEAD g.blob('v2.5:Makefile').grep('hello') g.tag('v2.5').grep('hello', 'docs/') g.diff(commit1, commit2).size g.diff(commit1, commit2).stats g.gtree('v2.5').diff('v2.6').insertions g.diff('gitsearch1', 'v2.5').path('lib/') g.diff('gitsearch1', @git.gtree('v2.5')) g.diff('gitsearch1', 'v2.5').path('docs/').patch g.gtree('v2.5').diff('v2.6').patch g.gtree('v2.5').diff('v2.6').each do |file_diff| puts file_diff.path puts file_diff.patch puts file_diff.blob(:src).contents end g.config('user.name') # returns 'Scott Chacon' g.config # returns whole config hash g.tag # returns array of Git::Tag objects ``` And here are the operations that will need to write to your git repository. ```ruby g = Git.init Git.init('project') Git.init('/home/schacon/proj', { :git_dir => '/opt/git/proj.git', :index_file => '/tmp/index'} ) g = Git.clone(URI, NAME, :path => '/tmp/checkout') g.config('user.name', 'Scott Chacon') g.config('user.email', 'email@email.com') g.add # git add -- "." g.add(:all=>true) # git add --all -- "." g.add('file_path') # git add -- "file_path" g.add(['file_path_1', 'file_path_2']) # git add -- "file_path_1" "file_path_2" g.remove('file.txt') g.remove(['file.txt', 'file2.txt']) g.commit('message') g.commit_all('message') g = Git.clone(repo, 'myrepo') g.chdir do new_file('test-file', 'blahblahblah') g.status.changed.each do |file| puts file.blob(:index).contents end end g.reset # defaults to HEAD g.reset_hard(Git::Commit) g.branch('new_branch') # creates new or fetches existing g.branch('new_branch').checkout g.branch('new_branch').delete g.branch('existing_branch').checkout g.checkout('new_branch') g.checkout(g.branch('new_branch')) g.branch(name).merge(branch2) g.branch(branch2).merge # merges HEAD with branch2 g.branch(name).in_branch(message) { # add files } # auto-commits g.merge('new_branch') g.merge('origin/remote_branch') g.merge(g.branch('master')) g.merge([branch1, branch2]) r = g.add_remote(name, uri) # Git::Remote r = g.add_remote(name, Git::Base) # Git::Remote g.remotes # array of Git::Remotes g.remote(name).fetch g.remote(name).remove g.remote(name).merge g.remote(name).merge(branch) g.fetch g.fetch(g.remotes.first) g.pull g.pull(Git::Repo, Git::Branch) # fetch and a merge g.add_tag('tag_name') # returns Git::Tag g.repack g.push g.push(g.remote('name')) ``` Some examples of more low-level index and tree operations ```ruby g.with_temp_index do g.read_tree(tree3) # calls self.index.read_tree g.read_tree(tree1, :prefix => 'hi/') c = g.commit_tree('message') # or # t = g.write_tree c = g.commit_tree(t, :message => 'message', :parents => [sha1, sha2]) g.branch('branch_name').update_ref(c) g.update_ref(branch, c) g.with_temp_working do # new blank working directory g.checkout g.checkout(another_index) g.commit # commits to temp_index end end g.set_index('/path/to/index') g.with_index(path) do # calls set_index, then switches back after end g.with_working(dir) do # calls set_working, then switches back after end g.with_temp_working(dir) do g.checkout_index(:prefix => dir, :path_limiter => path) # do file work g.commit # commits to index end ``` ## License licensed under MIT License Copyright (c) 2008 Scott Chacon. See LICENSE for further details. ruby-git-1.2.6/Rakefile000066400000000000000000000013431220362241100147210ustar00rootroot00000000000000require 'rdoc/task' require 'rubygems' require "#{File.expand_path(File.dirname(__FILE__))}/lib/git/version" task :default => :test desc "Upload Docs" task :upload_docs do |t| system('rsync -rv --delete doc/ git.rubyforge.org:/var/www/gforge-projects/git') end desc "Run Unit Tests" task :test do |t| sh 'git config --global user.email "git@example.com"' if `git config user.email`.empty? sh 'git config --global user.name "GitExample"' if `git config user.name`.empty? $VERBOSE = true require File.dirname(__FILE__) + '/tests/all_tests.rb' end Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'rdoc' rdoc.title = "ruby-git #{Git::VERSION}" rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end ruby-git-1.2.6/TODO000066400000000000000000000006271220362241100137500ustar00rootroot00000000000000* more documentation * git rebase * diff additions - annotate, blame * submodule support * repository admin - prune, fsck, pack-refs, count-objects, unpack-objects * email/patch integration - request-pull(email_address), git-am, git-apply * compatible with git 1.4 * More Error Examples * More Git::Status methods * Speed up through pure ruby * Speed up through C bindings to libgit-thin ruby-git-1.2.6/VERSION000066400000000000000000000000061220362241100143170ustar00rootroot000000000000001.2.6 ruby-git-1.2.6/benchmark.rb000066400000000000000000000072431220362241100155400ustar00rootroot00000000000000require 'fileutils' require 'benchmark' require 'rubygems' require 'ruby-prof' #require_gem 'git', '1.0.3' require 'lib/git' def main @wbare = File.expand_path(File.join('tests', 'files', 'working.git')) in_temp_dir do g = Git.clone(@wbare, 'test') g.chdir do n = 40 result = RubyProf.profile do puts "
"
      
      Benchmark.bm(8) do |x|
        run_code(x, 'objects') do
          @commit = g.gcommit('1cc8667014381')
          @tree = g.gtree('1cc8667014381^{tree}')
          @blob = g.gblob('v2.5:example.txt')
          @obj = g.object('v2.5:example.txt')
        end
        
                
        x.report('config  ') do
          n.times do
            c = g.config
            c = g.config('user.email')
            c = g.config('user.email', 'schacon@gmail.com')
          end
        end
        
        x.report('diff    ') do
          n.times do
            g.diff('gitsearch1', 'v2.5').lines
            g.diff('gitsearch1', 'v2.5').stats
            g.diff('gitsearch1', 'v2.5').patch
          end
        end
        
        x.report('path    ') do
          n.times do
            g.dir.readable?
            g.index.readable?
            g.repo.readable?
          end
        end
        
        #------------------
        x.report('status  ') do
          n.times do
            g.status['example.txt'].mode_index
            s = g.status
            s.added
            s.added
          end
        end

        #------------------
        x.report('log     ') do
          n.times do
            log = g.log.between('v2.5').object('example.txt')
            log.size
            log.size
            log.first
            g.log.between('v2.5').object('example.txt').map { |c| c.message }
            g.log.since("2 years ago").map { |c| c.message }
          end
        end

        #------------------
        x.report('branch  ') do
          for i in 1..10 do
            g.checkout('master')
            g.branch('new_branch' + i.to_s).in_branch('test') do
              g.current_branch
              new_file('new_file_' + i.to_s, 'hello')
              g.add
              true
            end
            g.branch('new_branch').merge('new_branch' + i.to_s)
            g.checkout('new_branch')
          end
        end
        
        #------------------
        x.report('tree    ') do
          for i in 1..10 do
            tr = g.with_temp_index do
               g.read_tree('new_branch' + i.to_s)
               index = g.ls_files
               g.write_tree
             end
          end
        end rescue nil

        x.report('archive ') do
          n.times do
            f = g.gcommit('v2.6').archive # returns path to temp file
          end
        end rescue nil
   
	     
      end
    
      end

      # Print a graph profile to text
      puts "
" printer = RubyProf::GraphHtmlPrinter.new(result) printer.print(STDOUT, 1) printer = RubyProf::FlatPrinter.new(result) puts "
"
      printer.print(STDOUT, 1)
      puts "
" end end end def run_code(x, name, times = 30) #result = RubyProf.profile do x.report(name) do for i in 1..times do yield i end end #end # Print a graph profile to text #printer = RubyProf::FlatPrinter.new(result) #printer.print(STDOUT, 0) end def new_file(name, contents) File.open(name, 'w') do |f| f.puts contents end end def in_temp_dir(remove_after = true) filename = 'git_test' + Time.now.to_i.to_s + rand(300).to_s.rjust(3, '0') tmp_path = File.join("/tmp/", filename) FileUtils.mkdir(tmp_path) Dir.chdir tmp_path do yield tmp_path end FileUtils.rm_r(tmp_path) if remove_after end main() ruby-git-1.2.6/camping/000077500000000000000000000000001220362241100146715ustar00rootroot00000000000000ruby-git-1.2.6/camping/gitweb.rb000066400000000000000000001041021220362241100164750ustar00rootroot00000000000000require 'rubygems' require 'camping' require 'lib/git' # # gitweb is a web frontend on git # there is no user auth, so don't run this anywhere that anyone can use it # it's read only, but anyone can remove or add references to your repos # # everything but the archive and diff functions are now in pure ruby # # install dependencies # sudo gem install camping-omnibus --source http://code.whytheluckystiff.net # # todo # - diff/patch between any two objects # - expand patch to entire file # - set title properly # - grep / search function # - prettify : http://projects.wh.techno-weenie.net/changesets/3030 # - add user model (add/remove repos) # - implement http-push for authenticated users # # author : scott chacon # Camping.goes :GitWeb module GitWeb::Models class Repository < Base; end class CreateGitWeb < V 0.1 def self.up create_table :gitweb_repositories, :force => true do |t| t.column :name, :string t.column :path, :string t.column :bare, :boolean end end end end module GitWeb::Helpers def inline_data(identifier) section = "__#{identifier.to_s.upcase}__" @@inline_data ||= File.read(__FILE__).gsub(/.*__END__/m, '') data = @@inline_data.match(/(#{section}.)(.*?)((__)|(\Z))/m) data ? data[2] : nil # return nil if no second found end end module GitWeb::Controllers class Stylesheet < R '/css/highlight.css' def get @headers['Content-Type'] = 'text/css' inline_data(:css) end end class JsHighlight < R '/js/highlight.js' def get @headers['Content-Type'] = 'text/javascript' inline_data(:js) end end class Index < R '/' def get @repos = Repository.find :all render :index end end class Add < R '/add' def get @repo = Repository.new render :add end def post if Git.bare(input.repository_path) repo = Repository.create :name => input.repo_name, :path => input.repo_path, :bare => input.repo_bare redirect View, repo else redirect Index end end end class RemoveRepo < R '/remove/(\d+)' def get repo_id @repo = Repository.find repo_id @repo.destroy @repos = Repository.find :all render :index end end class View < R '/view/(\d+)' def get repo_id @repo = Repository.find repo_id @git = Git.bare(@repo.path) render :view end end class Fetch < R '/git/(\d+)/(.*)' def get repo_id, path @repo = Repository.find repo_id @git = Git.bare(@repo.path) File.read(File.join(@git.repo.path, path)) end end class Commit < R '/commit/(\d+)/(\w+)' def get repo_id, sha @repo = Repository.find repo_id @git = Git.bare(@repo.path) @commit = @git.gcommit(sha) render :commit end end class Tree < R '/tree/(\d+)/(\w+)' def get repo_id, sha @repo = Repository.find repo_id @git = Git.bare(@repo.path) @tree = @git.gtree(sha) render :tree end end class Blob < R '/blob/(\d+)/(.*?)/(\w+)' def get repo_id, file, sha @repo = Repository.find repo_id #logger = Logger.new('/tmp/git.log') #logger.level = Logger::INFO #@git = Git.bare(@repo.path, :log => logger) @git = Git.bare(@repo.path) @blob = @git.gblob(sha) @file = file render :blob end end class BlobRaw < R '/blob/(\d+)/(\w+)' def get repo_id, sha @repo = Repository.find repo_id @git = Git.bare(@repo.path) @blob = @git.gblob(sha) @blob.contents end end class Archive < R '/archive/(\d+)/(\w+)' def get repo_id, sha @repo = Repository.find repo_id @git = Git.bare(@repo.path) file = @git.gtree(sha).archive @headers['Content-Type'] = 'application/zip' @headers["Content-Disposition"] = "attachment; filename=archive.zip" File.new(file).read end end class Download < R '/download/(\d+)/(.*?)/(\w+)' def get repo_id, file, sha @repo = Repository.find repo_id @git = Git.bare(@repo.path) @headers["Content-Disposition"] = "attachment; filename=#{file}" @git.gblob(sha).contents end end class Diff < R '/diff/(\d+)/(\w+)/(\w+)' def get repo_id, tree1, tree2 @repo = Repository.find repo_id @git = Git.bare(@repo.path) @tree1 = tree1 @tree2 = tree2 @diff = @git.diff(tree2, tree1) render :diff end end class Patch < R '/patch/(\d+)/(\w+)/(\w+)' def get repo_id, tree1, tree2 @repo = Repository.find repo_id @git = Git.bare(@repo.path) @diff = @git.diff(tree1, tree2).patch end end end module GitWeb::Views def layout html do head do title 'test' link :href=>R(Stylesheet), :rel=>'stylesheet', :type=>'text/css' script '', :type => "text/javascript", :language => "JavaScript", :src => R(JsHighlight) end style <<-END, :type => 'text/css' body { font-family: verdana, arial, helvetica, sans-serif; color: #333; font-size: 13px; line-height: 18px;} h1 { background: #cce; padding: 10px; margin: 3px; } h3 { background: #aea; padding: 5px; margin: 3px; } .options { float: right; margin: 10px; } p { padding: 5px; } .odd { background: #eee; } .tag { margin: 5px; padding: 1px 3px; border: 1px solid #8a8; background: #afa;} .indent { padding: 0px 15px;} table tr td { font-size: 13px; } table.shortlog { width: 100%; } .timer { color: #666; padding: 10px; margin-top: 10px; } END body :onload => "sh_highlightDocument();" do before = Time.now().usec self << yield self << '
' + ((Time.now().usec - before).to_f / 60).to_s + ' sec' end end end # git repo views def view h1 @repo.name h2 @repo.path gtags = @git.tags @tags = {} gtags.each { |tag| @tags[tag.sha] ||= []; @tags[tag.sha] << tag.name } url = 'http:' + URL(Fetch, @repo.id, '').to_s h3 'info' table.info do tr { td 'owner: '; td @git.config('user.name') } tr { td 'email: '; td @git.config('user.email') } tr { td 'url: '; td { a url, :href => url } } end h3 'shortlog' table.shortlog do @git.log.each do |log| tr do td log.date.strftime("%Y-%m-%d") td { code log.sha[0, 8] } td { em log.author.name } td do span.message log.message[0, 60] @tags[log.sha].each do |t| span.space ' ' span.tag { code t } end if @tags[log.sha] end td { a 'commit', :href => R(Commit, @repo, log.sha) } td { a 'commit-diff', :href => R(Diff, @repo, log.sha, log.parent.sha) } td { a 'tree', :href => R(Tree, @repo, log.gtree.sha) } td { a 'archive', :href => R(Archive, @repo, log.gtree.sha) } end end end h3 'branches' @git.branches.each do |branch| li { a branch.full, :href => R(Commit, @repo, branch.gcommit.sha) } end h3 'tags' gtags.each do |tag| li { a tag.name, :href => R(Commit, @repo, tag.sha) } end end def commit a.options 'repo', :href => R(View, @repo) h1 @commit.name h3 'info' table.info do tr { td 'author: '; td @commit.author.name + ' <' + @commit.author.email + '>'} tr { td ''; td { code @commit.author.date } } tr { td 'committer: '; td @commit.committer.name + ' <' + @commit.committer.email + '>'} tr { td ''; td { code @commit.committer.date } } tr { td 'commit sha: '; td { code @commit.sha } } tr do td 'tree sha: ' td do code { a @commit.gtree.sha, :href => R(Tree, @repo, @commit.gtree.sha) } span.space ' ' a 'archive', :href => R(Archive, @repo, @commit.gtree.sha) end end tr do td 'parents: ' td do @commit.parents.each do |p| code { a p.sha, :href => R(Commit, @repo, p.sha) } span.space ' ' a 'diff', :href => R(Diff, @repo, p.sha, @commit.sha) span.space ' ' a 'archive', :href => R(Archive, @repo, p.gtree.sha) br end end end end h3 'commit message' p @commit.message end def tree a.options 'repo', :href => R(View, @repo) h3 'tree : ' + @tree.sha p { a 'archive tree', :href => R(Archive, @repo, @tree.sha) }; table do @tree.children.each do |file, node| tr :class => cycle('odd','even') do td { code node.sha[0, 8] } td node.mode td file if node.type == 'tree' td { a node.type, :href => R(Tree, @repo, node.sha) } td { a 'archive', :href => R(Archive, @repo, node.sha) } else td { a node.type, :href => R(Blob, @repo, file, node.sha) } td { a 'raw', :href => R(BlobRaw, @repo, node.sha) } end end end end end def blob ext = File.extname(@file).gsub('.', '') case ext when 'rb' : classnm = 'sh_ruby' when 'js' : classnm = 'sh_javascript' when 'html' : classnm = 'sh_html' when 'css' : classnm = 'sh_css' end a.options 'repo', :href => R(View, @repo) h3 'blob : ' + @blob.sha h4 @file a 'download file', :href => R(Download, @repo, @file, @blob.sha) div.indent { pre @blob.contents, :class => classnm } end def diff a.options 'repo', :href => R(View, @repo) h1 "diff" p { a 'download patch file', :href => R(Patch, @repo, @tree1, @tree2) } p do a @tree1, :href => R(Tree, @repo, @tree1) span.space ' : ' a @tree2, :href => R(Tree, @repo, @tree2) end @diff.each do |file| h3 file.path div.indent { pre file.patch, :class => 'sh_diff' } end end # repo management views def add _form(@repo) end def _form(repo) form(:method => 'post') do label 'Path', :for => 'repo_path'; br input :name => 'repo_path', :type => 'text', :value => repo.path; br label 'Name', :for => 'repo_name'; br input :name => 'repo_name', :type => 'text', :value => repo.name; br label 'Bare', :for => 'repo_bare'; br input :type => 'checkbox', :name => 'repo_bare', :value => repo.bare; br input :type => 'hidden', :name => 'repo_id', :value => repo.id input :type => 'submit' end end def index @repos.each do | repo | h1 repo.name a 'remove', :href => R(RemoveRepo, repo.id) span.space ' ' a repo.path, :href => R(View, repo.id) end br br a 'add new repo', :href => R(Add) end # convenience functions def cycle(v1, v2) (@value == v1) ? @value = v2 : @value = v1 @value end end def GitWeb.create GitWeb::Models.create_schema end # everything below this line is the css and javascript for syntax-highlighting __END__ __CSS__ pre.sh_sourceCode { background-color: white; color: black; font-style: normal; font-weight: normal; } pre.sh_sourceCode .sh_keyword { color: blue; font-weight: bold; } /* language keywords */ pre.sh_sourceCode .sh_type { color: darkgreen; } /* basic types */ pre.sh_sourceCode .sh_string { color: red; font-family: monospace; } /* strings and chars */ pre.sh_sourceCode .sh_regexp { color: orange; font-family: monospace; } /* regular expressions */ pre.sh_sourceCode .sh_specialchar { color: pink; font-family: monospace; } /* e.g., \n, \t, \\ */ pre.sh_sourceCode .sh_comment { color: brown; font-style: italic; } /* comments */ pre.sh_sourceCode .sh_number { color: purple; } /* literal numbers */ pre.sh_sourceCode .sh_preproc { color: darkblue; font-weight: bold; } /* e.g., #include, import */ pre.sh_sourceCode .sh_symbol { color: darkred; } /* e.g., <, >, + */ pre.sh_sourceCode .sh_function { color: black; font-weight: bold; } /* function calls and declarations */ pre.sh_sourceCode .sh_cbracket { color: red; } /* block brackets (e.g., {, }) */ pre.sh_sourceCode .sh_todo { font-weight: bold; background-color: cyan; } /* TODO and FIXME */ /* for Perl, PHP, Prolog, Python, shell, Tcl */ pre.sh_sourceCode .sh_variable { color: darkgreen; } /* line numbers (not yet implemented) */ pre.sh_sourceCode .sh_linenum { color: black; font-family: monospace; } /* Internet related */ pre.sh_sourceCode .sh_url { color: blue; text-decoration: underline; font-family: monospace; } /* for ChangeLog and Log files */ pre.sh_sourceCode .sh_date { color: blue; font-weight: bold; } pre.sh_sourceCode .sh_time, pre.sh_sourceCode .sh_file { color: darkblue; font-weight: bold; } pre.sh_sourceCode .sh_ip, pre.sh_sourceCode .sh_name { color: darkgreen; } /* for LaTeX */ pre.sh_sourceCode .sh_italics { color: darkgreen; font-style: italic; } pre.sh_sourceCode .sh_bold { color: darkgreen; font-weight: bold; } pre.sh_sourceCode .sh_underline { color: darkgreen; text-decoration: underline; } pre.sh_sourceCode .sh_fixed { color: green; font-family: monospace; } pre.sh_sourceCode .sh_argument { color: darkgreen; } pre.sh_sourceCode .sh_optionalargument { color: purple; } pre.sh_sourceCode .sh_math { color: orange; } pre.sh_sourceCode .sh_bibtex { color: blue; } /* for diffs */ pre.sh_sourceCode .sh_oldfile { color: orange; } pre.sh_sourceCode .sh_newfile { color: darkgreen; } pre.sh_sourceCode .sh_difflines { color: blue; } /* for css */ pre.sh_sourceCode .sh_selector { color: purple; } pre.sh_sourceCode .sh_property { color: blue; } pre.sh_sourceCode .sh_value { color: darkgreen; font-style: italic; } __JS__ /* Copyright (C) 2007 gnombat@users.sourceforge.net */ /* License: http://shjs.sourceforge.net/doc/license.html */ function sh_highlightString(inputString,language,builder){var patternStack={_stack:[],getLength:function(){return this._stack.length;},getTop:function(){var stack=this._stack;var length=stack.length;if(length===0){return undefined;} return stack[length-1];},push:function(state){this._stack.push(state);},pop:function(){if(this._stack.length===0){throw"pop on empty stack";} this._stack.pop();}};var pos=0;var currentStyle=undefined;var output=function(s,style){var length=s.length;if(length===0){return;} if(!style){var pattern=patternStack.getTop();if(pattern!==undefined&&!('state'in pattern)){style=pattern.style;}} if(currentStyle!==style){if(currentStyle){builder.endElement();} if(style){builder.startElement(style);}} builder.text(s);pos+=length;currentStyle=style;};var endOfLinePattern=/\r\n|\r|\n/g;endOfLinePattern.lastIndex=0;var inputStringLength=inputString.length;while(posposWithinLine){output(line.substring(posWithinLine,bestMatch.index),null);} pattern=state[bestMatchIndex];var newStyle=pattern.style;var matchedString;if(newStyle instanceof Array){for(var subexpression=0;subexpression0){patternStack.pop();}}}}} if(currentStyle){builder.endElement();} currentStyle=undefined;if(endOfLineMatch){builder.text(endOfLineMatch[0]);} pos=startOfNextLine;}} function sh_getClasses(element){var result=[];var htmlClass=element.className;if(htmlClass&&htmlClass.length>0){var htmlClasses=htmlClass.split(" ");for(var i=0;i0){result.push(htmlClasses[i]);}}} return result;} function sh_addClass(element,name){var htmlClasses=sh_getClasses(element);for(var i=0;i0&&url.charAt(0)==='<'&&url.charAt(url.length-1)==='>'){url=url.substr(1,url.length-2);} if(sh_isEmailAddress(url)){url='mailto:'+url;} a.setAttribute('href',url);a.appendChild(this._document.createTextNode(this._currentText));this._currentParent.appendChild(a);} else{this._currentParent.appendChild(this._document.createTextNode(this._currentText));} this._currentText=null;} this._currentParent=this._currentParent.parentNode;},text:function(s){if(this._currentText===null){this._currentText=s;} else{this._currentText+=s;}},close:function(){if(this._currentText!==null){this._currentParent.appendChild(this._document.createTextNode(this._currentText));this._currentText=null;} this._element.appendChild(this._documentFragment);}};function sh_highlightElement(htmlDocument,element,language){sh_addClass(element,"sh_sourceCode");var inputString;if(element.childNodes.length===0){return;} else{inputString=sh_getText(element);} sh_builder.init(htmlDocument,element);sh_highlightString(inputString,language,sh_builder);sh_builder.close();} function sh_highlightHTMLDocument(htmlDocument){if(!window.sh_languages){return;} var nodeList=htmlDocument.getElementsByTagName("pre");for(var i=0;i element with class='"+htmlClass+"', but no such language exists";}}}}} function sh_highlightDocument(){sh_highlightHTMLDocument(document);} if(!this.sh_languages){this.sh_languages={};} sh_languages['css']=[[{'next':1,'regex':/\/\/\//g,'style':'sh_comment'},{'next':7,'regex':/\/\//g,'style':'sh_comment'},{'next':8,'regex':/\/\*\*/g,'style':'sh_comment'},{'next':14,'regex':/\/\*/g,'style':'sh_comment'},{'regex':/(?:\.|#)[A-Za-z0-9_]+/g,'style':'sh_selector'},{'next':15,'regex':/\{/g,'state':1,'style':'sh_cbracket'},{'regex':/~|!|%|\^|\*|\(|\)|-|\+|=|\[|\]|\\|:|;|,|\.|\/|\?|&|<|>|\|/g,'style':'sh_symbol'}],[{'exit':true,'regex':/$/g},{'regex':/(?:?)/g,'style':'sh_url'},{'regex':/(?:?)/g,'style':'sh_url'},{'next':2,'regex'://g,'style':'sh_keyword'},{'next':5,'regex':/<(?:\/)?[A-Za-z][A-Za-z0-9]*/g,'state':1,'style':'sh_keyword'},{'regex':/&(?:[A-Za-z0-9]+);/g,'style':'sh_preproc'},{'regex':/@[A-Za-z]+/g,'style':'sh_type'},{'regex':/(?:TODO|FIXME)(?:[:]?)/g,'style':'sh_todo'}],[{'exit':true,'regex':/>/g,'style':'sh_preproc'},{'next':3,'regex':/"/g,'style':'sh_string'}],[{'regex':/\\(?:\\|")/g},{'exit':true,'regex':/"/g,'style':'sh_string'}],[{'exit':true,'regex':/-->/g,'style':'sh_comment'},{'next':4,'regex'://g,'style':'sh_comment'},{'next':11,'regex'://g,'style':'sh_comment'},{'next':19,'regex'://g,'style':'sh_comment'},{'next':26,'regex'://g,'style':'sh_comment'},{'next':3,'regex'://g,'style':'sh_comment'},{'next':4,'regex'://g,'style':'sh_comment'},{'next':11,'regex':/