corundum 0.0.3 → 0.0.5

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.
@@ -15,6 +15,10 @@ module Corundum
15
15
  setting(:config_path, nil)
16
16
  setting(:filters, ["./spec"])
17
17
 
18
+ setting(:coverage_filter, proc do |path|
19
+ /\.rb$/ =~ path
20
+ end)
21
+
18
22
  setting(:threshold, 80)
19
23
  setting(:groups, {})
20
24
  setting(:code_files, toolkit.files.code)
@@ -26,23 +30,25 @@ module Corundum
26
30
  @report_path ||= File::join(report_dir, "index.html")
27
31
  end
28
32
 
29
- def filters
30
- filters.map do |pattern|
33
+ def filter_lines
34
+ return filters.map do |pattern|
31
35
  "add_filter \"#{pattern}\""
32
36
  end
33
37
  end
34
38
 
35
- def groups
39
+ def group_lines
40
+ lines = []
36
41
  groups.each_pair do |group, pattern|
37
- "add_group \"#{group}\", \"#{pattern}\""
42
+ lines << "add_group \"#{group}\", \"#{pattern}\""
38
43
  end
44
+ lines
39
45
  end
40
46
 
41
47
  def config_file_contents
42
48
  contents = ["SimpleCov.start do"]
43
49
  contents << " coverage_dir \"#{report_dir}\""
44
- contents += filters.map{|line| " " + line}
45
- contents += groups.map{|line| " " + line}
50
+ contents += filter_lines.map{|line| " " + line}
51
+ contents += group_lines.map{|line| " " + line}
46
52
  contents << "end"
47
53
  return contents.join("\n")
48
54
  end
@@ -97,9 +103,10 @@ module Corundum
97
103
  "//table[@class='file_list']//td//a[@class='src_link']").map do |link|
98
104
  link.content
99
105
  end
106
+ need_coverage = @code_files.find_all(&coverage_filter)
100
107
 
101
- not_listed = covered_files - @code_files
102
- not_covered = @code_files - covered_files
108
+ not_listed = covered_files - need_coverage
109
+ not_covered = need_coverage - covered_files
103
110
  unless not_listed.empty? and not_covered.empty?
