git-process 0.9.1.pre3 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/CHANGELOG.md +0 -0
  2. data/Gemfile +2 -2
  3. data/Gemfile.lock +2 -0
  4. data/README.md +27 -9
  5. data/bin/git-new-fb +42 -13
  6. data/bin/git-pull-request +79 -13
  7. data/bin/git-sync +47 -13
  8. data/bin/git-to-master +56 -13
  9. data/git-process.gemspec +1 -1
  10. data/lib/git-process/{abstract-error-builder.rb → abstract_error_builder.rb} +13 -3
  11. data/lib/git-process/{git-abstract-merge-error-builder.rb → git_abstract_merge_error_builder.rb} +15 -5
  12. data/lib/git-process/{git-branch.rb → git_branch.rb} +13 -1
  13. data/lib/git-process/git_branches.rb +72 -0
  14. data/lib/git-process/{git-lib.rb → git_lib.rb} +82 -70
  15. data/lib/git-process/git_merge_error.rb +38 -0
  16. data/lib/git-process/git_process.rb +124 -0
  17. data/lib/git-process/git_process_error.rb +18 -0
  18. data/lib/git-process/git_process_options.rb +101 -0
  19. data/lib/git-process/git_rebase_error.rb +38 -0
  20. data/lib/git-process/{git-status.rb → git_status.rb} +13 -1
  21. data/lib/git-process/{github-client.rb → github_client.rb} +13 -1
  22. data/lib/git-process/github_pull_request.rb +107 -0
  23. data/lib/git-process/{github-service.rb → github_service.rb} +39 -21
  24. data/lib/git-process/new_fb.rb +40 -0
  25. data/lib/git-process/parked_changes_error.rb +40 -0
  26. data/lib/git-process/pull_request.rb +61 -0
  27. data/lib/git-process/rebase_to_master.rb +110 -0
  28. data/lib/git-process/sync.rb +63 -0
  29. data/lib/git-process/uncommitted_changes_error.rb +23 -0
  30. data/lib/git-process/version.rb +19 -9
  31. data/spec/GitRepoHelper.rb +35 -21
  32. data/spec/{git-abstract-merge-error-builder_spec.rb → git_abstract_merge_error_builder_spec.rb} +3 -3
  33. data/spec/{git-lib_spec.rb → git_lib_spec.rb} +79 -16
  34. data/spec/git_process_spec.rb +36 -0
  35. data/spec/{git-status_spec.rb → git_status_spec.rb} +28 -29
  36. data/spec/github_pull_request_spec.rb +91 -0
  37. data/spec/{github-service_spec.rb → github_service_spec.rb} +1 -1
  38. data/spec/new_fb_spec.rb +80 -0
  39. data/spec/rebase_to_master_spec.rb +314 -0
  40. data/spec/spec_helper.rb +1 -1
  41. data/spec/sync_spec.rb +149 -0
  42. metadata +46 -43
  43. data/lib/git-process/git-branches.rb +0 -53
  44. data/lib/git-process/git-merge-error.rb +0 -31
  45. data/lib/git-process/git-new-fb-options.rb +0 -34
  46. data/lib/git-process/git-process-error.rb +0 -10
  47. data/lib/git-process/git-process-options.rb +0 -82
  48. data/lib/git-process/git-process.rb +0 -194
  49. data/lib/git-process/git-pull-request-options.rb +0 -42
  50. data/lib/git-process/git-rebase-error.rb +0 -31
  51. data/lib/git-process/git-sync-options.rb +0 -34
  52. data/lib/git-process/git-to-master-options.rb +0 -18
  53. data/lib/git-process/parked-changes-error.rb +0 -32
  54. data/lib/git-process/pull-request.rb +0 -38
  55. data/lib/git-process/uncommitted-changes-error.rb +0 -15
  56. data/spec/git-process_spec.rb +0 -328
  57. data/spec/pull-request_spec.rb +0 -57
data/CHANGELOG.md ADDED
File without changes
data/Gemfile CHANGED
@@ -1,10 +1,10 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- # gem "git", "~> 1.2.5"
4
3
  # gem "rugged" # "git" bindings for libgit2
