Commit d6f7bfbef5d5cb5193dc7c32b608aa01440f693c

rename class to make more sense

Commit diff

app/controllers/browse_controller.rb

 
55 LOGS_PER_PAGE = 30
66
77 def index
8 @git = Git.bare(@repository.full_repository_path)
8 @git = Gitorious::Gitto.new(@repository.full_repository_path)
99 @commits = @git.log(LOGS_PER_PAGE)
10 @tags_per_sha = returning({}) do |hash|
11 @git.tags.each do |tag|
12 hash[tag.sha] ||= []
13 hash[tag.sha] << tag.name
14 end
15 end
16 # TODO: Patch rails to keep track of what it responds to so we can DRY this up
17 @atom_auto_discovery_url = project_repository_formatted_browse_path(@project, @repository, :atom)
18 respond_to do |format|
19 format.html
20 format.atom
21 end
2210 end
2311
12 # def index
13 # @git = Git.bare(@repository.full_repository_path)
14 # @commits = @git.log(LOGS_PER_PAGE)
15 # @tags_per_sha = returning({}) do |hash|
16 # @git.tags.each do |tag|
17 # hash[tag.sha] ||= []
18 # hash[tag.sha] << tag.name
19 # end
20 # end
21 # # TODO: Patch rails to keep track of what it responds to so we can DRY this up
22 # @atom_auto_discovery_url = project_repository_formatted_browse_path(@project, @repository, :atom)
23 # respond_to do |format|
24 # format.html
25 # format.atom
26 # end
27 # end
28
2429 def tree
2530 @git = Git.bare(@repository.full_repository_path)
2631 @tree = @git.gtree(params[:sha])
toggle raw diff

lib/gitorious/gitto.rb

 
1module Gitorious
2 # The point of this class is primary to prevent dangerous/malicious arguments
3 # to be passed down to the underlying Git library, since it shells out to
4 # the git binary.
5 class Gitto
6 def initialize(repository_path)
7 @repository_path = repository_path
8 @git = Git.bare(@repository_path)
9 end
10 attr_reader :repository_path, :git
11
12 def log(num, skip=nil)
13 @git.log(num, skip)
14 end
15
16 def tree(sha)
17 check_sha(sha)
18 @git.gtree(sha)
19 end
20
21 def commit(sha)
22 check_sha(sha)
23 @git.gcommit(sha)
24 end
25
26 def diff(old_sha, new_sha)
27 check_sha(old_sha)
28 check_sha(new_sha)
29 @git.diff(old_sha, new_sha)
30 end
31
32 def blob(sha)
33 check_sha(sha)
34 @git.gblob(sha)
35 end
36
37 def branches
38 @git.branches
39 end
40
41 def tags
42 @git.tags
43 end
44
45 def remotes
46 @git.remotes
47 end
48
49 def check_sha(objectish)
50 if /^[a-z0-9~\{\}\^\.]*$/i !~ objectish.to_s
51 raise BadShaError
52 end
53 end
54
55 class BadShaError < StandardError; end # :nodoc:
56 end
57
58end
toggle raw diff

lib/gitorious/gitto/gitto.rb

 
0module Gitorious
1 module Gitto
2
3 class BadShaError < StandardError; end # :nodoc:
4
5 # The point of this class is primary to prevent dangerous/malicious arguments
6 # to be passed down to the underlying Git library, since it shells out to
7 # the git binary.
8 class Gitto
9 def initialize(repository_path)
10 @repository_path = repository_path
11 @git = Git.bare(@repository_path)
12 end
13 attr_reader :repository_path, :git
14
15 def log(num, skip=nil)
16 @git.log(num, skip)
17 end
18
19 def tree(sha)
20 check_sha(sha)
21 @git.gtree(sha)
22 end
23
24 def commit(sha)
25 check_sha(sha)
26 @git.gcommit(sha)
27 end
28
29 def diff(old_sha, new_sha)
30 check_sha(old_sha)
31 check_sha(new_sha)
32 @git.diff(old_sha, new_sha)
33 end
34
35 def blob(sha)
36 check_sha(sha)
37 @git.gblob(sha)
38 end
39
40 def branches
41 @git.branches
42 end
43
44 def tags
45 @git.tags
46 end
47
48 def remotes
49 @git.remotes
50 end
51
52 def check_sha(objectish)
53 if /^[a-z0-9~\{\}\^\.]*$/i !~ objectish.to_s
54 raise BadShaError
55 end
56 end
57
58 end
59
60 end
61end
toggle raw diff

