git_scf 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/README.md ADDED
@@ -0,0 +1 @@
1
+ TODO
data/bin/git-scf ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # == INSTALL
5
+ # RubyGem:
6
+ # gem install git_scf
7
+
8
+ $:.unshift('lib')
9
+ require 'git_scf'
10
+ GitScf.execute(*ARGV)
@@ -0,0 +1,10 @@
1
+ class EnvConfig
2
+
3
+ def initialize(repo)
4
+ @repo = repo
5
+ end
6
+
7
+ def get(key)
8
+ ENV[key] || repo.config["scfgit.#{key.downcase}"]
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ class Jira
2
+ require 'jira'
3
+
4
+ def initialize(config)
5
+ options = { username: config.get('JIRA_USERNAME'),
6
+ password: config.get('JIRA_PASSWORD'),
7
+ use_ssl: true,
8
+ site: 'https://seeclickfix.atlassian.net',
9
+ context_path: '/',
10
+ rest_base_path: 'rest/api/2',
11
+ auth_type: :basic }
12
+ @jira = JIRA::Client.new(options)
13
+ end
14
+
15
+ def ticket(id)
16
+ @jira.Issue.find(id)
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ class Logger
2
+
3
+ LOG_PATH = 'script/scfgit'
4
+ LOG_FILE = 'log'
5
+
6
+ def initialize
7
+ `mkdir -p #{LOG_PATH}`
8
+ end
9
+
10
+ def add(string)
11
+ `echo '#{string} #{`date`}' >> #{log_file}`
12
+ end
13
+
14
+ private
15
+
16
+ def log_file
17
+ "#{LOG_PATH}/#{LOG_FILE}"
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ class Finish
2
+ def initialize(ticket, logger)
3
+ @ticket = ticket
4
+ @logger = logger
5
+ end
6
+
7
+ def execute
8
+ @logger.add("Closing out #{@ticket.branch_name}")
9
+ `git add .`
10
+ `git commit -am "#{@ticket.id} #done"`
11
+ `git push`
12
+ `git flow feature finish #{@ticket.branch_name}`
13
+ `git push`
14
+ `git push origin :refs/heads/feature/#{@ticket.branch_name}`
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ class Review
2
+
3
+ def initialize(ticket, logger)
4
+ @ticket = ticket
5
+ @logger = logger
6
+ end
7
+
8
+ def execute
9
+ @logger.add("Reviewing #{@ticket.branch_name}")
10
+ `git add .`
11
+ `git commit -am "#{@ticket.id} #review"`
12
+ `git push`
13
+ `hub pull-request "Addresses #{@ticket.id} please review." | pbcopy`
14
+ puts "The code-review URL is in your clipboard."
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ class Show
2
+
3
+ def initialize(ticket, verbose)
4
+ @ticket = ticket
5
+ @verbose = verbose
6
+ end
7
+
8
+ def execute
9
+ jira_ticket = @ticket.jira_ticket
10
+ puts "Summary: #{jira_ticket.summary}"
11
+ puts "Status: #{jira_ticket.status.name}"
12
+ puts "Created at: #{jira_ticket.created}"
13
+ if @verbose
14
+ puts "Description: #{jira_ticket.description}"
15
+ jira_ticket.comments.each do |comment|
16
+ puts ""
17
+ puts "#{comment.author['name']} wrote: #{comment.body}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ class Start
2
+
3
+ def initialize(ticket, logger)
4
+ @ticket = ticket
5
+ @logger = logger
6
+ end
7
+
8
+ def execute
9
+ `git checkout develop`
10
+ `git pull`
11
+ `git flow feature start #{@ticket.branch_name}`
12
+ @logger.add("Started #{@ticket.branch_name}")
13
+ `git add .`
14
+ `git commit -am "#{@ticket.id} #in-progress"`
15
+ `git flow feature publish #{@ticket.branch_name}`
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ require 'git_scf/subcommands/start'
2
+ require 'git_scf/subcommands/show'
3
+ require 'git_scf/subcommands/review'
4
+ require 'git_scf/subcommands/review'
5
+ require 'git_scf/subcommands/finish'
@@ -0,0 +1,53 @@
1
+ class Ticket
2
+
3
+ def initialize(repo, jira)
4
+ @repo = repo
5
+ @jira = jira
6
+ end
7
+
8
+ def id
9
+ @id ||= id_by_argument_or_branch
10
+ end
11
+
12
+ def branch_name
13
+ "#{id}-#{parameterize(summary)}"
14
+ end
15
+
16
+ def jira_ticket
17
+ @jira && @jira.ticket(id)
18
+ end
19
+
20
+ private
21
+
22
+ def summary
23
+ jira_ticket && jira_ticket.summary
24
+ end
25
+
26
+ def id_by_argument_or_branch
27
+ ARGV.size == 2 ? ARGV.pop : id_from_branch
28
+ end
29
+
30
+ def name_from_branch
31
+ @repo.head.name.split('/')[-1][/^.*-.*$/]
32
+ end
33
+
34
+ def id_from_branch
35
+ parts = name_from_branch.split('-')
36
+ "#{parts[0]}-#{parts[1]}"
37
+ end
38
+
39
+ # Stolen from ActiveSupport
40
+ def parameterize(string, sep = '-')
41
+ # Turn unwanted chars into the separator
42
+ string.gsub!(/[^a-zA-Z0-9\-_]+/, sep)
43
+ unless sep.nil? || sep.empty?
44
+ re_sep = Regexp.escape(sep)
45
+ # No more than one of the separator in a row.
46
+ string.gsub!(/#{re_sep}{2,}/, sep)
47
+ # Remove leading/trailing separator.
48
+ string.gsub!(/^#{re_sep}|#{re_sep}$/, '')
49
+ end
50
+ string.downcase
51
+ end
52
+
53
+ end
@@ -0,0 +1,3 @@
1
+ module GitScf
2
+ VERSION = '0.0.1'
3
+ end
data/lib/git_scf.rb ADDED
@@ -0,0 +1,66 @@
1
+ require 'rugged'
2
+ require 'optparse'
3
+
4
+ require 'git_scf/ticket'
5
+ require 'git_scf/version'
6
+ require 'git_scf/jira'
7
+ require 'git_scf/env_config'
8
+ require 'git_scf/logger'
9
+ require 'git_scf/subcommands'
10
+
11
+ module GitScf
12
+ extend self
13
+
14
+ REPO_PATH = '.'
15
+
16
+ # Parses command line arguments and does what needs to be done.
17
+ def execute(*args)
18
+ options = {}
19
+ opts = OptionParser.new do |opts|
20
+ # Set a banner, displayed at the top of the help screen.
21
+ opts.banner = "Usage: git scf (start|show|review|finish) [issue_number]"
22
+
23
+ # Define the options, and what they do
24
+ options[:verbose] = false
25
+ opts.on( '-v', '--verbose', 'Output more information' ) do
26
+ options[:verbose] = true
27
+ end
28
+
29
+ # Displays the help screen.
30
+ opts.on( '-h', '--help', 'Display this screen' ) do
31
+ puts opts
32
+ exit
33
+ end
34
+ end
35
+ opts.parse!
36
+
37
+ if ARGV.empty?
38
+ puts "ERROR: you must specify a subcommand"
39
+ puts opts
40
+ exit
41
+ end
42
+
43
+ begin
44
+ repo = Rugged::Repository.new(REPO_PATH)
45
+ rescue
46
+ puts "ERROR: Invalid git directory"
47
+ puts opts
48
+ exit
49
+ end
50
+
51
+ jira = Jira.new(EnvConfig.new(repo))
52
+ ticket = Ticket.new(repo, jira)
53
+ logger = Logger.new
54
+
55
+ case ARGV.first
56
+ when 'start'
57
+ Start.new(ticket, logger)
58
+ when 'show'
59
+ Show.new(ticket, options[:verbose])
60
+ when 'review'
61
+ Review.new(ticket, logger)
62
+ when 'finish'
63
+ Finish.new(ticket, logger)
64
+ end.execute
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git_scf
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jeff Blasius
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
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: hub
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: jira
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
+ - !ruby/object:Gem::Dependency
63
+ name: rugged
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: ! " Provides git tools that match the SCF workflow. \n"
79
+ email: jeff@seeclickfix.com
80
+ executables:
81
+ - git-scf
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - README.md
86
+ - lib/git_scf/env_config.rb
87
+ - lib/git_scf/jira.rb
88
+ - lib/git_scf/logger.rb
89
+ - lib/git_scf/subcommands/finish.rb
90
+ - lib/git_scf/subcommands/review.rb
91
+ - lib/git_scf/subcommands/show.rb
92
+ - lib/git_scf/subcommands/start.rb
93
+ - lib/git_scf/subcommands.rb
94
+ - lib/git_scf/ticket.rb
95
+ - lib/git_scf/version.rb
96
+ - lib/git_scf.rb
97
+ - bin/git-scf
98
+ homepage: http://github.com/SeeClickFix/git_scf
99
+ licenses: []
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.9.2
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 1.8.24
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Git tools for SCF's workflow.
122
+ test_files: []