5
4
  gem "launchy", "~> 2.1.0" # web browser interaction
6
5
  gem "octokit", "~> 1.4.0" # GitHub API
7
6
  gem "json", "~> 1.7.3"
7
+ gem "trollop", "~> 1.16.2" # CLI options parser
8
8
  gem "highline", "~> 1.6.12" # user CLI interaction
9
9
  gem "termios", "~> 0.9.4" # used by highline to make things a little nicer
10
10
  gem "system_timer", "~> 1.2.4" # Needed by faraday via octokit
@@ -17,6 +17,6 @@ end
17
17
 
18
18
  group :development do
19
19
  gem "rake", "~> 0.9.2"
20
- gem "yard", "~> 0.8.2.1"
20
+ gem "yard", "~> 0.8.2.1" # documentation generator
21
21
  gem "redcarpet", "~> 2.1.1"
22
22
  end
data/Gemfile.lock CHANGED
@@ -33,6 +33,7 @@ GEM
33
33
  rspec-mocks (2.10.1)
34
34
  system_timer (1.2.4)
35
35
  termios (0.9.4)
36
+ trollop (1.16.2)
36
37
  webmock (1.8.7)
37
38
  addressable (>= 2.2.7)
38
39
  crack (>= 0.1.7)
@@ -52,5 +53,6 @@ DEPENDENCIES
52
53
  rspec-mocks (~> 2.10.0)
53
54
  system_timer (~> 1.2.4)
54
55
  termios (~> 0.9.4)
56
+ trollop (~> 1.16.2)
55
57
  webmock (~> 1.8.7)
56
58
  yard (~> 0.8.2.1)
data/README.md CHANGED
@@ -9,6 +9,7 @@ This provides an easy way to work with a sane git workflow process.
9
9
 
10
10
  $ gem install git-process
11
11
 
12
+
12
13
  # Overview #
13
14
 
14
15
  * `git new-fb` - Create a new feature branch based on the integration branch.
@@ -31,7 +32,7 @@ _The following assumes that the integration branch is "origin/master"._
31
32
  3. When you feel your work is ready for others to look at, do another "`git sync`" to post your
32
33
  changes to the server, and then "`git pull-request`" to ask someone to review your changes.
33
34
  4. If you get the thumbs up from the code-review, use "`git to-master`".
34
- * This will merge and push your changes into "`origin/master`"
35
+ * This will merge and push your changes into "`origin/master`", closing the pull request.
35
36
  5. If you still need to make changes, do so and use "`git sync`" to keep your branch on the
36
37
  server for that feature updated with your work until all issues have been resolved.
37
38
 
@@ -46,25 +47,28 @@ _The following assumes that the integration branch is "origin/master"._
46
47
  3. When you are ready to merge your work into the mainline, "`git to-master`".
47
48
  * This will merge and push your changes into "`origin/master`"
48
49
 
50
+
49
51
  # Notes #
50
52
 
51
- * It's assumed that you **_never_** do any work directly on "master": everything is done on a
53
+ * It's assumed that you **_never_** do any work directly on "`master`": everything is done on a
52
54
  feature branch. This is a much safer and more flexible practice, but may seem odd to
53
- people used to old VCSs.
55
+ people used to old VCSs. In addition to being a much better way of working in general,
56
+ it is also a requirement to take advantage of Pull Request functionality.
54
57
  * After publishing changes to the main integration branch (i.e., "`git to-master`") the
55
58
  old feature branch is removed as part of cleanup. Git is then "parked" on a "`_parking_`"
56
59
  branch until a new feature branch is created. Work is not expected to be done on this
57
60
  branch, but any that is done is brought over to a newly created feature branch (i.e.,
58
61
  "`git new-fb`").
62
+ * If there is a problem (such as a merge conflict), this will try to resolve such errors
63
+ for you as much as it can do safely. When it can't do so in an automated way, it will try
64
+ to tell you the process for doing so manually.
59
65
  * The first time you use a GitHub feature (e.g., "`git pull-request`"), this will ask for your
