between_meals 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,134 +1,117 @@
1
1
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
2
 
3
3
  # Copyright 2013-present Facebook
4
- #
4
+ #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
7
7
  # You may obtain a copy of the License at
8
- #
8
+ #
9
9
  # http://www.apache.org/licenses/LICENSE-2.0
10
- #
10
+ #
11
11
  # Unless required by applicable law or agreed to in writing, software
12
12
  # distributed under the License is distributed on an "AS IS" BASIS,
13
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
+ require 'pathname'
17
18
  require 'between_meals/repo'
18
19
  require 'between_meals/changeset'
19
20
  require 'mixlib/shellout'
21
+ require 'between_meals/repo/svn/cmd'
20
22
 
21
23
  module BetweenMeals
22
- # Local checkout wrapper
23
24
  class Repo
24
- # SVN implementation
25
25
  class Svn < BetweenMeals::Repo
26
26
  def setup
27
27
  @bin = 'svn'
28
+ @cmd = BetweenMeals::Repo::Svn::Cmd.new(
29
+ :bin => @bin,
30
+ :cwd => '/tmp',
31
+ :logger => @logger,
32
+ )
28
33
  end
29
34
 
30
35
  def exists?
31
- # this shuold be better
32
- Dir.exists?(@repo_path)
36
+ Dir.exists?(Pathname.new(@repo_path).join('.svn'))
33
37
  end
34
38
 
35
39
  def head_rev
36
- s = Mixlib::ShellOut.new("#{@bin} info #{@repo_path}").run_command
37
- s.error!
38
- s.stdout.each_line do |line|
40
+ @cmd.info(@repo_path).stdout.each_line do |line|
39
41
  m = line.match(/Last Changed Rev: (\d+)$/)
40
42
  return m[1] if m
41
43
  end
42
44
  end
43
45
 
44
46
  def latest_revision
45
- s = Mixlib::ShellOut.new("#{@bin} info #{@repo_path}").run_command
46
- s.error!
47
- s.stdout.each do |line|
47
+ @cmd.info(@repo_path).stdout.each_line do |line|
48
48
  m = line.match(/Revision: (\d+)$/)
49
49
  return m[1] if m
50
50
  end
51
51
  end
52
52
 
53
53
  def checkout(url)
54
- s = Mixlib::ShellOut.new(
55
- "#{@bin} co --ignore-externals #{url} #{@repo_path}").run_command
56
- s.error!
54
+ @cmd.co(url, @repo_path)
57
55
  end
58
56
 
59
57
  # Return files changed between two revisions
60
58
  def changes(start_ref, end_ref)
61
- check_refs(start_ref, end_ref)
62
- s = Mixlib::ShellOut.new(
63
- "#{@bin} diff -r #{start_ref}:#{end_ref} --summarize #{@repo_path}")
64
- s.run_command.error!
59
+ valid_ref?(start_ref)
60
+ valid_ref?(end_ref) if end_ref
61
+
65
62
  @logger.info("Diff between #{start_ref} and #{end_ref}")
66
- s.stdout.lines.map do |line|
67
- m = line.match(/^(\w)\w?\s+(\S+)$/)
68
- fail "Could not parse line: #{line}" unless m
69
-
70
- {
71
- :status => m[1] == 'D' ? :deleted : :modified,
72
- :path => m[2].sub("#{@repo_path}/", '')
73
- }
63
+ changes = @cmd.diff(start_ref, end_ref, @repo_path).stdout
64
+
65
+ begin
66
+ parse_status(changes).compact
67
+ rescue => e
68
+ @logger.error(
69
+ 'Something went wrong. Please please report this output.'
70
+ )
71
+ @logger.error(e)
72
+ stdout.lines.each do |line|
73
+ @logger.error(line.strip)
74
+ end
75
+ exit(1)
74
76
  end
75
77
  end
76
78
 
77
79
  def update
78
- cleanup
79
- revert
80
- up
80
+ @cmd.cleanup(@repo_path)
81
+ @cmd.revert(@repo_path)
82
+ @cmd.update(@repo_path)
81
83
  end
82
84
 
83
- # Return all files
84
85
  def files
85
- s = Mixlib::ShellOut.new("#{@bin} ls --depth infinity #{@repo_path}")
86
- s.run_command
87
- s.error!
88
- s.stdout.split("\n").map do |x|
86
+ @cmd.ls.stdout.split("\n").map do |x|
89
87
  { :path => x, :status => :created }
90
88
  end
91
89
  end
92
90
 
93
- private
94
-
95
- def run(cmd)
96
- Mixlib::ShellOut.new(cmd).run_command.error!
97
- end
98
-
99
- def revert
100
- run("#{@bin} revert -R #{@repo_path}")
101
- end
102
-
103
- def up
104
- run("#{@bin} update #{@repo_path}")
91
+ def upstream?
105
92
  end
106
93
 
