jeremylightsmith-piston 1.9.3

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.
Files changed (95) hide show
  1. data/.gitignore +6 -0
  2. data/History.txt +6 -0
  3. data/License.txt +20 -0
  4. data/Manifest.txt +86 -0
  5. data/README.txt +136 -0
  6. data/Rakefile +4 -0
  7. data/bin/piston +5 -0
  8. data/config/hoe.rb +76 -0
  9. data/config/requirements.rb +18 -0
  10. data/lib/piston.rb +18 -0
  11. data/lib/piston/cli.rb +279 -0
  12. data/lib/piston/commands.rb +4 -0
  13. data/lib/piston/commands/base.rb +44 -0
  14. data/lib/piston/commands/import.rb +69 -0
  15. data/lib/piston/commands/info.rb +14 -0
  16. data/lib/piston/commands/lock_unlock.rb +21 -0
  17. data/lib/piston/commands/update.rb +28 -0
  18. data/lib/piston/git.rb +12 -0
  19. data/lib/piston/git/client.rb +77 -0
  20. data/lib/piston/git/commit.rb +70 -0
  21. data/lib/piston/git/repository.rb +63 -0
  22. data/lib/piston/git/working_copy.rb +63 -0
  23. data/lib/piston/repository.rb +57 -0
  24. data/lib/piston/revision.rb +48 -0
  25. data/lib/piston/svn.rb +14 -0
  26. data/lib/piston/svn/client.rb +88 -0
  27. data/lib/piston/svn/repository.rb +67 -0
  28. data/lib/piston/svn/revision.rb +74 -0
  29. data/lib/piston/svn/working_copy.rb +55 -0
  30. data/lib/piston/version.rb +9 -0
  31. data/lib/piston/working_copy.rb +129 -0
  32. data/lib/subclass_responsibility_error.rb +2 -0
  33. data/log/.gitignore +0 -0
  34. data/samples/common.rb +19 -0
  35. data/samples/import_git_git.rb +39 -0
  36. data/samples/import_git_svn.rb +36 -0
  37. data/samples/import_svn_git.rb +29 -0
  38. data/samples/import_svn_svn.rb +24 -0
  39. data/script/destroy +14 -0
  40. data/script/generate +14 -0
  41. data/script/txt2html +74 -0
  42. data/setup.rb +1585 -0
  43. data/tasks/deployment.rake +40 -0
  44. data/tasks/environment.rake +7 -0
  45. data/tasks/samples.rake +6 -0
  46. data/tasks/test.rake +30 -0
  47. data/tasks/website.rake +17 -0
  48. data/test/integration/test_import_git_git.rb +96 -0
  49. data/test/integration/test_import_git_svn.rb +131 -0
  50. data/test/integration/test_import_svn_git.rb +52 -0
  51. data/test/integration/test_import_svn_svn.rb +43 -0
  52. data/test/integration_helpers.rb +33 -0
  53. data/test/test_helper.rb +56 -0
  54. data/test/unit/git/commit/test_checkout.rb +30 -0
  55. data/test/unit/git/commit/test_each.rb +36 -0
  56. data/test/unit/git/commit/test_rememberance.rb +20 -0
  57. data/test/unit/git/commit/test_validation.rb +33 -0
  58. data/test/unit/git/repository/test_at.rb +22 -0
  59. data/test/unit/git/repository/test_basename.rb +12 -0
  60. data/test/unit/git/repository/test_branchanme.rb +15 -0
  61. data/test/unit/git/repository/test_guessing.rb +32 -0
  62. data/test/unit/git/working_copy/test_copying.rb +28 -0
  63. data/test/unit/git/working_copy/test_creation.rb +26 -0
  64. data/test/unit/git/working_copy/test_existence.rb +21 -0
  65. data/test/unit/git/working_copy/test_finalization.rb +18 -0
  66. data/test/unit/git/working_copy/test_guessing.rb +34 -0
  67. data/test/unit/git/working_copy/test_rememberance.rb +25 -0
  68. data/test/unit/svn/repository/test_at.rb +18 -0
  69. data/test/unit/svn/repository/test_basename.rb +24 -0
  70. data/test/unit/svn/repository/test_guessing.rb +45 -0
  71. data/test/unit/svn/revision/test_checkout.rb +27 -0
  72. data/test/unit/svn/revision/test_each.rb +21 -0
  73. data/test/unit/svn/revision/test_rememberance.rb +42 -0
  74. data/test/unit/svn/revision/test_validation.rb +49 -0
  75. data/test/unit/svn/working_copy/test_copying.rb +29 -0
  76. data/test/unit/svn/working_copy/test_creation.rb +19 -0
  77. data/test/unit/svn/working_copy/test_existence.rb +26 -0
  78. data/test/unit/svn/working_copy/test_finalization.rb +21 -0
  79. data/test/unit/svn/working_copy/test_guessing.rb +17 -0
  80. data/test/unit/svn/working_copy/test_rememberance.rb +26 -0
  81. data/test/unit/test_import.rb +13 -0
  82. data/test/unit/test_info.rb +36 -0
  83. data/test/unit/test_lock_unlock.rb +46 -0
  84. data/test/unit/test_repository.rb +50 -0
  85. data/test/unit/test_revision.rb +30 -0
  86. data/test/unit/working_copy/test_guessing.rb +34 -0
  87. data/test/unit/working_copy/test_info.rb +13 -0
  88. data/test/unit/working_copy/test_rememberance.rb +48 -0
  89. data/test/unit/working_copy/test_validate.rb +68 -0
  90. data/website/index.html +11 -0
  91. data/website/index.txt +39 -0
  92. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  93. data/website/stylesheets/screen.css +138 -0
  94. data/website/template.rhtml +48 -0
  95. metadata +228 -0
