git-up-decklin 0.5.1.1 → 0.5.5.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.
Files changed (5) hide show
  1. data/README.md +15 -6
  2. data/bin/git-up +1 -0
  3. data/lib/git-up.rb +100 -54
  4. data/lib/git-up/version.rb +1 -1
  5. metadata +24 -9
data/README.md CHANGED
@@ -15,16 +15,25 @@ although
15
15
  configuration
16
16
  -------------
17
17
 
18
- `git-up` can check your app for any new bundled gems and suggest a `bundle install` if necessary.
19
-
20
- It slows the process down slightly, and is therefore enabled by setting `git-up.bundler.check` to `true` in your git config, either globally or per-project. To set it globally, run this command anywhere:
18
+ `git-up` has a few configuration options, which use git's configuration system. Each can be set either globally or per-project. To set an option globally, append the `--global` flag to `git config`, which you can run anywhere:
21
19
 
22
20
  git config --global git-up.bundler.check true
23
21
 
24
- To set it within a project, run this command inside that project's directory:
22
+ To set it within a project, run the command inside that project's directory and omit the `--global` flag:
25
23
 
24
+ cd myproject
26
25
  git config git-up.bundler.check true
27
26
 
28
- Replace 'true' with 'false' to disable checking.
27
+ ### `git-up.bundler.check [true|false]`
28
+
29
+ If set to `true`, `git-up` will check your app for any new bundled gems and suggest a `bundle install` if necessary.
30
+
31
+ It slows the process down slightly, and therefore defaults to `false`.
32
+
33
+ ### `git-up.bundler.autoinstall [true|false]`
34
+
35
+ If you're even lazier, you can tell `git-up` to run `bundle install` for you if it finds missing gems. Make sure `git-up.bundler.check` is also set to `true` or it won't do anything.
36
+
37
+ ### `git-up.fetch.prune [true|false]`
29
38
 
