git-bundle 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8fcf00baa552c9594401c3add235f2b13453dac1
4
- data.tar.gz: d71d2fc8bccbf51e00414d0763382ce50ba602d1
3
+ metadata.gz: 6f8a6dbac04e7df74fd20844a8d1b3d9644f1481
4
+ data.tar.gz: 73c8387f701edb2c52daa89c5dcabfd11623e5d1
5
5
  SHA512:
6
- metadata.gz: 44439c2d821e11854aad1aef4369c726d7d18b2d839ed7e7745111eee387815a34125ad7ad2d665c7edcb31911c89902e93eff6ed8e7bb716a2a876a4053412b
7
- data.tar.gz: d560cf0525edff11740a68edc11019938f02949adaad8ebc407720f9d07b25010490f699913b850bc28a1dce06e18cd065a5fdefc646483235303a8d44a56e16
6
+ metadata.gz: 0c5d5533464c4aef6dc674c18f70870926955eeb7c3b26c8a511bf73fee90495182f22955639ec8e40f5ec6f90c0a7964eb3ad011409c81fbd78d73512dcadb5
7
+ data.tar.gz: 9670f36cc2eedc9742e128c474261b5376a4e0031bfc650f46f1182d8339cb448ff6f963de8d8ad33e7a315f4dbdaa1fe8405616321cbf32686a60c89b032d17
data/Gemfile.lock ADDED
@@ -0,0 +1,18 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ git-bundle (1.0.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ bundler (~> 1.12)
15
+ git-bundle!
16
+
17
+ BUNDLED WITH
18
+ 1.12.5
data/lib/git_bundle.rb CHANGED
@@ -3,4 +3,5 @@ require 'git_bundle/version'
3
3
  require 'git_bundle/console'
4
4
  require 'git_bundle/cli'
5
5
  require 'git_bundle/repository'
6
- require 'git_bundle/push'
6
+ require 'git_bundle/commands/generic'
7
+ require 'git_bundle/commands/push'
@@ -12,39 +12,20 @@ module GitBundle
12
12
  when nil, '--help', 'help'
13
13
  puts `git #{args.join(' ')}`.gsub('git', 'gitb')
14
14
  when 'push'
15
- push = GitBundle::Push.new(@repositories, args[1..-1])
16
- push.invoke if push.prompt_confirm
15
+ GitBundle::Commands::Push.new(@repositories, args[1..-1]).invoke
17
16
  else
18
- exec_all(args)
17
+ GitBundle::Commands::Generic.new(@repositories, args).invoke
19
18
  end
20
-
21
- puts_error @errors.join('\n') unless @errors.empty?
22
- end
23
-
24
- def exec_all(*argv)
25
- exec_errors = []
26
- @repositories.each do |repo|
27
- puts_repo_heading(repo)
28
- puts repo.execute_git(argv.join(' '))
29
- exec_errors << repo.name unless $?.exitstatus == 0
30
- end
31
-
32
- @errors << "Command failed in #{exec_errors.join(', ')}." unless exec_errors.empty?
33
19
  end
34
20
 
35
21
  private
36
22
  def load_repositories
37
23
  @repositories = []
38
- begin
39
- lockfile_content = Bundler.read_file(Bundler.default_lockfile)
40
- all_specs = Bundler::LockfileParser.new(lockfile_content).specs
24
+ if Bundler.locked_gems
41
25
  Bundler.settings.local_overrides.each do |name, path|
42
- spec = all_specs.find { |s| s.name == name }
26
+ spec = Bundler.locked_gems.specs.find { |s| s.name == name }
43
27
  @repositories << GitBundle::Repository.new_dependant(spec.name, path, spec.source.branch, spec.source.revision) if spec
44
28
  end
45
-
46
- rescue Bundler::LockfileError
47
- @errors << "Error reading #{Bundler.default_lockfile}: \n\t#{error.message}."
48
29
  end
49
30
 
50
31
  @repositories << GitBundle::Repository.new_main(File.basename(Dir.getwd), Dir.getwd)
@@ -0,0 +1,23 @@
1
+ module GitBundle
2
+ module Commands
3
+ class Generic
4
+ include GitBundle::Console
5
+
6
+ def initialize(repositories, args)
7
+ @repositories = repositories
8
+ @args = args
9
+ end
10
+
11
+ def invoke
12
+ errors = []
13
+ @repositories.each do |repo|
14
+ puts_repo_heading(repo)
15
+ puts repo.execute_git(@args.join(' '))
16
+ errors << repo.name unless $?.exitstatus == 0
17
+ end
18
+
19
+ puts_error "Command failed in #{errors.join(', ')}." unless errors.empty?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,96 @@
1
+ module GitBundle
2
+ module Commands
3
+ class Push
4
+ include GitBundle::Console
5
+
6
+ def initialize(repositories, args)
7
+ @repositories = repositories
8
+ @args = args
9
+ end
10
+
11
+ def invoke
12
+ return false unless prompt_confirm
13
+
14
+ lockfile = Bundler.default_lockfile.basename.to_s
15
+ if gemfile_lock_stale?
16
+ puts "Local gems were updated. Building new #{lockfile} with bundle install."
17
+ unless build_gemfile_lock
18
+ puts_error 'Bundle install failed. Please run it manually before trying to push changes.'
19
+ return false
20
+ end
21
+ end
22
+
23
+ combined_messages = @repositories.map { |repo| repo.commit_messages_not_pushed }.uniq.join("\n\n")
24
+ @repositories.reject { |repo| repo.main || repo.commits_not_pushed.empty? }.each do |repo|
25
+ puts_repo_heading(repo)
26
+ unless repo.push(@args)
27
+ puts_error "Failed to push changes of #{repo.name}. Try pulling the latest changes or resolve conflicts first."
28
+ return false
29
+ end
30
+ end
31
+
32
+ puts_repo_heading(main_repository)
33
+ if main_repository.file_changed?(lockfile)
34
+ main_repository.add_file(lockfile)
35
+ main_repository.commit("Updated Gemfile.lock to include changes: #{combined_messages}", lockfile)
36
+ end
37
+
38
+ unless main_repository.push(@args)
39
+ puts_error "Failed to push changes of #{main_repository.name}. Try pulling the latest changes or resolve conflicts first."
40
+ end
41
+ end
42
+
43
+ private
44
+ def prompt_confirm
45
+ if main_repository.file_changed?('Gemfile')
46
+ puts_error 'Your Gemfile has uncommitted changes. Commit them first before pushing.'
47
+ return false
48
+ end
49
+
50
+ commits_to_push = false
51
+ @repositories.each do |repo|
52
+ commits = repo.commits_not_pushed
53
+ puts_repo_heading(repo)
54
+
55
+ if commits.empty?
56
+ puts 'No changes.'
57
+ else
58
+ commits_to_push = true
59
+ puts commits
60
+ end
61
+ end
62
+
63
+ if commits_to_push
64
+ puts_prompt('Are you sure you want to push these changes? (Y/N)')
65
+
66
+ elsif gemfile_lock_stale?
67
+ puts_prompt('Although you don\'t have any commits to push, your Gemfile.lock needs to be rebuilt, committed and pushed.')
68
+ puts_prompt('Do you want to continue? (Y/N)')
69
+
70
+ elsif main_repository.file_changed?('Gemfile.lock')
71
+ puts_prompt('Although you don\'t have any commits to push, your Gemfile.lock needs to be committed and pushed.')
72
+ puts_prompt('Do you want to continue? (Y/N)')
73
+ else
74
+ return false
75
+ end
76
+
77
+ STDIN.getch.upcase == 'Y'
78
+ end
79
+
80
+ def main_repository
81
+ @repositories.find { |repo| repo.main }
82
+ end
83
+
84
+ def gemfile_lock_stale?
85
+ @repositories.any? { |repo| repo.revision != repo.locked_revision }
86
+ end
87
+
88
+ def build_gemfile_lock
89
+ Dir.chdir(main_repository.path) do
90
+ puts `bundle install --quiet`
91
+ return $?.exitstatus == 0
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,13 +1,12 @@
1
1
  module GitBundle
2
2
  module Console
3
- COLORS = {std: 0,
4
- error: 31,
3
+ COLORS = {error: 31,
5
4
  attention: 32,
6
5
  prompt: 33,
7
- heading: 36}
6
+ heading: 34}
8
7
 
9
8
  def puts_repo_heading(repo)
10
- puts_heading "#{repo.name} (#{repo.branch})"
9
+ puts colorize("\n=== #{repo.name} (#{repo.branch})", COLORS[:heading], true)
11
10
  end
12
11
 
13
12
  def puts_heading(text)
@@ -27,8 +26,12 @@ module GitBundle
27
26
  end
28
27
 
29
28
  private
30
- def colorize(text, color_code)
31
- "\e[#{color_code}m#{text}\e[0m"
29
+ def colorize(text, color_code, bold = false)
30
+ if bold
31
+ "\e[1m\e[#{color_code}m#{text}\e[0m"
32
+ else
33
+ "\e[#{color_code}m#{text}\e[0m"
34
+ end
32
35
  end
33
36
  end
34
37
  end
@@ -51,15 +51,17 @@ module GitBundle
51
51
  end
52
52
 
53
53
  def file_changed?(filename)
54
- !execute_git("diff --name-only #{filename}").empty?
54
+ !execute_git("diff --name-only #{filename}").empty? && $?.exitstatus == 0
55
55
  end
56
56
 
57
57
  def add_file(filename)
58
58
  execute_git("add #{filename}")
59
+ $?.exitstatus == 0
59
60
  end
60
61
 
61
62
  def commit(message, *files)
62
63
  execute_git("commit -m '#{message}' #{files.join(' ')}")
64
+ $?.exitstatus == 0
63
65
  end
64
66
 
65
67
  def execute_git(command)
@@ -1,3 +1,3 @@
1
1
  module GitBundle
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-bundle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pierre Pretorius
@@ -36,14 +36,16 @@ files:
36
36
  - ".gitignore"
37
37
  - ".travis.yml"
38
38
  - Gemfile
39
+ - Gemfile.lock
39
40
  - LICENSE.txt
40
41
  - README.md
41
42
  - bin/gitb
42
43
  - git-bundle.gemspec
43
44
  - lib/git_bundle.rb
44
45
  - lib/git_bundle/cli.rb
46
+ - lib/git_bundle/commands/generic.rb
47
+ - lib/git_bundle/commands/push.rb
45
48
  - lib/git_bundle/console.rb
46
- - lib/git_bundle/push.rb
47
49
  - lib/git_bundle/repository.rb
48
50
  - lib/git_bundle/version.rb
49
51
  homepage: https://github.com/EPI-USE-Labs/git-bundle
@@ -1,80 +0,0 @@
1
- module GitBundle
2
- class Push
3
- include GitBundle::Console
4
-
5
- def initialize(repositories, args)
6
- @repositories = repositories
7
- @args = args
8
- end
9
-
10
- def prompt_confirm
11
- commits_to_push = false
12
-
13
- @repositories.each do |repo|
14
- commits = repo.commits_not_pushed
15
- puts_repo_heading(repo)
16
-
17
- if commits.empty?
18
- puts 'No changes.'
19
- else
20
- commits_to_push = true
21
- puts commits
22
- end
23
- end
24
-
25
- if commits_to_push
26
- puts_prompt("\nAre you sure you want to push these changes? (Y/N)")
27
- STDIN.getch.upcase == 'Y'
28
-
29
- elsif main_repository.file_changed?('Gemfile.lock')
30
- puts_prompt("\nAlthough you don't have any commits to push, your Gemfile.lock needs to be rebuilt, committed and pushed.")
31
- puts_prompt('Do you want to continue? (Y/N)')
32
- STDIN.getch.upcase == 'Y'
33
- end
34
- end
35
-
36
- def invoke
37
- @repositories.each do |repo|
38
- if repo.locked_branch != repo.branch
39
- puts_error "\nThe git revisions of #{repo.name} does not match. Are you running the correct branch?"
40
- puts_error "You are running #{repo.name} branch: #{repo.branch}"
41
- puts_error "Gemfile.lock references: #{repo.locked_branch}"
42
- return
43
- end
44
- end
45
-
46
- message = @repositories.map { |repo| repo.commit_messages_not_pushed }.uniq.join("\n\n")
47
- @repositories.reject { |repo| repo.main || repo.commits_not_pushed.empty? }.each do |repo|
48
- puts_repo_heading(repo)
49
- unless repo.push(@args)
50
- puts_error "Failed to push changes of #{repo.name}. Try pulling the latest changes or resolve conflicts first."
51
- return
52
- end
53
- end
54
-
55
- puts_repo_heading(main_repository)
56
- repo_changes = @repositories.any? { |repo| repo.revision == repo.locked_revision }
57
-
58
- build_gemfile_lock if repo_changes
59
- if main_repository.file_changed?('Gemfile.lock')
60
- main_repository.add_file('Gemfile.lock')
61
- main_repository.commit("Updated Gemfile.lock to include changes: #{commit_message}", 'Gemfile.lock')
62
- end
63
-
64
- main_repository.push(@args)
65
- end
66
-
67
- private
68
- def main_repository
69
- @repositories.find { |repo| repo.main }
70
- end
71
-
72
- def build_gemfile_lock
73
- puts 'Local gems were updated. Building new Gemfile.lock with bundle install.'
74
- Dir.chdir(main_repository.path) do
75
- puts `bundle install --quiet`
76
- $?.exitstatus == 0
77
- end
78
- end
79
- end
80
- end