spec/controllers/browse_controller_spec.rb

 
11require File.dirname(__FILE__) + '/../spec_helper'
22
33describe BrowseController do
4 before(:each) do
5 login_as :johan
6 @project = projects(:johans)
7 @repository = @project.repositories.first
8
9 Project.should_receive(:find_by_slug!).with(@project.slug) \
10 .and_return(@project)
11 @project.repositories.should_receive(:find_by_name!) \
12 .with(@repository.name).and_return(@repository)
13 @repository.stub!(:has_commits?).and_return(true)
14
15 @git_mock = mock("Git mock", :null_object => true)
16 Gitorious::Gitto.should_receive(:new) \
17 .with(@repository.full_repository_path) \
18 .and_return(@git_mock)
19 end
20
21 describe "index" do
422
5 #Delete this example and add some real ones
6 it "should use BrowseController" do
7 controller.should be_an_instance_of(BrowseController)
23 def do_get
24 get :index, :project_id => @project.slug, :repository_id => @repository.name
25 end
26
27 it "GETs successfully" do
28 do_get
29 flash[:notice].should == nil
30 response.should be_success
31 end
32
33 it "fetches the specified log entries" do
34 @git_mock.should_receive(:log).with(BrowseController::LOGS_PER_PAGE).and_return(commits=mock("logentrues"))
35 do_get
36 assigns[:commits].should == commits
37 end
38
39 it "assigns the tags for easy lookup" do
40 @git_mock.should_receive(:log).with(BrowseController::LOGS_PER_PAGE).and_return(commits=mock("logentrues"))
41 do_get
42 assigns[:tags_per_sha].should == {:write => "me"}
43 end
844 end
945
1046end
toggle raw diff

spec/lib/gitorious/gitto/gitto_spec.rb

 
0require File.dirname(__FILE__) + '/../../../spec_helper'
1
2describe Gitorious::Gitto::Gitto do
3 Gitto = Gitorious::Gitto::Gitto
4
5 before(:each) do
6 @path = "/home/repositories/foo"
7 @git_mock = mock("Git mock")
8 Git.should_receive(:bare).with(@path).and_return(@git_mock)
9 @gitto = Gitto.new(@path)
10 end
11
12 def some_sha(char = "a")
13 char * 40
14 end
15
16 it "should return Git#log(10)" do
17 @git_mock.should_receive(:log).with(10, nil).and_return([])
18 @gitto.log(10)
19 end
20
21 it "returns Git#log(10,20)" do
22 @git_mock.should_receive(:log).with(10, 20).and_return([])
23 @gitto.log(10, 20)
24 end
25
26 it "returns Git#gtre" do
27 @git_mock.should_receive(:gtree).with(some_sha).and_return(mock("tree"))
28 @gitto.should_receive(:check_sha).with(some_sha)
29 @gitto.tree(some_sha)
30 end
31
32 it "return Git#gcommit" do
33 @git_mock.should_receive(:gcommit).with(some_sha).and_return(mock("commit"))
34 @gitto.should_receive(:check_sha).with(some_sha)
35 @gitto.commit(some_sha)
36 end
37
38 it "return Git#diff" do
39 @git_mock.should_receive(:diff).with(some_sha("a"), some_sha("b")).and_return(mock("diff"))
40 @gitto.should_receive(:check_sha).with(some_sha("a"))
41 @gitto.should_receive(:check_sha).with(some_sha("b"))
42 @gitto.diff(some_sha("a"), some_sha("b"))
43 end
44
45 it "return Git#gblob" do
46 @git_mock.should_receive(:gblob).with(some_sha).and_return(mock("blob"))
47 @gitto.should_receive(:check_sha).with(some_sha)
48 @gitto.blob(some_sha)
49 end
50
51 it "return Git#gblob" do
52 @git_mock.should_receive(:gblob).with(some_sha).and_return(mock("blob"))
53 @gitto.should_receive(:check_sha).with(some_sha)
54 @gitto.blob(some_sha)
55 end
56
57 it "returns Git#tags" do
58 @git_mock.should_receive(:tags).and_return([])
59 @gitto.tags
60 end
61
62 it "returns Git#branches" do
63 @git_mock.should_receive(:branches).and_return([])
64 @gitto.branches
65 end
66
67 it "returns Git#remotes" do
68 @git_mock.should_receive(:remotes).and_return([])
69 @gitto.remotes
70 end
71
72 describe "objectish validation" do
73 it "accepts good objectish" do
74 proc{
75 @gitto.check_sha(some_sha)
76 }.should_not raise_error(Gitorious::Gitto::BadShaError)
77 proc{
78 @gitto.check_sha( ("a"*20) + ("2"*20) )
79 }.should_not raise_error(Gitorious::Gitto::BadShaError)
80 proc{
81 @gitto.check_sha("HEAD")
82 }.should_not raise_error(Gitorious::Gitto::BadShaError)
83 proc{
84 @gitto.check_sha("HEAD~1")
85 }.should_not raise_error(Gitorious::Gitto::BadShaError)
86 proc{
87 @gitto.check_sha("HEAD^{1}") # valid chars at least
88 }.should_not raise_error(Gitorious::Gitto::BadShaError)
89 proc{
90 @gitto.check_sha("v0.1^{tree}")
91 }.should_not raise_error(Gitorious::Gitto::BadShaError)
92 end
93
94 it "raises on bad objectish" do
95 proc{
96 @gitto.check_sha("asd;rm -rf")
97 }.should raise_error(Gitorious::Gitto::BadShaError)
98 proc{
99 @gitto.check_sha("asd;cat /etc/foo")
100 }.should raise_error(Gitorious::Gitto::BadShaError)
101
102 proc{
103 @gitto.check_sha("%3B++%2Ffoo")
104 }.should raise_error(Gitorious::Gitto::BadShaError)
105 end
106 end
107
108end
toggle raw diff

