git_snip 0.0.2 → 0.0.3

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: 7bb29f4ae9f8cbad6ba7e9b712f462a1ff4868f6
4
- data.tar.gz: 2fd15eef40fac8e8d4ca021f72b5ab13ac49b72b
3
+ metadata.gz: 971bfdab966edf6e8d0f147bd19f85eb0f72c8ac
4
+ data.tar.gz: c8c3db3af432f657a11ff0e4bde9d292b26a10b3
5
5
  SHA512:
6
- metadata.gz: bbfd6dfce8772031e32020ec52c16462360a1e4173c9d339e9f07e9142907fec8f0dfd6be210d2dc80efed8a6268986b51633ce59b492184a67ff37858281166
7
- data.tar.gz: e8273c8d9267ed225c84ba0c503fed2aca6275703746fe96a43a7d27ce701a889b5a6b78ee1ea076be4007b7a6aa67b3e1cb9c4017a9caea6438532395f0b898
6
+ metadata.gz: b5d5cff6b4b5e2ba9b495925283b30d16e042a8c7b81e94ccc0f81b96acb71035fdf030927871593d69744ca2f2719c5edc08c569e0f454d72bdd57e0da511a0
7
+ data.tar.gz: c55e1e8fbe97572c4b8b858c65f4509170d87ac4d5f6e59c6c8899756cbca9650d05fc1679d900e5a9c9d349359c8ed152e99ea1e515398ee52c90dae6a3dfff
data/.travis.yml CHANGED
@@ -2,7 +2,7 @@ before_script:
2
2
  - git config --global user.email "you@example.com"
3
3
  - git config --global user.name "Your Name"
4
4
 
5
- script: bundle exec rspec
5
+ script: CODECLIMATE_REPO_TOKEN=ea0ada8842b47f59715526e88df53a81afff061152ce67bb73a8baa75443ea43 bundle exec rspec
6
6
 
7
7
  rvm:
8
8
  - 2.0.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## master (unreleased)
2
2
 
3
+ ## 0.0.3
4
+
5
+ * Fix missing new line after each branch line.
6
+ * Fix bad formatting of multiline commit message.
7
+
3
8
  ## 0.0.2
4
9
 
5
10
  * Fix: dry-run doesn't take ignore argument.
data/Gemfile CHANGED
@@ -8,3 +8,7 @@ group :dev do
8
8
  gem 'guard', '~> 2.11.1'
9
9
  gem 'guard-rspec', '~> 4.5.0'
10
10
  end
11
+
12
+ group :test do
13
+ gem 'codeclimate-test-reporter', require: nil
14
+ end
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # git-snip
2
2
 