@@ -0,0 +1,6 @@
1
+ *.swp
2
+ *.log
3
+ pkg
4
+ *.iml
5
+ *.ipr
6
+ *.iws
@@ -0,0 +1,6 @@
1
+ == 1.9.3 2008-06-03
2
+
3
+ * Import git branches using --revision origin/BRANCH_NAME, or a tag
4
+ using --revision TAG_NAME, or even a specific commit using
5
+ --revision COMMIT_ID. In fact, use a committish and you'll be fine,
6
+ even HEAD^3.
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2006-2008 François Beausoleil <francois@teksol.info>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,86 @@
1
+ .gitignore
2
+ History.txt
3
+ License.txt
4
+ Manifest.txt
5
+ README.txt
6
+ Rakefile
7
+ bin/piston
8
+ config/hoe.rb
9
+ config/requirements.rb
10
+ lib/piston.rb
11
+ lib/piston/cli.rb
12
+ lib/piston/commands.rb
13
+ lib/piston/commands/base.rb
14
+ lib/piston/commands/import.rb
15
+ lib/piston/commands/lock_unlock.rb
16
+ lib/piston/commands/update.rb
17
+ lib/piston/commands/info.rb
18
+ lib/piston/git.rb
19
+ lib/piston/git/client.rb
20
+ lib/piston/git/commit.rb
21
+ lib/piston/git/repository.rb
22
+ lib/piston/git/working_copy.rb
23
+ lib/piston/repository.rb
24
+ lib/piston/revision.rb
25
+ lib/piston/svn.rb
26
+ lib/piston/svn/client.rb
27
+ lib/piston/svn/repository.rb
28
+ lib/piston/svn/revision.rb
29
+ lib/piston/svn/working_copy.rb
30
+ lib/piston/version.rb
31
+ lib/piston/working_copy.rb
32
+ lib/subclass_responsibility_error.rb
33
+ log/.gitignore
34
+ samples/common.rb
35
+ samples/import_git_git.rb
36
+ samples/import_git_svn.rb
37
+ samples/import_svn_git.rb
38
+ samples/import_svn_svn.rb
39
+ script/destroy
40
+ script/generate
41
+ script/txt2html
42
+ setup.rb
43
+ tasks/deployment.rake
44
+ tasks/environment.rake
45
+ tasks/samples.rake
46
+ tasks/test.rake
47
+ tasks/website.rake
48
+ test/integration/test_import_git_git.rb
49
+ test/integration/test_import_git_svn.rb
50
+ test/integration/test_import_svn_git.rb
51
+ test/integration/test_import_svn_svn.rb
52
+ test/integration_helpers.rb
53
+ test/test_helper.rb
54
+ test/unit/git/commit/test_checkout.rb
55
+ test/unit/git/commit/test_each.rb
56
+ test/unit/git/commit/test_rememberance.rb
57
+ test/unit/git/repository/test_at.rb
58
+ test/unit/git/repository/test_basename.rb
59
+ test/unit/git/repository/test_guessing.rb
60
+ test/unit/git/working_copy/test_copying.rb
61
+ test/unit/git/working_copy/test_creation.rb
62
+ test/unit/git/working_copy/test_existence.rb
63
+ test/unit/git/working_copy/test_finalization.rb
64
+ test/unit/git/working_copy/test_guessing.rb
65
+ test/unit/git/working_copy/test_rememberance.rb
66
+ test/unit/svn/repository/test_at.rb
67
+ test/unit/svn/repository/test_basename.rb
68
+ test/unit/svn/repository/test_guessing.rb
69
+ test/unit/svn/revision/test_checkout.rb
70
+ test/unit/svn/revision/test_each.rb
71
+ test/unit/svn/revision/test_rememberance.rb
72
+ test/unit/svn/working_copy/test_copying.rb
73
+ test/unit/svn/working_copy/test_creation.rb
74
+ test/unit/svn/working_copy/test_existence.rb
75
+ test/unit/svn/working_copy/test_finalization.rb
76
+ test/unit/svn/working_copy/test_guessing.rb
77
+ test/unit/svn/working_copy/test_rememberance.rb
78
+ test/unit/test_import.rb
79
+ test/unit/working_copy/test_guessing.rb
80
+ test/unit/working_copy/test_rememberance.rb
81
+ tmp/.gitignore
82
+ website/index.html
83
+ website/index.txt
84
+ website/javascripts/rounded_corners_lite.inc.js
85
+ website/stylesheets/screen.css
86
+ website/template.rhtml
@@ -0,0 +1,136 @@
1
+ Piston is a utility that eases vendor branch management.
2
+ This is similar to <tt>svn:externals</tt>, except you have a local copy of
3
+ the files, which you can modify at will. As long as the changes are
4
+ mergeable, you should have no problems.
5
+
6
+ This tool has a similar purpose than svnmerge.py which you can find in the
7
+ contrib/client-side folder of the main Subversion repository at
8
+ http://svn.collab.net/repos/svn/trunk/contrib/client-side/svnmerge.py.
9
+ The main difference is that Piston is designed to work with remote
10
+ repositories. Another tool you might want to look at, SVK, which you can find
11
+ at http://svk.elixus.org/.
12
+
13
+ From Wikipedia's Piston page (http://en.wikipedia.org/wiki/Piston):
14
+ In general, a piston is a sliding plug that fits closely inside the bore
15
+ of a cylinder.
16
+
17
+ Its purpose is either to change the volume enclosed by the cylinder, or
18
+ to exert a force on a fluid inside the cylinder.
19
+
20
+ For this utility, I retain the second meaning, "to exert a force on a fluid
21
+ inside the cylinder." Piston forces the content of a remote repository
22
+ location back into our own.
23
+
24
+
25
+ = Notes on 2.0
26
+
27
+ In the 1.0 era, Piston was exclusively geared towards Subversion repositories.
28
+ In early 2008, Git gained a lot of popularity among Ruby and Rails coders.
29
+ Piston was rewritten during that period to allow many repositories and working
30
+ copies to be used together.
31
+
32
+ The documentation still refers to Subversion throughout, but 2.0 allows any
33
+ repository to be used with any working copy.
34
+
35
+
36
+ = Installation
37
+
38
+ Nothing could be simpler:
39
+
40
+ $ gem install piston
41
+
42
+
43
+ = Usage
44
+
45
+ First, you need to import the remote repository location:
46
+
47
+ $ piston import http://dev.rubyonrails.org/svn/rails/trunk vendor/rails
48
+ Exported r4720 from 'http://dev.rubyonrails.org/svn/rails/trunk' to 'vendor/rails'
49
+
50
+ $ svn commit -m "Importing local copy of Rails"
51
+
52
+ When you want to get the latest changes from the remote repository location:
53
+
54
+ $ piston update vendor/rails
55
+ Updated 'vendor/rails' to r4720.
56
+
57
+ $ svn commit -m "Updates vendor/rails to the latest revision"
58
+
59
+ You can prevent a local Piston-managed folder from updating by using the
60
+ +lock+ subcommand:
61
+
62
+ $ piston lock vendor/rails
63
+ 'vendor/rails' locked at r4720.
64
+
65
+ When you want to update again, you unlock:
66
+
67
+ $ piston unlock vendor/rails
68
+ 'vendor/rails' unlocked.
69
+
70
+ If the branch you are following moves, you should use the switch subcommand:
71
+
72
+ $ piston import http://dev.rubyonrails.org/svn/rails/branches/1-2-pre-release vendor/rails
73
+ $ svn commit vendor/rails
74
+
75
+ # Vendor branch is renamed, let's follow it
76
+ $ piston switch http://dev.rubyonrails.org/svn/rails/branches/1-2-stable vendor/rails
77
+
78
+
79
+ = Contributions
80
+
81
+ == Bash Shell Completion Script
82
+
83
+ Michael Schuerig contributed a Bash shell completion script. You should copy
84
+ +contrib/piston+ from your gem repository to the appropriate folder. Michael
85
+ said:
86
+
87
+ I've put together a bash completion function for piston. On Debian, I
88
+ just put it in /etc/bash_completion.d, alternatively, the contents can
89
+ be copied to ~/.bash_completion. I don't know how things are organized
90
+ on other Unix/Linux systems.
91
+
92
+
93
+ = Caveats
94
+
95
+ == Speed
96
+
97
+ This tool is SLOW. The update process particularly so. I use a brute force
98
+ approach. Subversion cannot merge from remote repositories, so instead I
99
+ checkout the folder at the initial revision, and then run svn update and
100
+ parse the results of that to determine what changes have occured.
101
+
102
+ If a local copy of a file was changed, it's changes will be merged back in.
103
+ If that introduces a conflict, Piston will not detect it. The commit will be
104
+ rejected by Subversion anyway.
105
+
106
+ == Copies / Renames
107
+
108
+ Piston *does not* track copies. Since Subversion does renames in two
109
+ phases (copy + delete), that is what Piston does.
110
+
111
+ == Local Operations Only
112
+
113
+ Piston only works if you have a working copy. It also never commits your
114
+ working copy directly. You are responsible for reviewing the changes and
115
+ applying any pending fixes.
116
+
117
+ == Remote Repository UUID
118
+
119
+ Piston caches the remote repository UUID, allowing it to know if the remote
120
+ repos is still the same. Piston refuses to work against a different
121
+ repository than the one we checked out from originally.
122
+
123
+
124
+ = Subversion Properties Used
125
+
126
+ * <tt>piston:uuid</tt>: The remote repository's UUID, which we always confirm
127
+ before doing any operations.
128
+ * <tt>piston:root</tt>: The repository root URL from which this Piston folder
129
+ was exported from.
130
+ * <tt>piston:remote-revision</tt>: The <tt>Last Changed Rev</tt> of the remote
131
+ repository.
132
+ * <tt>piston:local-revision</tt>: The <tt>Last Changed Rev</tt> of the Piston
133
+ managed folder, to enable us to know if we need to do any merging.
134
+ * <tt>piston:locked</tt>: The revision at which this folder is locked. If
135
+ this property is set and non-blank, Piston will skip the folder with
136
+ an appropriate message.
@@ -0,0 +1,4 @@
1
+ require "config/requirements"
2
+ require "config/hoe" # setup Hoe + all gem configuration
3
+
4
+ Dir["tasks/**/*.rake"].each { |rake| load rake }
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+ require "piston"
3
+
4
+ # Chain to the real command-line client
5
+ require "piston/cli"
@@ -0,0 +1,76 @@
1
+ require "piston/version"
2
+
3
+ AUTHOR = "Francois Beausoleil"
4
+ EMAIL = "francois@teksol.info"
5
+ DESCRIPTION = "description of gem"
6
+ GEM_NAME = "piston"
7
+
8
+ RUBYFORGE_PROJECT = "piston"
9
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
10
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
11
+
12
+ @config_file = "~/.rubyforge/user-config.yml"
13
+ @config = nil
14
+ RUBYFORGE_USERNAME = "unknown"
15
+ def rubyforge_username
16
+ unless @config
17
+ begin
18
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
19
+ rescue
20
+ puts <<-EOS
21
+ ERROR: No rubyforge config file found: #{@config_file}
22
+ Run "rubyforge setup" to prepare your env for access to Rubyforge
23
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
24
+ EOS
25
+ exit
26
+ end
27
+ end
28
+ RUBYFORGE_USERNAME.replace @config["username"]
29
+ end
30
+
31
+
32
+ REV = nil
33
+ # UNCOMMENT IF REQUIRED:
34
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
35
+ VERS = Piston::VERSION::STRING + (REV ? ".#{REV}" : "")
36
+ RDOC_OPTS = ["--quiet", "--title", "Piston Documentation",
37
+ "--opname", "index.html",
38
+ "--line-numbers",
39
+ "--main", "README",
40
+ "--inline-source"]
41
+
42
+ class Hoe
43
+ def extra_deps
44
+ @extra_deps.reject! { |x| Array(x).first == "hoe" }
45
+ @extra_deps
46
+ end
47
+ end
48
+
49
+ # Generate all the Rake tasks
50
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
51
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
52
+ p.developer(AUTHOR, EMAIL)
53
+ p.description = DESCRIPTION
54
+ p.summary = DESCRIPTION
55
+ p.url = HOMEPATH
56
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
57
+ p.test_globs = ["test/**/test_*.rb"]
58
+ p.clean_globs |= ["**/.*.sw?", "*.gem", ".config", "**/.DS_Store"] #An array of file patterns to delete on clean.
59
+
60
+ # == Optional
61
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
62
+ p.extra_deps = [
63
+ ["main", "~> 2.8.0"],
64
+ ["open4", "~> 0.9.6"],
65
+ ["log4r", "~> 1.0.5"],
66
+ ["activesupport", "~> 2.0.2"]
67
+ ]
68
+
69
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
70
+
71
+ end
72
+
73
+ CHANGES = hoe.paragraphs_of("History.txt", 0..1).join("\\n\\n")
74
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
75
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,""), "rdoc")
76
+ hoe.rsync_args = "-av --delete --ignore-errors"
@@ -0,0 +1,18 @@
1
+ require "fileutils"
2
+ include FileUtils
3
+
4
+ require "rubygems"
5
+ %w[rake hoe newgem rubigen mocha activesupport].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
16
+
17
+ require "piston"
18
+ require "piston/commands"
@@ -0,0 +1,18 @@
1
+ require "subclass_responsibility_error"
2
+
3
+ require "piston/repository"
4
+ require "piston/revision"
5
+ require "piston/working_copy"
6
+
7
+ require "piston/git"
8
+ require "piston/svn"
9
+
10
+ require "pathname"
11
+
12
+ module Piston
13
+ class << self
14
+ def version_message
15
+ "Piston %s\nCopyright 2006-2008, François Beausoleil <francois@teksol.info>\nhttp://piston.rubyforge.org/\nDistributed under an MIT-like license." % Piston::VERSION::STRING
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,279 @@
1
+ require "main"
2
+ require "log4r"
3
+ require "activesupport"
4
+ require "piston/version"
5
+ require "piston/commands"
6
+
7
+ Main {
8
+ program "piston"
9
+ author "François Beausoleil <francois@teksol.info>"
10
+ version Piston::VERSION::STRING
11
+
12
+ mixin :standard_options do
13
+ option("verbose", "v") {
14
+ argument_optional
15
+ cast :integer
16
+ default 0
17
+ validate {|value| (0..5).include?(value)}
18
+ description "Verbosity level (0 to 5, 0 being the default)"
19
+ }
20
+ option("quiet", "q") { default false }
21
+ option("force") { default false }
22
+ option("dry-run") { default false }
23
+ end
24
+
25
+ mixin :revision_or_commit do
26
+ option "revision", "r" do
27
+ argument_required
28
+ default "HEAD"
29
+ description "The revision you wish to operate on"
30
+ end
31
+
32
+ option "commit" do
33
+ argument_required
34
+ default "HEAD"
35
+ description "The commit you wish to operate on"
36
+ end
37
+
38
+ def target_revision
39
+ case
40
+ when params["revision"].given?
41
+ params["revision"].value
42
+ when params["commit"].given?
43
+ params["commit"].value
44
+ else
45
+ :head
46
+ end
47
+ end
48
+ end
49
+
50
+ mode "import" do
51
+ mixin :standard_options
52
+ mixin :revision_or_commit
53
+
54
+ argument "repository" do
55
+ required
56
+ description "The repository you wish to Pistonize"
57
+ end
58
+
59
+ argument "directory" do
60
+ optional
61
+ default nil
62
+ description "Where to put the Pistonized repository"
63
+ end
64
+
65
+ option("lock") do
66
+ default false
67
+ description "Automatically lock down the revision/commit to protect against blanket updates"
68
+ end
69
+
70
+ option("repository-type") do
71
+ argument :required
72
+ default nil
73
+ description "Force a specific repository type, for when it's not possible to guess"
74
+ end
75
+
76
+ logger_level Logger::DEBUG
77
+ def run
78
+ configure_logging!
79
+
80
+ if params["revision"].given? && params["commit"].given? then
81
+ raise ArgumentError, "Only one of --revision or --commit can be given. Received both."
82
+ end
83
+
84
+ cmd = Piston::Commands::Import.new(:verbose => params["verbose"].value,
85
+ :quiet => params["quiet"].value,
86
+ :force => params["force"].value,
87
+ :dry_run => params["dry-run"].value,
88
+ :repository_type => params["repository-type"].value)
89
+
90
+ begin
91
+ cmd.run(params[:repository].value, self.target_revision, params[:directory].value)
92
+ rescue Piston::Repository::UnhandledUrl => e
93
+ supported_types = Piston::Repository.handlers.collect do |handler|
94
+ handler.repository_type
95
+ end
96
+ puts "Unsure how to handle:"
97
+ puts "\t#{params[:repository].value.inspect}."
98
+ puts "You should try using --repository-type. Supported types are:"
99
+ supported_types.each do |type|
100
+ puts "\t#{type}"
101
+ end
102
+ exit_failure!
103
+ end
104
+
105
+ # Lock the working copy, if the user asked for it
106
+ cmd = Piston::Commands::LockUnlock.new(:verbose => params["verbose"].value,
107
+ :quiet => params["quiet"].value,
108
+ :force => params["force"].value,
109
+ :dry_run => params["dry-run"].value)
110
+ cmd.run(params["directory"].value, params["lock"].value) if params["lock"].value
111
+ end
112
+ end
113
+
114
+ mode "lock" do
115
+ mixin :standard_options
116
+
117
+ argument "directory" do
118
+ argument_required
119
+ optional
120
+ description "Which directory to lock"
121
+ end
122
+
123
+ logger_level Logger::DEBUG
124
+ def run
125
+ configure_logging!
126
+
127
+ cmd = Piston::Commands::LockUnlock.new(:wcdir => params["directory"].value,
128
+ :verbose => params["verbose"].value,
129
+ :quiet => params["quiet"].value,
130
+ :force => params["force"].value)
131
+ begin
132
+ cmd.run(true)
133
+ puts "#{params["directory"].value} locked"
134
+ rescue Piston::WorkingCopy::NotWorkingCopy
135
+ puts "The #{params["directory"].value} is not Pistonized"
136
+ end
137
+ end
138
+ end
139
+
140
+ mode "unlock" do
141
+ mixin :standard_options
142
+
143
+ argument "directory" do
144
+ argument_required
145
+ optional
146
+ description "Which directory to lock"
147
+ end
148
+
149
+ logger_level Logger::DEBUG
150
+ def run
151
+ configure_logging!
152
+
153
+ cmd = Piston::Commands::LockUnlock.new(:wcdir => params["directory"].value,
154
+ :verbose => params["verbose"].value,
155
+ :quiet => params["quiet"].value,
156
+ :force => params["force"].value)
157
+ begin
158
+ cmd.run(false)
159
+ puts "#{params["directory"].value} unlocked"
160
+ rescue Piston::WorkingCopy::NotWorkingCopy
161
+ puts "The #{params["directory"].value} is not Pistonized"
162
+ end
163
+ end
164
+ end
165
+
166
+
167
+ mode "info" do
168
+ mixin :standard_options
169
+
170
+ argument "directory" do
171
+ argument_required
172
+ optional
173
+ description "Which directory to get info"
174
+ end
175
+
176
+ logger_level Logger::DEBUG
177
+ def run
178
+ configure_logging!
179
+
180
+ cmd = Piston::Commands::Info.new(:wcdir => params["directory"].value,
181
+ :verbose => params["verbose"].value,
182
+ :quiet => params["quiet"].value,
183
+ :force => params["force"].value)
184
+ begin
185
+ puts cmd.run(params["directory"].value)
186
+ rescue Piston::WorkingCopy::NotWorkingCopy
187
+ puts "The #{params["directory"].value} is not Pistonized"
188
+ end
189
+ end
190
+ end
191
+
192
+ mode "update" do
193
+ mixin :standard_options
194
+ mixin :revision_or_commit
195
+
196
+ argument("directory") { optional }
197
+
198
+ def run
199
+ configure_logging!
200
+
201
+ if params["revision"].given? && params["commit"].given? then
202
+ raise ArgumentError, "Only one of --revision or --commit can be given. Received both."
203
+ end
204
+
205
+ cmd = Piston::Commands::Update.new(:lock => params["lock"].value,
206
+ :verbose => params["verbose"].value,
207
+ :quiet => params["quiet"].value,
208
+ :force => params["force"].value,
209
+ :dry_run => params["dry-run"].value)
210
+
211
+ cmd.run(params["director"].value, target_revision)
212
+ end
213
+ end
214
+
215
+ option("version", "v")
216
+
217
+ def run
218
+ if params["version"].given? || ARGV.first == "version" then
219
+ puts Piston.version_message
220
+ exit_success!
221
+ elsif ARGV.empty?
222
+ puts Piston.version_message
223
+ puts "\nNo mode given. Call with help to find out the available options."
224
+ exit_failure!
225
+ else
226
+ puts "Unrecognized mode: #{ARGV.first.inspect}. Use the help mode to find the available options."
227
+ exit_warn!
228
+ end
229
+ end
230
+
231
+ def configure_logging!
232
+ Log4r::Logger.root.level = Log4r::INFO
233
+
234
+ case params["verbose"].value
235
+ when 0
236
+ main_level = Log4r::INFO
237
+ handler_level = Log4r::WARN
238
+ client_level = Log4r::WARN
239
+ client_out_level = Log4r::WARN
240
+ stdout_level = Log4r::INFO
241
+ when 1
242
+ main_level = Log4r::DEBUG
243
+ handler_level = Log4r::INFO
244
+ client_level = Log4r::WARN
245
+ client_out_level = Log4r::WARN
246
+ stdout_level = Log4r::DEBUG
247
+ when 2
248
+ main_level = Log4r::DEBUG
249
+ handler_level = Log4r::DEBUG
250
+ client_level = Log4r::INFO
251
+ client_out_level = Log4r::WARN
252
+ stdout_level = Log4r::DEBUG
253
+ when 3
254
+ main_level = Log4r::DEBUG
255
+ handler_level = Log4r::DEBUG
256
+ client_level = Log4r::DEBUG
257
+ client_out_level = Log4r::INFO
258
+ stdout_level = Log4r::DEBUG
259
+ when 4, 5
260
+ main_level = Log4r::DEBUG
261
+ handler_level = Log4r::DEBUG
262
+ client_level = Log4r::DEBUG
263
+ client_out_level = Log4r::DEBUG
264
+ stdout_level = Log4r::DEBUG
265
+ else
266
+ raise ArgumentError, "Did not expect verbosity to be outside 0..5: #{params["verbose"].value}"
267
+ end
268
+
269
+ Log4r::Logger.new("main", main_level)
270
+ Log4r::Logger.new("handler", handler_level)
271
+ Log4r::Logger.new("handler::client", client_level)
272
+ Log4r::Logger.new("handler::client::out", client_out_level)
273
+
274
+ Log4r::StdoutOutputter.new("stdout", :level => stdout_level)
275
+
276
+ Log4r::Logger["main"].add "stdout"
277
+ Log4r::Logger["handler"].add "stdout"
278
+ end
279
+ }