trout 0.1 → 0.2

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/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+ gem "cucumber"
3
+ gem "aruba"
4
+ gem "rake"
5
+ gem "rspec", :require => false
6
+
@@ -0,0 +1,28 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ aruba (0.2.1)
5
+ builder (2.1.2)
6
+ cucumber (0.8.5)
7
+ builder (~> 2.1.2)
8
+ diff-lcs (~> 1.1.2)
9
+ gherkin (~> 2.1.4)
10
+ json_pure (~> 1.4.3)
11
+ term-ansicolor (~> 1.0.4)
12
+ diff-lcs (1.1.2)
13
+ gherkin (2.1.5)
14
+ trollop (~> 1.16.2)
15
+ json_pure (1.4.6)
16
+ rake (0.8.7)
17
+ rspec (1.3.0)
18
+ term-ansicolor (1.0.5)
19
+ trollop (1.16.2)
20
+
21
+ PLATFORMS
22
+ ruby
23
+
24
+ DEPENDENCIES
25
+ aruba
26
+ cucumber
27
+ rake
28
+ rspec
@@ -46,3 +46,47 @@ h2. Author
46
46
 
47
47
  Copyright 2010 Joe Ferris
48
48
 
49
+ <pre>
50
+ ;t
51
+ jfLLf
52
+ tLfGfGL
53
+ tLjjEffGDt
54
+ fjfjfffLfGL;
55
+ GffffLLLLLGLGGGGLDL;
56
+ .GfffLLGGGLDLfffffGLGEGGLGf
57
+ :GGGDGLLLLGfLfffGLELEfLfLGLLG
58
+ ffDLLLDGLffDDjjjjjLGffEfLLfELGGLLGL,
59
+ tLfffGfjjLfffjjjjjjjjjjjjjLjDffLELffLLLfLDG
60
+ jj: ffLjjGtiittfitGifttfftttDtjtjGtDjjGjjjLfLjffffLG
61
+ jDGj GDjtjGi;;;t;tt,,it;;Liij;iiGtttttiftLtjjtjjjffffLfffL.
62
+ ,fLfftjti,;:..:.:.:,G;,G,i;,;t;tijtititLtitjftjGttjjLDffLLLD
63
+ tjfjL;,:..i.,. .: t::i,,j:,;;;;ii;;tii;fiiDitttGtitttfjjjfDfLG
64
+ Lfffij.... .i .;:..;;j,;i,,i;;;;t;iGiiiDititiLijttftijttLjfGLGt
65
+ ;Gf; fLfjj,,:tt...::,:,::,G,,,fti;iiiti;iiititftjttttjtitiftjiftititfLGLDD
66
+ fEKDGELt LLDt;;;;,,,,t,i;ii;;;;i;,iittttttjtjjjtttttttjjttjjjjLjtttitiGtGtffiLGDD,
67
+ DDGGGffL,ijLLii;jji;titifijjtiti;ifi;i;ij;ttt;tttijtttDtttjjttjjjfjjfjDjttitjGjGGGDEDD.
68
+ KGDLffLLfLjiijiiijtttjjjjjttiti;ttt;;ttit,i;i;titittjttfttGitDttjjjjjttjjjtffjffjGLDDDDE:
69
+ EGDLLEGLftLtLtiLjtLjjjjttittiiiiititittiiiittijititttjtitftttittjtttjffjfffjjfLLjLLLGGGEDD
70
+ iDGLDDDGjjtEjjjtffjfjjjttjjittitttit;tiii;tttttitiijtiittjtttttttGttGjtjffjffLfifLffGGGDGEEKj
71
+ DGGGGGLfLfjfjjfjjjtttjjjtjttjttjjttitiittiiittitttiiitttttjtjjtititjttjfLLffGtffLffLLLGGDGGGE
72
+ GGEGLLffjjjfDjfjfjjjjfffffjjtttjttitititttttjttttitttttjjjtitjtfttttjfftGLLGffLLLGGLLtjfffGLLL.
73
+ LDDGGLfLfffjjtjfLD. ;LLffLLfjjtjtttitittitttttittti;tttiitttttttttjjfffLLLLfjLGLLGLDLffjffLjtL:
74
+ KDLEGGjfjfjjffG ttjtLttjfLffjjtttttjttttjttttttjtttttiittttttttjjjLLLGLtLfLLLLLGEGGftLjjt;t
75
+ jELDEfffjjffj tttjjtjfitjfffjjjjjjjjjjjtjtttjtttttttttttjjtjjjfftfGLL;GLGLLLLGLf;tLj,G.
76
+ GDDDLfffjfj ,ittfjfit GLfLLLLLLLLLffjttttttttttttttttttjjfjfjjfLGiGLGLLffj;,LjiiG
77
+ KGKGDLffff ;iitjff .fGLGGGijjjjjjttttttttttttttjjfLff,LGjLGDGLLi,;fftDG
78
+ DELLfjLLL ,;ijff DiftjjLffjjjjtttttttjjjjfffjD,itGfGLLfj:tLjtfG
79
+ ;EfEELfLj ,;itj Ljitt EDfLGLffjjjjjjjjjjffLjjtD:fLGijftifjtt;j;t.t.:;t
80
+ LfKfGDG :;ij .,tttfi :fLLLLLfffffffLfftGGjfffEGGftfi;i;:iLjjit
81
+ tfDffDf :i ,;;itft ,LLLLLGLfLLGfGGLi.,tKKDffLLGDDGLLL
82
+ GLEfDf ;;itjj jGGGGDfLLGL.:tjGLLLG,
83
+ DDGDGL ;;iijj tjLGGDDKKKKDLGt,: .
84
+ jfGEj ,;it: tjffLGDLKKKWKK
85
+ GEfL .:;; tjjffLGjEKEEKKK
86
+ GLf, . ;jjjjfLfEEEEEKW
87
+ .Lf .tjjjjfiDDEEEEK
88
+ L ttjjjf LEEEE:
89
+ tjjjf ;ED
90
+ ittj
91
+ :
92
+ </pre>
@@ -0,0 +1,60 @@
1
+ Feature: get help on using trout
2
+
3
+ Scenario Outline: Specify an unknown command
4
+ When I run "trout <arguments>"
5
+ Then the output should contain:
6
+ """
7
+ I don't know how to "<command>."
8
+ Run "trout help" for usage information.
9
+ """
10
+ Examples:
11
+ | arguments | command |
12
+ | swim | swim |
13
+ | help swim | swim |
14
+
15
+ Scenario Outline: Run an invalid command
16
+ When I run "<invalid command>"
17
+ Then the output should contain:
18
+ """
19
+ I don't understand the options you provided.
20
+ Run "<help command>" for usage information.
21
+ """
22
+ Examples:
23
+ | invalid command | help command |
24
+ | trout checkout | trout help checkout |
25
+ | trout checkout file | trout help checkout |
26
+ | trout checkout file url extra | trout help checkout |
27
+ | trout update | trout help update |
28
+ | trout update file extra | trout help update |
29
+
30
+ Scenario Outline: Ask for help
31
+ When I run "<help command>"
32
+ Then the output should contain:
33
+ """
34
+ trout helps you sync individual files from other git repositories.
35
+ """
36
+ And the output should contain:
37
+ """
38
+ Commands:
39
+ """
40
+ And the output should not contain:
41
+ """
42
+ I don't know how
43
+ """
44
+ Examples:
45
+ | help command |
46
+ | trout |
47
+ | trout help |
48
+ | trout -h |
49
+ | trout --help |
50
+
51
+ Scenario Outline: Ask for usage for a particular command
52
+ When I run "trout help <command>"
53
+ Then the output should contain:
54
+ """
55
+ Usage: trout <command> <usage>
56
+ """
57
+ Examples:
58
+ | command | usage |
59
+ | checkout | filename git_url |
60
+ | update | filename |
@@ -1,6 +1,5 @@
1
1
  Feature: sync a Gemfile between two repositories