60
66
  username and password. It does not store them, but instead uses them to get an OAuth2 token,
61
67
  which is stored in "`git config gitProcess.github.authToken`".
62
-
63
- ## Misc ##
64
-
65
- * http://git-scm.com/2010/03/08/rerere.html
66
- * http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/rerere-train.sh;hb=HEAD
67
- * https://github.com/b4mboo/git-review
68
+ * If you want to use a different integration branch other than "`master`", set the
69
+ "`gitProcess.integrationBranch`" configuration value. (e.g.,
70
+ "`git config gitProcess.integrationBranch my-integ-branch`")
71
+ * This tries to respond "intelligently" to the use of 'rerere'.
68
72
 
69
73
 
70
74
  # Contributing #
@@ -78,3 +82,17 @@ _The following assumes that the integration branch is "origin/master"._
78
82
  5. Create new Pull Request
79
83
 
80
84
  The tests are written for RSpec 2.
85
+
86
+ ## License ##
87
+
88
+ Licensed under the Apache License, Version 2.0 (the "License");
89
+ you may not use this file except in compliance with the License.
90
+ You may obtain a copy of the License at
91
+
92
+ [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0 "License Link")
93
+
94
+ Unless required by applicable law or agreed to in writing, software
95
+ distributed under the License is distributed on an "AS IS" BASIS,
96
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
97
+ See the License for the specific language governing permissions and
98
+ limitations under the License.
data/bin/git-new-fb CHANGED
@@ -1,21 +1,50 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "rubygems"
4
- require "bundler/setup"
3
+ require 'git-process/git_process_options'
4
+ require 'git-process/new_fb'
5
5
 
6
- require 'logger'
6
+ class NewFeatureBranchOptions
7
+ include GitProc::GitProcessOptions
7
8
 
8
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib/git-process')
9
- require 'git-new-fb-options'
10
- require 'git-process'
9
+ def summary
10
+ "Create a new feature branch based on the integration branch."
11
+ end
11
12
 
12
- options = Git::Process::NewFeatureBranchOptions.new(File.basename(__FILE__), ARGV)
13
13
 
14
- gp = Git::Process.new('.', nil, :log_level => options.log_level)
14
+ def description
15
+ <<DESC
16
+ DESCRIPTION
17
+
18
+ This creates the named branch based on the integration branch.
19
+
20
+ EXAMPLE
21
+
22
+ Assuming that the the integration branch on the server is "master", \
23
+ typing "git new-fb my_feature" will do roughly the following \
24
+ for you:
25
+ $ git checkout my_feature origin/master
26
+
27
+ Also, if you are currently on the "_parking_" branch (see "git to-master"), \
28
+ this will remove that branch.
29
+
30
+ DESC
31
+ end
32
+
33
+
34
+ def usage(filename)
35
+ "#{filename} [options] branch_name"
36
+ end
37
+
38
+
39
+ def empty_argv_ok?
40
+ false
41
+ end
42
+
43
+
44
+ def post_parse(opts, argv)
45
+ opts[:branch_name] = argv.shift
46
+ end
15
47
 
16
- begin
17
- gp.new_feature_branch(options.branch_name)
18
- rescue Git::Process::GitProcessError => exp
19
- puts exp.message
20
- exit(-1)
21
48
  end
49
+
50
+ GitProc::NewFeatureBranch.new('.', NewFeatureBranchOptions.new.parse_cli(File.basename(__FILE__), ARGV)).run
data/bin/git-pull-request CHANGED
@@ -1,21 +1,87 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "rubygems"
4
- require "bundler/setup"
3
+ require 'git-process/pull_request'
4
+ require 'git-process/git_process_options'
5
5
 
6
- require 'logger'
6
+ class PullRequestOptions
7
+ include GitProc::GitProcessOptions
7
8
 
8
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib/git-process')
9
- require 'git-pull-request-options'
10
- require 'git-process'
9
+ def summary
10
+ "Creates a Pull Request for the current branch."
11
+ end
11
12
 
12
- options = Git::Process::PullRequestOptions.new(File.basename(__FILE__), ARGV)
13
13
 
