git_snip 0.0.4 → 0.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +6 -3
- data/CHANGELOG.md +4 -0
- data/Gemfile +2 -1
- data/README.md +17 -4
- data/Rakefile +2 -1
- data/bin/git-snip +1 -0
- data/lib/git_snip/branch.rb +28 -22
- data/lib/git_snip/cleaner.rb +2 -0
- data/lib/git_snip/cli.rb +21 -36
- data/lib/git_snip/config.rb +2 -0
- data/lib/git_snip/options.rb +24 -0
- data/lib/git_snip/printer.rb +41 -0
- data/lib/git_snip/version.rb +3 -1
- data/lib/git_snip.rb +2 -0
- data/spec/lib/git_snip/branch_spec.rb +2 -1
- data/spec/lib/git_snip/cleaner_spec.rb +2 -0
- data/spec/lib/git_snip/cli_help_spec.rb +2 -0
- data/spec/lib/git_snip/cli_spec.rb +2 -0
- data/spec/lib/git_snip/config_spec.rb +2 -0
- data/spec/lib/git_snip/options_spec.rb +32 -0
- data/spec/lib/git_snip/printer_spec.rb +55 -0
- data/spec/spec_helper.rb +4 -2
- data/spec/support/cli_helper.rb +2 -0
- data/spec/support/cli_runner.rb +3 -1
- data/spec/support/config_shared_context.rb +2 -0
- data/spec/support/repo.rb +2 -0
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1821b121c5779025b31a185db88508692503638a
|
4
|
+
data.tar.gz: 325f84bb5bcf7124fc9ce9b3836885813f5b2f22
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85454425cbcfe23ed00f5c40a07e8157be5ec24181b45fe491deb53c6d8a567dbebf1872a4287fc56d2d572759e564dd57de23b5c4171cccf38084553f9339bb
|
7
|
+
data.tar.gz: d337e1dd14cbc59f54e7191f1c3972744bb325d8697d8e1a354e909f3473b226adae03bf6830d80d4e6e849715950cd02140b17a71bd9943abc668c3bd74f031
|
data/.travis.yml
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
+
before_install:
|
2
|
+
- gem update bundler
|
3
|
+
|
1
4
|
before_script:
|
2
5
|
- git config --global user.email "you@example.com"
|
3
6
|
- git config --global user.name "Your Name"
|
4
7
|
|
5
|
-
script: CODECLIMATE_REPO_TOKEN=ea0ada8842b47f59715526e88df53a81afff061152ce67bb73a8baa75443ea43 bundle exec rspec
|
8
|
+
script: CODECLIMATE_REPO_TOKEN=ea0ada8842b47f59715526e88df53a81afff061152ce67bb73a8baa75443ea43 bundle exec rspec && bundle exec codeclimate-test-reporter
|
6
9
|
|
7
10
|
rvm:
|
8
|
-
- 2.0.0
|
9
11
|
- 2.1.0
|
10
12
|
- 2.2.0
|
11
|
-
-
|
13
|
+
- 2.3.0
|
14
|
+
- 2.4.0
|
12
15
|
- ruby-head
|
13
16
|
|
14
17
|
cache: bundler
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,6 +12,8 @@ deleted and will build up, making it harder to find your relevant branches.
|
|
12
12
|
This gem aims to fix that by doing using [`git cherry`][git-cherry] to find
|
13
13
|
local branches which have been merged and delete them.
|
14
14
|
|
15
|
+
[](https://asciinema.org/a/32614)
|
16
|
+
|
15
17
|
## Installation
|
16
18
|
|
17
19
|
Install using RubyGems:
|
@@ -30,6 +32,21 @@ And then execute:
|
|
30
32
|
|
31
33
|
## Usage
|
32
34
|
|
35
|
+
You can list the available options from command line:
|
36
|
+
|
37
|
+
$ git snip help
|
38
|
+
Usage:
|
39
|
+
git-snip
|
40
|
+
Options:
|
41
|
+
-f, [--force] # Will refuse to run unless given -f or -n.
|
42
|
+
-n, [--dry-run], [--no-dry-run] # Show branches which would be deleted.
|
43
|
+
[--repo=<path>] # Path to git repository.
|
44
|
+
# Default: .
|
45
|
+
[--target=<branch>] # Branch to compare equivalence against.
|
46
|
+
# Default: master
|
47
|
+
[--ignore=one two three] # List of branches to ignore.
|
48
|
+
[--full], [--no-full] # Show most branch information without cropping.
|
49
|
+
|
33
50
|
Show branches which would be deleted (accepts the same arguments as `-f`):
|
34
51
|
|
35
52
|
$ git snip -n
|
@@ -55,10 +72,6 @@ Delete branches already merged to `branch_a`:
|
|
55
72
|
|
56
73
|
$ git snip -f --target=branch_a
|
57
74
|
|
58
|
-
You can also list the available options from command line:
|
59
|
-
|
60
|
-
$ git snip help
|
61
|
-
|
62
75
|
## Config file
|
63
76
|
|
64
77
|
If you want some arguments to always be set, add a file to the root of the
|
data/Rakefile
CHANGED
data/bin/git-snip
CHANGED
data/lib/git_snip/branch.rb
CHANGED
@@ -1,35 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'time'
|
4
|
+
|
1
5
|
module GitSnip
|
2
6
|
module Branch
|
3
7
|
Row = Struct.new(:sha, :name, :date, :author, :message)
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
class << self
|
10
|
+
def row(branch)
|
11
|
+
Row.new.tap do |row|
|
12
|
+
row.sha = column(branch.gcommit.sha, 7)
|
13
|
+
row.name = column(branch.name, 12)
|
14
|
+
row.date = column(branch.gcommit.date.strftime('%F'), 10)
|
15
|
+
row.author = column(branch.gcommit.author.email.sub(/@.*/, ''), 8)
|
16
|
+
row.message = column(first_line(branch.gcommit.message), 39)
|
17
|
+
end
|
12
18
|
end
|
13
|
-
end
|
14
19
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def full_row(branch)
|
21
|
+
Row.new.tap do |row|
|
22
|
+
row.sha = branch.gcommit.sha
|
23
|
+
row.name = branch.name
|
24
|
+
row.date = branch.gcommit.date.iso8601
|
25
|
+
row.author = branch.gcommit.author.email
|
26
|
+
row.message = first_line(branch.gcommit.message)
|
27
|
+
end
|
22
28
|
end
|
23
|
-
end
|
24
29
|
|
25
|
-
|
30
|
+
private
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
32
|
+
def column(string, width)
|
33
|
+
string[0, width].ljust(width)
|
34
|
+
end
|
30
35
|
|
31
|
-
|
32
|
-
|
36
|
+
def first_line(string)
|
37
|
+
string.gsub(/[\r\n].*/, '')
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
35
41
|
end
|
data/lib/git_snip/cleaner.rb
CHANGED
data/lib/git_snip/cli.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'thor'
|
2
4
|
require 'git_snip/cleaner'
|
3
5
|
require 'git_snip/branch'
|
4
6
|
require 'git_snip/config'
|
7
|
+
require 'git_snip/printer'
|
8
|
+
require 'git_snip/options'
|
5
9
|
|
6
10
|
module GitSnip
|
7
11
|
class CLI < Thor
|
@@ -17,7 +21,7 @@ module GitSnip
|
|
17
21
|
desc: 'Will refuse to run unless given -f or -n.'
|
18
22
|
|
19
23
|
option :dry_run, type: :boolean, aliases: '-n',
|
20
|
-
desc:
|
24
|
+
desc: 'Show branches which would be deleted.'
|
21
25
|
|
22
26
|
option :repo, default: '.', banner: '<path>',
|
23
27
|
desc: 'Path to git repository.'
|
@@ -38,23 +42,23 @@ module GitSnip
|
|
38
42
|
end
|
39
43
|
|
40
44
|
if !opts[:force]
|
41
|
-
|
45
|
+
printer.force_option_needed
|
42
46
|
exit 64
|
43
47
|
end
|
44
48
|
|
45
49
|
cleaner = GitSnip::Cleaner.new(*cleaner_args)
|
46
50
|
|
47
|
-
|
51
|
+
printer.deleting_branches
|
48
52
|
|
49
53
|
deleted_branches = cleaner.delete_merged_branches do |branch|
|
50
|
-
|
54
|
+
printer.branch_info(branch_row(branch))
|
51
55
|
true
|
52
56
|
end
|
53
57
|
|
54
58
|
if deleted_branches.empty?
|
55
|
-
|
59
|
+
printer.no_branches_deleted
|
56
60
|
else
|
57
|
-
|
61
|
+
printer.done
|
58
62
|
end
|
59
63
|
end
|
60
64
|
default_task :snip
|
@@ -64,54 +68,35 @@ module GitSnip
|
|
64
68
|
def dry_run
|
65
69
|
cleaner = GitSnip::Cleaner.new(*cleaner_args)
|
66
70
|
|
67
|
-
|
71
|
+
printer.will_delete_branches
|
68
72
|
|
69
73
|
merged_branches = cleaner.merged_branches
|
70
74
|
|
71
75
|
merged_branches.each do |branch|
|
72
|
-
|
76
|
+
printer.branch_info(branch_row(branch))
|
73
77
|
end
|
74
78
|
|
75
79
|
if merged_branches.any?
|
76
|
-
|
80
|
+
printer.done
|
77
81
|
else
|
78
|
-
|
82
|
+
printer.no_branches_to_delete
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
82
|
-
def say_branch_info(branch, full = false)
|
83
|
-
row = opts[:full] ? Branch.full_row(branch) : Branch.row(branch)
|
84
|
-
|
85
|
-
say row.sha + ' ', :yellow
|
86
|
-
say row.name + ' ', :magenta
|
87
|
-
say row.date + ' ', :green
|
88
|
-
say row.author + ' ', [:blue, :bold]
|
89
|
-
say row.message.strip + "\n"
|
90
|
-
end
|
91
|
-
|
92
86
|
def cleaner_args
|
93
87
|
opts.values_at(:repo, :target, :ignore)
|
94
88
|
end
|
95
89
|
|
96
90
|
def opts
|
97
|
-
@opts ||=
|
98
|
-
|
99
|
-
|
100
|
-
options_dup = options.dup
|
101
|
-
|
102
|
-
options_dup.each_pair do |k, v|
|
103
|
-
if v.is_a?(Array) && v.empty?
|
104
|
-
config_value = config.options[k]
|
91
|
+
@opts ||= Options.merge(options, Config.new(options[:repo]).options)
|
92
|
+
end
|
105
93
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
110
|
-
end
|
94
|
+
def printer
|
95
|
+
@printer ||= Printer.new(self)
|
96
|
+
end
|
111
97
|
|
112
|
-
|
113
|
-
|
114
|
-
end
|
98
|
+
def branch_row(branch)
|
99
|
+
opts[:full] ? Branch.full_row(branch) : Branch.row(branch)
|
115
100
|
end
|
116
101
|
end
|
117
102
|
end
|
data/lib/git_snip/config.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'thor'
|
4
|
+
|
5
|
+
module GitSnip
|
6
|
+
module Options
|
7
|
+
def self.merge(primary = {}, secondary = {})
|
8
|
+
primary = primary.dup
|
9
|
+
|
10
|
+
primary.each_pair do |k, v|
|
11
|
+
if v.is_a?(Array) && v.empty?
|
12
|
+
secondary_value = secondary[k]
|
13
|
+
|
14
|
+
if secondary_value.is_a?(Array) && secondary_value.any?
|
15
|
+
primary[k] = secondary_value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Thor::CoreExt::HashWithIndifferentAccess.new(
|
21
|
+
secondary.merge(primary)).freeze
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GitSnip
|
4
|
+
class Printer
|
5
|
+
def initialize(cli)
|
6
|
+
@cli = cli
|
7
|
+
end
|
8
|
+
|
9
|
+
def force_option_needed
|
10
|
+
@cli.say '-f option is needed to delete branches.', :red
|
11
|
+
end
|
12
|
+
|
13
|
+
def deleting_branches
|
14
|
+
@cli.say "Deleting the following branches...\n\n", :green
|
15
|
+
end
|
16
|
+
|
17
|
+
def no_branches_deleted
|
18
|
+
@cli.say 'No branches were deleted.', :green
|
19
|
+
end
|
20
|
+
|
21
|
+
def will_delete_branches
|
22
|
+
@cli.say "Would delete the following branches...\n\n", :green
|
23
|
+
end
|
24
|
+
|
25
|
+
def no_branches_to_delete
|
26
|
+
@cli.say 'No branches would be deleted.', :green
|
27
|
+
end
|
28
|
+
|
29
|
+
def done
|
30
|
+
@cli.say "\nDone.", :green
|
31
|
+
end
|
32
|
+
|
33
|
+
def branch_info(row)
|
34
|
+
@cli.say row.sha + ' ', :yellow
|
35
|
+
@cli.say row.name + ' ', :magenta
|
36
|
+
@cli.say row.date + ' ', :green
|
37
|
+
@cli.say row.author + ' ', [:blue, :bold]
|
38
|
+
@cli.say row.message.strip + "\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/git_snip/version.rb
CHANGED
data/lib/git_snip.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'git_snip/options'
|
4
|
+
|
5
|
+
RSpec.describe GitSnip::Options do
|
6
|
+
describe '#merge' do
|
7
|
+
it 'should return HashWithIndifferentAccess' do
|
8
|
+
expect(described_class.merge)
|
9
|
+
.to be_a(Thor::CoreExt::HashWithIndifferentAccess)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return a frozen object' do
|
13
|
+
expect(described_class.merge).to be_frozen
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should prioritize primary' do
|
17
|
+
expect(described_class.merge({ a: 1 }, { a: 2 })).to eq('a' => 1)
|
18
|
+
end
|
19
|
+
|
20
|
+
specify 'false on primary should override true on secondary' do
|
21
|
+
expect(described_class.merge({ a: false }, { a: true })).to eq('a' => false)
|
22
|
+
end
|
23
|
+
|
24
|
+
specify 'empty array on secondary should not override' do
|
25
|
+
expect(described_class.merge({ a: [1] }, { a: [] })).to eq('a' => [1])
|
26
|
+
end
|
27
|
+
|
28
|
+
specify 'empty array on primary should be overridden' do
|
29
|
+
expect(described_class.merge({ a: [] }, { a: [2] })).to eq('a' => [2])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'git_snip/printer'
|
4
|
+
|
5
|
+
RSpec.describe GitSnip::Printer do
|
6
|
+
[
|
7
|
+
[:force_option_needed, '-f option is needed to delete branches.', :red],
|
8
|
+
[:deleting_branches, "Deleting the following branches...\n\n", :green],
|
9
|
+
[:no_branches_deleted, 'No branches were deleted.', :green],
|
10
|
+
[:will_delete_branches, "Would delete the following branches...\n\n", :green],
|
11
|
+
[:no_branches_to_delete, 'No branches would be deleted.', :green],
|
12
|
+
[:done, "\nDone.", :green]
|
13
|
+
].each do |method, text, color|
|
14
|
+
describe "##{method}" do
|
15
|
+
let(:sayer) { spy('sayer') }
|
16
|
+
let(:printer) { described_class.new(sayer) }
|
17
|
+
|
18
|
+
it "should print #{text.inspect} in #{color}" do
|
19
|
+
printer.send(method)
|
20
|
+
expect(sayer).to have_received(:say).with(text, color)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#branch_info' do
|
26
|
+
let(:sayer) { spy('sayer') }
|
27
|
+
let(:printer) { described_class.new(sayer) }
|
28
|
+
|
29
|
+
it 'should print a row of branch info' do
|
30
|
+
printer.branch_info(row_double)
|
31
|
+
|
32
|
+
expect(sayer).to have_received(:say).with('sha ', :yellow).ordered
|
33
|
+
expect(sayer).to have_received(:say).with('name ', :magenta).ordered
|
34
|
+
expect(sayer).to have_received(:say).with('date ', :green).ordered
|
35
|
+
expect(sayer).to have_received(:say).with('author ', [:blue, :bold]).ordered
|
36
|
+
expect(sayer).to have_received(:say).with("hello world\n").ordered
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should strip the last row and append new line' do
|
40
|
+
printer.branch_info(row_double(message: " hello world \n\n\n"))
|
41
|
+
|
42
|
+
expect(sayer).to have_received(:say).with("hello world\n")
|
43
|
+
end
|
44
|
+
|
45
|
+
def row_double(attrs = {})
|
46
|
+
instance_double('GitSnip::Branch::Row', {
|
47
|
+
sha: 'sha',
|
48
|
+
name: 'name',
|
49
|
+
date: 'date',
|
50
|
+
author: 'author',
|
51
|
+
message: 'hello world'
|
52
|
+
}.merge(attrs))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/cli_helper.rb
CHANGED
data/spec/support/cli_runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'git_snip/cli'
|
2
4
|
|
3
5
|
# https://github.com/erikhuda/thor/wiki/Integrating-with-Aruba-In-Process-Runs
|
@@ -28,7 +30,7 @@ module GitSnip
|
|
28
30
|
# of an unhandled exception.
|
29
31
|
b = e.backtrace
|
30
32
|
@stderr.puts("#{b.shift}: #{e.message} (#{e.class})")
|
31
|
-
@stderr.puts(b.map{|s| "\tfrom #{s}"}.join("\n"))
|
33
|
+
@stderr.puts(b.map { |s| "\tfrom #{s}" }.join("\n"))
|
32
34
|
1
|
33
35
|
rescue SystemExit => e
|
34
36
|
e.status
|
data/spec/support/repo.rb
CHANGED
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.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hendy Tanata
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git
|
@@ -103,12 +103,16 @@ files:
|
|
103
103
|
- lib/git_snip/cleaner.rb
|
104
104
|
- lib/git_snip/cli.rb
|
105
105
|
- lib/git_snip/config.rb
|
106
|
+
- lib/git_snip/options.rb
|
107
|
+
- lib/git_snip/printer.rb
|
106
108
|
- lib/git_snip/version.rb
|
107
109
|
- spec/lib/git_snip/branch_spec.rb
|
108
110
|
- spec/lib/git_snip/cleaner_spec.rb
|
109
111
|
- spec/lib/git_snip/cli_help_spec.rb
|
110
112
|
- spec/lib/git_snip/cli_spec.rb
|
111
113
|
- spec/lib/git_snip/config_spec.rb
|
114
|
+
- spec/lib/git_snip/options_spec.rb
|
115
|
+
- spec/lib/git_snip/printer_spec.rb
|
112
116
|
- spec/spec_helper.rb
|
113
117
|
- spec/support/cli_helper.rb
|
114
118
|
- spec/support/cli_runner.rb
|
@@ -134,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
134
138
|
version: '0'
|
135
139
|
requirements: []
|
136
140
|
rubyforge_project:
|
137
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.6.13
|
138
142
|
signing_key:
|
139
143
|
specification_version: 4
|
140
144
|
summary: Clean obsolete branches on your local git repository safely
|
@@ -144,6 +148,8 @@ test_files:
|
|
144
148
|
- spec/lib/git_snip/cli_help_spec.rb
|
145
149
|
- spec/lib/git_snip/cli_spec.rb
|
146
150
|
- spec/lib/git_snip/config_spec.rb
|
151
|
+
- spec/lib/git_snip/options_spec.rb
|
152
|
+
- spec/lib/git_snip/printer_spec.rb
|
147
153
|
- spec/spec_helper.rb
|
148
154
|
- spec/support/cli_helper.rb
|
149
155
|
- spec/support/cli_runner.rb
|