30
- If you're even lazier, you can tell `git-up` to run `bundle install` for you if it finds missing gems. Simply set `git-up.bundler.autoinstall` to `true`, in the same manner. As above, it works globally or per-project, but make sure `git-up.bundler.check` is also set to `true` or it won't do anything.
39
+ By default, `git-up` will append the `--prune` flag to the `git fetch` command if your git version supports it (1.6.6 or greater), telling it to [delete any branches which no longer exist on the remote](http://linux.die.net/man/1/git-fetch). Set this option to `false` to disable it.
data/bin/git-up CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ $: << "#{File.dirname(File.realdirpath(__FILE__))}/../lib"
3
4
  require 'git-up'
4
5
 
5
6
  GitUp.new.run
data/lib/git-up.rb CHANGED
@@ -3,48 +3,20 @@ require 'grit'
3
3
 
4
4
  class GitUp
5
5
  def run
6
- fetch_remotes
7
- with_stash do
8
- returning_to_current_branch do
9
- col_width = branches.map { |b| b.name.length }.max + 1
10
-
11
- branches.sort_by! do |b|
12
- case b.name.downcase
13
- when 'master', 'oldest'; "__#{b.name.downcase}"
14
- when /\//; "_#{b.name.downcase}"
15
- else; b.name.downcase
16
- end
17
- end
18
-
19
- branches.each do |branch|
20
- remote = remote_map[branch.name]
21
-
22
- print branch.name.ljust(col_width)
23
-
24
- if remote.commit.sha == branch.commit.sha
25
- puts "up to date".green
26
- next
27
- end
28
-
29
- base = merge_base(branch.name, remote.name)
30
-
31
- if base == remote.commit.sha
32
- puts "ahead of upstream".blue
33
- next
34
- end
6
+ command = ['git', 'fetch', '--multiple']
7
+ command << '--prune' if prune?
8
+ command << '--all' if config("fetch.all")
9
+ command += remotes
35
10
 
36
- if base == branch.commit.sha
37
- puts "fast-forwarding...".yellow
38
- elsif config("auto-rebase")
39
- puts "rebasing...".yellow
40
- else
41
- puts "diverged".red
42
- next
43
- end
11
+ # puts command.join(" ") # TODO: implement a 'debug' config option
12
+ system(*command)
13
+ raise GitError, "`git fetch` failed" unless $? == 0
14
+ @remote_map = nil # flush cache after fetch
44
15
 
45
- log(branch, remote)
46
- checkout(branch.name)
47
- rebase(remote)
16
+ Grit::Git.with_timeout(0) do
17
+ with_stash do
18
+ returning_to_current_branch do
19
+ rebase_all_branches
48
20
  end
49
21
  end
50
22
  end
@@ -55,15 +27,61 @@ class GitUp
55
27
  exit 1
56
28
  end
57
29
 
30
+ def rebase_all_branches
31
+ col_width = branches.map { |b| b.name.length }.max + 1
32
+
33
+ if config("case-insensitive")
34
+ branches.sort_by! do |b|
35
+ case b.name.downcase
36
+ when 'master', 'oldest'; "__#{b.name.downcase}"
37
+ when /\//; "_#{b.name.downcase}"
38
+ else; b.name.downcase
39
+ end
40
+ end
41
+ end
42
+
43
+ branches.each do |branch|
44
+ remote = remote_map[branch.name]
45
+
46
+ print branch.name.ljust(col_width)
47
+
48
+ if remote.commit.sha == branch.commit.sha
49
+ puts "up to date".green
50
+ next
51
+ end
52
+
53
+ base = merge_base(branch.name, remote.name)
54
+
55
+ if base == remote.commit.sha
56
+ puts "ahead of upstream".blue
57
+ next
58
+ end
59
+
60
+ if base == branch.commit.sha
61
+ puts "fast-forwarding...".yellow
62
+ elsif config("auto-rebase")
63
+ puts "rebasing...".yellow
64
+ else
65
+ puts "diverged".red
66
+ next
67
+ end
68
+
69
+ log(branch, remote)
70
+ checkout(branch.name)
71
+ rebase(remote)
72
+ end
73
+ end
74
+
58
75
  def repo
59
76
  @repo ||= get_repo
60
77
  end
61
78
 
62
79
  def get_repo
63
- git_dir = `git rev-parse --git-dir`
80
+ repo_dir = `git rev-parse --show-toplevel`.chomp
64
81
 
65
82
  if $? == 0
66
- @repo = Grit::Repo.new(File.dirname(git_dir))
83
+ Dir.chdir repo_dir
84
+ @repo = Grit::Repo.new(repo_dir)
67
85
  else
68
86
  raise GitError, "We don't seem to be in a git repository."
69
87
  end
@@ -94,21 +112,9 @@ class GitUp
94
112
  repo.remotes.find { |r| r.name == "#{remote_name}/#{remote_branch}" }
95
113
  end
96
114
 
97
- def fetch_remotes
98
- args =
99
- (config("prune") ? ['--prune'] : []) +
100
- (config("fetch-all") ? ['--all'] : ['--multiple', *remotes])
101
- system('git', 'fetch', *args)
102
- raise GitError, "`git fetch` failed" unless $? == 0
103
- @remote_map = nil # flush cache after fetch
104
- end
105
-
106
115
  def with_stash
107
116
  stashed = false
108
117
 
109
- status = repo.status
110
- change_count = status.added.length + status.changed.length + status.deleted.length
111
-
112
118
  if change_count > 0
113
119
  puts "stashing #{change_count} changes".magenta
114
120
  repo.git.stash
@@ -241,8 +247,48 @@ EOS
241
247
  config("bundler.check") == 'true' || ENV['GIT_UP_BUNDLER_CHECK'] == 'true'
242
248
  end
243
249
 
250
+ def prune?
251
+ required_version = "1.6.6"
252
+ config_value = config("fetch.prune")
253
+
254
+ if git_version_at_least?(required_version)
255
+ config_value != 'false'
256
+ else
257
+ if config_value == 'true'
258
+ puts "Warning: fetch.prune is set to 'true' but your git version doesn't seem to support it (#{git_version} < #{required_version}). Defaulting to 'false'.".yellow
259
+ end
260
+
261
+ false
262
+ end
263
+ end
264
+
265
+ def change_count
266
+ @change_count ||= begin
267
+ diff_status = repo.status
268
+ actual_status = repo.git.status(:porcelain => true).split("\n").map {|l| l[3..-1]}
269
+
270
+ added = diff_status.added.select { |(x,y)| actual_status.include? x }
271
+ changed = diff_status.changed.select { |(x,y)| actual_status.include? x }
272
+ deleted = diff_status.deleted.select { |(x,y)| actual_status.include? x }
273
+
274
+ added.length + changed.length + deleted.length
275
+ end
276
+ end
277
+
244
278
  def config(key)
245
279
  repo.config["git-up.#{key}"]
246
280
  end
281
+
282
+ def git_version_at_least?(required_version)
283
+ (version_array(git_version) <=> version_array(required_version)) >= 0
284
+ end
285
+
286
+ def version_array(version_string)
287
+ version_string.split('.').map { |s| s.to_i }
288
+ end
289
+
290
+ def git_version
291
+ `git --version`[/\d+(\.\d+)+/]
292
+ end
247
293
  end
248
294
 
@@ -1,3 +1,3 @@
1
1
  class GitUp
2
- VERSION = "0.5.1.1"
2
+ VERSION = "0.5.5.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-up-decklin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1.1
4
+ version: 0.5.5.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,11 +13,11 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2011-12-15 00:00:00.000000000 Z
16
+ date: 2012-09-10 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: thoughtbot-shoulda
20
- requirement: &70125576062640 !ruby/object:Gem::Requirement
20
+ requirement: !ruby/object:Gem::Requirement
21
21
  none: false
22
22
  requirements:
23
23
  - - ! '>='
@@ -25,10 +25,15 @@ dependencies:
25
25
  version: '0'
26
26
  type: :development
27
27
  prerelease: false
28
- version_requirements: *70125576062640
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
29
34
  - !ruby/object:Gem::Dependency
30
35
  name: colored
31
- requirement: &70125576062140 !ruby/object:Gem::Requirement
36
+ requirement: !ruby/object:Gem::Requirement
32
37
  none: false
33
38
  requirements:
34
39
  - - ! '>='
@@ -36,10 +41,15 @@ dependencies:
36
41
  version: '1.2'
37
42
  type: :runtime
38
43
  prerelease: false
39
- version_requirements: *70125576062140
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '1.2'
40
50
  - !ruby/object:Gem::Dependency
41
51
  name: grit
42
- requirement: &70125576061720 !ruby/object:Gem::Requirement
52
+ requirement: !ruby/object:Gem::Requirement
43
53
  none: false
44
54
  requirements:
45
55
  - - ! '>='
@@ -47,7 +57,12 @@ dependencies:
47
57
  version: '0'
48
58
  type: :runtime
49
59
  prerelease: false
50
- version_requirements: *70125576061720
60
+ version_requirements: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
51
66
  description:
52
67
  email:
53
68
  - aanand.prasad@gmail.com
@@ -83,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
98
  version: '0'
84
99
  requirements: []
85
100
  rubyforge_project:
86
- rubygems_version: 1.8.11
101
+ rubygems_version: 1.8.23
87
102
  signing_key:
88
103
  specification_version: 3
89
104
  summary: git command to fetch and rebase all branches