2
2
 
3
- @puts @announce
4
3
  Scenario: sync a Gemfile
5
4
  Given a directory named "upstream_repo"
6
5
  And a directory named "child_repo"
@@ -16,6 +15,10 @@ Feature: sync a Gemfile between two repositories
16
15
  And I run "git commit -m 'Added gemfile'"
17
16
  And I cd to "../child_repo"
18
17
  And I run "trout checkout Gemfile ../upstream_repo"
18
+ Then the output should contain:
19
+ """
20
+ Checked out Gemfile from ../upstream_repo.
21
+ """
19
22
  And I run "cat Gemfile"
20
23
  Then the output should contain:
21
24
  """
@@ -39,7 +42,11 @@ Feature: sync a Gemfile between two repositories
39
42
  gem "redcloth"
40
43
  """
41
44
  When I run "trout update Gemfile"
42
- And I run "cat Gemfile"
45
+ Then the output should contain:
46
+ """
47
+ Merged changes to Gemfile.
48
+ """
49
+ When I run "cat Gemfile"
43
50
  Then the output should contain:
44
51
  """
45
52
  source "http://rubygems.org"
@@ -49,6 +56,26 @@ Feature: sync a Gemfile between two repositories
49
56
  gem "redcloth"
50
57
  =======
51
58
  gem "postgresql"
52
- >>>>>>> .trout/upstream
59
+ >>>>>>> /tmp/upstream
60
+ """
61
+ When I write to "Gemfile" with:
62
+ """
63
+ source "http://rubygems.org"
64
+ gem "rails"
65
+ gem "mysql"
66
+ gem "redcloth"
67
+ """
68
+ When I run "trout update Gemfile"
69
+ Then the output should contain:
70
+ """
71
+ Gemfile already up to date.
72
+ """
73
+ And I run "cat Gemfile"
74
+ Then the output should contain:
75
+ """
76
+ source "http://rubygems.org"
77
+ gem "rails"
78
+ gem "mysql"
79
+ gem "redcloth"
53
80
  """