107
- def cleanup
108
- run("#{@bin} cleanup #{@repo_path}")
109
- end
110
-
111
- def first_revision
112
- 0
94
+ def valid_ref?(ref)
95
+ @cmd.info_r(ref, @repo_path)
96
+ rescue
97
+ raise Changeset::ReferenceError
113
98
  end
114
99
 
115
100
  private
116
101
 
117
- def check_refs(start_ref, end_ref)
118
- s = Mixlib::ShellOut.new(
119
- "#{@bin} info -r #{start_ref}",
120
- :cwd => @repo_path
121
- ).run_command
122
- s.error!
123
- if end_ref
124
- s = Mixlib::ShellOut.new(
125
- "#{@bin} info -r #{end_ref}",
126
- :cwd => @repo_path
127
- ).run_command
128
- s.error!
102
+ def parse_status(changes)
103
+ # http://svnbook.red-bean.com/en/1.0/re26.html
104
+ changes.lines.map do |line|
105
+ case line
106
+ when (/^([\w ])\w?\s+(\S+)$/)
107
+ {
108
+ :status => Regexp.last_match(1) == 'D' ? :deleted : :modified,
109
+ :path => Regexp.last_match(2).sub("#{@repo_path}/", ''),
110
+ }
111
+ else
112
+ fail 'No match'
113
+ end
129
114
  end
130
- rescue
131
- raise Changeset::ReferenceError
132
115
  end
133
116
  end
134
117
  end
@@ -0,0 +1,56 @@
1
+ # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
+
3
+ # Copyright 2013-present Facebook
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'between_meals/cmd'
18
+ module BetweenMeals
19
+ class Repo
20
+ class Svn < BetweenMeals::Repo
21
+ class Cmd < BetweenMeals::Cmd
22
+ def diff(start_ref, end_ref, repo_path)
23
+ cmd("diff -r #{start_ref}:#{end_ref} --summarize #{repo_path}")
24
+ end
25
+
26
+ def info(repo_path)
27
+ cmd("info #{repo_path}")
28
+ end
29
+
30
+ def info_r(ref, repo_path)
31
+ cmd("info -r #{ref} #{repo_path}")
32
+ end
33
+
34
+ def co(url, repo_path)
35
+ cmd("co --ignore-externals #{url} #{repo_path}")
36
+ end
37
+
38
+ def revert(repo_path)
39
+ cmd("revert -R #{repo_path}")
40
+ end
41
+
42
+ def update(repo_path)
43
+ cmd("update #{repo_path}")
44
+ end
45
+
46
+ def cleanup(repo_path)
47
+ cmd("cleanup #{repo_path}")
48
+ end
49
+
50
+ def ls(repo_path)
51
+ cmd("ls --depth infinity #{repo_path}")
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,13 +1,13 @@
1
1
  # vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
2
2
 
3
3
  # Copyright 2013-present Facebook
4
- #
4
+ #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
7
7
  # You may obtain a copy of the License at
8
- #
8
+ #
9
9
  # http://www.apache.org/licenses/LICENSE-2.0
10
- #
10
+ #
11
11
  # Unless required by applicable law or agreed to in writing, software
12
12
  # distributed under the License is distributed on an "AS IS" BASIS,
13
13
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: between_meals
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Phil Dibowitz
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2015-01-05 00:00:00 Z
19
+ date: 2015-11-26 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: colorize
@@ -116,6 +116,34 @@ dependencies:
116
116
  version: "0"
117
117
  type: :development
118
118
  version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: rubocop
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: simplecov
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
145
+ type: :development
146
+ version_requirements: *id009
119
147
  description: Library for calculation Chef differences between revisions
120
148
  email:
121
149
  executables: []
@@ -128,16 +156,21 @@ extra_rdoc_files:
128
156
  files:
129
157
  - README.md
130
158
  - LICENSE
131
- - lib/between_meals/changeset.rb
132
- - lib/between_meals/repo.rb
133
- - lib/between_meals/util.rb
134
159
  - lib/between_meals/knife.rb
135
- - lib/between_meals/changes/role.rb
160
+ - lib/between_meals/cmd.rb
161
+ - lib/between_meals/util.rb
162
+ - lib/between_meals/repo.rb
163
+ - lib/between_meals/changeset.rb
136
164
  - lib/between_meals/changes/change.rb
165
+ - lib/between_meals/changes/role.rb
137
166
  - lib/between_meals/changes/cookbook.rb
138
167
  - lib/between_meals/changes/databag.rb
168
+ - lib/between_meals/repo/svn/cmd.rb
169
+ - lib/between_meals/repo/hg/cmd.rb
170
+ - lib/between_meals/repo/git/cmd.rb
139
171
  - lib/between_meals/repo/svn.rb
140
172
  - lib/between_meals/repo/git.rb
173
+ - lib/between_meals/repo/hg.rb
141
174
  homepage: https://github.com/facebook/between-meals
142
175
  licenses:
143
176
  - Apache