sugarjar 1.1.1 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +128 -20
- data/bin/sj +31 -7
- data/lib/sugarjar/commands.rb +119 -19
- data/lib/sugarjar/config.rb +2 -0
- data/lib/sugarjar/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c689945af0d2bfb7b38477d19da9f58503a15b7be931ab021c4a121a07e6198c
|
4
|
+
data.tar.gz: e5fb66f22db68dce1ef31199ea688ff768d753b5df65bc8479744c010d4072c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9979e5aa13fd2a176cc5a391b9aef8353c1ddb7e63392ab6291f1781c3a99c39f9e4415a3c8cf02720ed2e0c6683a470978ba4ded3be9f2bb993120980a34863
|
7
|
+
data.tar.gz: 81ba9f2079a9cc6a88e9052092795c722f9a48bd6f9d763ddc33dddd48fbde65049a16dca2ca66ad39d2a33f179d175a712d22517e6e8103a5089a8d26d9592d
|
data/README.md
CHANGED
@@ -123,34 +123,142 @@ to `git clone` under the hood.
|
|
123
123
|
## Work with stacked branches more easily
|
124
124
|
|
125
125
|
It's important to break changes into reviewable chunks, but working with
|
126
|
-
stacked branches can be confusing.
|
127
|
-
|
128
|
-
branch structure like:
|
126
|
+
stacked branches can be confusing. SugarJar provides several tools to make this
|
127
|
+
easier.
|
129
128
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
129
|
+
First, and foremost, is `feature` and `subfeature`. Regardless of stacking, the
|
130
|
+
way to create a new feature bracnh with sugarjar is with `sj feature` (or `sj
|
131
|
+
f` for short):
|
132
|
+
|
133
|
+
```shell
|
134
|
+
$ sj feature mynewthing
|
135
|
+
Created feature branch mynewthing based on origin/main
|
134
136
|
```
|
135
137
|
|
136
|
-
|
138
|
+
A "feature" in SugarJar parliance just means that the branch is always created
|
139
|
+
from "most_main" - this is usually "upstream/main", but SJ will figure out
|
140
|
+
which remote is the "upstream", even if it's "origin", and then will determine
|
141
|
+
the primary branch ("main" or for older repos "master"). It's also smart enough
|
142
|
+
to fetch that remote first to make sure you're working on the latest HEAD.
|
143
|
+
|
144
|
+
When you want to create a stacked PR, you can create "subfeature", which, at
|
145
|
+
its core is just a branch created from the current branch:
|
137
146
|
|
138
147
|
```shell
|
139
|
-
$ sj
|
140
|
-
|
141
|
-
* e545b41 (test2) test2
|
142
|
-
* c808eae (test1) test1
|
143
|
-
o 44cf9e2 (origin/master, origin/HEAD, master) Lint/gemspec cleanups
|
148
|
+
$ sj subfeature dependentnewthing
|
149
|
+
Created feature branch dependentnewthing based on mynewthing
|
144
150
|
```
|
145
151
|
|
146
|
-
|
152
|
+
If you create branches like this then sugarjar can now make several things
|
153
|
+
much easier:
|
147
154
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
155
|
+
* `sj up` will rebase intelligently
|
156
|
+
* After an `sj bclean` of a branch earlier in the tree, `sj up` will update
|
157
|
+
the tracked branch to "most_main"
|
158
|
+
|
159
|
+
There are two commands that will show you the state of your stacked branches:
|
160
|
+
|
161
|
+
* `sj binfo` - shows the current branch and its ancestors up to your primary branch
|
162
|
+
* `sj smartlist` (aka `sj sl`) - shows you the whole tree.
|
163
|
+
|
164
|
+
To continue with the example above, my `smartlist` might look like:
|
165
|
+
|
166
|
+
```text
|
167
|
+
$ sj sl
|
168
|
+
* 59c0522 (HEAD -> dependentnewthing) anothertest
|
169
|
+
* 6ebaa28 (mynewthing) test
|
170
|
+
o 7a0ffd0 (tag: v1.1.2, origin/main, origin/HEAD, main) Version bump (#160)
|
171
|
+
```
|
172
|
+
|
173
|
+
This is simple. Now lets make a different feature stack:
|
174
|
+
|
175
|
+
```text
|
176
|
+
$ sj feature anotherfeature
|
177
|
+
Created feature branch anotherfeature based on origin/main
|
178
|
+
# do stuff
|
179
|
+
$ sj subfeature dependent2
|
180
|
+
Created feature branch dependent2 based on anotherfeature
|
181
|
+
# do stuff
|
182
|
+
```
|
183
|
+
|
184
|
+
The `smartlist` will now show us this tree, and it's a bit more interesting:
|
185
|
+
|
186
|
+
```text
|
187
|
+
$ sj sl
|
188
|
+
* af6f143 (HEAD -> dependent2) morestuff
|
189
|
+
* 028c7f4 (anotherfeature) stuff
|
190
|
+
| * 59c0522 (dependentnewthing) anothertest
|
191
|
+
| * 6ebaa28 (mynewthing) test
|
192
|
+
|/
|
193
|
+
o 7a0ffd0 (tag: v1.1.2, origin/main, origin/HEAD, main) Version bump (#160)
|
194
|
+
```
|
195
|
+
|
196
|
+
Now, what happens if I make a change to `mynewthing`?
|
197
|
+
|
198
|
+
```text
|
199
|
+
$ sj co mynewthing
|
200
|
+
Switched to branch 'mynewthing'
|
201
|
+
Your branch is ahead of 'origin/main' by 1 commit.
|
202
|
+
(use "git push" to publish your local commits)
|
203
|
+
$ echo 'randomchange' >> README.md
|
204
|
+
$ git commit -a -m change
|
205
|
+
[mynewthing d33e082] change
|
206
|
+
1 file changed, 1 insertion(+)
|
207
|
+
$ sj sl
|
208
|
+
* d33e082 (HEAD -> mynewthing) change
|
209
|
+
| * af6f143 (dependent2) morestuff
|
210
|
+
| * 028c7f4 (anotherfeature) stuff
|
211
|
+
| | * 59c0522 (dependentnewthing) anothertest
|
212
|
+
| |/
|
213
|
+
|/|
|
214
|
+
* | 6ebaa28 test
|
215
|
+
|/
|
216
|
+
o 7a0ffd0 (tag: v1.1.2, origin/main, origin/HEAD, main) Version bump (#160)
|
217
|
+
```
|
218
|
+
|
219
|
+
We can see here now that `dependentnewthing`, is based off a commit that _used_
|
220
|
+
to be `mynewthing`, but `mynewthing` has moved. But SugarJar will handle this
|
221
|
+
all correctly when we ask it to update the branch:
|
222
|
+
|
223
|
+
```text
|
224
|
+
$ sj co dependentnewthing
|
225
|
+
Switched to branch 'dependentnewthing'
|
226
|
+
Your branch and 'mynewthing' have diverged,
|
227
|
+
and have 1 and 1 different commits each, respectively.
|
228
|
+
(use "git pull" if you want to integrate the remote branch with yours)
|
229
|
+
$ sj up
|
230
|
+
dependentnewthing rebased on mynewthing
|
231
|
+
$ sj sl
|
232
|
+
* 93ed585 (HEAD -> dependentnewthing) anothertest
|
233
|
+
* d33e082 (mynewthing) change
|
234
|
+
* 6ebaa28 test
|
235
|
+
| * af6f143 (dependent2) morestuff
|
236
|
+
| * 028c7f4 (anotherfeature) stuff
|
237
|
+
|/
|
238
|
+
o 7a0ffd0 (tag: v1.1.2, origin/main, origin/HEAD, main) Version bump (#160)
|
239
|
+
```
|
240
|
+
|
241
|
+
Now, lets say that `mynewthing` gets merged and we use `bclean` to clean it all
|
242
|
+
up, what happens then?
|
243
|
+
|
244
|
+
```text
|
245
|
+
$ sj up
|
246
|
+
The brach we were tracking is gone, resetting tracking to origin/main
|
247
|
+
dependentnewthing rebased on origin/main
|
248
|
+
```
|
249
|
+
|
250
|
+
### Creating Stacked PRs with subfeatures
|
251
|
+
|
252
|
+
When dependent branches are created with `subfeature`, when you create a PR,
|
253
|
+
SugarJar will automatically set the 'base' of the PR to the parent branch. By
|
254
|
+
default it'll prompt you about this, but you can set `pr_autostack` to `true`
|
255
|
+
in your config to tell it to always do this (or `false` to never do this):
|
256
|
+
|
257
|
+
```text
|
258
|
+
$ sj spr
|
259
|
+
Autofilling in PR from commit message
|
260
|
+
It looks like this is a subfeature, would you like to base this PR on mynewthing? [y/n] y
|
261
|
+
...
|
154
262
|
```
|
155
263
|
|
156
264
|
## Have a better lint/unittest experience!
|
data/bin/sj
CHANGED
@@ -91,6 +91,24 @@ parser = OptionParser.new do |opts|
|
|
91
91
|
options['log_level'] = level
|
92
92
|
end
|
93
93
|
|
94
|
+
opts.on(
|
95
|
+
'--[no-]pr-autofill',
|
96
|
+
'When creating a PR, auto fill the title & description from the top ' +
|
97
|
+
'commit if we are using "gh". [default: true]',
|
98
|
+
) do |autofill|
|
99
|
+
options['pr_autofill'] = autofill
|
100
|
+
end
|
101
|
+
|
102
|
+
opts.on(
|
103
|
+
'--[no-]pr-autostack',
|
104
|
+
'When creating a PR, if this is a subfeature, should we make it a ' +
|
105
|
+
'PR on the PR for the parent feature. If not specified, we prompt ' +
|
106
|
+
'when this happens, when true always do this, when false never do ' +
|
107
|
+
'this. Only applicable when usiing "gh" and on branch-based PRs.',
|
108
|
+
) do |autostack|
|
109
|
+
options['pr_autostack'] = autostack
|
110
|
+
end
|
111
|
+
|
94
112
|
opts.on('--[no-]use-color', 'Enable color. [default: true]') do |color|
|
95
113
|
options['color'] = color
|
96
114
|
end
|
@@ -112,10 +130,10 @@ COMMANDS:
|
|
112
130
|
Same as "amend" but without changing the message. Alias for
|
113
131
|
"git commit --amend --no-edit".
|
114
132
|
|
115
|
-
bclean
|
116
|
-
If safe, delete the current branch
|
117
|
-
bclean can handle squash-merged branches.
|
118
|
-
a smarter "git branch -d".
|
133
|
+
bclean [<branch>]
|
134
|
+
If safe, delete the current branch (or the specified branch).
|
135
|
+
Unlike "git branch -d", bclean can handle squash-merged branches.
|
136
|
+
Think of it as a smarter "git branch -d".
|
119
137
|
|
120
138
|
bcleanall
|
121
139
|
Walk all branches, and try to delete them if it's safe. See
|
@@ -127,7 +145,7 @@ COMMANDS:
|
|
127
145
|
br
|
128
146
|
Verbose branch list. An alias for "git branch -v".
|
129
147
|
|
130
|
-
feature
|
148
|
+
feature, f <branch_name>
|
131
149
|
Create a "feature" branch. It's morally equivalent to
|
132
150
|
"git checkout -b" except it defaults to creating it based on
|
133
151
|
some form of 'master' instead of your current branch. In order
|
@@ -177,11 +195,17 @@ COMMANDS:
|
|
177
195
|
A smart wrapper to "git push" that runs whatever is defined in
|
178
196
|
"on_push" in .sugarjar.yml, and only pushes if they succeed.
|
179
197
|
|
198
|
+
subfeature, sf <feature>
|
199
|
+
An alias for 'sj feature <feature> <current_branch>'
|
200
|
+
|
180
201
|
unit
|
181
202
|
Run any unitests configured in .sugarjar.yaml.
|
182
203
|
|
183
|
-
up
|
184
|
-
Rebase the current branch
|
204
|
+
up [<branch>]
|
205
|
+
Rebase the current branch (or specified branch) intelligently.
|
206
|
+
In most causes this will check for a main (or master) branch on
|
207
|
+
upstream, then origin. If a branch explicitly tracks something
|
208
|
+
else, then that will be used, instead.
|
185
209
|
|
186
210
|
upall
|
187
211
|
Same as "up", but for all branches.
|
data/lib/sugarjar/commands.rb
CHANGED
@@ -23,6 +23,8 @@ class SugarJar
|
|
23
23
|
@repo_config = SugarJar::RepoConfig.config
|
24
24
|
SugarJar::Log.debug("Repoconfig: #{@repo_config}")
|
25
25
|
@color = options['color']
|
26
|
+
@pr_autofill = options['pr_autofill']
|
27
|
+
@pr_autostack = options['pr_autostack']
|
26
28
|
@feature_prefix = options['feature_prefix']
|
27
29
|
@checks = {}
|
28
30
|
@main_branch = nil
|
@@ -43,19 +45,31 @@ class SugarJar
|
|
43
45
|
name = fprefix(name)
|
44
46
|
die("#{name} already exists!") if all_local_branches.include?(name)
|
45
47
|
base ||= most_main
|
46
|
-
|
47
|
-
|
48
|
+
# If our base is a local branch, don't try to parse it for a remote name
|
49
|
+
unless all_local_branches.include?(base)
|
50
|
+
base_pieces = base.split('/')
|
51
|
+
git('fetch', base_pieces[0]) if base_pieces.length > 1
|
52
|
+
end
|
48
53
|
git('checkout', '-b', name, base)
|
54
|
+
git('branch', '-u', base)
|
49
55
|
SugarJar::Log.info(
|
50
56
|
"Created feature branch #{color(name, :green)} based on " +
|
51
57
|
color(base, :green),
|
52
58
|
)
|
53
59
|
end
|
60
|
+
alias f feature
|
61
|
+
|
62
|
+
def subfeature(name)
|
63
|
+
assert_in_repo
|
64
|
+
SugarJar::Log.debug("Subfature: #{name}")
|
65
|
+
feature(name, current_branch)
|
66
|
+
end
|
67
|
+
alias sf subfeature
|
54
68
|
|
55
69
|
def bclean(name = nil)
|
56
70
|
assert_in_repo
|
57
71
|
name ||= current_branch
|
58
|
-
name = fprefix(name)
|
72
|
+
name = fprefix(name)
|
59
73
|
if clean_branch(name)
|
60
74
|
SugarJar::Log.info("#{name}: #{color('reaped', :green)}")
|
61
75
|
else
|
@@ -100,7 +114,7 @@ class SugarJar
|
|
100
114
|
# and then add any featureprefix, and if _that_ is a branch
|
101
115
|
# name, replace the last arguement with that
|
102
116
|
name = args.last
|
103
|
-
bname = fprefix(name)
|
117
|
+
bname = fprefix(name)
|
104
118
|
if all_local_branches.include?(bname)
|
105
119
|
SugarJar::Log.debug("Featurepefixing #{name} -> #{bname}")
|
106
120
|
args[-1] = bname
|
@@ -133,11 +147,14 @@ class SugarJar
|
|
133
147
|
|
134
148
|
alias sl smartlog
|
135
149
|
|
136
|
-
def up
|
150
|
+
def up(branch = nil)
|
137
151
|
assert_in_repo
|
152
|
+
branch ||= current_branch
|
153
|
+
branch = fprefix(branch)
|
138
154
|
# get a copy of our current branch, if rebase fails, we won't
|
139
155
|
# be able to determine it without backing out
|
140
156
|
curr = current_branch
|
157
|
+
git('checkout', branch)
|
141
158
|
result = gitup
|
142
159
|
if result['so'].error?
|
143
160
|
backout = ''
|
@@ -156,6 +173,8 @@ class SugarJar
|
|
156
173
|
SugarJar::Log.info(
|
157
174
|
"#{color(current_branch, :green)} rebased on #{result['base']}",
|
158
175
|
)
|
176
|
+
# go back to where we were if we rebased a different branch
|
177
|
+
git('checkout', curr) if branch != curr
|
159
178
|
end
|
160
179
|
end
|
161
180
|
|
@@ -302,6 +321,7 @@ class SugarJar
|
|
302
321
|
def smartpullrequest(*args)
|
303
322
|
assert_in_repo
|
304
323
|
assert_common_main_branch
|
324
|
+
|
305
325
|
if dirty?
|
306
326
|
SugarJar::Log.warn(
|
307
327
|
'Your repo is dirty, so I am not going to create a pull request. ' +
|
@@ -309,9 +329,47 @@ class SugarJar
|
|
309
329
|
)
|
310
330
|
exit(1)
|
311
331
|
end
|
332
|
+
|
312
333
|
if gh?
|
334
|
+
curr = current_branch
|
335
|
+
base = tracked_branch
|
336
|
+
if @pr_autofill
|
337
|
+
SugarJar::Log.info('Autofilling in PR from commit message')
|
338
|
+
num_commits = git(
|
339
|
+
'rev-list', '--count', curr, "^#{base}"
|
340
|
+
).stdout.strip.to_i
|
341
|
+
if num_commits > 1
|
342
|
+
args.unshift('--fill-first')
|
343
|
+
else
|
344
|
+
args.unshift('--fill')
|
345
|
+
end
|
346
|
+
end
|
347
|
+
if subfeature?(base)
|
348
|
+
if upstream != push_org
|
349
|
+
SugarJar::Log.warn(
|
350
|
+
'Unfortunately you cannot based one PR on another PR when' +
|
351
|
+
" using fork-based PRs. We will base this on #{most_main}." +
|
352
|
+
' This just means the PR "Changes" tab will show changes for' +
|
353
|
+
' the full stack until those other PRs are merged and this PR' +
|
354
|
+
' PR is rebased.',
|
355
|
+
)
|
356
|
+
# nil is prompt, true is always, false is never
|
357
|
+
elsif @pr_autostack.nil?
|
358
|
+
$stdout.print(
|
359
|
+
'It looks like this is a subfeature, would you like to base ' +
|
360
|
+
"this PR on #{base}? [y/n] ",
|
361
|
+
)
|
362
|
+
ans = $stdin.gets.strip
|
363
|
+
args.unshift('--base', base) if %w{Y y}.include?(ans)
|
364
|
+
elsif @pr_autostack
|
365
|
+
args.unshift('--base', base)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
# <org>:<branch> is the GH API syntax for:
|
369
|
+
# look for a branch of name <branch>, from a fork in owner <org>
|
370
|
+
args.unshift('--head', "#{push_org}:#{curr}")
|
313
371
|
SugarJar::Log.trace("Running: gh pr create #{args.join(' ')}")
|
314
|
-
system(which('gh'), 'pr', 'create',
|
372
|
+
system(which('gh'), 'pr', 'create', *args)
|
315
373
|
else
|
316
374
|
SugarJar::Log.trace("Running: hub pull-request #{args.join(' ')}")
|
317
375
|
system(which('hub'), 'pull-request', *args)
|
@@ -341,7 +399,7 @@ class SugarJar
|
|
341
399
|
|
342
400
|
src = "origin/#{current_branch}"
|
343
401
|
fetch('origin')
|
344
|
-
diff = git('diff', src).stdout
|
402
|
+
diff = git('diff', "..#{src}").stdout
|
345
403
|
return unless diff && !diff.empty?
|
346
404
|
|
347
405
|
puts "Will merge the following suggestions:\n\n#{diff}"
|
@@ -369,6 +427,9 @@ class SugarJar
|
|
369
427
|
def fprefix(name)
|
370
428
|
return name unless @feature_prefix
|
371
429
|
|
430
|
+
return name if name.start_with?(@feature_prefix)
|
431
|
+
return name if all_local_branches.include?(name)
|
432
|
+
|
372
433
|
newname = "#{@feature_prefix}#{name}"
|
373
434
|
SugarJar::Log.debug(
|
374
435
|
"Munging feature name: #{name} -> #{newname} due to feature prefix",
|
@@ -430,6 +491,10 @@ class SugarJar
|
|
430
491
|
end
|
431
492
|
end
|
432
493
|
|
494
|
+
def extract_repo(repo)
|
495
|
+
File.basename(repo, '.git')
|
496
|
+
end
|
497
|
+
|
433
498
|
def forked_repo(repo, username)
|
434
499
|
repo = if repo.start_with?('http', 'git@')
|
435
500
|
File.basename(repo)
|
@@ -712,11 +777,15 @@ class SugarJar
|
|
712
777
|
end
|
713
778
|
|
714
779
|
def all_local_branches
|
715
|
-
|
716
|
-
|
717
|
-
|
780
|
+
git(
|
781
|
+
'branch', '--format', '%(refname)'
|
782
|
+
).stdout.lines.map do |line|
|
783
|
+
branch_from_ref(line.strip)
|
718
784
|
end
|
719
|
-
|
785
|
+
end
|
786
|
+
|
787
|
+
def all_remotes
|
788
|
+
git('remote').stdout.lines.map(&:strip)
|
720
789
|
end
|
721
790
|
|
722
791
|
def safe_to_clean(branch)
|
@@ -794,14 +863,28 @@ class SugarJar
|
|
794
863
|
SugarJar::Log.debug('Fetching upstream')
|
795
864
|
fetch_upstream
|
796
865
|
curr = current_branch
|
797
|
-
|
866
|
+
# this isn't a hash, it's a named param, silly rubocop
|
867
|
+
# rubocop:disable Style/HashSyntax
|
868
|
+
base = tracked_branch(fallback: false)
|
869
|
+
# rubocop:enable Style/HashSyntax
|
870
|
+
unless base
|
871
|
+
SugarJar::Log.info(
|
872
|
+
'The brach we were tracking is gone, resetting tracking to ' +
|
873
|
+
most_main,
|
874
|
+
)
|
875
|
+
git('branch', '-u', most_main)
|
876
|
+
base = most_main
|
877
|
+
end
|
878
|
+
# If this is a subfeature based on a local branch which has since
|
879
|
+
# been deleted, 'tracked branch' will automatically return <most_main>
|
880
|
+
# so we don't need any special handling for that
|
798
881
|
if !MAIN_BRANCHES.include?(curr) && base == "origin/#{curr}"
|
799
882
|
SugarJar::Log.warn(
|
800
883
|
"This branch is tracking origin/#{curr}, which is probably your " +
|
801
884
|
'downstream (where you push _to_) as opposed to your upstream ' +
|
802
885
|
'(where you pull _from_). This means that "sj up" is probably ' +
|
803
886
|
'rebasing on the wrong thing and doing nothing. You probably want ' +
|
804
|
-
|
887
|
+
"to do a 'git branch -u #{most_main}'.",
|
805
888
|
)
|
806
889
|
end
|
807
890
|
SugarJar::Log.debug('Rebasing')
|
@@ -812,6 +895,12 @@ class SugarJar
|
|
812
895
|
}
|
813
896
|
end
|
814
897
|
|
898
|
+
# determine if this branch is based on another local branch (i.e. is a
|
899
|
+
# subfeature). Used to figure out of we should stack the PR
|
900
|
+
def subfeature?(base)
|
901
|
+
all_local_branches.reject { |x| x == most_main }.include?(base)
|
902
|
+
end
|
903
|
+
|
815
904
|
def rebase_in_progress?
|
816
905
|
# for rebase without -i
|
817
906
|
rebase_file = git('rev-parse', '--git-path', 'rebase-apply').stdout.strip
|
@@ -821,15 +910,22 @@ class SugarJar
|
|
821
910
|
File.exist?(rebase_file) || File.exist?(rebase_merge_file)
|
822
911
|
end
|
823
912
|
|
824
|
-
def tracked_branch
|
913
|
+
def tracked_branch(fallback: true)
|
914
|
+
branch = nil
|
825
915
|
s = git_nofail(
|
826
916
|
'rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'
|
827
917
|
)
|
828
918
|
if s.error?
|
829
|
-
most_main
|
919
|
+
branch = fallback ? most_main : nil
|
920
|
+
SugarJar::Log.debug("No specific tracked branch, using #{branch}")
|
830
921
|
else
|
831
|
-
s.stdout.strip
|
922
|
+
branch = s.stdout.strip
|
923
|
+
SugarJar::Log.debug(
|
924
|
+
"Using explicit tracked branch: #{branch}, use " +
|
925
|
+
'`git branch -u` to change',
|
926
|
+
)
|
832
927
|
end
|
928
|
+
branch
|
833
929
|
end
|
834
930
|
|
835
931
|
def most_main
|
@@ -844,9 +940,7 @@ class SugarJar
|
|
844
940
|
def upstream
|
845
941
|
return @remote if @remote
|
846
942
|
|
847
|
-
|
848
|
-
|
849
|
-
remotes = s.stdout.lines.map(&:strip)
|
943
|
+
remotes = all_remotes
|
850
944
|
SugarJar::Log.debug("remotes is #{remotes}")
|
851
945
|
if remotes.empty?
|
852
946
|
@remote = nil
|
@@ -862,6 +956,12 @@ class SugarJar
|
|
862
956
|
@remote
|
863
957
|
end
|
864
958
|
|
959
|
+
# Whatever org we push to, regardless of if this is a fork or not
|
960
|
+
def push_org
|
961
|
+
url = git('remote', 'get-url', 'origin').stdout.strip
|
962
|
+
extract_org(url)
|
963
|
+
end
|
964
|
+
|
865
965
|
def branch_from_ref(ref, type = :local)
|
866
966
|
# local branches are refs/head/XXXX
|
867
967
|
# remote branches are refs/remotes/<remote>/XXXX
|
data/lib/sugarjar/config.rb
CHANGED
data/lib/sugarjar/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sugarjar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Dibowitz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: deep_merge
|