realityforge-braid 0.7.2 → 0.8.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.
- data/.gitignore +3 -0
- data/.ruby-version +1 -0
- data/README.md +2 -2
- data/Rakefile +4 -15
- data/bin/braid +4 -15
- data/braid.gemspec +2 -2
- data/lib/braid/command.rb +4 -28
- data/lib/braid/commands/add.rb +2 -2
- data/lib/braid/commands/setup.rb +2 -6
- data/lib/braid/config.rb +1 -8
- data/lib/braid/mirror.rb +5 -43
- data/lib/braid/operations.rb +4 -61
- data/lib/braid/version.rb +1 -1
- data/lib/braid.rb +8 -6
- data/{test/config_test.rb → spec/config_spec.rb} +14 -17
- data/{test → spec}/fixtures/shiny/README +0 -0
- data/{test → spec}/fixtures/skit1/layouts/layout.liquid +0 -0
- data/{test → spec}/fixtures/skit1/preview.png +0 -0
- data/{test → spec}/fixtures/skit1.1/layouts/layout.liquid +0 -0
- data/{test → spec}/fixtures/skit1.2/layouts/layout.liquid +0 -0
- data/spec/integration/adding_spec.rb +43 -0
- data/{test/integration/updating_test.rb → spec/integration/updating_spec.rb} +2 -41
- data/{test → spec}/integration_helper.rb +3 -26
- data/{test/mirror_test.rb → spec/mirror_spec.rb} +3 -32
- data/{test/operations_test.rb → spec/operations_spec.rb} +1 -1
- data/{test → spec}/test_helper.rb +2 -2
- metadata +100 -88
- data/lib/core_ext.rb +0 -13
- data/test/braid_test.rb +0 -7
- data/test/integration/adding_test.rb +0 -80
data/.gitignore
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.8.7-p371
|
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# Braid
|
2
2
|
|
3
|
-
Braid is a simple tool to help track git
|
3
|
+
Braid is a simple tool to help track git vendor branches in a git repository.
|
4
4
|
|
5
5
|
The project homepage is [here](http://github.com/evilchelu/braid/wikis/home).
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
9
|
-
* git 1.6+
|
9
|
+
* git 1.6+
|
10
10
|
* main >= 4.2.0
|
11
11
|
* open4 >= 1.0.1 (unless using jruby)
|
12
12
|
|
data/Rakefile
CHANGED
@@ -2,19 +2,8 @@ require 'bundler'
|
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
4
|
require 'rake'
|
5
|
-
require '
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def test_task(name, pattern)
|
10
|
-
Rake::TestTask.new(name) do |t|
|
11
|
-
ENV['TESTOPTS'] = '--runner=s'
|
12
|
-
|
13
|
-
t.libs << 'lib'
|
14
|
-
t.pattern = pattern
|
15
|
-
t.verbose = true
|
16
|
-
end
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
desc 'Run all specs'
|
7
|
+
RSpec::Core::RakeTask.new :spec do |task|
|
8
|
+
task.rspec_opts = %w{--backtrace}
|
17
9
|
end
|
18
|
-
|
19
|
-
test_task(:test, "test/*_test.rb")
|
20
|
-
namespace(:test) { test_task(:integration, "test/integration/*_test.rb") }
|
data/bin/braid
CHANGED
@@ -12,7 +12,7 @@ Home = File.expand_path(ENV['HOME'] || '~')
|
|
12
12
|
# main kicks ass!
|
13
13
|
Main {
|
14
14
|
description <<-TXT
|
15
|
-
braid is a simple tool to help track git
|
15
|
+
braid is a simple tool to help track git repositories inside a git repository.
|
16
16
|
|
17
17
|
Run 'braid commandname help' for more details.
|
18
18
|
|
@@ -25,16 +25,9 @@ Main {
|
|
25
25
|
Add a new mirror to be tracked.
|
26
26
|
|
27
27
|
* adds metadata about the mirror to .braids
|
28
|
-
* adds the git
|
28
|
+
* adds the git remotes to .git/config
|
29
29
|
* fetches and merges remote code into given directory
|
30
30
|
|
31
|
-
--type defaults:
|
32
|
-
|
33
|
-
* svn://path # => svn
|
34
|
-
* git://path # => git
|
35
|
-
* http://path/trunk # => svn
|
36
|
-
* http://path.git # => git
|
37
|
-
|
38
31
|
Name defaults:
|
39
32
|
|
40
33
|
* remote/path # => path
|
@@ -43,12 +36,8 @@ Main {
|
|
43
36
|
TXT
|
44
37
|
|
45
38
|
examples <<-TXT
|
46
|
-
. braid add svn://remote/path
|
47
|
-
. braid add svn://remote/path local/dir
|
48
|
-
. braid add git://remote/path local/dir
|
49
39
|
. braid add http://remote/path.git local/dir
|
50
|
-
. braid add http://remote/path
|
51
|
-
. braid add svn://remote/path --branch notmaster
|
40
|
+
. braid add http://remote/path local/dir
|
52
41
|
TXT
|
53
42
|
|
54
43
|
mixin :argument_url, :option_type, :optional_path, :option_branch, :option_rails_plugin, :option_revision, :option_full, :option_verbose
|
@@ -134,7 +123,7 @@ Main {
|
|
134
123
|
|
135
124
|
mode(:setup) {
|
136
125
|
description <<-TXT
|
137
|
-
Set up git
|
126
|
+
Set up git remotes.
|
138
127
|
TXT
|
139
128
|
|
140
129
|
mixin :optional_path, :option_verbose, :option_force
|
data/braid.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.rubyforge_project = %q{braid}
|
18
18
|
|
19
19
|
s.files = `git ls-files`.split("\n")
|
20
|
-
s.test_files = `git ls-files -- {
|
20
|
+
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
22
22
|
s.default_executable = %q{braid}
|
23
23
|
s.require_paths = ["lib"]
|
@@ -28,6 +28,6 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_dependency(%q<main>, [">= 4.7.3"])
|
29
29
|
s.add_dependency(%q<open4>, [">= 1.0.1"]) unless defined?(JRUBY_VERSION)
|
30
30
|
|
31
|
-
s.add_development_dependency(%q<
|
31
|
+
s.add_development_dependency(%q<rspec>, ["= 2.12.0"])
|
32
32
|
s.add_development_dependency(%q<mocha>, [">= 0.9.11"])
|
33
33
|
end
|
data/lib/braid/command.rb
CHANGED
@@ -89,48 +89,24 @@ module Braid
|
|
89
89
|
|
90
90
|
def display_revision(mirror, revision = nil)
|
91
91
|
revision ||= mirror.revision
|
92
|
-
|
92
|
+
"'#{revision[0, 7]}'"
|
93
93
|
end
|
94
94
|
|
95
95
|
def validate_new_revision(mirror, new_revision)
|
96
|
-
unless new_revision
|
97
|
-
unless mirror.type == "svn"
|
98
|
-
return git.rev_parse(mirror.remote)
|
99
|
-
else
|
100
|
-
return svn.head_revision(mirror.url)
|
101
|
-
end
|
102
|
-
end
|
96
|
+
return git.rev_parse(mirror.remote) unless new_revision
|
103
97
|
|
104
|
-
|
105
|
-
new_revision = git.rev_parse(new_revision)
|
106
|
-
else
|
107
|
-
new_revision = svn.clean_revision(new_revision)
|
108
|
-
end
|
98
|
+
new_revision = git.rev_parse(new_revision)
|
109
99
|
old_revision = mirror.revision
|
110
100
|
|
111
101
|
if new_revision == old_revision
|
112
102
|
raise InvalidRevision, "mirror is already at requested revision"
|
113
103
|
end
|
114
104
|
|
115
|
-
if mirror.type == "svn"
|
116
|
-
if old_revision && new_revision < old_revision
|
117
|
-
raise InvalidRevision, "local revision is higher than request revision"
|
118
|
-
end
|
119
|
-
|
120
|
-
if svn.head_revision(mirror.url) < new_revision
|
121
|
-
raise InvalidRevision, "requested revision is higher than remote revision"
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
105
|
new_revision
|
126
106
|
end
|
127
107
|
|
128
108
|
def determine_target_revision(mirror, new_revision)
|
129
|
-
|
130
|
-
git.rev_parse(new_revision)
|
131
|
-
else
|
132
|
-
git_svn.commit_hash(mirror.remote, new_revision)
|
133
|
-
end
|
109
|
+
git.rev_parse(new_revision)
|
134
110
|
end
|
135
111
|
end
|
136
112
|
end
|
data/lib/braid/commands/add.rb
CHANGED
@@ -7,9 +7,9 @@ module Braid
|
|
7
7
|
with_reset_on_error do
|
8
8
|
mirror = config.add_from_options(url, options)
|
9
9
|
|
10
|
-
branch_message = (mirror.
|
10
|
+
branch_message = (mirror.branch == "master") ? "" : " branch '#{mirror.branch}'"
|
11
11
|
revision_message = options["revision"] ? " at #{display_revision(mirror, options["revision"])}" : ""
|
12
|
-
msg "Adding
|
12
|
+
msg "Adding mirror of '#{mirror.url}'#{branch_message}#{revision_message}."
|
13
13
|
|
14
14
|
# these commands are explained in the subtree merge guide
|
15
15
|
# http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
|
data/lib/braid/commands/setup.rb
CHANGED
@@ -28,12 +28,8 @@ module Braid
|
|
28
28
|
end
|
29
29
|
|
30
30
|
msg "Setup: Creating remote for '#{mirror.path}'."
|
31
|
-
|
32
|
-
|
33
|
-
git.remote_add(mirror.remote, url, mirror.branch)
|
34
|
-
else
|
35
|
-
git_svn.init(mirror.remote, mirror.url)
|
36
|
-
end
|
31
|
+
url = use_local_cache? ? git_cache.path(mirror.url) : mirror.url
|
32
|
+
git.remote_add(mirror.remote, url, mirror.branch)
|
37
33
|
end
|
38
34
|
end
|
39
35
|
end
|
data/lib/braid/config.rb
CHANGED
@@ -1,9 +1,4 @@
|
|
1
1
|
require 'yaml'
|
2
|
-
|
3
|
-
# psych throws such wonderful errors as:
|
4
|
-
# `@vendor/rails' is not allowed as an instance variable name (NameError)
|
5
|
-
YAML::ENGINE.yamler = 'syck' if RUBY_VERSION >= '1.9.1'
|
6
|
-
|
7
2
|
require 'yaml/store'
|
8
3
|
|
9
4
|
module Braid
|
@@ -73,9 +68,7 @@ module Braid
|
|
73
68
|
|
74
69
|
def valid?
|
75
70
|
@db.transaction(true) do
|
76
|
-
!@db.roots.any?
|
77
|
-
@db[path]["url"].nil?
|
78
|
-
end
|
71
|
+
!@db.roots.any? {|path| @db[path]["url"].nil?}
|
79
72
|
end
|
80
73
|
end
|
81
74
|
|
data/lib/braid/mirror.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Braid
|
2
2
|
class Mirror
|
3
|
-
TYPES = %w(git svn)
|
4
3
|
ATTRIBUTES = %w(url remote type branch squashed revision lock)
|
5
4
|
|
6
5
|
class UnknownType < BraidError
|
@@ -8,11 +7,6 @@ module Braid
|
|
8
7
|
"unknown type: #{super}"
|
9
8
|
end
|
10
9
|
end
|
11
|
-
class CannotGuessType < BraidError
|
12
|
-
def message
|
13
|
-
"cannot guess type: #{super}"
|
14
|
-
end
|
15
|
-
end
|
16
10
|
class PathRequired < BraidError
|
17
11
|
def message
|
18
12
|
"path is required"
|
@@ -33,12 +27,6 @@ module Braid
|
|
33
27
|
|
34
28
|
branch = options["branch"] || "master"
|
35
29
|
|
36
|
-
if type = options["type"] || extract_type_from_url(url)
|
37
|
-
raise UnknownType, type unless TYPES.include?(type)
|
38
|
-
else
|
39
|
-
raise CannotGuessType, url
|
40
|
-
end
|
41
|
-
|
42
30
|
unless path = options["path"] || extract_path_from_url(url)
|
43
31
|
raise PathRequired
|
44
32
|
end
|
@@ -47,11 +35,10 @@ module Braid
|
|
47
35
|
path = "vendor/plugins/#{path}"
|
48
36
|
end
|
49
37
|
|
50
|
-
remote = "#{branch}/braid/#{path}"
|
38
|
+
remote = "#{branch}/braid/#{path}"
|
51
39
|
squashed = !options["full"]
|
52
|
-
branch = nil if type == "svn"
|
53
40
|
|
54
|
-
attributes = {"url" => url, "remote" => remote, "
|
41
|
+
attributes = {"url" => url, "remote" => remote, "branch" => branch, "squashed" => squashed}
|
55
42
|
self.new(path, attributes)
|
56
43
|
end
|
57
44
|
|
@@ -59,11 +46,6 @@ module Braid
|
|
59
46
|
path == comparison.path && attributes == comparison.attributes
|
60
47
|
end
|
61
48
|
|
62
|
-
def type
|
63
|
-
# override Object#type
|
64
|
-
attributes["type"]
|
65
|
-
end
|
66
|
-
|
67
49
|
def locked?
|
68
50
|
!!lock
|
69
51
|
end
|
@@ -90,12 +72,8 @@ module Braid
|
|
90
72
|
end
|
91
73
|
|
92
74
|
def fetch
|
93
|
-
|
94
|
-
|
95
|
-
git.fetch(remote)
|
96
|
-
else
|
97
|
-
git_svn.fetch(remote)
|
98
|
-
end
|
75
|
+
git_cache.fetch(url) if cached?
|
76
|
+
git.fetch(remote)
|
99
77
|
end
|
100
78
|
|
101
79
|
def cached?
|
@@ -104,11 +82,7 @@ module Braid
|
|
104
82
|
|
105
83
|
def base_revision
|
106
84
|
if revision
|
107
|
-
|
108
|
-
git.rev_parse(revision)
|
109
|
-
else
|
110
|
-
git_svn.commit_hash(remote, revision)
|
111
|
-
end
|
85
|
+
git.rev_parse(revision)
|
112
86
|
else
|
113
87
|
inferred_revision
|
114
88
|
end
|
@@ -156,18 +130,6 @@ module Braid
|
|
156
130
|
hash
|
157
131
|
end
|
158
132
|
|
159
|
-
def self.extract_type_from_url(url)
|
160
|
-
return nil unless url
|
161
|
-
url.sub!(/\/$/, '')
|
162
|
-
|
163
|
-
# check for git:// and svn:// URLs
|
164
|
-
url_scheme = url.split(":").first
|
165
|
-
return url_scheme if TYPES.include?(url_scheme)
|
166
|
-
|
167
|
-
return "svn" if url[-6..-1] == "/trunk"
|
168
|
-
return "git" if url[-4..-1] == ".git"
|
169
|
-
end
|
170
|
-
|
171
133
|
def self.extract_path_from_url(url)
|
172
134
|
return nil unless url
|
173
135
|
name = File.basename(url)
|
data/lib/braid/operations.rb
CHANGED
@@ -41,7 +41,7 @@ module Braid
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
# The command proxy is meant to encapsulate commands such as git,
|
44
|
+
# The command proxy is meant to encapsulate commands such as git, that work with subcommands.
|
45
45
|
class Proxy
|
46
46
|
include Singleton
|
47
47
|
|
@@ -157,6 +157,7 @@ module Braid
|
|
157
157
|
message_file = Tempfile.new("braid_commit")
|
158
158
|
message_file.print("Braid: #{message}")
|
159
159
|
message_file.flush
|
160
|
+
message_file.close
|
160
161
|
cmd << " -F #{message_file.path}"
|
161
162
|
end
|
162
163
|
cmd << " #{args.join(' ')}" unless args.empty?
|
@@ -207,14 +208,10 @@ module Braid
|
|
207
208
|
true
|
208
209
|
end
|
209
210
|
|
210
|
-
# Checks git
|
211
|
+
# Checks git remotes.
|
211
212
|
def remote_url(remote)
|
212
213
|
key = "remote.#{remote}.url"
|
213
|
-
|
214
|
-
invoke(:config, key)
|
215
|
-
rescue ShellExecutionError
|
216
|
-
invoke(:config, "svn-#{key}")
|
217
|
-
end
|
214
|
+
invoke(:config, key)
|
218
215
|
rescue ShellExecutionError
|
219
216
|
nil
|
220
217
|
end
|
@@ -320,52 +317,6 @@ module Braid
|
|
320
317
|
end
|
321
318
|
end
|
322
319
|
|
323
|
-
class GitSvn < Proxy
|
324
|
-
def self.command;
|
325
|
-
"git svn";
|
326
|
-
end
|
327
|
-
|
328
|
-
def commit_hash(remote, revision)
|
329
|
-
out = invoke(:log, "--show-commit --oneline", "-r #{revision}", remote)
|
330
|
-
part = out.to_s.split("|")[1]
|
331
|
-
part.strip!
|
332
|
-
raise UnknownRevision, "r#{revision}" unless part
|
333
|
-
git.rev_parse(part)
|
334
|
-
end
|
335
|
-
|
336
|
-
def fetch(remote)
|
337
|
-
sh("git svn fetch #{remote} 2>&1 >/dev/null")
|
338
|
-
end
|
339
|
-
|
340
|
-
def init(remote, path)
|
341
|
-
invoke(:init, "-R", remote, "--id=#{remote}", path)
|
342
|
-
true
|
343
|
-
end
|
344
|
-
|
345
|
-
private
|
346
|
-
|
347
|
-
def command(name)
|
348
|
-
"#{self.class.command} #{name}"
|
349
|
-
end
|
350
|
-
|
351
|
-
def git
|
352
|
-
Git.instance
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
class Svn < Proxy
|
357
|
-
def clean_revision(revision)
|
358
|
-
revision.to_i if revision
|
359
|
-
end
|
360
|
-
|
361
|
-
def head_revision(path)
|
362
|
-
# not using svn info because it's retarded and doesn't show the actual last changed rev for the url
|
363
|
-
# git svn has no clue on how to get the actual HEAD revision number on it's own
|
364
|
-
status, out, err = exec!("svn log -q --limit 1 #{path}")
|
365
|
-
out.split(/\n/).find { |x| x.match /^r\d+/ }.split(" | ")[0][1..-1].to_i
|
366
|
-
end
|
367
|
-
end
|
368
|
-
|
369
320
|
class GitCache
|
370
321
|
include Singleton
|
371
322
|
|
@@ -407,14 +358,6 @@ module Braid
|
|
407
358
|
Git.instance
|
408
359
|
end
|
409
360
|
|
410
|
-
def git_svn
|
411
|
-
GitSvn.instance
|
412
|
-
end
|
413
|
-
|
414
|
-
def svn
|
415
|
-
Svn.instance
|
416
|
-
end
|
417
|
-
|
418
361
|
def git_cache
|
419
362
|
GitCache.instance
|
420
363
|
end
|
data/lib/braid/version.rb
CHANGED
data/lib/braid.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
$:.unshift dirname = File.dirname(__FILE__)
|
2
1
|
require 'braid/version'
|
3
2
|
|
4
3
|
module Braid
|
@@ -37,12 +36,15 @@ module Braid
|
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
40
|
-
require
|
39
|
+
#require 'braid/core_ext'
|
41
40
|
require 'braid/operations'
|
42
41
|
require 'braid/mirror'
|
43
42
|
require 'braid/config'
|
44
43
|
require 'braid/command'
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
44
|
+
require 'braid/commands/add'
|
45
|
+
require 'braid/commands/diff'
|
46
|
+
require 'braid/commands/list'
|
47
|
+
require 'braid/commands/push'
|
48
|
+
require 'braid/commands/remove'
|
49
|
+
require 'braid/commands/setup'
|
50
|
+
require 'braid/commands/update'
|
@@ -1,52 +1,49 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
db = "tmp.yml"
|
5
|
-
|
3
|
+
describe "Braid::Config, when empty" do
|
6
4
|
before(:each) do
|
7
|
-
@config = Braid::Config.new(
|
5
|
+
@config = Braid::Config.new("tmp.yml")
|
8
6
|
end
|
9
7
|
|
10
8
|
after(:each) do
|
11
|
-
FileUtils.rm(
|
9
|
+
FileUtils.rm("tmp.yml") rescue nil
|
12
10
|
end
|
13
|
-
end
|
14
|
-
|
15
|
-
describe "Braid::Config, when empty" do
|
16
|
-
it_should_behave_like "Braid::Config, in general"
|
17
11
|
|
18
12
|
it "should not get a mirror by name" do
|
19
|
-
@config.get("path").should
|
20
|
-
lambda { @config.get!("path") }.should
|
13
|
+
@config.get("path").should be_nil
|
14
|
+
lambda { @config.get!("path") }.should raise_error(Braid::Config::MirrorDoesNotExist)
|
21
15
|
end
|
22
16
|
|
23
17
|
it "should add a mirror and its params" do
|
24
18
|
@mirror = build_mirror
|
25
19
|
@config.add(@mirror)
|
26
|
-
@config.get("path").path.
|
20
|
+
@config.get("path").path.should_not be_nil
|
27
21
|
end
|
28
22
|
end
|
29
23
|
|
30
24
|
describe "Braid::Config, with one mirror" do
|
31
|
-
it_should_behave_like "Braid::Config, in general"
|
32
|
-
|
33
25
|
before(:each) do
|
26
|
+
@config = Braid::Config.new("tmp.yml")
|
34
27
|
@mirror = build_mirror
|
35
28
|
@config.add(@mirror)
|
36
29
|
end
|
37
30
|
|
31
|
+
after(:each) do
|
32
|
+
FileUtils.rm("tmp.yml") rescue nil
|
33
|
+
end
|
34
|
+
|
38
35
|
it "should get the mirror by name" do
|
39
36
|
@config.get("path").should == @mirror
|
40
37
|
@config.get!("path").should == @mirror
|
41
38
|
end
|
42
39
|
|
43
40
|
it "should raise when trying to overwrite a mirror on add" do
|
44
|
-
lambda { @config.add(@mirror) }.should
|
41
|
+
lambda { @config.add(@mirror) }.should raise_error(Braid::Config::PathAlreadyInUse)
|
45
42
|
end
|
46
43
|
|
47
44
|
it "should remove the mirror" do
|
48
45
|
@config.remove(@mirror)
|
49
|
-
@config.get("path").should
|
46
|
+
@config.get("path").should be_nil
|
50
47
|
end
|
51
48
|
|
52
49
|
it "should update the mirror with new params" do
|
@@ -57,6 +54,6 @@ describe "Braid::Config, with one mirror" do
|
|
57
54
|
|
58
55
|
it "should raise when trying to update nonexistent mirror" do
|
59
56
|
@mirror.instance_variable_set("@path", "other")
|
60
|
-
lambda { @config.update(@mirror) }.should
|
57
|
+
lambda { @config.update(@mirror) }.should raise_error(Braid::Config::MirrorDoesNotExist)
|
61
58
|
end
|
62
59
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../integration_helper'
|
2
|
+
|
3
|
+
describe "Adding a mirror in a clean repository" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
FileUtils.rm_rf(TMP_PATH)
|
7
|
+
FileUtils.mkdir_p(TMP_PATH)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "from a git repository" do
|
11
|
+
before do
|
12
|
+
@shiny = create_git_repo_from_fixture("shiny")
|
13
|
+
@skit1 = create_git_repo_from_fixture("skit1")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should add the files and commit" do
|
17
|
+
in_dir(@shiny) do
|
18
|
+
`#{BRAID_BIN} add #{@skit1}`
|
19
|
+
end
|
20
|
+
|
21
|
+
file_name = "skit1/layouts/layout.liquid"
|
22
|
+
output = `diff -U 3 #{File.join(FIXTURE_PATH, file_name)} #{File.join(TMP_PATH, "shiny", file_name)}`
|
23
|
+
$?.should be_success
|
24
|
+
|
25
|
+
output = `git log --pretty=oneline`.split("\n")
|
26
|
+
output.length.should == 2
|
27
|
+
output[0].should =~ /Braid: Add mirror 'skit1' at '[0-9a-f]{7}'/
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should create .braids and add the mirror to it" do
|
31
|
+
in_dir(@shiny) do
|
32
|
+
`#{BRAID_BIN} add #{@skit1}`
|
33
|
+
end
|
34
|
+
|
35
|
+
braids = YAML::load_file("#{@shiny}/.braids")
|
36
|
+
braids["skit1"]["squashed"].should == true
|
37
|
+
braids["skit1"]["url"].should == @skit1
|
38
|
+
braids["skit1"]["revision"].should_not be_nil
|
39
|
+
braids["skit1"]["branch"].should == "master"
|
40
|
+
braids["skit1"]["remote"].should == "master/braid/skit1"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -13,7 +13,7 @@ describe "Updating a mirror without conflicts" do
|
|
13
13
|
@skit1 = create_git_repo_from_fixture("skit1")
|
14
14
|
|
15
15
|
in_dir(@shiny) do
|
16
|
-
`#{BRAID_BIN} add
|
16
|
+
`#{BRAID_BIN} add #{@skit1}`
|
17
17
|
end
|
18
18
|
|
19
19
|
update_dir_from_fixture("skit1", "skit1.1")
|
@@ -37,7 +37,7 @@ describe "Updating a mirror without conflicts" do
|
|
37
37
|
|
38
38
|
file_name = "layouts/layout.liquid"
|
39
39
|
output = `diff -U 3 #{File.join(FIXTURE_PATH, "skit1.2", file_name)} #{File.join(TMP_PATH, "shiny", "skit1", file_name)}`
|
40
|
-
$?.should
|
40
|
+
$?.should be_success
|
41
41
|
|
42
42
|
output = `git log --pretty=oneline`.split("\n")
|
43
43
|
output.length.should == 3
|
@@ -45,43 +45,4 @@ describe "Updating a mirror without conflicts" do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
end
|
48
|
-
|
49
|
-
describe "from a svn repository" do
|
50
|
-
before do
|
51
|
-
@shiny = create_git_repo_from_fixture("shiny")
|
52
|
-
@skit1 = create_svn_repo_from_fixture("skit1")
|
53
|
-
@skit1_wc = File.join(TMP_PATH, "skit1_wc")
|
54
|
-
|
55
|
-
in_dir(@shiny) do
|
56
|
-
`#{BRAID_BIN} add --type svn #{@skit1}`
|
57
|
-
end
|
58
|
-
|
59
|
-
update_dir_from_fixture("skit1_wc", "skit1.1")
|
60
|
-
in_dir(@skit1_wc) do
|
61
|
-
`svn commit -m "change default color"`
|
62
|
-
end
|
63
|
-
|
64
|
-
update_dir_from_fixture("skit1_wc", "skit1.2")
|
65
|
-
in_dir(@skit1_wc) do
|
66
|
-
`svn commit -m "add a happy note"`
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should add the files and commit" do
|
72
|
-
in_dir(@shiny) do
|
73
|
-
`#{BRAID_BIN} update skit1`
|
74
|
-
end
|
75
|
-
|
76
|
-
file_name = "layouts/layout.liquid"
|
77
|
-
output = `diff -U 3 #{File.join(FIXTURE_PATH, "skit1.2", file_name)} #{File.join(TMP_PATH, "shiny", "skit1", file_name)}`
|
78
|
-
$?.should.be.success
|
79
|
-
|
80
|
-
output = `git log --pretty=oneline`.split("\n")
|
81
|
-
output.length.should == 3
|
82
|
-
output[0].should =~ /Braid: Update mirror 'skit1' to r3/
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
48
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
3
|
-
require 'mocha'
|
2
|
+
require 'rspec'
|
3
|
+
require 'mocha/api'
|
4
4
|
|
5
5
|
require 'tempfile'
|
6
6
|
require 'fileutils'
|
@@ -8,15 +8,11 @@ require 'pathname'
|
|
8
8
|
|
9
9
|
TMP_PATH = File.join(Dir.tmpdir, "braid_integration")
|
10
10
|
BRAID_PATH = Pathname.new(File.dirname(__FILE__)).parent.realpath
|
11
|
-
FIXTURE_PATH = File.join(BRAID_PATH, "
|
11
|
+
FIXTURE_PATH = File.join(BRAID_PATH, "spec", "fixtures")
|
12
12
|
FileUtils.rm_rf(TMP_PATH)
|
13
13
|
FileUtils.mkdir_p(TMP_PATH)
|
14
14
|
BRAID_BIN = File.join(BRAID_PATH, "bin", "braid")
|
15
15
|
|
16
|
-
#def exec(cmd)
|
17
|
-
# `cd #{TMP} && #{cmd}`
|
18
|
-
#end
|
19
|
-
|
20
16
|
def in_dir(dir = TMP_PATH)
|
21
17
|
Dir.chdir(dir)
|
22
18
|
yield
|
@@ -49,22 +45,3 @@ def create_git_repo_from_fixture(fixture_name)
|
|
49
45
|
|
50
46
|
git_repo
|
51
47
|
end
|
52
|
-
|
53
|
-
def create_svn_repo_from_fixture(fixture_name)
|
54
|
-
svn_wc = File.join(TMP_PATH, fixture_name + "_wc")
|
55
|
-
svn_repo = File.join(TMP_PATH, fixture_name)
|
56
|
-
run_cmds(<<-EOD)
|
57
|
-
svnadmin create #{svn_repo}
|
58
|
-
svn co file://#{svn_repo} #{svn_wc}
|
59
|
-
EOD
|
60
|
-
update_dir_from_fixture(fixture_name + "_wc", fixture_name)
|
61
|
-
in_dir(svn_wc) do
|
62
|
-
run_cmds(<<-EOD)
|
63
|
-
svn add *
|
64
|
-
svn commit -m "initial commit of #{fixture_name}"
|
65
|
-
EOD
|
66
|
-
end
|
67
|
-
"file://#{svn_repo}"
|
68
|
-
end
|
69
|
-
|
70
|
-
|
@@ -6,35 +6,6 @@ describe "Braid::Mirror.new_from_options" do
|
|
6
6
|
@mirror.branch.should == "master"
|
7
7
|
end
|
8
8
|
|
9
|
-
it "should default type to git, from protocol" do
|
10
|
-
new_from_options("git://path")
|
11
|
-
@mirror.type.should == "git"
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should default type to git, if path ends in .git" do
|
15
|
-
new_from_options("http://path.git")
|
16
|
-
@mirror.type.should == "git"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should default type to svn, from protocol" do
|
20
|
-
new_from_options("svn://path")
|
21
|
-
@mirror.type.should == "svn"
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should default type to svn, if path ends in /trunk" do
|
25
|
-
new_from_options("http://path/trunk")
|
26
|
-
@mirror.type.should == "svn"
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should raise if no type can be guessed" do
|
30
|
-
lambda { new_from_options("http://path") }.should.raise(Braid::Mirror::CannotGuessType)
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should default mirror to previous to last path part, if last path part is /trunk" do
|
34
|
-
new_from_options("http://path/trunk")
|
35
|
-
@mirror.path.should == "path"
|
36
|
-
end
|
37
|
-
|
38
9
|
it "should default mirror to last path part, ignoring trailing .git" do
|
39
10
|
new_from_options("http://path.git")
|
40
11
|
@mirror.path.should == "path"
|
@@ -69,7 +40,7 @@ end
|
|
69
40
|
describe "Braid::Mirror#base_revision" do
|
70
41
|
it "should be inferred when no revision is set" do
|
71
42
|
@mirror = build_mirror
|
72
|
-
@mirror.revision.should
|
43
|
+
@mirror.revision.should be_nil
|
73
44
|
@mirror.expects(:inferred_revision).returns('b' * 40)
|
74
45
|
@mirror.base_revision.should == 'b' * 40
|
75
46
|
end
|
@@ -100,11 +71,11 @@ describe "Braid::Mirror#cached?" do
|
|
100
71
|
|
101
72
|
it "should be true when the remote path matches the cache path" do
|
102
73
|
git.expects(:remote_url).with(@mirror.remote).returns(git_cache.path(@mirror.url))
|
103
|
-
@mirror.should
|
74
|
+
@mirror.should be_cached
|
104
75
|
end
|
105
76
|
|
106
77
|
it "should be false if the remote does not point to the cache" do
|
107
78
|
git.expects(:remote_url).with(@mirror.remote).returns(@mirror.url)
|
108
|
-
@mirror.
|
79
|
+
@mirror.should_not be_cached
|
109
80
|
end
|
110
81
|
end
|
@@ -18,7 +18,7 @@ describe "Braid::Operations::Git#rev_parse" do
|
|
18
18
|
it "should raise a revision error when the hash is not found" do
|
19
19
|
ambiguous_revision = 'b' * 7
|
20
20
|
git.expects(:exec).returns([1, ambiguous_revision, "fatal: ..."])
|
21
|
-
lambda { git.rev_parse(ambiguous_revision) }.should
|
21
|
+
lambda { git.rev_parse(ambiguous_revision) }.should raise_error(Braid::Operations::UnknownRevision)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
metadata
CHANGED
@@ -1,89 +1,99 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: realityforge-braid
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Cristi Balan
|
9
14
|
- Norbert Crombach
|
10
15
|
autorequire:
|
11
16
|
bindir: bin
|
12
17
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
18
|
+
|
19
|
+
date: 2013-02-11 00:00:00 +11:00
|
20
|
+
default_executable: braid
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
16
23
|
name: main
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
|
-
requirements:
|
20
|
-
- - ! '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 4.7.3
|
23
|
-
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
26
|
none: false
|
27
|
-
requirements:
|
28
|
-
- -
|
29
|
-
- !ruby/object:Gem::Version
|
27
|
+
requirements:
|
28
|
+
- - ">="
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
hash: 37
|
31
|
+
segments:
|
32
|
+
- 4
|
33
|
+
- 7
|
34
|
+
- 3
|
30
35
|
version: 4.7.3
|
31
|
-
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
38
|
+
- !ruby/object:Gem::Dependency
|
32
39
|
name: open4
|
33
|
-
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
34
42
|
none: false
|
35
|
-
requirements:
|
36
|
-
- -
|
37
|
-
- !ruby/object:Gem::Version
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
hash: 21
|
47
|
+
segments:
|
48
|
+
- 1
|
49
|
+
- 0
|
50
|
+
- 1
|
38
51
|
version: 1.0.1
|
39
52
|
type: :runtime
|
53
|
+
version_requirements: *id002
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: rspec
|
40
56
|
prerelease: false
|
41
|
-
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 1.0.1
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: test-spec
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
58
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
59
|
+
requirements:
|
60
|
+
- - "="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
hash: 63
|
63
|
+
segments:
|
64
|
+
- 2
|
65
|
+
- 12
|
66
|
+
- 0
|
67
|
+
version: 2.12.0
|
55
68
|
type: :development
|
56
|
-
|
57
|
-
|
58
|
-
none: false
|
59
|
-
requirements:
|
60
|
-
- - ! '>='
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 0.10.0
|
63
|
-
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: *id003
|
70
|
+
- !ruby/object:Gem::Dependency
|
64
71
|
name: mocha
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
|
-
requirements:
|
68
|
-
- - ! '>='
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 0.9.11
|
71
|
-
type: :development
|
72
72
|
prerelease: false
|
73
|
-
|
73
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
|
-
requirements:
|
76
|
-
- -
|
77
|
-
- !ruby/object:Gem::Version
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
hash: 45
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
- 9
|
82
|
+
- 11
|
78
83
|
version: 0.9.11
|
84
|
+
type: :development
|
85
|
+
version_requirements: *id004
|
79
86
|
description: A simple tool for tracking vendor branches in git.
|
80
87
|
email: evil@che.lu
|
81
|
-
executables:
|
88
|
+
executables:
|
82
89
|
- braid
|
83
90
|
extensions: []
|
91
|
+
|
84
92
|
extra_rdoc_files: []
|
85
|
-
|
93
|
+
|
94
|
+
files:
|
86
95
|
- .gitignore
|
96
|
+
- .ruby-version
|
87
97
|
- Gemfile
|
88
98
|
- LICENSE
|
89
99
|
- README.md
|
@@ -103,53 +113,55 @@ files:
|
|
103
113
|
- lib/braid/mirror.rb
|
104
114
|
- lib/braid/operations.rb
|
105
115
|
- lib/braid/version.rb
|
106
|
-
-
|
107
|
-
-
|
108
|
-
-
|
109
|
-
-
|
110
|
-
-
|
111
|
-
-
|
112
|
-
-
|
113
|
-
-
|
114
|
-
-
|
115
|
-
-
|
116
|
-
-
|
117
|
-
-
|
118
|
-
|
119
|
-
- test/test_helper.rb
|
116
|
+
- spec/config_spec.rb
|
117
|
+
- spec/fixtures/shiny/README
|
118
|
+
- spec/fixtures/skit1.1/layouts/layout.liquid
|
119
|
+
- spec/fixtures/skit1.2/layouts/layout.liquid
|
120
|
+
- spec/fixtures/skit1/layouts/layout.liquid
|
121
|
+
- spec/fixtures/skit1/preview.png
|
122
|
+
- spec/integration/adding_spec.rb
|
123
|
+
- spec/integration/updating_spec.rb
|
124
|
+
- spec/integration_helper.rb
|
125
|
+
- spec/mirror_spec.rb
|
126
|
+
- spec/operations_spec.rb
|
127
|
+
- spec/test_helper.rb
|
128
|
+
has_rdoc: true
|
120
129
|
homepage: http://evil.che.lu/projects/braid
|
121
130
|
licenses: []
|
131
|
+
|
122
132
|
post_install_message:
|
123
|
-
rdoc_options:
|
133
|
+
rdoc_options:
|
124
134
|
- --line-numbers
|
125
135
|
- --inline-source
|
126
136
|
- --title
|
127
137
|
- braid
|
128
138
|
- --main
|
129
|
-
require_paths:
|
139
|
+
require_paths:
|
130
140
|
- lib
|
131
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
142
|
none: false
|
133
|
-
requirements:
|
134
|
-
- -
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
|
137
|
-
segments:
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
hash: 3
|
147
|
+
segments:
|
138
148
|
- 0
|
139
|
-
|
140
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
version: "0"
|
150
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
151
|
none: false
|
142
|
-
requirements:
|
143
|
-
- -
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
|
146
|
-
segments:
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
hash: 3
|
156
|
+
segments:
|
147
157
|
- 0
|
148
|
-
|
158
|
+
version: "0"
|
149
159
|
requirements: []
|
160
|
+
|
150
161
|
rubyforge_project: braid
|
151
|
-
rubygems_version: 1.
|
162
|
+
rubygems_version: 1.6.2
|
152
163
|
signing_key:
|
153
164
|
specification_version: 3
|
154
165
|
summary: A simple tool for tracking vendor branches in git.
|
155
166
|
test_files: []
|
167
|
+
|
data/lib/core_ext.rb
DELETED
data/test/braid_test.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../integration_helper'
|
2
|
-
|
3
|
-
describe "Adding a mirror in a clean repository" do
|
4
|
-
|
5
|
-
before do
|
6
|
-
FileUtils.rm_rf(TMP_PATH)
|
7
|
-
FileUtils.mkdir_p(TMP_PATH)
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "from a git repository" do
|
11
|
-
before do
|
12
|
-
@shiny = create_git_repo_from_fixture("shiny")
|
13
|
-
@skit1 = create_git_repo_from_fixture("skit1")
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should add the files and commit" do
|
17
|
-
in_dir(@shiny) do
|
18
|
-
`#{BRAID_BIN} add --type git #{@skit1}`
|
19
|
-
end
|
20
|
-
|
21
|
-
file_name = "skit1/layouts/layout.liquid"
|
22
|
-
output = `diff -U 3 #{File.join(FIXTURE_PATH, file_name)} #{File.join(TMP_PATH, "shiny", file_name)}`
|
23
|
-
$?.should.be.success
|
24
|
-
|
25
|
-
output = `git log --pretty=oneline`.split("\n")
|
26
|
-
output.length.should == 2
|
27
|
-
output[0].should =~ /Braid: Add mirror 'skit1' at '[0-9a-f]{7}'/
|
28
|
-
end
|
29
|
-
|
30
|
-
it "should create .braids and add the mirror to it" do
|
31
|
-
in_dir(@shiny) do
|
32
|
-
`#{BRAID_BIN} add --type git #{@skit1}`
|
33
|
-
end
|
34
|
-
|
35
|
-
braids = YAML::load_file("#{@shiny}/.braids")
|
36
|
-
braids["skit1"]["squashed"].should == true
|
37
|
-
braids["skit1"]["url"].should == @skit1
|
38
|
-
braids["skit1"]["type"].should == "git"
|
39
|
-
braids["skit1"]["revision"].should.not.be nil
|
40
|
-
braids["skit1"]["branch"].should == "master"
|
41
|
-
braids["skit1"]["remote"].should == "braid/skit1"
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "from an svn repository" do
|
46
|
-
before do
|
47
|
-
@shiny = create_git_repo_from_fixture("shiny")
|
48
|
-
@skit1 = create_svn_repo_from_fixture("skit1")
|
49
|
-
end
|
50
|
-
|
51
|
-
it "should add the files and commit" do
|
52
|
-
in_dir(@shiny) do
|
53
|
-
`#{BRAID_BIN} add --type svn #{@skit1}`
|
54
|
-
end
|
55
|
-
|
56
|
-
file_name = "skit1/layouts/layout.liquid"
|
57
|
-
output = `diff -U 3 #{File.join(FIXTURE_PATH, file_name)} #{File.join(TMP_PATH, "shiny", file_name)}`
|
58
|
-
$?.should.be.success
|
59
|
-
|
60
|
-
output = `git log --pretty=oneline`.split("\n")
|
61
|
-
output.length.should == 2
|
62
|
-
output[0].should =~ /Braid: Add mirror 'skit1' at r1/
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should create .braids and add the mirror to it" do
|
66
|
-
in_dir(@shiny) do
|
67
|
-
`#{BRAID_BIN} add --type svn #{@skit1}`
|
68
|
-
end
|
69
|
-
|
70
|
-
braids = YAML::load_file("#{@shiny}/.braids")
|
71
|
-
braids["skit1"]["squashed"].should == true
|
72
|
-
braids["skit1"]["url"].should == @skit1
|
73
|
-
braids["skit1"]["type"].should == "svn"
|
74
|
-
braids["skit1"]["revision"].should == 1
|
75
|
-
braids["skit1"]["remote"].should == "braid/skit1"
|
76
|
-
braids["skit1"]["branch"].should.be == nil
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|