54
81
 
@@ -1,3 +1,4 @@
1
+ require 'optparse'
1
2
  require 'trout/managed_file'
2
3
 
3
4
  module Trout
@@ -6,31 +7,104 @@ module Trout
6
7
  new(arguments).run
7
8
  end
8
9
 
9
- attr_reader :arguments, :git_url, :filename, :file, :command
10
+ attr_accessor :command, :option_parser, :arguments, :file
10
11
 
11
12
  def initialize(arguments)
12
- self.arguments = arguments
13
- self.file = ManagedFile.new(filename)
13
+ self.arguments = arguments
14
+ self.option_parser = parse_options
14
15
  end
15
16
 
16
17
  def run
17
18
  case command
18
19
  when 'checkout'
19
- self.git_url = arguments[2]
20
+ build_file
21
+ git_url = next_argument
22
+ end_arguments
20
23
  file.copy_from(git_url)
21
24
  when 'update'
25
+ build_file
26
+ end_arguments
22
27
  file.update
28
+ when 'help', nil
29
+ puts option_parser
30
+ if arguments_left?
31
+ puts
32
+ usage_for(next_argument)
33
+ end
34
+ else
35
+ unknown_command(command)
23
36
  end
24
37
  end
25
38
 
26
39
  private
27
40
 
28
- def arguments=(arguments)
29
- @arguments = arguments
30
- self.command = arguments[0]
31
- self.filename = arguments[1]
41
+ def parse_options
42
+ option_parser = OptionParser.new do |parser|
43
+ parser.banner =
44
+ "trout helps you sync individual files from other git repositories.\n\n" +
45
+ "Usage: trout [options] command arguments"
46
+
47
+ parser.separator ""
48
+ parser.separator "Options:"
49
+ parser.separator ""
50
+
51
+ parser.on("-h", "--help", "View this help document")
52
+
53
+ parser.separator ""
54
+ parser.separator "Commands:"
55
+ parser.separator ""
56
+ parser.separator " checkout - start tracking a file from another repository"
57
+ parser.separator " help - get usage details for a specific command"
58
+ parser.separator " update - synchronize changes to a tracked file"
59
+ end
60
+
61
+ option_parser.parse!(arguments)
62
+
63
+ if arguments_left?
64
+ self.command = next_argument
65
+ else
66
+ self.command = 'help'
67
+ end
68
+
69
+ option_parser
70
+ end
71
+
72
+ def next_argument
73
+ arguments.shift or invalid_arguments
32
74
  end
33
75
 
