branch_raker 0.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/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ = Branch Raker ChangeLog
2
+
3
+ == 0.0.1
4
+
5
+ Initial release.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Evan Boyd Sosenko
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,47 @@
1
+ = Branch Raker
2
+
3
+ <b>Use Branch Raker to maintain a build history for each branch. Originally created for LaTeX projects, but useful for anything that needs to be 'compiled'.</b>
4
+
5
+ <em>Intelligently builds the latest commit on all of your Git branches.</em>
6
+
7
+ == What is Branch Raker?
8
+
9
+ Coming soon.
10
+
11
+ == Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'branch_raker'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install branch_raker
24
+
25
+ == Using Branch Raker
26
+
27
+ Coming soon.
28
+
29
+ == Development
30
+
31
+ === Source Repository
32
+
33
+ The {Branch Raker source}[https://github.com/razor-x/branch_raker] is currently hosted at github.
34
+ To clone the project run
35
+
36
+ $ git clone git://github.com/razor-x/branch_raker.git
37
+
38
+ == License
39
+
40
+ Branch Raker is licensed under the MIT license.
41
+
42
+ == Warranty
43
+
44
+ This software is provided "as is" and without any express or
45
+ implied warranties, including, without limitation, the implied
46
+ warranties of merchantibility and fitness for a particular
47
+ purpose.
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path( '../lib/branch_raker/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ['Evan Boyd Sosenko']
6
+ gem.email = ['razorx@evansosenko.com']
7
+ gem.description = %q{Use Branch Raker to maintain a build history for each branch. Originally created for LaTeX projects, but useful for anything that needs to be 'compiled'.}
8
+ gem.summary = %q{Intelligently builds the latest commit on all of your Git branches.}
9
+ gem.homepage = "http://evansosenko.com"
10
+ gem.license = 'MIT'
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.name = 'branch_raker'
16
+ gem.require_paths = ['lib']
17
+ gem.platform = Gem::Platform::RUBY
18
+ gem.version = BranchRaker::VERSION
19
+
20
+ gem.add_dependency 'grit'
21
+ gem.add_dependency 'minitar'
22
+ gem.add_dependency 'rake'
23
+
24
+ end
@@ -0,0 +1,4 @@
1
+ module BranchRaker
2
+ # Version number.
3
+ VERSION = '0.0.1'
4
+ end
@@ -0,0 +1,143 @@
1
+ require 'archive/tar/minitar'
2
+ require 'fileutils'
3
+ require 'grit'
4
+ require 'rake'
5
+ require 'stringio'
6
+
7
+ include Rake::DSL
8
+
9
+ module BranchRaker
10
+
11
+ # These constants may be defined before including the module.
12
+ IGNORE_BRANCHES ||= []
13
+ REPO_DIR ||= '.'
14
+ TMP_DIR ||= '/tmp'
15
+ BUILD_DIR ||= 'builds'
16
+ TMP_GROUP_DIR ||= "#{BUILD_DIR}/tmp"
17
+
18
+ # Variables accessed by several tasks.
19
+ @current = []
20
+ @stale = []
21
+ @ignore = []
22
+
23
+ REPO = Grit::Repo.new REPO_DIR
24
+
25
+ IGNORE_BRANCHES.each do |b|
26
+ head = REPO.get_head(b)
27
+ @ignore << head.commit unless head.nil?
28
+ end
29
+
30
+ class BuildError < RuntimeError
31
+ end
32
+
33
+ task :default => 'build:all'
34
+
35
+ namespace :built do
36
+
37
+ task :current do |t|
38
+ Dir.glob "#{BUILD_DIR}/*/build_info" do |f|
39
+ File.read(f).scan(/^ id: ([0-9abcdef]+)/) do |id|
40
+ @current << REPO.commit(id[0]) unless @current.map{ |c| c.id }.include?(id[0])
41
+ end
42
+ end
43
+
44
+ if t.application.top_level_tasks.include? 'built:current'
45
+ heads = REPO.heads.keep_if{ |h| ( @current.map{ |c| c.id } + @ignore.map{ |c| c.id } ).include? h.commit.id }.sort_by{ |h| h.name }
46
+ if heads.empty?
47
+ print "No branches with current builds.\n"
48
+ else
49
+ print "Listing branches with current builds:\n"
50
+ heads.each { |h| print " #{h.name}\n" }
51
+ end
52
+ end
53
+ end
54
+
55
+ task :stale => :current do |t|
56
+ @stale = REPO.heads.delete_if { |h| ( @current.map{ |c| c.id } + @ignore.map{ |c| c.id } ).include? h.commit.id }.sort_by{ |h| h.name }
57
+
58
+ if t.application.top_level_tasks.include? 'built:stale'
59
+ heads = REPO.heads.keep_if{ |h| ( @stale.map{ |h| h.commit.id } ).include? h.commit.id }.sort_by{ |h| h.name }
60
+ if heads.empty?
61
+ print "No branches with stale builds.\n"
62
+ else
63
+ print "Listing branches with stale builds:\n"
64
+ heads.each { |h| print " #{h.name}\n" }
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ namespace :build do
71
+
72
+ def extract_repo commit, dir
73
+ input = Archive::Tar::Minitar::Input.new StringIO.new(REPO.archive_tar commit.id)
74
+ input.each { |entry| input.extract_entry dir, entry }
75
+ end
76
+
77
+ def build_group heads
78
+ built = []
79
+ begin
80
+ FileUtils.mkdir_p TMP_GROUP_DIR
81
+ heads.each do |h|
82
+ status = build(TMP_GROUP_DIR, h.commit, h.name)
83
+ built << h.name unless status.nil?
84
+ end
85
+ FileUtils.mv TMP_GROUP_DIR, "#{BUILD_DIR}/#{Time.now.to_i} (#{built.join(' ,')})" unless built.empty?
86
+ ensure
87
+ FileUtils.rm_rf TMP_GROUP_DIR
88
+ end
89
+ end
90
+
91
+ def build build_dir, commit, branch = nil
92
+
93
+ build_name = branch.nil? ? commit.id : branch
94
+
95
+ src = "#{TMP_DIR}/branch_raker_#{commit.id}"
96
+ out_dir = "#{build_dir}/#{build_name}"
97
+
98
+ begin
99
+ FileUtils.mkdir src
100
+ FileUtils.mkdir out_dir
101
+ extract_repo commit, src
102
+ make src, out_dir
103
+
104
+ log = branch.nil? ? '' : "Branch: #{branch}\n"
105
+ commit.to_hash.each do |k, v|
106
+ if v.is_a? Hash
107
+ log << " #{k}:\n"
108
+ v.each { |k, v| log << " #{k}: #{v}\n" }
109
+ elsif v.is_a? Array
110
+ log << " #{k}:\n"
111
+ v.each { |v| v.each { |k, v| log << " #{k}: #{v}\n" } }
112
+ else
113
+ log << " #{k}: #{v}\n"
114
+ end
115
+ end
116
+ File.open("#{build_dir}/build_info", 'a') { |f| f.write log + "\n" }
117
+
118
+ print "Built #{build_name}."
119
+
120
+ return true
121
+
122
+ rescue BuildError => e
123
+ FileUtils.rm_rf out_dir
124
+ print "Failed to build #{branch} with error:\n#{e.message}"
125
+ return nil
126
+ ensure
127
+ FileUtils.rm_rf src
128
+ end
129
+ end
130
+
131
+ task :all => 'built:stale' do
132
+ build_group @stale unless @stale.empty?
133
+ end
134
+
135
+ task :branch, [:branch] => ['built:update'] do |t, args|
136
+ args.with_defaults :branch => nil
137
+ head = args[:branch].nil? ? Grit::Head.current(REPO) : REPO.get_head(args[:branch])
138
+ unless @current.map{ |c| c.id }.include?(head.commit.id)
139
+ build head.commit, head.name, "#{Time.now.to_i} (#{head.name})"
140
+ end
141
+ end
142
+ end
143
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: branch_raker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Evan Boyd Sosenko
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: grit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: minitar
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Use Branch Raker to maintain a build history for each branch. Originally
63
+ created for LaTeX projects, but useful for anything that needs to be 'compiled'.
64
+ email:
65
+ - razorx@evansosenko.com
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - CHANGELOG.rdoc
72
+ - Gemfile
73
+ - LICENSE.txt
74
+ - README.rdoc
75
+ - Rakefile
76
+ - branch_raker.gemspec
77
+ - lib/branch_raker.rb
78
+ - lib/branch_raker/version.rb
79
+ homepage: http://evansosenko.com
80
+ licenses:
81
+ - MIT
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 1.8.23
101
+ signing_key:
102
+ specification_version: 3
103
+ summary: Intelligently builds the latest commit on all of your Git branches.
104
+ test_files: []