git-whistles 0.7.4 → 0.7.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.
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/HISTORY +4 -0
- data/README.md +4 -3
- data/bin/git-outstanding-features +10 -3
- data/bin/git-pivotal-branch +122 -0
- data/git-whistles.gemspec +1 -1
- data/lib/git-whistles/version.rb +1 -1
- metadata +6 -3
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/HISTORY
CHANGED
@@ -1,2 +1,6 @@
|
|
1
|
+
# 2013-07-18: 0.7.5
|
2
|
+
* [FEATURE] git pivotal-branch <story-id> Creates a branch name suggestion from the specified Pivotal Tracker story ID. [dncrht]
|
3
|
+
* [FEATURE] git outstanding-features -o allows to view all features to be deployed in one single line
|
4
|
+
|
1
5
|
# 2013-06-18: 0.7.4
|
2
6
|
* [FIX] Adjusted git-pull-request to play with the new GitHub pull request user interface
|
data/README.md
CHANGED
@@ -12,13 +12,14 @@ Use it with:
|
|
12
12
|
|
13
13
|
- `git ff-all-branches [-f] [-p] [-v]`. Fast-forward all local tracking branches to their remote counterpart (where possible). Very useful on big projects.
|
14
14
|
- `git stash-and-checkout [branch]` As the name implies: stash and checkout another branch.
|
15
|
-
- `git
|
16
|
-
- `git outstanding-features [-f from-branch] [-t to-branch]` List the pull requests merged in `[to-branch]` but not in `[from-branch]`. Useful to prepare a list of stuff you're going to deploy. Defaults to listing what's on `origin/master` but not on `origin/production`. [[PedroCunha](https://github.com/PedroCunha)]
|
17
|
-
- `git chop [branch]` Delete the local and origin copy of a branch. Useful to close feature branches once a feature is completed.
|
15
|
+
- `git pull-request [--from your-branch] [--to target-branch]` Open your browser at a Github pull-request page for the specified branch (defaults to the current `head`). If you're using Pivotal Tracker and your branch has a story number in its name, populates your pull request with story details.
|
16
|
+
- `git outstanding-features [-f from-branch] [-t to-branch] [--oneline]` List the pull requests merged in `[to-branch]` but not in `[from-branch]`. Useful to prepare a list of stuff you're going to deploy. Defaults to listing what's on `origin/master` but not on `origin/production`. By default lists one feature per line, if `--oneline` or `-o` is specified features will be separated by spaces instead. [[PedroCunha](https://github.com/PedroCunha)]
|
17
|
+
- `git chop [branch]` Delete the local and origin copy of a branch. Useful to close feature branches once a feature is completed.
|
18
18
|
- `git list-branches [-l] [-r] [-i integration-branch]` Colourful listing of all local or origin branches, and their distance to an integration branch (`master` by default).
|
19
19
|
- `git merge-po <ancestor> <left> <right>` Merge engine for GetText PO files.
|
20
20
|
- `git select <story-id>` Checkout a local branch with the matching number. If not found, lists remote branches
|
21
21
|
- `git latest-pushes [-n NR_RESULTS] [-p PATTERN]` Show latest pushed branches to origin. Defaults to 20 results. Pattern is appended to refs/remotes/origin/ so include the team or project name to filter results. [[PedroCunha](https://github.com/PedroCunha)]
|
22
|
+
- `git pivotal-branch <story-id>` Creates a branch name suggestion from the specified Pivotal Tracker story ID. [[dncrht](https://github.com/dncrht)]
|
22
23
|
|
23
24
|
### More details on some of the commands
|
24
25
|
|
@@ -20,13 +20,16 @@ class App < Git::Whistles::App
|
|
20
20
|
super
|
21
21
|
parse_args!(args)
|
22
22
|
|
23
|
-
|
23
|
+
output = `git log --oneline #{options.from} ^#{options.to} | grep 'Merge pull request' | sed -e 's:.*from [^/]*/::'`
|
24
|
+
return output if output.nil?
|
25
|
+
puts options.oneline ? output.gsub(/\s+/, ' ') : output
|
24
26
|
end
|
25
27
|
|
26
28
|
def defaults
|
27
29
|
{
|
28
|
-
:from
|
29
|
-
:to
|
30
|
+
:from => 'origin/master',
|
31
|
+
:to => 'origin/production',
|
32
|
+
:oneline => false
|
30
33
|
}
|
31
34
|
end
|
32
35
|
|
@@ -42,6 +45,10 @@ class App < Git::Whistles::App
|
|
42
45
|
options.to = to
|
43
46
|
end
|
44
47
|
|
48
|
+
op.on("-o", "--oneline", "Output features in one line separated by spaces") do |oneline|
|
49
|
+
options.oneline = true
|
50
|
+
end
|
51
|
+
|
45
52
|
op.on_tail("-h", "--help", "Show this message") do
|
46
53
|
puts op
|
47
54
|
exit
|
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# git-pivotal-branch
|
5
|
+
#
|
6
|
+
# Suggest a branch name from the given Pivotal Tracker story ID
|
7
|
+
#
|
8
|
+
# Assumes the branches are named as:
|
9
|
+
# <team>/<branch-title>-<story-id>
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'optparse'
|
13
|
+
require 'pivotal-tracker'
|
14
|
+
require 'readline'
|
15
|
+
require 'term/ansicolor'
|
16
|
+
require 'git-whistles/app'
|
17
|
+
|
18
|
+
|
19
|
+
class App < Git::Whistles::App
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def main(args)
|
26
|
+
super
|
27
|
+
parse_args!(args)
|
28
|
+
|
29
|
+
if args.count < 1
|
30
|
+
show_and_exit usage
|
31
|
+
end
|
32
|
+
|
33
|
+
story_id = args[0]
|
34
|
+
|
35
|
+
# get PT info
|
36
|
+
story, project = get_pivotal_info(story_id)
|
37
|
+
|
38
|
+
branch_name_suggested = "#{project.name}/#{story.name}-#{story_id}".downcase
|
39
|
+
branch_name_suggested.gsub!(/[^\w\d\/]/, '-').gsub!(/-+/, '-')
|
40
|
+
|
41
|
+
puts 'The suggested branch name is: ' << Term::ANSIColor.yellow(branch_name_suggested)
|
42
|
+
puts ' Press ENTER if you agree'
|
43
|
+
puts ' or Write any other name and press ENTER'
|
44
|
+
puts ' or Press CTRL-D to cancel'
|
45
|
+
|
46
|
+
branch_name = Readline.readline ' > ', false
|
47
|
+
|
48
|
+
if branch_name.nil?
|
49
|
+
log.warn "\nCancelled by user"
|
50
|
+
exit 2
|
51
|
+
end
|
52
|
+
|
53
|
+
branch_name = branch_name.empty? ? branch_name_suggested : branch_name
|
54
|
+
|
55
|
+
# create branch
|
56
|
+
`cd #{ENV['PWD']} && git co -b #{branch_name}`
|
57
|
+
|
58
|
+
# comment and start on PT
|
59
|
+
story.notes.create :text => "Created branch #{branch_name}"
|
60
|
+
story.update :current_state => 'started'
|
61
|
+
|
62
|
+
puts Term::ANSIColor.green('Created branch and started PT story')
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def usage
|
68
|
+
'Usage: git pivotal-branch PIVOTAL_TRACKER_STORY_ID'
|
69
|
+
end
|
70
|
+
|
71
|
+
def show_and_exit(message)
|
72
|
+
puts message
|
73
|
+
exit 1
|
74
|
+
end
|
75
|
+
|
76
|
+
def option_parser
|
77
|
+
@option_parser ||= OptionParser.new do |op|
|
78
|
+
op.banner = usage
|
79
|
+
|
80
|
+
op.on_tail('-h', '--help', 'Show this message') do
|
81
|
+
show_and_exit op
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def get_pivotal_info(story_id)
|
87
|
+
token = `git config pivotal-tracker.token`.strip
|
88
|
+
if token.empty?
|
89
|
+
puts Term::ANSIColor.yellow %Q{
|
90
|
+
Your branch appears to have a story ID,
|
91
|
+
but I don't know your Pivotal Tracker token!
|
92
|
+
Please set it with:
|
93
|
+
$ git config [--global] pivotal-tracker.token <token>
|
94
|
+
}
|
95
|
+
die "Aborting."
|
96
|
+
end
|
97
|
+
|
98
|
+
log.info "Finding your project and story¬"
|
99
|
+
|
100
|
+
PivotalTracker::Client.token = token
|
101
|
+
story, project = PivotalTracker::Project.all.find do |project|
|
102
|
+
log.info '.¬'
|
103
|
+
story = project.stories.find(story_id) and break story, project
|
104
|
+
end
|
105
|
+
log.info '.'
|
106
|
+
|
107
|
+
if story.nil?
|
108
|
+
log.warn "Apologies... I could not find story #{story_id}."
|
109
|
+
exit 1
|
110
|
+
end
|
111
|
+
|
112
|
+
log.info "Found story #{story_id} in '#{project.name}'"
|
113
|
+
|
114
|
+
[story, project]
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
############################################################################
|
121
|
+
|
122
|
+
App.run!
|
data/git-whistles.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require File.expand_path('../lib/git-whistles/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Julien Letessier"]
|
5
|
+
gem.authors = ["Julien Letessier", "Pedro Cunha"]
|
6
6
|
gem.email = ["julien.letessier@gmail.com"]
|
7
7
|
gem.description = %q{A few helpers for classic Git workflows}
|
8
8
|
gem.summary = %q{
|
data/lib/git-whistles/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-whistles
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Julien Letessier
|
9
|
+
- Pedro Cunha
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2013-
|
13
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: bundler
|
@@ -117,6 +118,7 @@ executables:
|
|
117
118
|
- git-list-branches
|
118
119
|
- git-merge-po
|
119
120
|
- git-outstanding-features
|
121
|
+
- git-pivotal-branch
|
120
122
|
- git-pull-request
|
121
123
|
- git-select
|
122
124
|
- git-stash-and-checkout
|
@@ -136,6 +138,7 @@ files:
|
|
136
138
|
- bin/git-list-branches
|
137
139
|
- bin/git-merge-po
|
138
140
|
- bin/git-outstanding-features
|
141
|
+
- bin/git-pivotal-branch
|
139
142
|
- bin/git-pull-request
|
140
143
|
- bin/git-select
|
141
144
|
- bin/git-stash-and-checkout
|
@@ -164,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
164
167
|
version: '0'
|
165
168
|
segments:
|
166
169
|
- 0
|
167
|
-
hash:
|
170
|
+
hash: 1077237623234121323
|
168
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
172
|
none: false
|
170
173
|
requirements:
|