34
- attr_writer :git_url, :filename, :file, :command
76
+ def arguments_left?
77
+ !arguments.empty?
78
+ end
79
+
80
+ def invalid_arguments
81
+ puts "I don't understand the options you provided."
82
+ puts %{Run "trout help #{command}" for usage information.}
83
+ exit
84
+ end
85
+
86
+ def end_arguments
87
+ invalid_arguments if arguments_left?
88
+ end
89
+
90
+ def build_file
91
+ self.file = ManagedFile.new(next_argument)
92
+ end
93
+
94
+ def usage_for(command)
95
+ case command
96
+ when 'checkout'
97
+ puts "Usage: trout checkout filename git_url"
98
+ when 'update'
99
+ puts "Usage: trout update filename"
100
+ else
101
+ unknown_command(command)
102
+ end
103
+ end
104
+
105
+ def unknown_command(command)
106
+ puts %{I don't know how to "#{command}."}
107
+ puts %{Run "trout help" for usage information.}
108
+ end
35
109
  end
36
110
  end
@@ -13,13 +13,20 @@ module Trout
13
13
  checkout(git_url)
14
14
  copy_to_destination
15
15
  write_url_and_version
16
+ puts "Checked out #{filename} from #{git_url}."
16
17
  ensure
17
18
  cleanup
18
19
  end
19
20
 
20
21
  def update
21
22
  checkout(previous_git_url)
22
- merge_to_destination
23
+ if up_to_date?
24
+ puts "#{filename} already up to date."
25
+ else
26
+ merge_to_destination
27
+ write_url_and_version
28
+ puts "Merged changes to #{filename}."
29
+ end
23
30
  ensure
24
31
  cleanup
25
32
  end
@@ -65,10 +72,6 @@ module Trout
65
72
  FileUtils.mkdir(working_root)
66
73
  end
67
74
 
68
- def working_root
69
- '.trout'
70
- end
71
-
72
75
  def write_url_and_version
73
76
  version_list.update(filename,
74
77
  'git_url' => checked_out_url,
@@ -76,7 +79,7 @@ module Trout
76
79
  end
77
80
 
78
81
  def checked_out_version
79
- git_command("rev-parse HEAD")
82
+ git_command("rev-parse master")
80
83
  end
81
84
 
82
85
  def checkout_last_version
@@ -95,12 +98,16 @@ module Trout
95
98
  version_list.version_for(filename)
96
99
  end
97
100
 
101
+ def up_to_date?
102
+ previous_git_version == checked_out_version
103
+ end
104
+
98
105
  def version_list
99
- @version_list ||= VersionList.new(working('versions'))
106
+ @version_list ||= VersionList.new('.trout')
100
107
  end
101
108
 
102
109
  def working(*paths)
103
- File.join(working_root, *paths)
110
+ File.join('/tmp', *paths)
104
111
  end
105
112
 
106
113
  def enforce_newline(path)
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trout
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- version: "0.1"
8
+ - 2
9
+ version: "0.2"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Joe Ferris
@@ -14,13 +14,11 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-10 00:00:00 -04:00
17
+ date: 2010-09-21 00:00:00 -04:00
18
18
  default_executable: trout
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: cucumber
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
22
  none: false
25
23
  requirements:
26
24
  - - ">="
@@ -29,12 +27,12 @@ dependencies:
29
27
  segments:
30
28
  - 0
31
29
  version: "0"
30
+ requirement: *id001
32
31
  type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: aruba
32
+ name: cucumber
36
33
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
34
+ - !ruby/object:Gem::Dependency
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
38
36
  none: false
39
37
  requirements:
40
38
  - - ">="
@@ -43,8 +41,10 @@ dependencies:
43
41
  segments:
44
42
  - 0
45
43
  version: "0"
44
+ requirement: *id002
46
45
  type: :development
47
- version_requirements: *id002
46
+ name: aruba
47
+ prerelease: false
48
48
  description: |-
49
49
  Trout allows you to maintain a base version of special
50
50
  files (like Gemfile) in one repository, and then syncronize just that
@@ -60,6 +60,8 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
 
62
62
  files:
63
+ - Gemfile
64
+ - Gemfile.lock
63
65
  - LICENSE
64
66
  - Rakefile
65
67
  - README.textile
@@ -67,6 +69,7 @@ files:
67
69
  - lib/trout/managed_file.rb
68
70
  - lib/trout/version_list.rb
69
71
  - lib/trout.rb
72
+ - features/help.feature
70
73
  - features/support/env.rb
71
74
  - features/sync_gemfile.feature
72
75
  - bin/trout
@@ -105,5 +108,6 @@ signing_key:
105
108
  specification_version: 3
106
109
  summary: So your common files can swim upstream.
107
110
  test_files:
111
+ - features/help.feature
108
112
  - features/support/env.rb
109
113
  - features/sync_gemfile.feature