14
- gp = Git::Process.new('.', nil, :log_level => options.log_level)
14
+ def description
15
+ <<DESC
16
+ DESCRIPTION
17
+
18
+ This creates a Pull Request on the GitHub server associated with the current \
19
+ branch. For the reasons why Pull Requests are useful for the development process, \
20
+ see https://help.github.com/articles/using-pull-requests
21
+
22
+ The "git pull-request" command is a nice, simplified alternative to using the \
23
+ web interface.
24
+
25
+ EXAMPLE
26
+
27
+ You've been developing your killer new feature or bug fix, and you want \
28
+ someone else to look at it (to do code-review or otherwise provide input). \
29
+ When you do "git pull-request", it synchronizes the current branch with \
30
+ the server (effectively executing "git sync") and creates the Pull Request \
31
+ against the integration branch. (Usually "master", but this can be changed; \
32
+ see below.)
33
+
34
+ The counterpart to this command is "git to-master".
35
+
36
+ NOTES
37
+
38
+ * It's assumed that you *never* do any work directly on "master":
39
+ everything is done on a feature branch. In addition to being a much
40
+ safer and more flexible way of working in general, it is also a
41
+ requirement to take advantage of Pull Request functionality.
42
+ * The first time you use a GitHub feature like this, you will be asked
43
+ for your username and password. This does not store them, but instead
44
+ uses them to get an OAuth2 token, which is stored in
45
+ "git config gitProcess.github.authToken".
46
+ * If you want to use a different integration branch other than "master",
47
+ set the "gitProcess.integrationBranch" configuration value. (e.g.,
48
+ "git config gitProcess.integrationBranch my-integ-branch")
49
+
50
+ DESC
51
+ end
52
+
53
+
54
+ def usage(filename)
55
+ "Usage: #{filename} [ options ] pull_request_title"
56
+ end
57
+
58
+
59
+ def empty_argv_ok?
60
+ false
61
+ end
62
+
63
+
64
+ def extend_opts(parser)
65
+ parser.opt :base_branch, "The branch on the server that you want this \"pulled\" into. "+
66
+ "Defaults to the integration branch."
67
+ parser.opt :head_branch, "The branch that you want reviewed before being \"pulled\" "+
68
+ "into the base branch. Defaults to the current branch."
69
+ parser.opt :repo_name, "The name of the repository to \"pull\" into. Defaults to "+
70
+ "the current repository."
71
+ parser.opt :description, "The description of the Pull Request. Usually includes a "+
72
+ "nice description of what was changed to make things easier "+
73
+ "for the reviewer.", :short => :d
74
+ parser.opt :user, "Your GitHub username. Only needed the first time you connect, "+
75
+ "and you will be prompted for it if needed."
76
+ parser.opt :password, "Your GitHub password. Only needed the first time you connect, "+
77
+ "and you will be prompted for it if needed."
78
+ end
79
+
80
+
81
+ def post_parse(opts, argv)
82
+ opts[:title] = argv.shift
83
+ end
15
84
 
16
- begin
17
- gp.create(nil, nil, nil, options.title, options.description, :user => options.user, :password => options.password)
18
- rescue Git::Process::GitProcessError => exp
19
- puts exp.message
20
- exit(-1)
21
85
  end
86
+
87
+ GitProc::PullRequest.new('.', PullRequestOptions.new.parse_cli(File.basename(__FILE__), ARGV)).run
data/bin/git-sync CHANGED
@@ -1,21 +1,55 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "rubygems"
4
- require "bundler/setup"
3
+ require 'git-process/git_process_options'
4
+ require 'git-process/sync'
5
5
 
6
- require 'logger'
6
+ class SyncOptions
7
+ include GitProc::GitProcessOptions
7
8
 
8
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib/git-process')
9
- require 'git-sync-options'
10
- require 'git-process'
9
+ def summary
10
+ "Gets the latest changes that have happened on the integration branch, then pushes your changes to a \"private\" branch on the server."
11
+ end
11
12
 
12
- options = Git::Process::SyncOptions.new(File.basename(__FILE__), ARGV)
13
13
 
