braid 1.1.5 → 1.1.8
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/exe/braid +11 -0
- data/lib/braid/check_gem.rb +65 -0
- data/lib/braid/command.rb +18 -0
- data/lib/braid/commands/add.rb +41 -1
- data/lib/braid/commands/diff.rb +2 -1
- data/lib/braid/commands/push.rb +1 -0
- data/lib/braid/commands/remove.rb +1 -0
- data/lib/braid/commands/setup.rb +1 -0
- data/lib/braid/commands/status.rb +1 -0
- data/lib/braid/commands/update.rb +1 -0
- data/lib/braid/commands/upgrade_config.rb +1 -0
- data/lib/braid/config.rb +28 -4
- data/{bin/braid → lib/braid/main.rb} +16 -17
- data/lib/braid/mirror.rb +111 -24
- data/lib/braid/operations.rb +20 -18
- data/lib/braid/operations_lite.rb +19 -1
- data/lib/braid/sorbet/fake_runtime.rb +75 -0
- data/lib/braid/sorbet/setup.rb +18 -0
- data/lib/braid/version.rb +4 -1
- data/lib/braid.rb +23 -3
- metadata +26 -75
- data/.gitignore +0 -16
- data/.travis.yml +0 -15
- data/CONTRIBUTING.md +0 -24
- data/Gemfile +0 -3
- data/README.md +0 -234
- data/Rakefile +0 -12
- data/_config.yml +0 -1
- data/braid.gemspec +0 -35
- data/braids-json.schema.json +0 -91
- data/config_versions.md +0 -58
- data/spec/config_spec.rb +0 -59
- data/spec/fixtures/shiny/README +0 -3
- data/spec/fixtures/shiny/other-skit/layout.liquid +0 -219
- data/spec/fixtures/shiny/skit-layout.liquid.test +0 -2
- data/spec/fixtures/shiny/skit1.test +0 -2
- data/spec/fixtures/shiny-conf-1.0.9-lock/.braids.json +0 -10
- data/spec/fixtures/shiny-conf-1.0.9-lock/expected.braids.json +0 -9
- data/spec/fixtures/shiny-conf-1.0.9-lock/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/shiny-conf-1.0.9-lock/skit1/preview.png +0 -0
- data/spec/fixtures/shiny-conf-breaking-changes/.braids +0 -14
- data/spec/fixtures/shiny-conf-breaking-changes/Spoon-Knife/README.md +0 -9
- data/spec/fixtures/shiny-conf-breaking-changes/Spoon-Knife/index.html +0 -20
- data/spec/fixtures/shiny-conf-breaking-changes/Spoon-Knife/styles.css +0 -17
- data/spec/fixtures/shiny-conf-breaking-changes/expected.braids.json +0 -10
- data/spec/fixtures/shiny-conf-breaking-changes/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/shiny-conf-breaking-changes/skit1/preview.png +0 -0
- data/spec/fixtures/shiny-conf-future/.braids.json +0 -10
- data/spec/fixtures/shiny-conf-future/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/shiny-conf-future/skit1/preview.png +0 -0
- data/spec/fixtures/shiny-conf-json-old-name/.braids +0 -9
- data/spec/fixtures/shiny-conf-json-old-name/expected.braids.json +0 -10
- data/spec/fixtures/shiny-conf-json-old-name/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/shiny-conf-json-old-name/skit1/preview.png +0 -0
- data/spec/fixtures/shiny-conf-yaml/.braids +0 -8
- data/spec/fixtures/shiny-conf-yaml/expected.braids.json +0 -10
- data/spec/fixtures/shiny-conf-yaml/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/shiny-conf-yaml/skit1/preview.png +0 -0
- data/spec/fixtures/shiny_skit1.2_merged/layouts/layout.liquid +0 -223
- data/spec/fixtures/shiny_skit1.2_merged/preview.png +0 -0
- data/spec/fixtures/shiny_skit1_conflicting/layouts/layout.liquid +0 -221
- data/spec/fixtures/shiny_skit1_conflicting/preview.png +0 -0
- data/spec/fixtures/shiny_skit1_mergeable/layouts/layout.liquid +0 -221
- data/spec/fixtures/shiny_skit1_mergeable/preview.png +0 -0
- data/spec/fixtures/skit1/layouts/layout.liquid +0 -219
- data/spec/fixtures/skit1/preview.png +0 -0
- data/spec/fixtures/skit1.1/layouts/layout.liquid +0 -219
- data/spec/fixtures/skit1.1_with_filter/.gitattributes +0 -1
- data/spec/fixtures/skit1.1_with_filter/layouts/layout.liquid +0 -219
- data/spec/fixtures/skit1.1_with_filter/preview.png +0 -0
- data/spec/fixtures/skit1.1x/layouts/layout.liquid +0 -219
- data/spec/fixtures/skit1.2/layouts/layout.liquid +0 -221
- data/spec/fixtures/skit1.3/layouts/README.md +0 -1
- data/spec/fixtures/skit1.3/layouts/layout.liquid +0 -221
- data/spec/fixtures/skit1_with_filter/.gitattributes +0 -1
- data/spec/fixtures/skit1_with_filter/layouts/layout.liquid +0 -219
- data/spec/fixtures/skit1_with_filter/preview.png +0 -0
- data/spec/integration/adding_spec.rb +0 -230
- data/spec/integration/config_versioning_spec.rb +0 -222
- data/spec/integration/diff_spec.rb +0 -597
- data/spec/integration/integration_helper.rb +0 -129
- data/spec/integration/push_spec.rb +0 -399
- data/spec/integration/remove_spec.rb +0 -81
- data/spec/integration/status_spec.rb +0 -165
- data/spec/integration/updating_spec.rb +0 -487
- data/spec/mirror_spec.rb +0 -119
- data/spec/operations_spec.rb +0 -66
- data/spec/test_helper.rb +0 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6efac3d863ec38976f90032c012ebe9acca8911a9316608d7dfe704cc0d8925b
|
|
4
|
+
data.tar.gz: 5c5c8870bbf0702767234ee5b467324c7c25914ed3de06ac67ef903f87ca4ee7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dcb55a781668a47cdae99c5e013844b3234c7edcaeec21d71f64174dfc6ae3339acf89083b3256244fd430bdf035285d44cd9244d2abd6808b97f1c3c0be41cf
|
|
7
|
+
data.tar.gz: b8143594481cb94c3ca8c099e02c4c231be84e4a742b5e2047a7e79c82ea0e47c1b8e1ece68719130870aa613f5bca20182eb85e62f1d45a8bca210c0e163f80
|
data/exe/braid
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# I haven't found a clean way to get Sorbet to check this file since the name
|
|
4
|
+
# doesn't end in `.rb`. (If I add `--file bin/braid` to `sorbet/config`, then
|
|
5
|
+
# the Sorbet language server doesn't support using Watchman.) So move all the
|
|
6
|
+
# interesting code to `lib/braid/main.rb` and leave this as a launcher that
|
|
7
|
+
# doesn't have any code worth type checking. ~ Matt 2022-04-02
|
|
8
|
+
|
|
9
|
+
require_relative '../lib/braid/check_gem'
|
|
10
|
+
|
|
11
|
+
require 'braid/main'
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Since this file can't safely depend on the Sorbet runtime, it isn't prudent to
|
|
2
|
+
# try to commit to `typed: true` even if the file currently passes type checking
|
|
3
|
+
# without needing any references to `T`. Like `exe/braid`, this file doesn't
|
|
4
|
+
# have much code worth type checking.
|
|
5
|
+
#
|
|
6
|
+
# typed: false
|
|
7
|
+
|
|
8
|
+
# Braid has several entry points that run code from Ruby gems (either Braid
|
|
9
|
+
# itself or dependencies such as Sorbet) and expect to get the correct versions
|
|
10
|
+
# (either the same copy of Braid or versions of dependencies consistent with the
|
|
11
|
+
# gemspec or Gemfile, as applicable). This currently applies to the following
|
|
12
|
+
# entry points:
|
|
13
|
+
#
|
|
14
|
+
# - The Braid CLI launcher: `exe/braid`
|
|
15
|
+
# - The Braid test suite under `spec`
|
|
16
|
+
# - The Rakefile: Has a target to run the Sorbet type checker and wants the
|
|
17
|
+
# correct version for the current version of Braid.
|
|
18
|
+
#
|
|
19
|
+
# If these entry points are invoked without first activating the correct gems,
|
|
20
|
+
# then other globally installed versions might be used by default, leading to
|
|
21
|
+
# unintended behavior. So we have each of these entry points check that a Braid
|
|
22
|
+
# gem is active in the current Ruby interpreter _and_ the entry point is part of
|
|
23
|
+
# that same Braid gem. If so, we can assume that the correct versions of
|
|
24
|
+
# dependencies are active as well.
|
|
25
|
+
#
|
|
26
|
+
# To implement the check, the entry point file loads its corresponding copy of
|
|
27
|
+
# check_gem.rb via `require_relative`, and that copy of check_gem.rb checks that
|
|
28
|
+
# it is part of the active Braid gem. Note that loading check_gem.rb via
|
|
29
|
+
# `require 'lib/braid/check_gem'` would defeat the purpose, since it would
|
|
30
|
+
# activate whatever Braid gem is visible and then check that that gem's copy of
|
|
31
|
+
# check_gem.rb is part of the active Braid gem (which it would always be), not
|
|
32
|
+
# whether the _caller_ is part of the active Braid gem.
|
|
33
|
+
#
|
|
34
|
+
# Common means of activating the correct gems before invoking an entry point
|
|
35
|
+
# include:
|
|
36
|
+
#
|
|
37
|
+
# - Bundler: Used when developing Braid itself and possibly by some projects
|
|
38
|
+
# that use Braid. It modifies the environment so that every Ruby subprocess
|
|
39
|
+
# activates the gems from the Gemfile.lock.
|
|
40
|
+
# - A wrapper for `exe/braid` generated by `gem install --wrappers`.
|
|
41
|
+
#
|
|
42
|
+
# Note that we don't have every `.rb` file that is part of Braid load
|
|
43
|
+
# check_gem.rb: that would be too invasive and only helps in the case where a
|
|
44
|
+
# user manually added Braid's `lib` dir to the load path, which is a mistake
|
|
45
|
+
# that a reasonable user is much less likely to make than just running an entry
|
|
46
|
+
# point without the proper setup.
|
|
47
|
+
#
|
|
48
|
+
# TODO: Is there a more standard way to do this check? One would think it would
|
|
49
|
+
# be potentially applicable to any Ruby project, though maybe most don't care as
|
|
50
|
+
# much as we do about catching the problem up front.
|
|
51
|
+
|
|
52
|
+
braid_spec = Gem.loaded_specs['braid']
|
|
53
|
+
if braid_spec.nil? || __FILE__ != braid_spec.gem_dir + '/lib/braid/check_gem.rb'
|
|
54
|
+
STDERR.puts <<-MSG
|
|
55
|
+
Error: The RubyGems environment is not set up correctly for Braid.
|
|
56
|
+
- If you're using a copy of Braid installed globally via 'gem install' or
|
|
57
|
+
similar, use the 'braid' wrapper script (which is typically installed at a
|
|
58
|
+
location like ~/.gem/ruby/bin/braid depending on your environment) instead of
|
|
59
|
+
running 'exe/braid' directly.
|
|
60
|
+
- If you're using a copy of Braid managed by Bundler (including when developing
|
|
61
|
+
Braid itself), prepend 'bundle exec' to your command or use a binstub
|
|
62
|
+
generated by 'bundle binstubs'.
|
|
63
|
+
MSG
|
|
64
|
+
exit(1)
|
|
65
|
+
end
|
data/lib/braid/command.rb
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
module Braid
|
|
2
3
|
class Command
|
|
4
|
+
extend T::Sig
|
|
5
|
+
|
|
3
6
|
class InvalidRevision < BraidError
|
|
4
7
|
end
|
|
5
8
|
|
|
@@ -14,6 +17,11 @@ module Braid
|
|
|
14
17
|
klass.new.run(*args)
|
|
15
18
|
|
|
16
19
|
rescue BraidError => error
|
|
20
|
+
handle_error(error)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
sig {params(error: BraidError).returns(T.noreturn)}
|
|
24
|
+
def self.handle_error(error)
|
|
17
25
|
case error
|
|
18
26
|
when Operations::ShellExecutionError
|
|
19
27
|
msg "Shell error: #{error.message}"
|
|
@@ -23,10 +31,12 @@ module Braid
|
|
|
23
31
|
exit(1)
|
|
24
32
|
end
|
|
25
33
|
|
|
34
|
+
sig {params(str: String).void}
|
|
26
35
|
def self.msg(str)
|
|
27
36
|
puts "Braid: #{str}"
|
|
28
37
|
end
|
|
29
38
|
|
|
39
|
+
sig {params(str: String).void}
|
|
30
40
|
def msg(str)
|
|
31
41
|
self.class.msg(str)
|
|
32
42
|
end
|
|
@@ -35,16 +45,19 @@ module Braid
|
|
|
35
45
|
@config ||= Config.new({'mode' => config_mode})
|
|
36
46
|
end
|
|
37
47
|
|
|
48
|
+
sig {returns(T::Boolean)}
|
|
38
49
|
def verbose?
|
|
39
50
|
Braid.verbose
|
|
40
51
|
end
|
|
41
52
|
|
|
53
|
+
sig {returns(T::Boolean)}
|
|
42
54
|
def force?
|
|
43
55
|
Braid.force
|
|
44
56
|
end
|
|
45
57
|
|
|
46
58
|
private
|
|
47
59
|
|
|
60
|
+
sig {returns(Config::ConfigMode)}
|
|
48
61
|
def config_mode
|
|
49
62
|
Config::MODE_MAY_WRITE
|
|
50
63
|
end
|
|
@@ -63,14 +76,17 @@ module Braid
|
|
|
63
76
|
git.remote_rm(mirror.remote) unless options['keep']
|
|
64
77
|
end
|
|
65
78
|
|
|
79
|
+
sig {returns(T::Boolean)}
|
|
66
80
|
def use_local_cache?
|
|
67
81
|
Braid.use_local_cache
|
|
68
82
|
end
|
|
69
83
|
|
|
84
|
+
sig {void}
|
|
70
85
|
def self.verify_git_version!
|
|
71
86
|
git.require_version!(REQUIRED_GIT_VERSION)
|
|
72
87
|
end
|
|
73
88
|
|
|
89
|
+
sig {void}
|
|
74
90
|
def self.check_working_dir!
|
|
75
91
|
# If we aren't in a git repository at all, git.is_inside_worktree will
|
|
76
92
|
# propagate a "fatal: Not a git repository" ShellException.
|
|
@@ -82,6 +98,7 @@ module Braid
|
|
|
82
98
|
end
|
|
83
99
|
end
|
|
84
100
|
|
|
101
|
+
sig {void}
|
|
85
102
|
def bail_on_local_changes!
|
|
86
103
|
git.ensure_clean!
|
|
87
104
|
end
|
|
@@ -100,6 +117,7 @@ module Braid
|
|
|
100
117
|
end
|
|
101
118
|
end
|
|
102
119
|
|
|
120
|
+
sig {void}
|
|
103
121
|
def add_config_file
|
|
104
122
|
git.rm(OLD_CONFIG_FILE) if File.exist?(OLD_CONFIG_FILE)
|
|
105
123
|
git.add(CONFIG_FILE)
|
data/lib/braid/commands/add.rb
CHANGED
|
@@ -1,15 +1,55 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
module Braid
|
|
2
3
|
module Commands
|
|
3
4
|
class Add < Command
|
|
5
|
+
# Returns the default branch name of the repository at the given URL, or
|
|
6
|
+
# nil if it couldn't be determined.
|
|
7
|
+
#
|
|
8
|
+
# We won't be able to determine a default branch in certain cases that we
|
|
9
|
+
# expect to be unusual in the context of Braid, such as if the HEAD is
|
|
10
|
+
# detached or points to a ref outside of `refs/heads`. (Presumably, the
|
|
11
|
+
# same thing happens if the server is too old to report symrefs to us.)
|
|
12
|
+
# In those cases, a plausible alternative behavior would be to just lock
|
|
13
|
+
# the mirror to the remote HEAD revision, but that's probably not what the
|
|
14
|
+
# user wants. It's much more likely that something is wrong and Braid
|
|
15
|
+
# should report an error.
|
|
16
|
+
def get_default_branch_name(url)
|
|
17
|
+
head_targets = []
|
|
18
|
+
# The `HEAD` parameter here doesn't appear to do an exact match (it
|
|
19
|
+
# appears to match any ref with `HEAD` as the last path component, such
|
|
20
|
+
# as `refs/remotes/origin/HEAD` in the unusual case where the repository
|
|
21
|
+
# contains its own remote-tracking branches), but it reduces the data we
|
|
22
|
+
# have to scan a bit.
|
|
23
|
+
git.ls_remote('--symref', url, 'HEAD').split("\n").each do |line|
|
|
24
|
+
m = /^ref: (.*)\tHEAD$/.match(line)
|
|
25
|
+
head_targets.push(m[1]) if m
|
|
26
|
+
end
|
|
27
|
+
return nil unless head_targets.size == 1
|
|
28
|
+
m = /^refs\/heads\/(.*)$/.match(head_targets[0])
|
|
29
|
+
return nil unless m
|
|
30
|
+
m[1]
|
|
31
|
+
end
|
|
32
|
+
|
|
4
33
|
def run(url, options = {})
|
|
5
34
|
with_reset_on_error do
|
|
35
|
+
if options['branch'].nil? && options['tag'].nil? && options['revision'].nil?
|
|
36
|
+
default_branch = get_default_branch_name(url)
|
|
37
|
+
if default_branch.nil?
|
|
38
|
+
raise BraidError, <<-MSG
|
|
39
|
+
Failed to detect the default branch of the remote repository. Please specify
|
|
40
|
+
the branch you want to use via the --branch option.
|
|
41
|
+
MSG
|
|
42
|
+
end
|
|
43
|
+
options['branch'] = default_branch
|
|
44
|
+
end
|
|
45
|
+
|
|
6
46
|
mirror = config.add_from_options(url, options)
|
|
7
47
|
add_config_file
|
|
8
48
|
|
|
9
49
|
mirror.branch = nil if options['revision']
|
|
10
50
|
raise BraidError, 'Can not add mirror specifying both a revision and a tag' if options['revision'] && mirror.tag
|
|
11
51
|
|
|
12
|
-
branch_message =
|
|
52
|
+
branch_message = mirror.branch.nil? ? '' : " branch '#{mirror.branch}'"
|
|
13
53
|
tag_message = mirror.tag.nil? ? '' : " tag '#{mirror.tag}'"
|
|
14
54
|
revision_message = options['revision'] ? " at #{display_revision(mirror, options['revision'])}" : ''
|
|
15
55
|
msg "Adding mirror of '#{mirror.url}'#{branch_message}#{tag_message}#{revision_message}."
|
data/lib/braid/commands/diff.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
module Braid
|
|
2
3
|
module Commands
|
|
3
4
|
class Diff < Command
|
|
@@ -35,7 +36,7 @@ module Braid
|
|
|
35
36
|
|
|
36
37
|
# XXX: Warn if the user specifies file paths that are outside the
|
|
37
38
|
# mirror? Currently, they just won't match anything.
|
|
38
|
-
git.diff_to_stdout(*mirror.diff_args(
|
|
39
|
+
git.diff_to_stdout(*mirror.diff_args(options['git_diff_args']))
|
|
39
40
|
|
|
40
41
|
clear_remote(mirror, options)
|
|
41
42
|
end
|
data/lib/braid/commands/push.rb
CHANGED
data/lib/braid/commands/setup.rb
CHANGED
data/lib/braid/config.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# typed: true
|
|
1
2
|
require 'yaml'
|
|
2
3
|
require 'json'
|
|
3
4
|
require 'yaml/store'
|
|
@@ -48,6 +49,10 @@ require 'yaml/store'
|
|
|
48
49
|
|
|
49
50
|
module Braid
|
|
50
51
|
class Config
|
|
52
|
+
extend T::Sig
|
|
53
|
+
|
|
54
|
+
# TODO (typing): Migrate to T::Enum?
|
|
55
|
+
ConfigMode = T.type_alias { Integer }
|
|
51
56
|
|
|
52
57
|
MODE_UPGRADE = 1
|
|
53
58
|
MODE_READ_ONLY = 2
|
|
@@ -56,11 +61,13 @@ module Braid
|
|
|
56
61
|
CURRENT_CONFIG_VERSION = 1
|
|
57
62
|
|
|
58
63
|
class PathAlreadyInUse < BraidError
|
|
64
|
+
sig {returns(String)}
|
|
59
65
|
def message
|
|
60
66
|
"path already in use: #{super}"
|
|
61
67
|
end
|
|
62
68
|
end
|
|
63
69
|
class MirrorDoesNotExist < BraidError
|
|
70
|
+
sig {returns(String)}
|
|
64
71
|
def message
|
|
65
72
|
"mirror does not exist: #{super}"
|
|
66
73
|
end
|
|
@@ -70,9 +77,15 @@ module Braid
|
|
|
70
77
|
end
|
|
71
78
|
|
|
72
79
|
# For upgrade-config command only. XXX: Ideally would be immutable.
|
|
73
|
-
|
|
80
|
+
sig {returns(Integer)}
|
|
81
|
+
attr_reader :config_version
|
|
82
|
+
sig {returns(T::Boolean)}
|
|
83
|
+
attr_reader :config_existed
|
|
84
|
+
sig {returns(T::Array[String])}
|
|
85
|
+
attr_reader :breaking_change_descs
|
|
74
86
|
|
|
75
87
|
# options: config_file, old_config_files, mode
|
|
88
|
+
sig {params(options: T.untyped).void}
|
|
76
89
|
def initialize(options = {})
|
|
77
90
|
@config_file = options['config_file'] || CONFIG_FILE
|
|
78
91
|
old_config_files = options['old_config_files'] || [OLD_CONFIG_FILE]
|
|
@@ -150,6 +163,7 @@ MSG
|
|
|
150
163
|
|
|
151
164
|
end
|
|
152
165
|
|
|
166
|
+
sig {params(url: String, options: T.untyped).returns(Mirror)}
|
|
153
167
|
def add_from_options(url, options)
|
|
154
168
|
mirror = Mirror.new_from_options(url, options)
|
|
155
169
|
|
|
@@ -157,33 +171,39 @@ MSG
|
|
|
157
171
|
mirror
|
|
158
172
|
end
|
|
159
173
|
|
|
174
|
+
sig {returns(T::Array[Mirror])}
|
|
160
175
|
def mirrors
|
|
161
176
|
@db.keys
|
|
162
177
|
end
|
|
163
178
|
|
|
179
|
+
sig {params(path: String).returns(T.nilable(Mirror))}
|
|
164
180
|
def get(path)
|
|
165
181
|
key = path.to_s.sub(/\/$/, '')
|
|
166
182
|
attributes = @db[key]
|
|
167
183
|
attributes ? Mirror.new(path, attributes) : nil
|
|
168
184
|
end
|
|
169
185
|
|
|
186
|
+
sig {params(path: String).returns(Mirror)}
|
|
170
187
|
def get!(path)
|
|
171
188
|
mirror = get(path)
|
|
172
189
|
raise MirrorDoesNotExist, path unless mirror
|
|
173
190
|
mirror
|
|
174
191
|
end
|
|
175
192
|
|
|
193
|
+
sig {params(mirror: Mirror).void}
|
|
176
194
|
def add(mirror)
|
|
177
195
|
raise PathAlreadyInUse, mirror.path if get(mirror.path)
|
|
178
196
|
write_mirror(mirror)
|
|
179
197
|
write_db
|
|
180
198
|
end
|
|
181
199
|
|
|
200
|
+
sig {params(mirror: Mirror).void}
|
|
182
201
|
def remove(mirror)
|
|
183
202
|
@db.delete(mirror.path)
|
|
184
203
|
write_db
|
|
185
204
|
end
|
|
186
205
|
|
|
206
|
+
sig {params(mirror: Mirror).void}
|
|
187
207
|
def update(mirror)
|
|
188
208
|
raise MirrorDoesNotExist, mirror.path unless get(mirror.path)
|
|
189
209
|
write_mirror(mirror)
|
|
@@ -191,6 +211,7 @@ MSG
|
|
|
191
211
|
end
|
|
192
212
|
|
|
193
213
|
# Public for upgrade-config command only.
|
|
214
|
+
sig {void}
|
|
194
215
|
def write_db
|
|
195
216
|
new_db = {}
|
|
196
217
|
@db.keys.sort.each do |key|
|
|
@@ -211,11 +232,12 @@ MSG
|
|
|
211
232
|
|
|
212
233
|
private
|
|
213
234
|
|
|
235
|
+
sig {params(config_file: String, old_config_files: T::Array[String]).returns(T.untyped)}
|
|
214
236
|
def load_config(config_file, old_config_files)
|
|
215
237
|
(old_config_files + [config_file]).each do |file|
|
|
216
238
|
next unless File.exist?(file)
|
|
217
239
|
begin
|
|
218
|
-
store = YAML::Store.new(file)
|
|
240
|
+
store = T.let(YAML::Store, T.untyped).new(file)
|
|
219
241
|
data = {}
|
|
220
242
|
store.transaction(true) do
|
|
221
243
|
store.roots.each do |path|
|
|
@@ -228,15 +250,17 @@ MSG
|
|
|
228
250
|
return data if data
|
|
229
251
|
end
|
|
230
252
|
end
|
|
231
|
-
|
|
253
|
+
nil
|
|
232
254
|
end
|
|
233
255
|
|
|
256
|
+
sig {params(mirror: Mirror).void}
|
|
234
257
|
def write_mirror(mirror)
|
|
235
258
|
@db[mirror.path] = clean_attributes(mirror.attributes)
|
|
236
259
|
end
|
|
237
260
|
|
|
261
|
+
sig {params(hash: T::Hash[String, T.untyped]).returns(T::Hash[String, T.untyped])}
|
|
238
262
|
def clean_attributes(hash)
|
|
239
|
-
hash.reject { |
|
|
263
|
+
hash.reject { |_, v| v.nil? }
|
|
240
264
|
end
|
|
241
265
|
end
|
|
242
266
|
end
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
# typed: true
|
|
2
2
|
|
|
3
|
-
# Duplicated from Braid::Command.run. :(
|
|
4
|
-
def die(msg)
|
|
5
|
-
puts "Braid: Error: #{msg}"
|
|
6
|
-
exit(1)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
# If we assume Ruby >= 2.0, we can use __dir__.
|
|
10
|
-
libdir = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
|
|
11
|
-
unless File.exists?(libdir)
|
|
12
|
-
# Don't silently fall back to a different globally installed copy of Braid!
|
|
13
|
-
die "Cannot find Braid's 'lib' directory."
|
|
14
|
-
end
|
|
15
|
-
$LOAD_PATH.unshift(libdir)
|
|
16
3
|
require 'braid'
|
|
17
4
|
|
|
18
5
|
require 'rubygems'
|
|
19
6
|
require 'main'
|
|
20
7
|
|
|
8
|
+
# This is needed for `T` below to resolve to `Braid::T` when using the fake
|
|
9
|
+
# Sorbet runtime. TODO: Indent the contents and accept the large diff?
|
|
10
|
+
module Braid
|
|
11
|
+
|
|
21
12
|
Home = File.expand_path(ENV['HOME'] || '~')
|
|
22
13
|
|
|
23
14
|
# mostly blantantly stolen from ara's punch script
|
|
24
15
|
# main kicks ass!
|
|
25
|
-
Main {
|
|
16
|
+
T.unsafe(Main).run {
|
|
17
|
+
# `Main` is somewhat mind-bending and I'm unsure what the type of `self`
|
|
18
|
+
# actually is here, but whatever it is, we don't have a type declaration for
|
|
19
|
+
# it.
|
|
20
|
+
T.bind(self, T.untyped)
|
|
21
|
+
|
|
26
22
|
description <<-TXT
|
|
27
23
|
braid is a simple tool to help track git repositories inside a git repository.
|
|
28
24
|
|
|
@@ -35,7 +31,8 @@ Main {
|
|
|
35
31
|
# The "main" library doesn't provide a way to do this??
|
|
36
32
|
def check_no_extra_args!
|
|
37
33
|
if @argv.length > 0
|
|
38
|
-
|
|
34
|
+
Braid::Command.handle_error(
|
|
35
|
+
Braid::BraidError.new('Extra argument(s) passed to command.'))
|
|
39
36
|
end
|
|
40
37
|
end
|
|
41
38
|
|
|
@@ -138,7 +135,7 @@ Main {
|
|
|
138
135
|
|
|
139
136
|
mixin :optional_local_path, :option_verbose, :option_keep_remote
|
|
140
137
|
|
|
141
|
-
synopsis
|
|
138
|
+
synopsis(T.unsafe(Main::Usage).default_synopsis(self) + ' [-- git_diff_arg*]')
|
|
142
139
|
|
|
143
140
|
run {
|
|
144
141
|
if @argv.length > 0 && @argv[0] == '--'
|
|
@@ -333,3 +330,5 @@ Main {
|
|
|
333
330
|
|
|
334
331
|
run { help! }
|
|
335
332
|
}
|
|
333
|
+
|
|
334
|
+
end
|