spec/lib/gitorious/gitto_spec.rb

 
1require File.dirname(__FILE__) + '/../../spec_helper'
2
3describe Gitorious::Gitto do
4
5 before(:each) do
6 @path = "/home/repositories/foo"
7 @git_mock = mock("Git mock")
8 Git.should_receive(:bare).with(@path).and_return(@git_mock)
9 @gitto = Gitorious::Gitto.new(@path)
10 end
11
12 def some_sha(char = "a")
13 char * 40
14 end
15
16 it "should return Git#log(10)" do
17 @git_mock.should_receive(:log).with(10, nil).and_return([])
18 @gitto.log(10)
19 end
20
21 it "returns Git#log(10,20)" do
22 @git_mock.should_receive(:log).with(10, 20).and_return([])
23 @gitto.log(10, 20)
24 end
25
26 it "returns Git#gtre" do
27 @git_mock.should_receive(:gtree).with(some_sha).and_return(mock("tree"))
28 @gitto.should_receive(:check_sha).with(some_sha)
29 @gitto.tree(some_sha)
30 end
31
32 it "return Git#gcommit" do
33 @git_mock.should_receive(:gcommit).with(some_sha).and_return(mock("commit"))
34 @gitto.should_receive(:check_sha).with(some_sha)
35 @gitto.commit(some_sha)
36 end
37
38 it "return Git#diff" do
39 @git_mock.should_receive(:diff).with(some_sha("a"), some_sha("b")).and_return(mock("diff"))
40 @gitto.should_receive(:check_sha).with(some_sha("a"))
41 @gitto.should_receive(:check_sha).with(some_sha("b"))
42 @gitto.diff(some_sha("a"), some_sha("b"))
43 end
44
45 it "return Git#gblob" do
46 @git_mock.should_receive(:gblob).with(some_sha).and_return(mock("blob"))
47 @gitto.should_receive(:check_sha).with(some_sha)
48 @gitto.blob(some_sha)
49 end
50
51 it "return Git#gblob" do
52 @git_mock.should_receive(:gblob).with(some_sha).and_return(mock("blob"))
53 @gitto.should_receive(:check_sha).with(some_sha)
54 @gitto.blob(some_sha)
55 end
56
57 it "returns Git#tags" do
58 @git_mock.should_receive(:tags).and_return([])
59 @gitto.tags
60 end
61
62 it "returns Git#branches" do
63 @git_mock.should_receive(:branches).and_return([])
64 @gitto.branches
65 end
66
67 it "returns Git#remotes" do
68 @git_mock.should_receive(:remotes).and_return([])
69 @gitto.remotes
70 end
71
72 describe "objectish validation" do
73 it "accepts good objectish" do
74 proc{
75 @gitto.check_sha(some_sha)
76 }.should_not raise_error(Gitorious::Gitto::BadShaError)
77 proc{
78 @gitto.check_sha( ("a"*20) + ("2"*20) )
79 }.should_not raise_error(Gitorious::Gitto::BadShaError)
80 proc{
81 @gitto.check_sha("HEAD")
82 }.should_not raise_error(Gitorious::Gitto::BadShaError)
83 proc{
84 @gitto.check_sha("HEAD~1")
85 }.should_not raise_error(Gitorious::Gitto::BadShaError)
86 proc{
87 @gitto.check_sha("HEAD^{1}") # valid chars at least
88 }.should_not raise_error(Gitorious::Gitto::BadShaError)
89 proc{
90 @gitto.check_sha("v0.1^{tree}")
91 }.should_not raise_error(Gitorious::Gitto::BadShaError)
92 end
93
94 it "raises on bad objectish" do
95 proc{
96 @gitto.check_sha("asd;rm -rf")
97 }.should raise_error(Gitorious::Gitto::BadShaError)
98 proc{
99 @gitto.check_sha("asd;cat /etc/foo")
100 }.should raise_error(Gitorious::Gitto::BadShaError)
101
102 proc{
103 @gitto.check_sha("%3B++%2Ffoo")
104 }.should raise_error(Gitorious::Gitto::BadShaError)
105 end
106 end
107
108end
toggle raw diff