14
- gp = Git::Process.new('.', nil, :log_level => options.log_level)
14
+ def description
15
+ <<DESC
16
+ DESCRIPTION
17
+
18
+ This fetches the latest repository from the server, rebases/merges the current branch \
19
+ against the changes in the integration branch, then pushes the result up to a branch on \
20
+ the server of the same name.
21
+
22
+ If there is a problem, such as a merge conflict, this tries to \
23
+ resolve it automatically. If it can not do so in an automated way, \
24
+ if tells you the steps involved for doing so manually.
25
+
26
+ EXAMPLE
27
+
28
+ Assuming that the current branch is called "interesting_changes" and the integration \
29
+ branch on the server is "master", typing "git sync" will do roughly the following \
30
+ for you:
31
+ $ git fetch -p
32
+ $ git merge origin/master
33
+ $ git push origin interesting_changes:interesting_changes
34
+
35
+ DESC
36
+ end
37
+
38
+
39
+ def extend_opts(parser)
40
+ parser.opt :rebase, "Rebase instead of merge against the integration branch"
41
+ parser.opt :merge, "Merge instead of rebase against the integration branch", :short => :none, :default => true
42
+ parser.opt :force, "Force the push; defaults to true if --rebase is used", :short => :f, :default => false
43
+
44
+ parser.conflicts :rebase, :merge
45
+ end
46
+
47
+
48
+ def post_parse(opts, argv)
49
+ opts[:force] = true if opts[:rebase]
50
+ opts[:merge] = !opts[:rebase]
51
+ end
15
52
 
16
- begin
17
- gp.sync_with_server(options.rebase, options.force)
18
- rescue Git::Process::GitProcessError => exp
19
- puts exp.message
20
- exit(-1)
21
53
  end
54
+
55
+ GitProc::Sync.new('.', SyncOptions.new.parse_cli(File.basename(__FILE__), ARGV)).run
data/bin/git-to-master CHANGED
@@ -1,21 +1,64 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "rubygems"
4
- require "bundler/setup"
3
+ require 'git-process/git_process_options'
4
+ require 'git-process/rebase_to_master'
5
5
 
6
- require 'logger'
6
+ class ToMasterOptions
7
+ include GitProc::GitProcessOptions
7
8
 
8
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib/git-process')
9
- require 'git-to-master-options'
10
- require 'git-process'
9
+ def summary
10
+ "Rebase against the integration branch, then pushes to it."
11
+ end
11
12
 
12
- options = Git::Process::ToMasterOptions.new(File.basename(__FILE__), ARGV)
13
13
 
14
- gp = Git::Process.new('.', nil, :log_level => options.log_level)
14
+ def description
15
+ <<DESC
16
+ DESCRIPTION
17
+
18
+ This fetches the latest changes from the server, rebases against \
19
+ the integration branch, pushes to the integration branch, then does \
20
+ housecleaning.
21
+
22
+ If there is a problem, such as a merge conflict, this tries to \
23
+ resolve it automatically. If it can not do so in an automated way, \
24
+ if tells you the steps involved for doing so manually.
25
+
26
+ "Housecleaning" includes such things as closing any \
27
+ Pull Request that may exist for the branch, removing the (now obsolete) \
28
+ local and remote feature branches, and then "parking" on the \
29
+ special "_parking_" branch.
30
+
31
+ Work is not expected to be done on the "parking" branch, but any that is \
32
+ done is brought over to a newly created feature branch when you do \
33
+ "git new-fb".
34
+
35
+ It's assumed that you *never* do any work directly on "master": \
36
+ everything is done on a feature branch. In addition to being a much \
37
+ safer and more flexible way of working in general, it is also a \
38
+ requirement to take advantage of Pull Request functionality.
39
+
40
+ EXAMPLE
41
+
42
+ Assuming that the current branch is called "interesting_changes" and the integration \
43
+ branch on the server is "master", typing "git to-master" will do roughly the following \
44
+ for you:
45
+ $ git fetch -p
46
+ $ git rebase origin/master
47
+ $ git push origin interesting_changes:master
48
+ # close pull request
49
+ $ git co -b _parking_ origin/master
50
+ $ git branch -d interesting_changes
51
+ $ git push origin :interesting_changes
52
+
53
+ NOTES
54
+
55
+ * If you want to use a different integration branch other than "master",
56
+ set the "gitProcess.integrationBranch" configuration value. (e.g.,
57
+ "git config gitProcess.integrationBranch my-integ-branch")
58
+
59
+ DESC
60
+ end
15
61
 
