rebase_pusher 0.1.0
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 +7 -0
- data/bin/console +8 -0
- data/bin/rebase_push +39 -0
- data/lib/rebase_pusher/version.rb +5 -0
- data/lib/rebase_pusher.rb +108 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 210c9f95029d1cae3b877543d0ff198a4265c821be7259f5408f58a4418448e6
|
4
|
+
data.tar.gz: 8c7f2eb6e24a355cdb253847085850002e825788b3452abe4ad6a05773b47943
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e0923d87a648c7fd793bc13d8156248ae2f025f02f1e016e06aa83c8253020711ed25bff2f491612342698215a1eff1d9352000a163ec13afebe6636e159353e
|
7
|
+
data.tar.gz: 1c1a9cfb77237650ff34a277b967a7bb353c868604f86c42d6e35a8f851e27a3226620d65b6ab668594677120b00ebbfcefbf5f5f0b4658c274069cacb2452dd
|
data/bin/console
ADDED
data/bin/rebase_push
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require_relative "../lib/rebase_pusher"
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
ARGV << '-h' if ARGV.empty?
|
10
|
+
|
11
|
+
# https://docs.ruby-lang.org/en/2.1.0/OptionParser.html
|
12
|
+
OptionParser.new do |opts|
|
13
|
+
opts.banner =<<~EOF
|
14
|
+
Description: this cli rebase all YOUR branches onto repository default branch and force push them to remote real quick
|
15
|
+
|
16
|
+
Example:
|
17
|
+
rebase_push -t reset
|
18
|
+
rebase_push -t rebase
|
19
|
+
rebase_push -t force_push # this is slow, calm down
|
20
|
+
rebase_push -t reset && rebase_push -t rebase
|
21
|
+
|
22
|
+
Options:
|
23
|
+
EOF
|
24
|
+
|
25
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
26
|
+
puts opts
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-t", "--type [TYPE]", %i[rebase reset force_push], "Select operation type (reset, rebase, force_push)") do |t|
|
31
|
+
options[:operation_type] = t
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on("-v", "--verbose", "Run verbosely") do |v|
|
35
|
+
options[:verbose] = v
|
36
|
+
end
|
37
|
+
end.parse!
|
38
|
+
|
39
|
+
RebasePusher.new(options).run
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "rebase_pusher/version"
|
4
|
+
|
5
|
+
require "optparse"
|
6
|
+
require "open3"
|
7
|
+
require "json"
|
8
|
+
|
9
|
+
class RebasePusher
|
10
|
+
attr_reader :options
|
11
|
+
attr_reader :io
|
12
|
+
attr_reader :original_branch
|
13
|
+
|
14
|
+
def initialize(options, io = $stdout)
|
15
|
+
@options = options
|
16
|
+
if options[:operation_type].nil?
|
17
|
+
warn "TYPE must present"
|
18
|
+
exit 1
|
19
|
+
end
|
20
|
+
|
21
|
+
@io = io
|
22
|
+
@original_branch = sh("git rev-parse --abbrev-ref HEAD")
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
io.puts "skipped branches: #{branches - my_branches}"
|
27
|
+
sh("git checkout --quiet #{default_branch}")
|
28
|
+
|
29
|
+
case options[:operation_type]
|
30
|
+
when :rebase
|
31
|
+
my_branches.each do |branch|
|
32
|
+
io.print "." if !options[:verbose]
|
33
|
+
sh("git rebase --quiet #{default_branch} #{branch}")
|
34
|
+
end
|
35
|
+
|
36
|
+
io.puts if !options[:verbose]
|
37
|
+
io.puts "all my branches are rebased"
|
38
|
+
when :reset
|
39
|
+
my_branches.each do |branch|
|
40
|
+
io.print "." if !options[:verbose]
|
41
|
+
sh("git branch --force #{branch} #{branch}@{u}")
|
42
|
+
end
|
43
|
+
|
44
|
+
io.puts if !options[:verbose]
|
45
|
+
io.puts "all my branches are reset"
|
46
|
+
when :force_push
|
47
|
+
# https://git-scm.com/docs/git-push
|
48
|
+
# refspec: <src>:<dst>
|
49
|
+
my_branches.each do |branch|
|
50
|
+
io.print "." if !options[:verbose]
|
51
|
+
sh("git push origin --quiet --force-with-lease --force-if-includes #{branch}:#{branch}")
|
52
|
+
end
|
53
|
+
|
54
|
+
io.puts if !options[:verbose]
|
55
|
+
io.puts "all my branches are force pushed"
|
56
|
+
else
|
57
|
+
raise "NOT SUPPORTTED"
|
58
|
+
end
|
59
|
+
|
60
|
+
sh("git checkout --quiet #{original_branch}")
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# Ensure I never touch other people's branch
|
66
|
+
def my_branches
|
67
|
+
@my_branches ||= branches.select do |branch|
|
68
|
+
merge_base_commitid = sh("git merge-base #{default_branch} #{branch}").chomp
|
69
|
+
author_emails = sh("git log --format='%ae' #{merge_base_commitid}..#{branch}").split("\n").uniq
|
70
|
+
|
71
|
+
!author_emails.empty? && author_emails.all? { |email| email == my_email }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def default_branch
|
76
|
+
@default_branch ||= sh("git rev-parse --abbrev-ref origin/HEAD").chomp
|
77
|
+
end
|
78
|
+
|
79
|
+
def branches
|
80
|
+
@branches ||= sh('git branch | grep "[^* ]+" -Eo').split("\n")
|
81
|
+
end
|
82
|
+
|
83
|
+
def my_email
|
84
|
+
@my_email ||= sh("git config --get user.email").chomp
|
85
|
+
end
|
86
|
+
|
87
|
+
def sh(cmd)
|
88
|
+
if options[:verbose]
|
89
|
+
io.puts "running command: #{cmd}"
|
90
|
+
end
|
91
|
+
|
92
|
+
out, err, status = Open3.capture3(*cmd)
|
93
|
+
|
94
|
+
if status.success?
|
95
|
+
out
|
96
|
+
else
|
97
|
+
info = {
|
98
|
+
output: out,
|
99
|
+
error: err,
|
100
|
+
status: status,
|
101
|
+
backtraces: caller
|
102
|
+
}
|
103
|
+
|
104
|
+
warn info.to_json
|
105
|
+
raise "command failed: #{cmd}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rebase_pusher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- lijunwei
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-03-27 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: git rebase and push for all my branches
|
14
|
+
email:
|
15
|
+
- ljw532344863@sina.com
|
16
|
+
executables:
|
17
|
+
- rebase_push
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/console
|
22
|
+
- bin/rebase_push
|
23
|
+
- lib/rebase_pusher.rb
|
24
|
+
- lib/rebase_pusher/version.rb
|
25
|
+
homepage: https://github.com/liijunwei/rebase_pusher
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata:
|
29
|
+
allowed_push_host: https://rubygems.org/
|
30
|
+
rubygems_mfa_required: 'true'
|
31
|
+
homepage_uri: https://github.com/liijunwei/rebase_pusher
|
32
|
+
source_code_uri: https://github.com/liijunwei/rebase_pusher
|
33
|
+
changelog_uri: https://github.com/liijunwei/rebase_pusher
|
34
|
+
post_install_message:
|
35
|
+
rdoc_options: []
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 2.6.0
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirements: []
|
49
|
+
rubygems_version: 3.3.22
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: git rebase and push for all my branches
|
53
|
+
test_files: []
|