104
111
  raise ["Covered files and gemspec manifest don't match:",
105
112
  "Not in gemspec: #{not_listed.inspect}",
@@ -5,4 +5,5 @@ require 'corundum/gem_building'
5
5
  require 'corundum/gemcutter'
6
6
  require 'corundum/email'
7
7
  require 'corundum/version_control/monotone'
8
+ require 'corundum/version_control/git'
8
9
  require 'corundum/yardoc'
@@ -9,13 +9,16 @@ module Corundum
9
9
  def default_configuration(toolkit)
10
10
  setting(:gemspec, toolkit.gemspec)
11
11
  setting(:build_finished_file, toolkit.finished_files.build)
12
+ setting(:gemspec_files, toolkit.files.code + toolkit.files.test)
12
13
  setting(:tag, toolkit.gemspec.version.to_s)
13
14
  end
14
15
 
15
16
  def define
16
17
  in_namespace do
17
18
  task :not_tagged
18
- task :is_checked_in
19
+ task :gemspec_files_added
20
+ task :workspace_committed
21
+ task :is_checked_in => %w{gemspec_files_added workspace_committed}
19
22
  task :tag
20
23
  task :check_in => :tag
21
24
  end
@@ -0,0 +1,105 @@
1
+ require 'corundum/version_control'
2
+
3
+ module Corundum
4
+ class Git < VersionControl
5
+ def default_configuration(*args)
6
+ super
7
+ setting(:branch, nil)
8
+ end
9
+
10
+ def resolve_configuration
11
+ @branch ||= guess_branch
12
+ end
13
+
14
+
15
+ def git_command(*args)
16
+ result = ""
17
+ pid = nil
18
+ command = "git --no-pager #{args.join(" ")}"
19
+ puts command if verbose
20
+ pipe = IO.popen(command)
21
+ pid = pipe.pid
22
+ Process::wait(pid)
23
+ result = pipe.read
24
+ pipe.close
25
+ unless $?.exitstatus == 0
26
+ fail "Git exited with status #{$?.exitstatus}: \n#{result}"
27
+ end
28
+ return result.split("\n")
29
+ end
30
+
31
+ def guess_branch
32
+ puts "Guessing branch - configure Git > branch"
33
+ branch = git_command("branch").grep(/^\*/).sub(/\*\s*/,"").chomp
34
+ puts " Guessed: #{branch}"
35
+ return branch
36
+ end
37
+
38
+ def define
39
+ super
40
+
41
+ in_namespace do
42
+ task :on_branch do
43
+ current_branch = git_command("branch").grep(/^\*/).first.sub(/\*\s*/,"").chomp
44
+ unless current_branch == branch
45
+ fail "Current branch \"#{current_branch}\" is not #{branch}"
46
+ end
47
+ end
48
+
49
+ task :not_tagged => :on_branch do
50
+ tags = git_command("tag", "-l", tag)
51
+ unless tags.empty?
52
+ fail "Tag #{tag} already exists in branch #{branch}"
53
+ end
54
+ end
55
+
56
+ task :workspace_committed => :on_branch do
57
+ diffs = git_command("diff", "--stat", "HEAD")
58
+ unless diffs.empty?
59
+ fail "Workspace not committed:\n #{diffs.join(" \n")}"
60
+ end
61
+ end
62
+
63
+ task :gemspec_files_added => :on_branch do
64
+ list = git_command(%w{ls-tree -r HEAD})
65
+ list.map! do |line|
66
+ line.split(/\s+/)[3]
67
+ end
68
+
69
+ missing = gemspec_files - list
70
+ unless missing.empty?
71
+ fail "Gemspec files not in version control: #{missing.join(", ")}"
72
+ end
73
+ end
74
+
75
+ task :is_pulled do
76
+ fetch = git_command("fetch", "--dry-run")
77
+ unless fetch.empty?
78
+ fail "Remote branch has unpulled changes"
79
+ end
80
+
81
+ remote = git_command("config", "--get", "branch.#{branch}.remote").first
82
+ merge = git_command("config", "--get", "branch.#{branch}.merge").first.split("/").last
83
+
84
+ ancestor = git_command("merge-base", branch, "#{remote}/#{merge}").first
85
+ remote_rev = File::read(".git/refs/remotes/#{remote}/#{merge}").chomp
86
+
87
+ unless ancestor == remote_rev
88
+ fail "Unmerged changes with remote branch #{remote}/#{merge}"
89
+ end
90
+ end
91
+ task :is_checked_in => :is_pulled
92
+
93
+ task :tag => :on_branch do
94
+ git_command("tag", tag)
95
+ end
96
+
97
+ task :push => :on_branch do
98
+ git_command("push")
99
+ end
100
+
101
+ task :check_in => [:push]
102
+ end
103
+ end
104
+ end
105
+ end
@@ -3,10 +3,6 @@ require 'strscan'
3
3
 
4
4
  module Corundum
5
5
  class Monotone < VersionControl
6
- def default_namespace
7
- :monotone
8
- end
9
-
10
6
  def default_configuration(*args)
11
7
  super
12
8
  setting(:branch, nil)
@@ -17,13 +13,17 @@ module Corundum
17
13
  end
18
14
 
19
15
  def mtn_automate(cmd, *args)
20
- result = ""
21
16
  command = "mtn automate #{cmd} #{args.join(" ")}"
22
17
  puts command if verbose
23
- IO.popen(command) do |pipe|
24
- result = pipe.read
18
+ pipe = IO.popen(command)
19
+ pid = pipe.pid
20
+ Process.wait(pid)
21
+ result = pipe.read
22
+ pipe.close
23
+ unless $?.exitstatus == 0
24
+ fail "Monotone failed with exit status #{$?.exitstatus}: \n#{result}"
25
25
  end
26
- result
26
+ return result
27
27
  end
28
28
 
29
29
  def parse_basic_io(string)
@@ -87,10 +87,30 @@ module Corundum
87
87
  certs["branch"].first
88
88
  end
89
89
 
90
+ def stanzas(first_item, items)
91
+ stanzas = []
92
+ current_stanza = {}
93
+ items.each do |name, value|
94
+ if name == first_item
95
+ current_stanza = {}
96
+ stanzas << current_stanza
97
+ end
98
+ current_stanza[name] = value
99
+ end
100
+ return stanzas
101
+ end
102
+
90
103
  def define
91
104
  super
92
105
 
93
106
  in_namespace do
107
+ task :on_branch do
108
+ branches = parse_certs(mtn_automate("certs", base_revision))["branch"] || []
109
+ unless branches.include?(branch)
110
+ fail "Not on branch #{branch}"
111
+ end
112
+ end
113
+
94
114
  task :not_tagged do
95
115
  items = parse_basic_io(mtn_automate("tags", branch))
96
116
  tags = items.find{|pair| pair[0] == "tag" && pair[1] == tag}
@@ -99,7 +119,7 @@ module Corundum
99
119
  end
100
120
  end
101
121
 
102
- task :is_committed do
122
+ task :workspace_committed => :on_branch do
103
123
  items = parse_basic_io(mtn_automate("inventory"))
104
124
  changed = items.find{|pair| pair[0] == "changes"}
105
125
  unless changed.nil?
@@ -107,7 +127,21 @@ module Corundum
107
127
  end
108
128
  end
109
129
 
110
- task :tag do
130
+ task :gemspec_files_added => :on_branch do
131
+ items = stanzas("path", parse_basic_io(mtn_automate("inventory")))
132
+ items.delete_if{|item| item["status"] == "unknown"}
133
+ known_paths = items.each_with_object({}) do |item, hash|
134
+ hash[item["path"]] = true
135
+ end
136
+
137
+ files = gemspec_files.dup
138
+ files.delete_if{|path| known_paths[path]}
139
+ unless files.empty?
140
+ fail "Gemspec files not in version control: #{files.join(" ")}"
141
+ end
142
+ end
143
+
144
+ task :tag => :on_branch do
111
145
  mtn_automate("cert", base_revision, "tag", tag)
112
146
  end
113
147
 
@@ -115,9 +149,7 @@ module Corundum
115
149
  mtn_automate("sync")
116
150
  end
117
151
 
118
- task :check_in => %w{commit sync}
119
-
120
- task :is_checked_in => [:is_committed]
152
+ task :check_in => [:sync]
121
153
  end
122
154
  end
123
155
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: corundum
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.3
5
+ version: 0.0.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - Judson Lester
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-12-11 00:00:00 Z
13
+ date: 2011-12-13 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: corundum
@@ -196,6 +196,7 @@ files:
196
196
  - lib/corundum/rubyforge.rb
197
197
  - lib/corundum/version_control.rb
198
198
  - lib/corundum/version_control/monotone.rb
199
+ - lib/corundum/version_control/git.rb
199
200
  - lib/corundum.rb
200
201
  - doc/README
201
202
  - doc/Specifications
@@ -264,7 +265,7 @@ rdoc_options:
264
265
  - --main
265
266
  - doc/README
266
267
  - --title
267
- - corundum-0.0.3 RDoc
268
+ - corundum-0.0.5 RDoc
268
269
  require_paths:
269
270
  - lib/
270
271
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -272,7 +273,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
272
273
  requirements:
273
274
  - - ">="
274
275
  - !ruby/object:Gem::Version
275
- hash: 298532273
276
+ hash: 4506387
276
277
  segments:
277
278
  - 0
278
279
  version: "0"