sugarjar 1.0.0 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95e4979017c0ed58f99c446d9215a6b64aec7d5ebc22694a95903710d5af9d7e
4
- data.tar.gz: b4b7a648bc7e8002e46dfbaa73cc52749cd38258b5782a2b33a6d66db98facfc
3
+ metadata.gz: d4282936baebdd165acf740d342b5f2e75a74dcaac6b77049842e903fe675957
4
+ data.tar.gz: f200b2404a6b61444b8846f0b67af1c43585daaab22b89d6e916f3a5fe9b3b3e
5
5
  SHA512:
6
- metadata.gz: 0e34735382f6646bf5fe1577eb6637ad7aaceaa9ccf2d2dad024d4a95f3e2a0e8ec080fe086fd5dae7354b3f15f83d26e6ae8b067a1fae9fb5b3da777f9e1f86
7
- data.tar.gz: 155d1aa1c7148f2d7181678f64ef64b17fb5efc90386ce3bd27c2bcc7b256113680b4e69a16558790ab3c77080325fc36a56c9f3cc76cf4962f8f575cd00d5d7
6
+ metadata.gz: aa37f43fbbfbd68bf3a43f58706add2a3ea981a257e41cea1b894077cad51f2f10a1d3e95d9968ea59518bbd5b6a739678bd123cd279ec67016856666521452b
7
+ data.tar.gz: 44a62d13863c21952264b4722a8fb6dd26fa3d1f548d7ab41f65d7dd0600c95f38fd333f49dfb0840734f9472ffa54050b6216a1140dc7edae2306d3b46b24b8
data/README.md CHANGED
@@ -5,12 +5,14 @@
5
5
  [![DCO](https://github.com/jaymzh/sugarjar/workflows/DCO%20Check/badge.svg)](https://github.com/jaymzh/sugarjar/actions?query=workflow%3A%22DCO+Check%22)
6
6
 
7
7
  > [!IMPORTANT]
8
- > You probably want to use [Sapling](https://sapling-scm.com/)
9
- > instead of this! This was written as a stop-gap to approximate some features
8
+ > If you are a _new_ user, I suggest looking at [Sapling](https://sapling-scm.com/)
9
+ > instead of this. This was written as a stop-gap to approximate some features
10
10
  > of the Facebook/Meta internal development tools before they were released.
11
- > Now that those tools have been open-sourced and work with GitHub, this is
12
- > likely to be deprecated at some point. Sapling is far more feature rich,
13
- > faster, and have more development resources behind them.
11
+ > Now that those tools have been open-sourced and work with GitHub, new users
12
+ > will likely want to start there. Sapling is far more feature rich, faster,
13
+ > and have more development resources behind them. SugarJar is a smaller
14
+ > transition, and for the time being I'm maintaining it for all existing users,
15
+ > and for those who may not yet be ready for the transition to Sapling.
14
16
 
15
17
  Welcome to SugarJar - a git/github helper. It needs one of the GitHub CLI's:
16
18
  either [gh](https://cli.github.com/) or the older [hub](https://hub.github.com/).
@@ -222,12 +224,20 @@ $ sj feature dependent-feature test-branch
222
224
  Created feature branch dependent-feature based on test-branch
223
225
  ```
224
226
 
227
+ Additionally you can specify a `feature_prefix` in your config which will cause
228
+ `feature` to create branches prefixed with your `feature_prefix` and will also
229
+ cause `co` to checkout branches with that prefix. This is useful when organizations
230
+ use branch-based workflows and branches need to be prefixed with e.g. `$USER/`.
231
+
232
+ For example, if your prefix was `user/`, then `sj feature foo` would create
233
+ `user/foo`, and `sj co foo` would switch to `user/foo`.
234
+
225
235
  ## Smartlog
226
236
 
227
237
  Smartlog will show you a tree diagram of your branches! Simply run `sj
228
238
  smartlog` or `sj sl` for short.
229
239
 
230
- ![smartlog screenshot](https://github.com/jaymzh/sugarjar/blob/master/smartlog.png)
240
+ ![smartlog screenshot](https://github.com/jaymzh/sugarjar/blob/main/smartlog.png)
231
241
 
232
242
  ## Pulling in suggestions from the web
233
243
 
@@ -317,6 +327,12 @@ how to handle repo-specific things. Currently there options are:
317
327
  * `commit_template` - A path to a commit template to set in the `commit.template`
318
328
  git config for this repo. Should be either a fully-qualified path, or a path
319
329
  relative to the repo root.
330
+ * `include_from` - This will read an additional repoconfig file and merge it
331
+ into the one being read. The value should be relative to the root of the
332
+ repo. This will not error if the file does not exist, it is intended for
333
+ organizations to allow users to optionally extend a default repo config.
334
+ * `overwrite_from` - Same as `include_from`, but completely overwrites the
335
+ base configuration if the file is found.
320
336
 
321
337
  Example configuration:
322
338
 
@@ -21,6 +21,7 @@ class SugarJar
21
21
  @ignore_dirty = options['ignore_dirty']
22
22
  @ignore_prerun_failure = options['ignore_prerun_failure']
23
23
  @repo_config = SugarJar::RepoConfig.config
24
+ SugarJar::Log.debug("Repoconfig: #{@repo_config}")
24
25
  @color = options['color']
25
26
  @feature_prefix = options['feature_prefix']
26
27
  @checks = {}
@@ -95,6 +96,15 @@ class SugarJar
95
96
 
96
97
  def co(*args)
97
98
  assert_in_repo
99
+ # Pop the last arguement, which is _probably_ a branch name
100
+ # and then add any featureprefix, and if _that_ is a branch
101
+ # name, replace the last arguement with that
102
+ name = args.last
103
+ bname = fprefix(name) unless all_local_branches.include?(name)
104
+ if all_local_branches.include?(bname)
105
+ SugarJar::Log.debug("Featurepefixing #{name} -> #{bname}")
106
+ args[-1] = bname
107
+ end
98
108
  s = git('checkout', *args)
99
109
  SugarJar::Log.info(s.stderr + s.stdout.chomp)
100
110
  end
@@ -296,7 +306,7 @@ class SugarJar
296
306
  end
297
307
  if gh?
298
308
  SugarJar::Log.trace("Running: gh pr create #{args.join(' ')}")
299
- system(which('gh'), 'pr', 'create', *args)
309
+ system(which('gh'), 'pr', 'create', '--fill', *args)
300
310
  else
301
311
  SugarJar::Log.trace("Running: hub pull-request #{args.join(' ')}")
302
312
  system(which('hub'), 'pull-request', *args)
@@ -553,7 +563,12 @@ class SugarJar
553
563
  SugarJar::Log.debug("Running #{type} #{check}")
554
564
 
555
565
  short = check.split.first
556
- unless File.exist?(short)
566
+ if short.include?('/')
567
+ short = File.join(repo_root, short) unless short.start_with?('/')
568
+ unless File.exist?(short)
569
+ SugarJar::Log.error("Configured #{type} #{short} does not exist!")
570
+ end
571
+ elsif !which_nofail(short)
557
572
  SugarJar::Log.error("Configured #{type} #{short} does not exist!")
558
573
  return false
559
574
  end
@@ -1,6 +1,7 @@
1
1
  require_relative 'util'
2
2
  require_relative 'log'
3
3
  require 'yaml'
4
+ require 'deep_merge'
4
5
 
5
6
  class SugarJar
6
7
  # This parses SugarJar repoconfigs (not to be confused with configs).
@@ -10,23 +11,40 @@ class SugarJar
10
11
 
11
12
  CONFIG_NAME = '.sugarjar.yaml'.freeze
12
13
 
13
- def self.repo_config
14
- ::File.join(repo_root, CONFIG_NAME)
14
+ def self.repo_config_path(config)
15
+ ::File.join(repo_root, config)
15
16
  end
16
17
 
17
- def self.config
18
+ def self.hash_from_file(config_file)
19
+ SugarJar::Log.debug("Loading repo config: #{config_file}")
20
+ YAML.safe_load(File.read(config_file))
21
+ end
22
+
23
+ # wrapper for File.exist to make unittests easier
24
+ def self.config_file?(config_file)
25
+ File.exist?(config_file)
26
+ end
27
+
28
+ def self.config(config = CONFIG_NAME)
29
+ data = {}
18
30
  unless in_repo
19
31
  SugarJar::Log.debug('Not in repo, skipping repoconfig load')
20
- return {}
32
+ return data
21
33
  end
22
- config = repo_config
23
- if File.exist?(config)
24
- SugarJar::Log.debug("Loading repo config: #{config}")
25
- YAML.safe_load(File.read(repo_config))
26
- else
27
- SugarJar::Log.debug("No repo config (#{config}), returning empty hash")
28
- {}
34
+ config_file = repo_config_path(config)
35
+ data = hash_from_file(config_file) if config_file?(config_file)
36
+ if data['overwrite_from'] && config_file?(data['overwrite_from'])
37
+ SugarJar::Log.debug(
38
+ "Attempting overwrite_from #{data['overwrite_from']}",
39
+ )
40
+ data = config(data['overwrite_from'])
41
+ data.delete('overwrite_from')
42
+ elsif data['include_from'] && config_file?(data['include_from'])
43
+ SugarJar::Log.debug("Attempting include_from #{data['include_from']}")
44
+ data.deep_merge!(config(data['include_from']))
45
+ data.delete('include_from')
29
46
  end
47
+ data
30
48
  end
31
49
  end
32
50
  end
@@ -1,3 +1,3 @@
1
1
  class SugarJar
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
data/sugarjar.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  Dir.glob('bin/*') +
18
18
  docs
19
19
 
20
+ spec.add_dependency 'deep_merge'
20
21
  spec.add_dependency 'mixlib-log'
21
22
  spec.add_dependency 'mixlib-shellout'
22
23
  spec.add_dependency 'pastel'
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sugarjar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phil Dibowitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-23 00:00:00.000000000 Z
11
+ date: 2023-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: deep_merge
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: mixlib-log
15
29
  requirement: !ruby/object:Gem::Requirement