brigit 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ bin/brigit
2
+ lib/brigit/cli.rb
3
+ lib/brigit/commands/command.rb
4
+ lib/brigit/commands/map_command.rb
5
+ lib/brigit/commands/update_command.rb
6
+ lib/brigit/config_parser.rb
7
+ lib/brigit/version.rb
8
+ lib/brigit.rb
9
+ lib/ext/option_parser.rb
10
+ Rakefile
11
+ README.rdoc
12
+ test/config_parser_test.rb
13
+ test/fixtures/example.conf
14
+ test/test_helper.rb
15
+ Manifest
@@ -0,0 +1,36 @@
1
+ = Brigit
2
+
3
+ A random collection of utilities for developers working with Git repositories.
4
+
5
+ == Contributing
6
+
7
+ Feel free to fork, send patches, etc. Development is done at http://github.com/fiveruns/brigit
8
+
9
+ == Authors
10
+
11
+ The FiveRuns development team, http://www.fiveruns.org
12
+
13
+ == License
14
+
15
+ # (The FiveRuns License)
16
+ #
17
+ # Copyright (c) 2006-2008 FiveRuns Corporation
18
+ #
19
+ # Permission is hereby granted, free of charge, to any person obtaining
20
+ # a copy of this software and associated documentation files (the
21
+ # 'Software'), to deal in the Software without restriction, including
22
+ # without limitation the rights to use, copy, modify, merge, publish,
23
+ # distribute, sublicense, and/or sell copies of the Software, and to
24
+ # permit persons to whom the Software is furnished to do so, subject to
25
+ # the following conditions:
26
+ #
27
+ # The above copyright notice and this permission notice shall be
28
+ # included in all copies or substantial portions of the Software.
29
+ #
30
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
31
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
33
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
34
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
35
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
36
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'echoe'
3
+
4
+ require File.dirname(__FILE__) << "/lib/brigit/version"
5
+
6
+ Echoe.new 'brigit' do |p|
7
+ p.version = Brigit::Version::STRING
8
+ p.author = "FiveRuns Development Team"
9
+ p.email = 'dev@fiveruns.com'
10
+ p.project = 'fiveruns'
11
+ p.summary = "Git utilities"
12
+ p.url = "http://github.com/fiveruns/brigit"
13
+ p.include_rakefile = true
14
+ end
15
+
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__) << "/../lib/brigit"
4
+
5
+ Brigit::CLI.new.parse(*ARGV) do |command|
6
+ command.execute!
7
+ end
8
+
@@ -0,0 +1,55 @@
1
+
2
+ # Gem::Specification for Brigit-0.8.1
3
+ # Originally generated by Echoe
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{brigit}
7
+ s.version = "0.8.1"
8
+
9
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.authors = ["FiveRuns Development Team"]
11
+ s.date = %q{2008-07-08}
12
+ s.default_executable = %q{brigit}
13
+ s.description = %q{Git utilities}
14
+ s.email = %q{dev@fiveruns.com}
15
+ s.executables = ["brigit"]
16
+ s.extra_rdoc_files = ["bin/brigit", "lib/brigit/cli.rb", "lib/brigit/commands/command.rb", "lib/brigit/commands/map_command.rb", "lib/brigit/commands/update_command.rb", "lib/brigit/config_parser.rb", "lib/brigit/version.rb", "lib/brigit.rb", "lib/ext/option_parser.rb", "README.rdoc"]
17
+ s.files = ["bin/brigit", "lib/brigit/cli.rb", "lib/brigit/commands/command.rb", "lib/brigit/commands/map_command.rb", "lib/brigit/commands/update_command.rb", "lib/brigit/config_parser.rb", "lib/brigit/version.rb", "lib/brigit.rb", "lib/ext/option_parser.rb", "Rakefile", "README.rdoc", "test/config_parser_test.rb", "test/fixtures/example.conf", "test/test_helper.rb", "Manifest", "brigit.gemspec"]
18
+ s.has_rdoc = true
19
+ s.homepage = %q{http://github.com/fiveruns/brigit}
20
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Brigit", "--main", "README.rdoc"]
21
+ s.require_paths = ["lib"]
22
+ s.rubyforge_project = %q{fiveruns}
23
+ s.rubygems_version = %q{1.2.0}
24
+ s.summary = %q{Git utilities}
25
+ s.test_files = ["test/config_parser_test.rb", "test/test_helper.rb"]
26
+
27
+ if s.respond_to? :specification_version then
28
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
29
+ s.specification_version = 2
30
+
31
+ if current_version >= 3 then
32
+ else
33
+ end
34
+ else
35
+ end
36
+ end
37
+
38
+
39
+ # # Original Rakefile source (requires the Echoe gem):
40
+ #
41
+ # require 'rubygems'
42
+ # require 'echoe'
43
+ #
44
+ # require File.dirname(__FILE__) << "/lib/brigit/version"
45
+ #
46
+ # Echoe.new 'brigit' do |p|
47
+ # p.version = Brigit::Version::STRING
48
+ # p.author = "FiveRuns Development Team"
49
+ # p.email = 'dev@fiveruns.com'
50
+ # p.project = 'fiveruns'
51
+ # p.summary = "Git utilities"
52
+ # p.url = "http://github.com/fiveruns/brigit"
53
+ # p.include_rakefile = true
54
+ # end
55
+ #
@@ -0,0 +1,24 @@
1
+ require 'find'
2
+
3
+ module Brigit
4
+
5
+ def self.at_dot_gitmodules
6
+ Find.find(Dir.pwd) do |path|
7
+ if File.basename(path) == '.git' && File.directory?(path)
8
+ Find.prune
9
+ elsif File.file?(File.join(path, '.gitmodules'))
10
+ Dir.chdir path do
11
+ yield path
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ $:.unshift File.dirname(__FILE__)
20
+
21
+ # Require all files
22
+ Dir[File.dirname(__FILE__) << "/**/*.rb"].each do |file|
23
+ require file
24
+ end
@@ -0,0 +1,61 @@
1
+ require 'ostruct'
2
+
3
+ module Brigit
4
+
5
+ class CLI
6
+
7
+ def parse(*args)
8
+ self.class.parser.parse!(args)
9
+ if (args.first && command = Command[args.shift])
10
+ yield command.new(self.class.options, *args)
11
+ else
12
+ abort "No command given.\n#{parser}"
13
+ end
14
+ end
15
+
16
+ def self.usage
17
+ parser.to_s
18
+ end
19
+
20
+ #######
21
+ private
22
+ #######
23
+
24
+ def self.options
25
+ @options ||= OpenStruct.new
26
+ end
27
+
28
+ def self.parser
29
+
30
+ command_list = Command.list.map { |command| " * #{command.name}: #{command.help}" }.join("\n")
31
+
32
+ options.inventory = {}
33
+
34
+ @parser ||= OptionParser.new do |opts|
35
+
36
+ opts.banner = %("Brigit," Submodule utilities for Git\nUSAGE: brigit COMMAND [OPTIONS])
37
+
38
+ opts.separator "COMMANDS:\n#{command_list}\n"
39
+
40
+ opts.separator "OPTIONS:\n"
41
+
42
+ Inventory.list.each do |inventory|
43
+ opts.on("-#{inventory.name[0,1]}", "--#{inventory.name} PATH", "Location of #{inventory.name} (`grab' only)") do |path|
44
+ options.inventory[inventory] = path
45
+ end
46
+ end
47
+
48
+ opts.on('-o', '--open', "Open with Preview.app (`map' only, requires OSX & `dot' in PATH)") do
49
+ options.open = true
50
+ end
51
+
52
+ opts.on_tail('-h', '--help', 'Show this message') do
53
+ abort opts.to_s
54
+ end
55
+
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ end
@@ -0,0 +1,34 @@
1
+ require 'brigit/listable'
2
+ require 'brigit/fallible'
3
+
4
+ module Brigit
5
+
6
+ class Command
7
+ include Listable
8
+ include Fallible
9
+
10
+ class << self
11
+ attr_accessor :help
12
+ end
13
+
14
+ attr_reader :options, :args
15
+ def initialize(options, *args)
16
+ @options = options
17
+ @args = args
18
+ end
19
+
20
+ def execute!
21
+ raise ArgumentError, "Must be in Git repository" unless repo?
22
+ end
23
+
24
+ #######
25
+ private
26
+ #######
27
+
28
+ def repo?
29
+ File.directory?(File.join(Dir.pwd, '.git'))
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,55 @@
1
+ require 'brigit/commands/command'
2
+ require 'find'
3
+
4
+ module Brigit
5
+
6
+ class MapCommand < Command
7
+
8
+ self.help = "Graphs of submodules in this repository"
9
+
10
+ def execute!
11
+ super
12
+ text = %|digraph G {\n|
13
+ # TODO: Allow customization
14
+ text << %|ranksep=.75; size = "12,12";\n|
15
+ base = Dir.pwd
16
+ Brigit.at_dot_gitmodules do |path|
17
+ origin = origin_at(path)
18
+ text << %| "#{origin}" [shape="box",style=filled,fillcolor=lightgrey];\n|
19
+ submodules_at(path).each do |submodule|
20
+ text << %| "#{origin}" -> "#{submodule['url']}" [fontsize=16,label="#{submodule['path']}"];\n|
21
+ end
22
+ end
23
+ text << %|}\n|
24
+ if options.open
25
+ IO.popen("dot -Tpng | open -f -a /Applications/Preview.app", 'w') do |file|
26
+ file.write text
27
+ end
28
+ else
29
+ puts text
30
+ end
31
+ end
32
+
33
+ #######
34
+ private
35
+ #######
36
+
37
+ def origin_at(path)
38
+ filename = File.join(path, '.git/config')
39
+ result = parser.parse(File.readlines(filename))
40
+ result['remote "origin"']['url']
41
+ end
42
+
43
+ def submodules_at(path)
44
+ filename = File.join(path, '.gitmodules')
45
+ result = parser.parse(File.readlines(filename))
46
+ result.values
47
+ end
48
+
49
+ def parser
50
+ @parser ||= ConfigParser.new
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -0,0 +1,20 @@
1
+ require 'brigit/commands/command'
2
+ require 'find'
3
+
4
+ module Brigit
5
+
6
+ class UpdateCommand < Command
7
+
8
+ self.help = "Update all submodules in the repo, recursively"
9
+
10
+ def execute!
11
+ super
12
+ Brigit.at_dot_gitmodules do |path|
13
+ system "git submodule init"
14
+ system "git submodule update"
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,90 @@
1
+ module Brigit
2
+
3
+ # Reworked from Sam Ruby's Ruby "PythonConfigParser," http://intertwingly.net/code/mars/planet/config.rb
4
+ # which in turn is a port of Python's ConfigParser, http://docs.python.org/lib/module-ConfigParser.html
5
+ class ConfigParser
6
+
7
+ class Section
8
+
9
+ attr_reader :name
10
+ def initialize(name)
11
+ @name = name
12
+ end
13
+
14
+ def options
15
+ @options ||= {}
16
+ end
17
+
18
+ def method_missing(*args, &block)
19
+ options.__send__(*args, &block)
20
+ end
21
+
22
+ end
23
+
24
+ def self.section_pattern
25
+ @section_pattern ||= /
26
+ \[ # [
27
+ ([^\]]+) # very permissive!
28
+ \] # ]
29
+ /x
30
+ end
31
+
32
+ def self.option_pattern
33
+ @option_pattern ||= /
34
+ ([^:=\s][^:=]*) # very permissive!
35
+ \s*[:=]\s* # any number of space chars,
36
+ # followed by separator
37
+ # (either : or =), followed
38
+ # by any # space chars
39
+ (.*)$ # everything up to eol
40
+ /x
41
+ end
42
+
43
+
44
+ # FIXME: This is *way* ugly
45
+ def parse(lines)
46
+ sections = Hash.new { |_, name| Section.new(name) }
47
+ section = nil
48
+ option = nil
49
+ lines.each_with_index do |line, number|
50
+ next if skip? line
51
+ if line =~ self.class.option_pattern
52
+ # option line
53
+ option, value = $1, $2
54
+ option = option.downcase.strip
55
+ value.sub!(/\s;.*/, '')
56
+ value = '' if value == '""'
57
+ section[option] = clean value
58
+ elsif line =~ /^\s/ && section && option
59
+ # continuation line
60
+ value = line.strip
61
+ section[option] = section[option] ? (section[option] << "\n#{clean value}") : clean(value)
62
+ elsif line =~ self.class.section_pattern
63
+ section = sections[$1]
64
+ sections[$1] = section
65
+ option = nil
66
+ elsif !section
67
+ raise SyntaxError, 'Missing section header'
68
+ else
69
+ raise SyntaxError, "Invalid syntax on line #{number}"
70
+ end
71
+ end
72
+ sections
73
+ end
74
+
75
+ #######
76
+ private
77
+ #######
78
+
79
+ def clean(value)
80
+ value.sub(/\s*#.*/, '')
81
+ end
82
+
83
+ def skip?(line)
84
+ line.strip.empty? || line =~ /^\s*[#;]/ || line =~ /^rem(\s|$)/i
85
+ end
86
+
87
+ end
88
+
89
+ end
90
+
@@ -0,0 +1,86 @@
1
+ # (The MIT License)
2
+ #
3
+ # Copyright (c) 2008 Jamis Buck <jamis@37signals.com>,
4
+ # with modifications by Bruce Williams <bruce@fiveruns.com>
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # 'Software'), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+
25
+ module Brigit
26
+
27
+ # A class for describing the current version of a library. The version
28
+ # consists of three parts: the +major+ number, the +minor+ number, and the
29
+ # +tiny+ (or +patch+) number.
30
+ class Version
31
+
32
+ include Comparable
33
+
34
+ # A convenience method for instantiating a new Version instance with the
35
+ # given +major+, +minor+, and +tiny+ components.
36
+ def self.[](major, minor, tiny)
37
+ new(major, minor, tiny)
38
+ end
39
+
40
+ def self.rails
41
+ @rails ||= begin
42
+ # handle ::Rails::VERSION not being set
43
+ Version.new(::Rails::VERSION::MAJOR, ::Rails::VERSION::MINOR, ::Rails::VERSION::TINY) rescue Version.new(0,0,0)
44
+ end
45
+ end
46
+
47
+ attr_reader :major, :minor, :tiny
48
+
49
+ # Create a new Version object with the given components.
50
+ def initialize(major, minor, tiny)
51
+ @major, @minor, @tiny = major, minor, tiny
52
+ end
53
+
54
+ # Compare this version to the given +version+ object.
55
+ def <=>(version)
56
+ to_i <=> version.to_i
57
+ end
58
+
59
+ # Converts this version object to a string, where each of the three
60
+ # version components are joined by the '.' character. E.g., 2.0.0.
61
+ def to_s
62
+ @to_s ||= [@major, @minor, @tiny].join(".")
63
+ end
64
+
65
+ # Converts this version to a canonical integer that may be compared
66
+ # against other version objects.
67
+ def to_i
68
+ @to_i ||= @major * 1_000_000 + @minor * 1_000 + @tiny
69
+ end
70
+
71
+ def to_a
72
+ [@major, @minor, @tiny]
73
+ end
74
+
75
+ MAJOR = 0
76
+ MINOR = 8
77
+ TINY = 1
78
+
79
+ # The current version as a Version instance
80
+ CURRENT = new(MAJOR, MINOR, TINY)
81
+ # The current version as a String
82
+ STRING = CURRENT.to_s
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,13 @@
1
+ require 'optparse'
2
+
3
+ # Fix OptionParser#separator's handling of strings with newlines
4
+ # From http://rubyforge.org/tracker/?func=detail&atid=1700&aid=9177&group_id=426
5
+ class OptionParser
6
+
7
+ def separator(string)
8
+ string.split(/\n/).each do |line|
9
+ top.append(line.chomp, nil, nil)
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) << "/test_helper"
2
+
3
+ class ConfigParserTest < Test::Unit::TestCase
4
+
5
+ attr_reader :results
6
+
7
+ context "ConfigParser" do
8
+ setup do
9
+ @results = parser.parse(File.read(File.dirname(__FILE__) << "/fixtures/example.conf"))
10
+ end
11
+ should "find correct number of sections" do
12
+ assert_equal %w(section1 section2 section3 section4), results.keys.sort
13
+ end
14
+ should "find options" do
15
+ counts = { 1 => 0, 2 => 2, 3 => 2, 4 => 0}
16
+ counts.each do |i, count|
17
+ assert_equal count, results["section#{i}"].size
18
+ end
19
+ end
20
+ should "ignore comments" do
21
+ assert_equal %w(
22
+ lib/ham
23
+ spam/eggs
24
+ foo/a
25
+ foo/b
26
+ foo/c
27
+ foo/lib/bar
28
+ foo/lib/baz
29
+ foo/lib/quux
30
+ foo/doc/design), results["section3"]['items'].scan(/(\S+)/).flatten
31
+ end
32
+ end
33
+
34
+ #######
35
+ private
36
+ #######
37
+
38
+ def parser
39
+ @parser ||= Brigit::ConfigParser.new
40
+ end
41
+
42
+ end
@@ -0,0 +1,23 @@
1
+ [section1]
2
+
3
+ [section2]
4
+ writable = gitosis-admin
5
+ members = a b c
6
+
7
+ [section3]
8
+ items = lib/ham
9
+
10
+ spam/eggs
11
+
12
+ foo/a
13
+ foo/b
14
+ foo/c
15
+ foo/lib/bar # this is a comment
16
+ foo/lib/baz
17
+ foo/lib/quux
18
+ foo/doc/design
19
+ # this is a ful line comment
20
+
21
+ members = a b c d e f g
22
+
23
+ [section4]
@@ -0,0 +1,6 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'Shoulda'
4
+ require 'flexmock/test_unit'
5
+
6
+ require File.dirname(__FILE__) << "/../lib/brigit"
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: brigit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.1
5
+ platform: ruby
6
+ authors:
7
+ - FiveRuns Development Team
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-07-08 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Git utilities
17
+ email: dev@fiveruns.com
18
+ executables:
19
+ - brigit
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - bin/brigit
24
+ - lib/brigit/cli.rb
25
+ - lib/brigit/commands/command.rb
26
+ - lib/brigit/commands/map_command.rb
27
+ - lib/brigit/commands/update_command.rb
28
+ - lib/brigit/config_parser.rb
29
+ - lib/brigit/version.rb
30
+ - lib/brigit.rb
31
+ - lib/ext/option_parser.rb
32
+ - README.rdoc
33
+ files:
34
+ - bin/brigit
35
+ - lib/brigit/cli.rb
36
+ - lib/brigit/commands/command.rb
37
+ - lib/brigit/commands/map_command.rb
38
+ - lib/brigit/commands/update_command.rb
39
+ - lib/brigit/config_parser.rb
40
+ - lib/brigit/version.rb
41
+ - lib/brigit.rb
42
+ - lib/ext/option_parser.rb
43
+ - Rakefile
44
+ - README.rdoc
45
+ - test/config_parser_test.rb
46
+ - test/fixtures/example.conf
47
+ - test/test_helper.rb
48
+ - Manifest
49
+ - brigit.gemspec
50
+ has_rdoc: true
51
+ homepage: http://github.com/fiveruns/brigit
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --line-numbers
55
+ - --inline-source
56
+ - --title
57
+ - Brigit
58
+ - --main
59
+ - README.rdoc
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ requirements: []
75
+
76
+ rubyforge_project: fiveruns
77
+ rubygems_version: 1.2.0
78
+ signing_key:
79
+ specification_version: 2
80
+ summary: Git utilities
81
+ test_files:
82
+ - test/config_parser_test.rb
83
+ - test/test_helper.rb