piston 1.4.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|