git-smart 0.1.4 → 0.1.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/README.md +6 -12
- data/Rakefile +26 -0
- data/VERSION +1 -1
- data/bin/git-smart-merge +7 -0
- data/bin/git-smart-pull +7 -0
- data/git-smart.gemspec +4 -4
- data/lib/commands/smart-pull.rb +7 -1
- data/lib/git-smart/git_repo.rb +4 -4
- data/spec/smart-pull_spec.rb +2 -0
- metadata +8 -6
- data/bin/git-smart +0 -68
data/README.md
CHANGED
@@ -11,24 +11,18 @@ Adds some additional git commands to add some smarts to your workflow. These com
|
|
11
11
|
|
12
12
|
# Installing
|
13
13
|
|
14
|
-
|
14
|
+
All you need to do is grab the gem:
|
15
15
|
|
16
16
|
gem install git-smart
|
17
17
|
|
18
|
-
|
18
|
+
That'll put an executable file for each command as a gem executable. They can be removed by uninstalling the gem.
|
19
19
|
|
20
|
-
|
20
|
+
You almost certainly want to run this as well, to allow git commands to be output with colour:
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
git-smart install smart-pull
|
25
|
-
|
26
|
-
OR
|
27
|
-
|
28
|
-
git-smart install --all
|
29
|
-
|
30
|
-
That'll put an executable file for each command in your ~/bin directory if that exists and is on the path, /usr/local/bin otherwise.
|
22
|
+
git config --global color.ui always
|
31
23
|
|
24
|
+
Git normally only colours output when being run from the terminal, not from within scripts like these. This sorts that right out.
|
25
|
+
|
32
26
|
# Using
|
33
27
|
|
34
28
|
Git allows custom commands with a simple convention - `git xyz` tries to find an executable `git-xyz` on the path. So, to run the commands, simply type
|
data/Rakefile
CHANGED
@@ -51,3 +51,29 @@ task :rocco do
|
|
51
51
|
end
|
52
52
|
|
53
53
|
task :release => :rocco
|
54
|
+
|
55
|
+
desc "Generate a binary for each of our commands"
|
56
|
+
task :generate_binaries do
|
57
|
+
base_dir = File.dirname(__FILE__)
|
58
|
+
require "#{base_dir}/lib/git-smart"
|
59
|
+
|
60
|
+
require 'fileutils'
|
61
|
+
FileUtils.mkdir_p "#{base_dir}/bin"
|
62
|
+
GitSmart.commands.keys.each { |cmd|
|
63
|
+
filename = "#{base_dir}/bin/git-#{cmd}"
|
64
|
+
File.open(filename, 'w') { |out|
|
65
|
+
out.puts %Q{#!/usr/bin/env ruby
|
66
|
+
|
67
|
+
$:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
68
|
+
|
69
|
+
require 'git-smart'
|
70
|
+
|
71
|
+
GitSmart.run('#{cmd}', ARGV)
|
72
|
+
}
|
73
|
+
}
|
74
|
+
`chmod a+x #{filename}`
|
75
|
+
puts "Wrote #{filename}"
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
task :gemspec => :generate_binaries
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/bin/git-smart-merge
ADDED
data/bin/git-smart-pull
ADDED
data/git-smart.gemspec
CHANGED
@@ -5,15 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{git-smart}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Glen Maddern"]
|
12
12
|
s.date = %q{2011-01-05}
|
13
|
-
s.default_executable = %q{git-smart}
|
14
13
|
s.description = %q{Installs some additional 'smart' git commands, like `git smart-pull`.}
|
15
14
|
s.email = %q{glenmaddern@gmail.com}
|
16
|
-
s.executables = ["git-smart"]
|
15
|
+
s.executables = ["git-smart-pull", "git-smart-merge"]
|
17
16
|
s.extra_rdoc_files = [
|
18
17
|
"LICENSE.txt",
|
19
18
|
"README.md"
|
@@ -25,7 +24,8 @@ Gem::Specification.new do |s|
|
|
25
24
|
"README.md",
|
26
25
|
"Rakefile",
|
27
26
|
"VERSION",
|
28
|
-
"bin/git-smart",
|
27
|
+
"bin/git-smart-merge",
|
28
|
+
"bin/git-smart-pull",
|
29
29
|
"docs/images/git-smart.png",
|
30
30
|
"docs/smart-merge.html",
|
31
31
|
"docs/smart-pull.html",
|
data/lib/commands/smart-pull.rb
CHANGED
@@ -48,6 +48,12 @@ GitSmart.register 'smart-pull' do |repo, args|
|
|
48
48
|
#uses internally.
|
49
49
|
merge_base = repo.merge_base(head, remote)
|
50
50
|
|
51
|
+
#Report how many commits are new locally, since that's useful information.
|
52
|
+
new_commits_locally = repo.rev_list(merge_base, head)
|
53
|
+
if !new_commits_locally.empty?
|
54
|
+
note "You have #{new_commits_locally.length} new commit#{'s' if new_commits_locally.length != 1} on '#{branch}'."
|
55
|
+
end
|
56
|
+
|
51
57
|
#By comparing the merge_base to both HEAD and the remote, we can
|
52
58
|
#determine whether both or only one have moved on.
|
53
59
|
#If the remote hasn't changed, we're already up to date, so there's nothing
|
@@ -58,7 +64,7 @@ GitSmart.register 'smart-pull' do |repo, args|
|
|
58
64
|
else
|
59
65
|
#If the remote _has_ moved on, we actually have some work to do:
|
60
66
|
#
|
61
|
-
#First, report how many commits are new on remote. Because that's useful information.
|
67
|
+
#First, report how many commits are new on remote. Because that's useful information, too.
|
62
68
|
new_commits_on_remote = repo.rev_list(merge_base, remote)
|
63
69
|
is_are, s_or_not = (new_commits_on_remote.length == 1) ? ['is', ''] : ['are', 's']
|
64
70
|
note "There #{is_are} #{new_commits_on_remote.length} new commit#{s_or_not} on '#{upstream_branch}'."
|
data/lib/git-smart/git_repo.rb
CHANGED
@@ -60,10 +60,10 @@ class GitRepo
|
|
60
60
|
map_values { |lines| lines.map(&:last) }.
|
61
61
|
map_keys { |status|
|
62
62
|
case status
|
63
|
-
when /^M/; :modified
|
64
|
-
when /^A/; :added
|
65
|
-
when
|
66
|
-
when /^UU/; :conflicted
|
63
|
+
when /^[^ ]*M/; :modified
|
64
|
+
when /^[^ ]*A/; :added
|
65
|
+
when /^[^ ]*\?\?/; :untracked
|
66
|
+
when /^[^ ]*UU/; :conflicted
|
67
67
|
else raise GitSmart::UnexpectedOutput.new("Expected the output of git status to only have lines starting with A,M, or ??. Got: \n#{raw_status}")
|
68
68
|
end
|
69
69
|
}
|
data/spec/smart-pull_spec.rb
CHANGED
@@ -45,6 +45,7 @@ describe 'smart-pull' do
|
|
45
45
|
out = run_command(local_dir, 'smart-pull')
|
46
46
|
out.should report("Executing: git fetch origin")
|
47
47
|
out.should report("Remote branch 'origin/master' has not moved on.")
|
48
|
+
out.should report("You have 1 new commit on 'master'.")
|
48
49
|
out.should report("Already up-to-date")
|
49
50
|
end
|
50
51
|
end
|
@@ -121,6 +122,7 @@ describe 'smart-pull' do
|
|
121
122
|
out.should report("Executing: git fetch origin")
|
122
123
|
out.should report(/master +-> +origin\/master/)
|
123
124
|
out.should report("There is 1 new commit on 'origin/master'.")
|
125
|
+
out.should report("You have 1 new commit on 'master'.")
|
124
126
|
out.should report("Both local and remote branches have moved on. Branch 'master' needs to be rebased onto 'origin/master'")
|
125
127
|
out.should report("Executing: git rebase -p origin/master")
|
126
128
|
out.should report("Successfully rebased and updated refs/heads/master.")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-smart
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 5
|
10
|
+
version: 0.1.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Glen Maddern
|
@@ -16,7 +16,7 @@ bindir: bin
|
|
16
16
|
cert_chain: []
|
17
17
|
|
18
18
|
date: 2011-01-05 00:00:00 +11:00
|
19
|
-
default_executable:
|
19
|
+
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|
@@ -111,7 +111,8 @@ dependencies:
|
|
111
111
|
description: Installs some additional 'smart' git commands, like `git smart-pull`.
|
112
112
|
email: glenmaddern@gmail.com
|
113
113
|
executables:
|
114
|
-
- git-smart
|
114
|
+
- git-smart-pull
|
115
|
+
- git-smart-merge
|
115
116
|
extensions: []
|
116
117
|
|
117
118
|
extra_rdoc_files:
|
@@ -124,7 +125,8 @@ files:
|
|
124
125
|
- README.md
|
125
126
|
- Rakefile
|
126
127
|
- VERSION
|
127
|
-
- bin/git-smart
|
128
|
+
- bin/git-smart-merge
|
129
|
+
- bin/git-smart-pull
|
128
130
|
- docs/images/git-smart.png
|
129
131
|
- docs/smart-merge.html
|
130
132
|
- docs/smart-pull.html
|
data/bin/git-smart
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
class GitSmartBinary
|
4
|
-
USAGE = %Q{Usage:
|
5
|
-
git-smart list List all the git commands that can be installed
|
6
|
-
git-smart install --all Install all git commands
|
7
|
-
git-smart install command [command] Install these git commands
|
8
|
-
}
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
# If this was called through a symlink, follow it and include the lib/git-smart.rb file
|
12
|
-
require File.expand_path(
|
13
|
-
File.join(
|
14
|
-
File.dirname(File.expand_path(
|
15
|
-
File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
|
16
|
-
)),
|
17
|
-
'../lib/git-smart'
|
18
|
-
)
|
19
|
-
)
|
20
|
-
end
|
21
|
-
|
22
|
-
def list
|
23
|
-
puts "These commands available to install:"
|
24
|
-
puts GitSmart.commands.keys.map { |c| " git-smart install " + c }.join("\n")
|
25
|
-
puts "\nOr install everything with: git-smart install --all"
|
26
|
-
end
|
27
|
-
|
28
|
-
def install(args)
|
29
|
-
cmds = if args.include? '--all'
|
30
|
-
GitSmart.commands.keys
|
31
|
-
else
|
32
|
-
args
|
33
|
-
end
|
34
|
-
install_dir = get_install_dir
|
35
|
-
puts "Installing #{cmds.join(', ')} to #{install_dir}:"
|
36
|
-
cmds.each { |cmd|
|
37
|
-
filename = "#{install_dir}/git-#{cmd}"
|
38
|
-
File.open(filename, 'w') { |out|
|
39
|
-
out.puts %Q{#!/usr/bin/env ruby
|
40
|
-
|
41
|
-
require 'rubygems'
|
42
|
-
require 'git-smart'
|
43
|
-
|
44
|
-
GitSmart.run('#{cmd}', ARGV)
|
45
|
-
}
|
46
|
-
}
|
47
|
-
`chmod a+x #{filename}`
|
48
|
-
puts "Wrote #{filename}"
|
49
|
-
}
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def get_install_dir
|
55
|
-
home_bin = File.expand_path('~/bin')
|
56
|
-
if File.exists?(home_bin) && ENV['PATH'].split(':').include?(home_bin)
|
57
|
-
home_bin
|
58
|
-
else
|
59
|
-
'/usr/local/bin'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
case ARGV.shift
|
65
|
-
when 'list'; GitSmartBinary.new.list
|
66
|
-
when 'install'; GitSmartBinary.new.install(ARGV)
|
67
|
-
else puts GitSmartBinary::USAGE
|
68
|
-
end
|