3
3
  [![Build Status](https://travis-ci.org/htanata/git_snip.svg?branch=master)](https://travis-ci.org/htanata/git_snip)
4
+ [![Code Climate](https://codeclimate.com/github/htanata/git_snip/badges/gpa.svg)](https://codeclimate.com/github/htanata/git_snip)
5
+ [![Test Coverage](https://codeclimate.com/github/htanata/git_snip/badges/coverage.svg)](https://codeclimate.com/github/htanata/git_snip)
4
6
 
5
7
  Clean obsolete branches on your git repository safely.
6
8
 
@@ -28,7 +30,7 @@ And then execute:
28
30
 
29
31
  ## Usage
30
32
 
31
- Show branches which would be deleted:
33
+ Show branches which would be deleted (accepts the same arguments as `-f`):
32
34
 
33
35
  $ git snip -n
34
36
 
data/git_snip.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ["Hendy Tanata"]
10
10
  spec.email = ["htanata@gmail.com"]
11
11
  spec.summary = %q{Clean obsolete branches on your local git repository safely}
12
- spec.homepage = ""
12
+ spec.homepage = "https://github.com/htanata/git_snip"
13
13
  spec.license = "MIT"
14
14
 
15
15
  spec.files = `git ls-files -z`.split("\x0") - %w(Guardfile)
@@ -17,6 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.required_ruby_version = '>= 2.0'
21
+
20
22
  spec.add_runtime_dependency "git"
21
23
  spec.add_runtime_dependency "thor"
22
24
 
@@ -0,0 +1,26 @@
1
+ module GitSnip
2
+ module Branch
3
+ class Column < Struct.new(:sha, :name, :date, :author, :message)
4
+ end
5
+
6
+ def self.columnize(branch)
7
+ Column.new.tap do |column|
8
+ column.sha = column(branch.gcommit.sha, 7)
9
+ column.name = column(branch.name, 12)
10
+ column.date = column(branch.gcommit.date.strftime('%F'), 10)
11
+ column.author = column(branch.gcommit.author.email.sub(/@.*/, ''), 8)
12
+ column.message = column(first_line(branch.gcommit.message), 39)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def self.column(string, width)
19
+ string[0, width].ljust(width)
20
+ end
21
+
22
+ def self.first_line(string)
23
+ string.gsub(/[\r\n].*/, '')
24
+ end
25
+ end
26
+ end
data/lib/git_snip/cli.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'thor'
2
2
  require 'git_snip/cleaner'
3
+ require 'git_snip/branch'
3
4
 
4
5
  module GitSnip
5
6
  class CLI < Thor
@@ -33,8 +34,7 @@ module GitSnip
33
34
 
34
35
  cleaner = GitSnip::Cleaner.new(*cleaner_args)
35
36
 
36
- say 'Deleting the following branches...', :green
37
- say
37
+ say "Deleting the following branches...\n\n", :green
38
38
 
39
39
  deleted_branches = cleaner.delete_merged_branches do |branch|
40
40
  say_branch_info(branch)
@@ -44,7 +44,7 @@ module GitSnip
44
44
  if deleted_branches.empty?
45
45
  say 'No branches were deleted.', :green
46
46
  else
47
- say "\n\nDone.", :green
47
+ say "\nDone.", :green
48
48
  end
49
49
  end
50
50
  default_task :snip
@@ -54,8 +54,7 @@ module GitSnip
54
54
  def dry_run
55
55
  cleaner = GitSnip::Cleaner.new(*cleaner_args)
56
56
 
57
- say 'Would delete the following branches...', :green
58
- say
57
+ say "Would delete the following branches...\n\n", :green
59
58
 
60
59
  merged_branches = cleaner.merged_branches
61
60
 
@@ -64,22 +63,20 @@ module GitSnip
64
63
  end
65
64
 
66
65
  if merged_branches.any?
67
- say "\n\nDone.", :green
66
+ say "\nDone.", :green
68
67
  else
69
68
  say 'No branches would be deleted.', :green
70
69
  end
71
70
  end
72
71
 
73
72
  def say_branch_info(branch)
74
- say column(branch.gcommit.sha, 7), :yellow
75
- say column(branch.name, 12), :magenta
76
- say column(branch.gcommit.date.strftime('%F'), 10), :green
77
- say column(branch.gcommit.author.email.sub(/@.*/, ''), 8), [:blue, :bold]
78
- say column(branch.gcommit.message, 39, last: true)
79
- end
80
-
81
- def column(string, width, last: false)
82
- string[0, width].ljust(last ? width : width + 1)
73
+ Branch.columnize(branch).tap do |column|
74
+ say column.sha + ' ', :yellow
75
+ say column.name + ' ', :magenta
76
+ say column.date + ' ', :green
77
+ say column.author + ' ', [:blue, :bold]
78
+ say column.message.strip + "\n"
79
+ end
83
80
  end
84
81
 
85
82
  def cleaner_args
@@ -1,3 +1,3 @@
1
1
  module GitSnip
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,43 @@
1
+ require 'git_snip/branch'
2
+
3
+ RSpec.describe GitSnip::Branch do
4
+ it 'should return values with number of characters within 80' do
5
+ result = described_class.columnize(build_branch(build_column))
6
+
7
+ expect([
8
+ result.sha, result.name, result.author, result.date, result.message
9
+ ].join(' ').size).to eq(80)
10
+ end
11
+
12
+ it 'should remove message starting from the first new line' do
13
+ column = build_column(message: "First line\n\nThird line")
14
+ result = described_class.columnize(build_branch(column))
15
+
16
+ expect(result.message).to eq('First line' + (' ' * 29))
17
+ end
18
+
19
+ def build_branch(column)
20
+ author = instance_double('Git::Author', email: column.author)
21
+
22
+ gcommit = instance_double(
23
+ 'Git::Gcommit',
24
+ sha: column.sha,
25
+ date: column.date,
26
+ message: column.message,
27
+ author: author
28
+ )
29
+
30
+ instance_double('Git::Branch', name: column.name, gcommit: gcommit)
31
+ end
32
+
33
+ def build_column(attrs = {})
34
+ described_class::Column.new.tap do |column|
35
+ column.sha = attrs[:sha] || '28720606978a7257f735ce67df50bc55ccf1c138'
36
+ column.name = attrs[:name] || 'a_pretty_long_branch_name'
37
+ column.author = attrs[:author] || 'inigo_montoya@example.com'
38
+ column.date = attrs[:date] || Time.now
39
+ column.message = attrs[:message] || 'Hello, my name is Inigo Montoya.'
40
+ end
41
+ end
42
+
43
+ end
@@ -129,4 +129,14 @@ RSpec.describe GitSnip::CLI do
129
129
  expect(exitstatus).to eq(0)
130
130
  end
131
131
  end
132
+
133
+ describe 'branch formatting' do
134
+ it 'should add new line after each branch line' do
135
+ setup_basic_repo
136
+
137
+ stdout, _, _ = git_snip('--dry-run')
138
+
139
+ expect(stdout).to match(/merged.+Version 2\n/)
140
+ end
141
+ end
132
142
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'codeclimate-test-reporter'
2
+ CodeClimate::TestReporter.start
3
+
1
4
  Dir['spec/support/**/*.rb'].each { |f| require f.sub(/\Aspec\//, '') }
2
5
 
3
6
  # This file was generated by the `rspec --init` command. Conventionally, all
@@ -1,12 +1,31 @@
1
- require 'open3'
1
+ require 'git_snip/cli'
2
+ require_relative 'cli_runner'
2
3
 
3
4
  module CliHelper
5
+ class FakeKernel
6
+ attr_reader :exitstatus
7
+
8
+ def initialize
9
+ @exitstatus = 0
10
+ end
11
+
12
+ def exit(exitstatus)
13
+ @exitstatus = exitstatus
14
+ end
15
+ end
16
+
4
17
  def git_snip(args = '')
5
- cmd = "#{Gem.ruby} -I#{lib} #{bin} #{cmd} #{args} --repo=#{repo.path}"
18
+ stdin, stdout, stderr = Array.new(3) { StringIO.new }
19
+
20
+ runner =
21
+ GitSnip::CLIRunner.new("#{args} --repo=#{repo.path}".split(' '),
22
+ stdin, stdout, stderr, FakeKernel.new)
23
+
24
+ exitstatus = runner.execute!
6
25
 
7
- stdout, stderr, status = Open3.capture3(cmd)
26
+ [stdin, stdout, stderr].each(&:rewind)
8
27
 
9
- [stdout, stderr, status.exitstatus]
28
+ [stdout.read, stderr.read, exitstatus]
10
29
  end
11
30
 
12
31
  def setup_basic_repo
@@ -0,0 +1,54 @@
1
+ require 'git_snip/cli'
2
+
3
+ # https://github.com/erikhuda/thor/wiki/Integrating-with-Aruba-In-Process-Runs
4
+ module GitSnip
5
+ class CLIRunner
6
+ # Allow everything fun to be injected from the outside while defaulting to
7
+ # normal implementations.
8
+ def initialize(argv, stdin = STDIN, stdout = STDOUT, stderr = STDERR, kernel = Kernel)
9
+ @argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
10
+ end
11
+
12
+ def execute!
13
+ exit_code = begin
14
+ # Thor accesses these streams directly rather than letting them be
15
+ # injected, so replace them.
16
+ $stderr = @stderr
17
+ $stderr = @stderr
18
+ $stdin = @stdin
19
+ $stdout = @stdout
20
+
21
+ GitSnip::CLI.start(@argv)
22
+
23
+ # Thor::Base#start does not have a return value, assume success if no
24
+ # exception is raised.
25
+ 0
26
+ rescue StandardError => e
27
+ # The ruby interpreter would pipe this to STDERR and exit 1 in the case
28
+ # of an unhandled exception.
29
+ b = e.backtrace
30
+ @stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
31
+ @stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
32
+ 1
33
+ rescue SystemExit => e
34
+ e.status
35
+ ensure
36
+ # Reset your app here, free up resources, etc.
37
+ # Examples:
38
+ # MyApp.logger.flush
39
+ # MyApp.logger.close
40
+ # MyApp.logger = nil
41
+ #
42
+ # MyApp.reset_singleton_instance_variables
43
+
44
+ # Then we put the streams back.
45
+ $stderr = STDERR
46
+ $stdin = STDIN
47
+ $stdout = STDOUT
48
+ end
49
+
50
+ # Proxy our exit code back to the injected kernel.
51
+ @kernel.exit(exit_code)
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_snip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendy Tanata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-07 00:00:00.000000000 Z
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -99,15 +99,18 @@ files:
99
99
  - bin/git-snip
100
100
  - git_snip.gemspec
101
101
  - lib/git_snip.rb
102
+ - lib/git_snip/branch.rb
102
103
  - lib/git_snip/cleaner.rb
103
104
  - lib/git_snip/cli.rb
104
105
  - lib/git_snip/version.rb
106
+ - spec/lib/git_snip/branch_spec.rb
105
107
  - spec/lib/git_snip/cleaner_spec.rb
106
108
  - spec/lib/git_snip/cli_spec.rb
107
109
  - spec/spec_helper.rb
108
110
  - spec/support/cli_helper.rb
111
+ - spec/support/cli_runner.rb
109
112
  - spec/support/repo.rb
110
- homepage: ''
113
+ homepage: https://github.com/htanata/git_snip
111
114
  licenses:
112
115
  - MIT
113
116
  metadata: {}
@@ -119,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
119
122
  requirements:
120
123
  - - ">="
121
124
  - !ruby/object:Gem::Version
122
- version: '0'
125
+ version: '2.0'
123
126
  required_rubygems_version: !ruby/object:Gem::Requirement
124
127
  requirements:
125
128
  - - ">="
@@ -132,8 +135,10 @@ signing_key:
132
135
  specification_version: 4
133
136
  summary: Clean obsolete branches on your local git repository safely
134
137
  test_files:
138
+ - spec/lib/git_snip/branch_spec.rb
135
139
  - spec/lib/git_snip/cleaner_spec.rb
136
140
  - spec/lib/git_snip/cli_spec.rb
137
141
  - spec/spec_helper.rb
138
142
  - spec/support/cli_helper.rb
143
+ - spec/support/cli_runner.rb
139
144
  - spec/support/repo.rb