braid 1.1.7 → 1.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/braid/check_gem.rb +7 -0
- data/lib/braid/command.rb +5 -0
- data/lib/braid/commands/add.rb +41 -1
- data/lib/braid/commands/diff.rb +1 -0
- 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/main.rb +17 -3
- data/lib/braid/mirror.rb +1 -1
- data/lib/braid/operations.rb +12 -13
- data/lib/braid/sorbet/fake_runtime.rb +7 -0
- data/lib/braid/version.rb +4 -1
- data/lib/braid.rb +2 -3
- metadata +16 -2
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/lib/braid/check_gem.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
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
|
+
|
1
8
|
# Braid has several entry points that run code from Ruby gems (either Braid
|
2
9
|
# itself or dependencies such as Sorbet) and expect to get the correct versions
|
3
10
|
# (either the same copy of Braid or versions of dependencies consistent with the
|
data/lib/braid/command.rb
CHANGED
@@ -17,6 +17,11 @@ module Braid
|
|
17
17
|
klass.new.run(*args)
|
18
18
|
|
19
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)
|
20
25
|
case error
|
21
26
|
when Operations::ShellExecutionError
|
22
27
|
msg "Shell error: #{error.message}"
|
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
data/lib/braid/commands/push.rb
CHANGED
data/lib/braid/commands/setup.rb
CHANGED
data/lib/braid/main.rb
CHANGED
@@ -1,13 +1,24 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
1
3
|
require 'braid'
|
2
4
|
|
3
5
|
require 'rubygems'
|
4
6
|
require 'main'
|
5
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
|
+
|
6
12
|
Home = File.expand_path(ENV['HOME'] || '~')
|
7
13
|
|
8
14
|
# mostly blantantly stolen from ara's punch script
|
9
15
|
# main kicks ass!
|
10
|
-
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
|
+
|
11
22
|
description <<-TXT
|
12
23
|
braid is a simple tool to help track git repositories inside a git repository.
|
13
24
|
|
@@ -20,7 +31,8 @@ Main {
|
|
20
31
|
# The "main" library doesn't provide a way to do this??
|
21
32
|
def check_no_extra_args!
|
22
33
|
if @argv.length > 0
|
23
|
-
|
34
|
+
Braid::Command.handle_error(
|
35
|
+
Braid::BraidError.new('Extra argument(s) passed to command.'))
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
@@ -123,7 +135,7 @@ Main {
|
|
123
135
|
|
124
136
|
mixin :optional_local_path, :option_verbose, :option_keep_remote
|
125
137
|
|
126
|
-
synopsis(Main::Usage.default_synopsis(self) + ' [-- git_diff_arg*]')
|
138
|
+
synopsis(T.unsafe(Main::Usage).default_synopsis(self) + ' [-- git_diff_arg*]')
|
127
139
|
|
128
140
|
run {
|
129
141
|
if @argv.length > 0 && @argv[0] == '--'
|
@@ -318,3 +330,5 @@ Main {
|
|
318
330
|
|
319
331
|
run { help! }
|
320
332
|
}
|
333
|
+
|
334
|
+
end
|
data/lib/braid/mirror.rb
CHANGED
@@ -86,7 +86,7 @@ DESC
|
|
86
86
|
raise NoTagAndBranch if options['tag'] && options['branch']
|
87
87
|
|
88
88
|
tag = options['tag']
|
89
|
-
branch = options['branch']
|
89
|
+
branch = options['branch']
|
90
90
|
|
91
91
|
path = (options['path'] || extract_path_from_url(url, options['remote_path'])).sub(/\/$/, '')
|
92
92
|
raise PathRequired unless path
|
data/lib/braid/operations.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
1
3
|
require 'singleton'
|
2
4
|
require 'rubygems'
|
3
5
|
require 'tempfile'
|
@@ -56,7 +58,7 @@ module Braid
|
|
56
58
|
include Singleton
|
57
59
|
|
58
60
|
def self.command;
|
59
|
-
name.split('::').last.downcase;
|
61
|
+
T.unsafe(name).split('::').last.downcase;
|
60
62
|
end
|
61
63
|
|
62
64
|
# hax!
|
@@ -89,6 +91,9 @@ module Braid
|
|
89
91
|
end
|
90
92
|
|
91
93
|
def method_missing(name, *args)
|
94
|
+
# We have to use this rather than `T.unsafe` because `invoke` is
|
95
|
+
# private. See https://sorbet.org/docs/type-assertions#tbind.
|
96
|
+
T.bind(self, T.untyped)
|
92
97
|
invoke(name, *args)
|
93
98
|
end
|
94
99
|
|
@@ -138,12 +143,7 @@ module Braid
|
|
138
143
|
# 'MERGE_MSG'), taking into account worktree configuration. The returned
|
139
144
|
# path may be absolute or relative to the current working directory.
|
140
145
|
def repo_file_path(path)
|
141
|
-
|
142
|
-
invoke(:rev_parse, '--git-path', path)
|
143
|
-
else
|
144
|
-
# Git < 2.5 doesn't support linked worktrees anyway.
|
145
|
-
File.join(invoke(:rev_parse, '--git-dir'), path)
|
146
|
-
end
|
146
|
+
invoke(:rev_parse, '--git-path', path)
|
147
147
|
end
|
148
148
|
|
149
149
|
# If the current directory is not inside a git repository at all, this
|
@@ -273,7 +273,7 @@ module Braid
|
|
273
273
|
if path.nil? || path == ''
|
274
274
|
tree
|
275
275
|
else
|
276
|
-
m = /^([^ ]*) ([^ ]*) ([^\t]*)\t.*$/.match(invoke(:ls_tree, tree, path))
|
276
|
+
m = T.must(/^([^ ]*) ([^ ]*) ([^\t]*)\t.*$/.match(invoke(:ls_tree, tree, path)))
|
277
277
|
mode = m[1]
|
278
278
|
type = m[2]
|
279
279
|
hash = m[3]
|
@@ -293,9 +293,7 @@ module Braid
|
|
293
293
|
# file).
|
294
294
|
def add_item_to_index(item, path, update_worktree)
|
295
295
|
if item.is_a?(BlobWithMode)
|
296
|
-
|
297
|
-
# wasn't added until 2.0.0.
|
298
|
-
invoke(:update_index, '--add', '--cacheinfo', item.mode, item.hash, path)
|
296
|
+
invoke(:update_index, '--add', '--cacheinfo', "#{item.mode},#{item.hash},#{path}")
|
299
297
|
if update_worktree
|
300
298
|
# XXX If this fails, we've already updated the index.
|
301
299
|
invoke(:checkout_index, path)
|
@@ -390,6 +388,7 @@ module Braid
|
|
390
388
|
|
391
389
|
def clone(*args)
|
392
390
|
# overrides builtin
|
391
|
+
T.bind(self, T.untyped) # Ditto the comment in `method_missing`.
|
393
392
|
invoke(:clone, *args)
|
394
393
|
end
|
395
394
|
|
@@ -407,11 +406,11 @@ module Braid
|
|
407
406
|
dir = path(url)
|
408
407
|
|
409
408
|
# remove local cache if it was created with --no-checkout
|
410
|
-
if File.
|
409
|
+
if File.exist?("#{dir}/.git")
|
411
410
|
FileUtils.rm_r(dir)
|
412
411
|
end
|
413
412
|
|
414
|
-
if File.
|
413
|
+
if File.exist?(dir)
|
415
414
|
Dir.chdir(dir) do
|
416
415
|
git.fetch
|
417
416
|
end
|
@@ -36,6 +36,10 @@ module Braid
|
|
36
36
|
def self.must(value)
|
37
37
|
value
|
38
38
|
end
|
39
|
+
def self.unsafe(value)
|
40
|
+
value
|
41
|
+
end
|
42
|
+
def self.bind(value, type); end
|
39
43
|
|
40
44
|
class FakeType
|
41
45
|
include Singleton
|
@@ -52,6 +56,9 @@ module Braid
|
|
52
56
|
def self.untyped
|
53
57
|
FAKE_TYPE
|
54
58
|
end
|
59
|
+
def self.noreturn
|
60
|
+
FAKE_TYPE
|
61
|
+
end
|
55
62
|
Boolean = FAKE_TYPE
|
56
63
|
module Array
|
57
64
|
def self.[](type)
|
data/lib/braid/version.rb
CHANGED
data/lib/braid.rb
CHANGED
@@ -12,14 +12,13 @@ module Braid
|
|
12
12
|
# See the background in the "Supported environments" section of README.md.
|
13
13
|
#
|
14
14
|
# The newest Git feature that Braid is currently known to rely on is
|
15
|
-
# `
|
16
|
-
# spec/integration/push_spec.rb), which was added in Git 2.3.0 (in 2015). It
|
15
|
+
# `git ls-remote --symref`, which was added in Git 2.8.0 (in 2016). It
|
17
16
|
# doesn't seem worth even a small amount of work to remove that dependency and
|
18
17
|
# support even older versions of Git. So set that as the declared requirement
|
19
18
|
# for now. In general, a reasonable approach might be to try to support the
|
20
19
|
# oldest version of Git in current "long-term support" versions of popular OS
|
21
20
|
# distributions.
|
22
|
-
REQUIRED_GIT_VERSION = '2.
|
21
|
+
REQUIRED_GIT_VERSION = '2.8.0'
|
23
22
|
|
24
23
|
@verbose = T.let(false, T::Boolean)
|
25
24
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: braid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cristi Balan
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: exe
|
13
13
|
cert_chain: []
|
14
|
-
date: 2022-06-
|
14
|
+
date: 2022-06-23 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: main
|
@@ -97,6 +97,20 @@ dependencies:
|
|
97
97
|
- - ">="
|
98
98
|
- !ruby/object:Gem::Version
|
99
99
|
version: '0'
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: irb
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
type: :development
|
108
|
+
prerelease: false
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
100
114
|
description: A simple tool for tracking vendor branches in git.
|
101
115
|
email: evil@che.lu norbert.crombach@primetheory.org peter@realityforge.org matt@mattmccutchen.net
|
102
116
|
executables:
|