16
- begin
17
- gp.rebase_to_master
18
- rescue Git::Process::GitProcessError => exp
19
- puts exp.message
20
- exit(-1)
21
62
  end
63
+
64
+ GitProc::RebaseToMaster.new('.', ToMasterOptions.new.parse_cli(File.basename(__FILE__), ARGV)).run
data/git-process.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
16
16
  gem.name = "git-process"
17
17
  gem.require_paths = ["lib"]
18
- gem.version = Git::Process::Version::STRING
18
+ gem.version = GitProc::Version::STRING
19
19
  gem.platform = Gem::Platform::RUBY
20
20
  gem.required_ruby_version = '>= 1.8.7'
21
21
  end
@@ -1,8 +1,18 @@
1
- require 'git-lib'
2
- require 'git-process-error'
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.require 'shellwords'
12
+
3
13
  require 'shellwords'
4
14
 
5
- module Git
15
+ module GitProc
6
16
 
7
17
  #
8
18
  # Assumes that there are two attributes defined: error_message, lib
@@ -1,15 +1,25 @@
1
- require 'git-lib'
2
- require 'abstract-error-builder'
3
- require 'git-process-error'
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.require 'shellwords'
12
+
13
+ require 'git-process/abstract_error_builder'
4
14
  require 'shellwords'
5
15
 
6
- module Git
16
+ module GitProc
7
17
 
8
18
  #
9
19
  # Assumes that there are three attributes defined: error_message, lib, continue_command
10
20
  #
11
21
  module AbstractMergeErrorBuilder
12
- include AbstractErrorBuilder
22
+ include GitProc::AbstractErrorBuilder
13
23
 
14
24
  def resolved_files
15
25
  @resolved_files ||= find_resolved_files
@@ -1,4 +1,16 @@
1
- module Git
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.require 'shellwords'
12
+
13
+ module GitProc
2
14
 
3
15
  class GitBranch
4
16
  include Comparable
@@ -0,0 +1,72 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.require 'shellwords'
12
+
13
+ require 'set'
14
+ require 'git-process/git_branch'
15
+
16
+ module GitProc
17
+
18
+ class GitBranches
19
+ include Enumerable
20
+
21
+ def initialize(lib)
22
+ @lib = lib
23
+ branch_lines = lib.branch(nil, :all => true, :no_color => true).split("\n")
24
+ @items = SortedSet.new
25
+ branch_lines.each do |bl|
26
+ @items << GitBranch.new(bl[2..-1], bl[0..0] == '*', lib)
27
+ end
28
+ end
29
+
30
+
31
+ def <<(item)
32
+ @items << item
33
+ end
34
+
35
+
36
+ def each(&block)
37
+ @items.each {|b| block.call(b)}
38
+ end
39
+
40
+
41
+ def names
42
+ @items.map {|b| b.name}
43
+ end
44
+
45
+
46
+ def current
47
+ @items.find {|b| b.current? }
48
+ end
49
+
50
+
51
+ def parking
52
+ @items.find {|b| b.name == '_parking_' }
53
+ end
54
+
55
+
56
+ def include?(branch_name)
57
+ @items.find {|b| b.name == branch_name} != nil
58
+ end
59
+
60
+
61
+ def [](branch_name)
62
+ branch_name = current.name if branch_name == 'HEAD'
63
+ br = @items.find {|b| b.name == branch_name}
64
+ unless br
65
+ @lib.logger.warn {"Could not find '#{branch_name}' in #{@items.map{|i|i.name}.join(',')}"}
66
+ end
67
+ br
68
+ end
69
+
70
+ end
71
+
72
+ end