piston 1.4.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +24 -0
- data/License.txt +20 -0
- data/Manifest.txt +109 -0
- data/{README → README.txt} +14 -10
- data/VERSION.yml +4 -0
- data/bin/piston +3 -8
- data/lib/piston/cli.rb +121 -0
- data/lib/piston/commands/base.rb +44 -0
- data/lib/piston/commands/convert.rb +23 -71
- data/lib/piston/commands/diff.rb +14 -46
- data/lib/piston/commands/import.rb +48 -57
- data/lib/piston/commands/info.rb +24 -0
- data/lib/piston/commands/lock_unlock.rb +26 -0
- data/lib/piston/commands/status.rb +29 -54
- data/lib/piston/commands/update.rb +35 -122
- data/lib/piston/commands/upgrade.rb +26 -0
- data/lib/piston/commands.rb +4 -0
- data/lib/piston/git/client.rb +76 -0
- data/lib/piston/git/commit.rb +114 -0
- data/lib/piston/git/repository.rb +63 -0
- data/lib/piston/git/working_copy.rb +145 -0
- data/lib/piston/git.rb +13 -0
- data/lib/piston/repository.rb +61 -0
- data/lib/piston/revision.rb +83 -0
- data/lib/piston/svn/client.rb +88 -0
- data/lib/piston/svn/repository.rb +67 -0
- data/lib/piston/svn/revision.rb +112 -0
- data/lib/piston/svn/working_copy.rb +184 -0
- data/lib/piston/svn.rb +15 -0
- data/lib/piston/version.rb +9 -7
- data/lib/piston/working_copy.rb +334 -0
- data/lib/piston.rb +13 -64
- data/lib/subclass_responsibility_error.rb +2 -0
- data/test/integration_helpers.rb +36 -0
- data/test/spec_suite.rb +4 -0
- data/test/test_helper.rb +92 -0
- data/test/unit/git/commit/test_checkout.rb +31 -0
- data/test/unit/git/commit/test_each.rb +30 -0
- data/test/unit/git/commit/test_rememberance.rb +22 -0
- data/test/unit/git/commit/test_validation.rb +34 -0
- data/test/unit/git/repository/test_at.rb +23 -0
- data/test/unit/git/repository/test_basename.rb +12 -0
- data/test/unit/git/repository/test_branchanme.rb +15 -0
- data/test/unit/git/repository/test_guessing.rb +32 -0
- data/test/unit/git/working_copy/test_copying.rb +25 -0
- data/test/unit/git/working_copy/test_creation.rb +22 -0
- data/test/unit/git/working_copy/test_existence.rb +18 -0
- data/test/unit/git/working_copy/test_finalization.rb +15 -0
- data/test/unit/git/working_copy/test_guessing.rb +35 -0
- data/test/unit/git/working_copy/test_rememberance.rb +22 -0
- data/test/unit/svn/repository/test_at.rb +19 -0
- data/test/unit/svn/repository/test_basename.rb +24 -0
- data/test/unit/svn/repository/test_guessing.rb +45 -0
- data/test/unit/svn/revision/test_checkout.rb +28 -0
- data/test/unit/svn/revision/test_each.rb +22 -0
- data/test/unit/svn/revision/test_rememberance.rb +38 -0
- data/test/unit/svn/revision/test_validation.rb +50 -0
- data/test/unit/svn/working_copy/test_copying.rb +26 -0
- data/test/unit/svn/working_copy/test_creation.rb +16 -0
- data/test/unit/svn/working_copy/test_existence.rb +23 -0
- data/test/unit/svn/working_copy/test_externals.rb +56 -0
- data/test/unit/svn/working_copy/test_finalization.rb +17 -0
- data/test/unit/svn/working_copy/test_guessing.rb +18 -0
- data/test/unit/svn/working_copy/test_rememberance.rb +26 -0
- data/test/unit/test_info.rb +37 -0
- data/test/unit/test_lock_unlock.rb +47 -0
- data/test/unit/test_repository.rb +51 -0
- data/test/unit/test_revision.rb +31 -0
- data/test/unit/working_copy/test_guessing.rb +35 -0
- data/test/unit/working_copy/test_info.rb +14 -0
- data/test/unit/working_copy/test_rememberance.rb +42 -0
- data/test/unit/working_copy/test_validate.rb +63 -0
- metadata +132 -31
- data/CHANGELOG +0 -81
- data/LICENSE +0 -19
- data/Rakefile +0 -63
- data/contrib/piston +0 -43
- data/lib/core_ext/range.rb +0 -5
- data/lib/core_ext/string.rb +0 -9
- data/lib/piston/command.rb +0 -68
- data/lib/piston/command_error.rb +0 -6
- data/lib/piston/commands/lock.rb +0 -30
- data/lib/piston/commands/switch.rb +0 -139
- data/lib/piston/commands/unlock.rb +0 -29
- data/lib/transat/parser.rb +0 -189
data/test/test_helper.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "rubygems"
|
3
|
+
require "mocha"
|
4
|
+
require "log4r"
|
5
|
+
require "fileutils"
|
6
|
+
require "pathname"
|
7
|
+
require "piston"
|
8
|
+
require "active_support"
|
9
|
+
|
10
|
+
begin
|
11
|
+
require "turn"
|
12
|
+
rescue LoadError
|
13
|
+
# NOP: ignore, this is not a real dependency
|
14
|
+
end
|
15
|
+
|
16
|
+
require File.expand_path("#{File.dirname(__FILE__)}/integration_helpers")
|
17
|
+
require "find"
|
18
|
+
|
19
|
+
module Test
|
20
|
+
module Unit
|
21
|
+
module Assertions
|
22
|
+
def deny(boolean, message = nil)
|
23
|
+
message = build_message message, '<?> is not false or nil.', boolean
|
24
|
+
assert_block message do
|
25
|
+
not boolean
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Piston::TestCase < Test::Unit::TestCase
|
33
|
+
class << self
|
34
|
+
def logger
|
35
|
+
@@logger ||= Log4r::Logger["test"]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :pathnames
|
40
|
+
def setup
|
41
|
+
super
|
42
|
+
@pathnames = []
|
43
|
+
end
|
44
|
+
|
45
|
+
def teardown
|
46
|
+
pathnames.each do |pathname|
|
47
|
+
pathname.rmtree if File.exists?(pathname)
|
48
|
+
end
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def run(*args)
|
53
|
+
test_name = if self.respond_to?(:name) then
|
54
|
+
name
|
55
|
+
elsif self.respond_to?(:method_name) then
|
56
|
+
method_name
|
57
|
+
else
|
58
|
+
raise "Don't know how to get the test's name: neither #name or #method_name is available"
|
59
|
+
end
|
60
|
+
return if test_name.to_sym == :default_test && self.class == Piston::TestCase
|
61
|
+
super
|
62
|
+
end
|
63
|
+
|
64
|
+
def mkpath(path_or_pathname)
|
65
|
+
returning(path_or_pathname.is_a?(Pathname) ? path_or_pathname : Pathname.new(File.expand_path(path_or_pathname))) do |path|
|
66
|
+
path.mkpath
|
67
|
+
pathnames.push(path)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def logger
|
72
|
+
self.class.logger
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
LOG_DIR = Pathname.new(File.expand_path("#{File.dirname(__FILE__)}/../log")) unless Object::const_defined?(:LOG_DIR)
|
77
|
+
LOG_DIR.mkdir rescue nil
|
78
|
+
|
79
|
+
Log4r::Logger.root.level = Log4r::DEBUG
|
80
|
+
|
81
|
+
Log4r::Logger.new("main")
|
82
|
+
Log4r::Logger.new("handler")
|
83
|
+
Log4r::Logger.new("handler::client")
|
84
|
+
Log4r::Logger.new("handler::client::out")
|
85
|
+
Log4r::Logger.new("test")
|
86
|
+
|
87
|
+
FileUtils.touch("#{LOG_DIR}/test.log")
|
88
|
+
Log4r::FileOutputter.new("log", :trunc => true, :filename => (LOG_DIR + "test.log").realpath.to_s)
|
89
|
+
|
90
|
+
Log4r::Logger["main"].add "log"
|
91
|
+
Log4r::Logger["handler"].add "log"
|
92
|
+
Log4r::Logger["test"].add "log"
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitCommitCheckout < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = mock("repos")
|
7
|
+
@repos.stubs(:url).returns("git://a.repos.com/project.git")
|
8
|
+
@reposdir = Pathname.new("tmp/.repos.tmp.git")
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_clones_repository_at_indicated_path
|
12
|
+
@sha1 = "a9302"
|
13
|
+
@commit = Piston::Git::Commit.new(@repos, @sha1)
|
14
|
+
@commit.expects(:git).with(:clone, @repos.url, @reposdir)
|
15
|
+
@commit.expects(:git).with(:checkout, "-b", "my-#{@sha1}", @sha1)
|
16
|
+
@commit.expects(:git).with(:log, "-n", "1").returns("commit 922b12a6bcbb6f6a2cec60bcf5de17118086080a\nAuthor: Fran\303\247ois Beausoleil <francois@teksol.info>\nDate: Fri Mar 14 13:28:41 2008 -0400\n\n Changed how dependencies are found and managed, by using config/requirements.rb everywhere.\n \n Updated test/test_helper.rb where appropriate.\n")
|
17
|
+
Dir.expects(:chdir).with(@reposdir).yields
|
18
|
+
@commit.checkout_to(@reposdir)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_cloning_head_finds_head_commit
|
22
|
+
@sha1 = "master"
|
23
|
+
@commit = Piston::Git::Commit.new(@repos, @sha1)
|
24
|
+
@commit.expects(:git).with(:clone, @repos.url, @reposdir)
|
25
|
+
@commit.expects(:git).with(:checkout, "-b", "my-#{@sha1}", @sha1)
|
26
|
+
@commit.expects(:git).with(:log, "-n", "1").returns("commit 922b12a6bcbb6f6a2cec60bcf5de17118086080a\nAuthor: Fran\303\247ois Beausoleil <francois@teksol.info>\nDate: Fri Mar 14 13:28:41 2008 -0400\n\n Changed how dependencies are found and managed, by using config/requirements.rb everywhere.\n \n Updated test/test_helper.rb where appropriate.\n")
|
27
|
+
Dir.expects(:chdir).with(@reposdir).yields
|
28
|
+
@commit.checkout_to(@reposdir)
|
29
|
+
assert_equal "922b12a6bcbb6f6a2cec60bcf5de17118086080a", @commit.sha1
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitCommitEach < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = mock("repository")
|
7
|
+
@repos.stubs(:url).returns("git://github.com/francois/arepos.git")
|
8
|
+
@tmpdir = mkpath("tmp/.arepos.tmp.git")
|
9
|
+
|
10
|
+
@commit = Piston::Git::Commit.new(@repos, "ab"*20)
|
11
|
+
@commit.stubs(:git).returns("commit " + "ab" * 20)
|
12
|
+
@commit.checkout_to(@tmpdir)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_prunes_search_tree_on_dot_git_directory
|
16
|
+
@tmpdir.expects(:find).yields(@tmpdir + ".git")
|
17
|
+
assert_throws :prune do
|
18
|
+
@commit.each do |relpath|
|
19
|
+
# Can't assert anything
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_yields_paths_relative_to_working_copy
|
25
|
+
@tmpdir.expects(:find).yields(@tmpdir + "a.rb")
|
26
|
+
@commit.each do |relpath|
|
27
|
+
assert_equal Pathname.new("a.rb"), relpath
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitCommitRememberance < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = mock("repository")
|
7
|
+
@repos.stubs(:url).returns("git://github.com/francois/arepos.git")
|
8
|
+
|
9
|
+
@reposdir = Pathname.new("tmp/repos.git")
|
10
|
+
@commit = Piston::Git::Commit.new(@repos, "ab"*20)
|
11
|
+
@commit.stubs(:git).with("ls-remote", @repos.url, @commit.commit).returns("b"*40)
|
12
|
+
@values = @commit.remember_values
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_remembers_original_commit_sha1
|
16
|
+
assert_equal @values[Piston::Git::COMMIT], @commit.sha1
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_remembers_original_branch_name
|
20
|
+
assert_equal @values[Piston::Git::BRANCH], @commit.revision
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitCommitValidation < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repository = mock("repository")
|
7
|
+
@repository.stubs(:url).returns("git://my-git-repos/my-project.git")
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_is_invalid_if_cannot_ls_remote_repository
|
11
|
+
commit = new_commit("HEAD")
|
12
|
+
commit.expects(:git).with("ls-remote", @repository.url).raises(Piston::Git::Client::CommandError)
|
13
|
+
assert_raise Piston::Git::Commit::Gone do
|
14
|
+
commit.validate!
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_is_valid_when_ls_remote_succeeds
|
19
|
+
commit = new_commit("HEAD")
|
20
|
+
commit.expects(:git).with("ls-remote", @repository.url).returns(INFO)
|
21
|
+
assert_nothing_raised do
|
22
|
+
commit.validate!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
def new_commit(commit, recalled_values={})
|
28
|
+
Piston::Git::Commit.new(@repository, commit, recalled_values)
|
29
|
+
end
|
30
|
+
|
31
|
+
INFO = <<EOF
|
32
|
+
a7c46c702243f145a4089b0cb33d189870f1ae53 HEAD
|
33
|
+
EOF
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitRepositoryAt < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = Piston::Git::Repository.new("git://a.repos.com/project.git")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_returns_a_piston_git_commit
|
10
|
+
Piston::Git::Commit.expects(:new).with(@repos, "a93029").returns(commit = mock("commit"))
|
11
|
+
assert_equal commit, @repos.at("a93029")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_returns_a_piston_git_commit_at_head_when_appropriate
|
15
|
+
Piston::Git::Commit.expects(:new).with(@repos, "HEAD").returns(commit = mock("commit"))
|
16
|
+
assert_equal commit, @repos.at(:head)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_returns_a_git_commit_using_recalled_values
|
20
|
+
Piston::Git::Commit.expects(:new).with(@repos, "a"*40, Piston::Git::COMMIT => "a"*40).returns(commit = mock("commit"))
|
21
|
+
assert_equal commit, @repos.at(Piston::Git::COMMIT => "a"*40)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitRepositoryBasename < Piston::TestCase
|
4
|
+
def test_basename_is_urls_last_component_minus_dot_git
|
5
|
+
assert_equal "piston", basename("git://github.com/francois/piston.git")
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def basename(url)
|
10
|
+
Piston::Git::Repository.new(url).basename
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitRepositoryBranchname < Piston::TestCase
|
4
|
+
def test_branchname_is_nil_when_no_branch_in_url
|
5
|
+
assert_nil Piston::Git::Repository.new("git://github.com/francois/piston.git").branchname
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_branchname_is_branch_when_branch_in_url
|
9
|
+
assert_equal "branch", Piston::Git::Repository.new("git://github.com/francois/piston.git?branch").branchname
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_url_does_not_include_branchname
|
13
|
+
assert_equal "git://github.com/francois/piston.git", Piston::Git::Repository.new("git://github.com/francois/piston.git?branch").url
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitRepositoryGuessing < Piston::TestCase
|
4
|
+
def test_understands_git_protocol
|
5
|
+
assert Piston::Git::Repository.understands_url?("git://github.com/francois/piston.git")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_understands_git_ssh_protocol
|
9
|
+
Piston::Git::Repository.expects(:git).with("ls-remote", "--heads", "git@github.com:francois/piston.git").returns("ab"*20 + " refs/heads/master")
|
10
|
+
assert Piston::Git::Repository.understands_url?("git@github.com:francois/piston.git")
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_understand_http_when_heads_returned
|
14
|
+
Piston::Git::Repository.expects(:git).with("ls-remote", "--heads", "http://github.com/francois/piston.git").returns("ab"*20 + " refs/heads/master")
|
15
|
+
assert Piston::Git::Repository.understands_url?("http://github.com/francois/piston.git")
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_does_not_understand_http_when_no_heads
|
19
|
+
Piston::Git::Repository.expects(:git).with("ls-remote", "--heads", "http://github.com/francois/piston.git").returns("")
|
20
|
+
deny Piston::Git::Repository.understands_url?("http://github.com/francois/piston.git")
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_asks_url_when_ssh_protocol
|
24
|
+
Piston::Git::Repository.expects(:git).with("ls-remote", "--heads", "ssh://francois@github.com/francois/piston.git").returns("ab"*20 + " refs/heads/master")
|
25
|
+
assert Piston::Git::Repository.understands_url?("ssh://francois@github.com/francois/piston.git")
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_asks_base_url_when_named_branch_in_url
|
29
|
+
Piston::Git::Repository.expects(:git).with("ls-remote", "--heads", "ssh://francois@github.com/francois/piston.git").returns("ab"*20 + " refs/heads/master")
|
30
|
+
assert Piston::Git::Repository.understands_url?("ssh://francois@github.com/francois/piston.git?convert")
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyCopying < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = mkpath("tmp/wc")
|
7
|
+
@wc = Piston::Git::WorkingCopy.new(@wcdir)
|
8
|
+
@wc.stubs(:git)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_copies_file
|
12
|
+
files = ["file.rb"]
|
13
|
+
files.expects(:copy_to).with("file.rb", @wcdir + files.first)
|
14
|
+
@wc.copy_from(files)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_ensures_directories_are_created
|
18
|
+
files = ["file/a.rb"]
|
19
|
+
@wcdir.expects(:+).with(files.first).returns(target = mock("target"))
|
20
|
+
target.expects(:dirname).returns(target)
|
21
|
+
target.expects(:mkdir)
|
22
|
+
files.expects(:copy_to).with("file/a.rb", target)
|
23
|
+
@wc.copy_from(files)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyCreation < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = mkpath("tmp/wc")
|
7
|
+
@wc = Piston::Git::WorkingCopy.new(@wcdir)
|
8
|
+
@wc.stubs(:git)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_create_does_a_simple_mkpath
|
12
|
+
@wcdir.expects(:mkpath)
|
13
|
+
@wc.create
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_create_succeeds_even_if_mkpath_fails
|
17
|
+
@wcdir.expects(:mkpath).raises(Errno::EEXIST)
|
18
|
+
assert_nothing_raised do
|
19
|
+
@wc.create
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyExistence < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wc = Piston::Git::WorkingCopy.new("tmp/wc")
|
7
|
+
@wcdir = @wc.path
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_exist_false_when_no_dir
|
11
|
+
deny @wc.exist?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_exist_true_when_dir_present
|
15
|
+
@wcdir.mkdir
|
16
|
+
assert @wc.exist?
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyFinalization < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = mkpath("tmp/wc")
|
7
|
+
@wc = Piston::Git::WorkingCopy.new(@wcdir)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_finalize_adds_path_to_git
|
11
|
+
Dir.expects(:chdir).with(@wcdir).yields
|
12
|
+
@wc.expects(:git).with(:add, ".")
|
13
|
+
@wc.finalize
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyGuessing < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@dir = mkpath("tmp/wc")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_does_git_status_on_directory
|
10
|
+
Dir.expects(:chdir).with(@dir).yields
|
11
|
+
Piston::Git::WorkingCopy.expects(:git).with(:status).returns("# On branch master
|
12
|
+
nothing to commit (working directory clean)
|
13
|
+
")
|
14
|
+
assert Piston::Git::WorkingCopy.understands_dir?(@dir)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_does_git_status_on_parent_directories_recursively
|
18
|
+
@wc = @dir
|
19
|
+
@tmp = @wc.parent
|
20
|
+
@root = @tmp.parent
|
21
|
+
|
22
|
+
Dir.expects(:chdir).with(@dir).raises(Errno::ENOENT)
|
23
|
+
Dir.expects(:chdir).with(@tmp).raises(Errno::ENOENT)
|
24
|
+
Dir.expects(:chdir).with(@root).yields
|
25
|
+
Piston::Git::WorkingCopy.expects(:git).with(:status).returns("# On branch master
|
26
|
+
nothing to commit (working directory clean)
|
27
|
+
")
|
28
|
+
assert Piston::Git::WorkingCopy.understands_dir?(@dir)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_denies_when_git_unavailable
|
32
|
+
Piston::Git::WorkingCopy.stubs(:git).raises(Piston::Git::Client::BadCommand)
|
33
|
+
deny Piston::Git::WorkingCopy.understands_dir?(@dir)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Git::TestGitWorkingCopyRememberance < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = mkpath("tmp/wc")
|
7
|
+
Dir.chdir(@wcdir) { git(:init) }
|
8
|
+
@wc = Piston::Git::WorkingCopy.new(@wcdir)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_creates_dot_piston_dot_yml_file
|
12
|
+
@wc.remember({}, "a" => "b")
|
13
|
+
assert((@wcdir + ".piston.yml").exist?)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_writes_values_as_yaml_under_handler_key
|
17
|
+
expected = {"a" => "b"}
|
18
|
+
@wc.remember({}, expected)
|
19
|
+
actual = YAML.load((@wcdir + ".piston.yml").read)
|
20
|
+
assert_equal expected, actual["handler"]
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRepositoryAt < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = Piston::Svn::Repository.new("http://bla.com/svn/repos/trunk")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_instantiate_revision_at_head
|
10
|
+
Piston::Svn::Revision.expects(:new).with(@repos, "HEAD").returns(:newrev)
|
11
|
+
assert_equal :newrev, @repos.at(:head)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_instantiate_revision_using_recalled_values
|
15
|
+
recalled_values = {Piston::Svn::REMOTE_REV => 9123, Piston::Svn::UUID => "5ecf4fe2-1ee6-0310-87b1-e25e094e27de"}
|
16
|
+
Piston::Svn::Revision.expects(:new).with(@repos, 9123, recalled_values).returns(:newrev)
|
17
|
+
assert_equal :newrev, @repos.at(recalled_values)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRepositoryBasename < Piston::TestCase
|
4
|
+
def test_basename_is_urls_path_last_component
|
5
|
+
assert_equal "piston", basename("http://svn.rubyforge.org/var/svn/piston")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_basename_is_urls_path_last_component_minus_trunk
|
9
|
+
assert_equal "attachment_fu", basename("svn+ssh://some.host.com/svn/attachment_fu/trunk")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_basename_is_urls_path_last_component_before_branches
|
13
|
+
assert_equal "rails", basename("svn://some.host.com/svn/rails/branches/stable")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_basename_is_urls_path_last_component_before_tags
|
17
|
+
assert_equal "plugin", basename("https://some.host.com/svn/plugin/tags/stable")
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def basename(url)
|
22
|
+
Piston::Svn::Repository.new(url).basename
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRepositoryGuessing < Piston::TestCase
|
4
|
+
def test_guesses_with_svn_protocol
|
5
|
+
assert Piston::Svn::Repository.understands_url?("svn://a.host.com/")
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_guesses_with_svn_plus_bla_protocol
|
9
|
+
assert Piston::Svn::Repository.understands_url?("svn+bla://username@a.host.com/")
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_guesses_with_svn_plus_ssh_protocol
|
13
|
+
assert Piston::Svn::Repository.understands_url?("svn+ssh://username@a.host.com/")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_contacts_repository_for_file_protocol
|
17
|
+
url = "file:///home/username/svn/projects/trunk"
|
18
|
+
Piston::Svn::Repository.expects(:svn).with(:info, url).returns("Repository UUID: abcdef\n")
|
19
|
+
assert Piston::Svn::Repository.understands_url?(url)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_contacts_repository_for_http_protocol
|
23
|
+
url = "http://svn.collab.net/repos/svn/trunk"
|
24
|
+
Piston::Svn::Repository.expects(:svn).with(:info, url).returns("Repository UUID: abcdef\n")
|
25
|
+
assert Piston::Svn::Repository.understands_url?(url)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_contacts_repository_for_https_protocol
|
29
|
+
url = "https://svn.collab.net/repos/svn/trunk"
|
30
|
+
Piston::Svn::Repository.expects(:svn).with(:info, url).returns("Repository UUID: abcdef\n")
|
31
|
+
assert Piston::Svn::Repository.understands_url?(url)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_says_does_not_understand_when_svn_info_errors_out
|
35
|
+
url = "http://rubyonrails.org/"
|
36
|
+
Piston::Svn::Repository.expects(:svn).with(:info, url).raises(Piston::Svn::Client::Failed)
|
37
|
+
deny Piston::Svn::Repository.understands_url?(url)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_says_does_not_understand_when_svn_command_not_found
|
41
|
+
url = "http://rubyonrails.org/"
|
42
|
+
Piston::Svn::Repository.expects(:svn).with(:info, url).raises(Piston::Svn::Client::BadCommand)
|
43
|
+
deny Piston::Svn::Repository.understands_url?(url)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRevisionCheckout < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = Pathname.new("tmp/wc")
|
7
|
+
@repos = mock("repository")
|
8
|
+
@repos.stubs(:url).returns("http://a.repos.com/trunk")
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_head_checkout_to_path
|
12
|
+
rev = new_revision("HEAD")
|
13
|
+
rev.expects(:svn).with(:checkout, "--revision", "HEAD", @repos.url, @wcdir).returns("Checked out revision 1322.")
|
14
|
+
rev.checkout_to(@wcdir)
|
15
|
+
assert_equal 1322, rev.revision
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_specific_revision_checkout_to_path
|
19
|
+
rev = new_revision(1231)
|
20
|
+
rev.expects(:svn).with(:checkout, "--revision", 1231, @repos.url, @wcdir).returns("Checked out revision 1231.")
|
21
|
+
rev.checkout_to(@wcdir)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def new_revision(revision)
|
26
|
+
Piston::Svn::Revision.new(@repos, revision)
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRevisionEach < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@repos = mock("repository")
|
7
|
+
@repos.stubs(:url).returns("http://a.repos.com/project/trunk")
|
8
|
+
|
9
|
+
@wcdir = Pathname.new("tmp/.wc.tmp")
|
10
|
+
|
11
|
+
@rev = Piston::Svn::Revision.new(@repos, "HEAD")
|
12
|
+
@rev.stubs(:svn).returns("Checked out revision 111.\n")
|
13
|
+
@rev.checkout_to(@wcdir)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_each_skips_over_svn_metadata_folders
|
17
|
+
@rev.expects(:svn).with(:ls, "--recursive", @wcdir).returns("CONTRIBUTORS\nREADME\ntest/test_helper.rb\n")
|
18
|
+
expected = ["CONTRIBUTORS", "README", "test/test_helper.rb"]
|
19
|
+
actual = @rev.inject([]) {|memo, relpath| memo << relpath}
|
20
|
+
assert_equal expected.sort, actual.sort
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../../../test_helper")
|
2
|
+
|
3
|
+
class Piston::Svn::TestSvnRevisionRememberance < Piston::TestCase
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@wcdir = mkpath("tmp/wc")
|
7
|
+
@repos = mock("repository")
|
8
|
+
@repos.stubs(:url).returns("http://a.repos.com/svn/trunk")
|
9
|
+
|
10
|
+
@info = {"Path" => @wcdir.realpath,
|
11
|
+
"URL" => "http://a.repos.com/svn/trunk",
|
12
|
+
"Repository Root" => "http://a.repos.com/svn",
|
13
|
+
"Repository UUID" => "some-long-uuid",
|
14
|
+
"Revision" => "9283",
|
15
|
+
"Node Kind" => "directory",
|
16
|
+
"Schedule" => "normal",
|
17
|
+
"Last Changed Author" => "me",
|
18
|
+
"Last Changed Rev" => "9283",
|
19
|
+
"Last Changed Date" => "2008-03-11 20:44:24 -0400 (Tue, 11 Mar 2008)"}
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_remembers_repos_uuid
|
23
|
+
rev = new_revision("HEAD")
|
24
|
+
rev.expects(:svn).with(:info, "--revision", "HEAD", @repos.url).returns(@info.to_yaml)
|
25
|
+
assert_equal "some-long-uuid", rev.remember_values[Piston::Svn::UUID]
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_remembers_repos_revision
|
29
|
+
rev = new_revision("HEAD")
|
30
|
+
rev.expects(:svn).with(:info, "--revision", "HEAD", @repos.url).returns(@info.to_yaml)
|
31
|
+
assert_equal "9283", rev.remember_values[Piston::Svn::REMOTE_REV]
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def new_revision(revision)
|
36
|
+
Piston::Svn::Revision.new(@repos, revision)
|
37
|
+
end
|
38
|
+
end
|