braid 1.0.17 → 1.0.18

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
  SHA1:
3
- metadata.gz: 6b8ca4b2ca46100c1204aa7e8303d29f0ca2f827
4
- data.tar.gz: 2762804b4104a9102b215ae04c697607d279667a
3
+ metadata.gz: 91ffaf5ed3caf78d594252885a0a420faa985530
4
+ data.tar.gz: 34467d809339f7035e29ea3f53c88e322f391ee2
5
5
  SHA512:
6
- metadata.gz: d482a938bccaec81fdaf42c058a6d90fc88915335cf46b6a6896e00542850040a3de103026013cb974010389667397393efe1371108afc386f90ed02500b796a
7
- data.tar.gz: 7a8eae42c2d2f5d41b6c1f8f18c34d3ee670c5acef87e79c24965a61b71808a16a81d676f00de2dc84ad5725292b046b4b9fe9a0d778d0372e1fa8e3fc52150a
6
+ metadata.gz: 2e481ed9197ec3a0d48a2b76a1697cd7407fa36cc7ef4f5a8f045a1a2aac101d1f67f3f16412fdd79620cb6cd7b31e166320c574e97a9b57cea5716011b29ba9
7
+ data.tar.gz: f7222bc8ac1b732b44eaa038310ec5f7fd50c2a7b63164d1dec0aba6157305122940167f8775804b1962b85889251ffc67aa1bfafbe3a843e5fb5f580eb8862d
data/README.md CHANGED
@@ -39,6 +39,7 @@ references to external libraries or mirrors. The configuration allows you to con
39
39
  aspects of the mirroring process such as;
40
40
 
41
41
  * whether the mirror is locked to a particular version of the external library.
42
+ * whether the mirror is tracking a tag or a branch.
42
43
  * whether the mirror includes the entire external library or just a subdirectory.
43
44
 
44
45
  ## Installation
@@ -99,7 +100,15 @@ This is useful if you want to add a subdirectory from a mirror into your own pro
99
100
 
100
101
  braid add --path dist https://github.com/twbs/bootstrap.git vendor/assets/bootstrap
101
102
 
102
- #### Adding mirrors with revisions
103
+ #### Adding a mirror based on a branch
104
+
105
+ braid add --branch 5-0-stable https://github.com/rails/rails.git vendor/rails
106
+
107
+ #### Adding a mirror based on a tag
108
+
109
+ braid add --tag v1.0 https://github.com/realityforge/backpack.git vendor/tools/backpack
110
+
111
+ #### Adding mirror locked to a revision
103
112
 
104
113
  braid add --revision bf1b1e0 git://github.com/rails/rails.git vendor/rails
105
114
 
@@ -123,8 +132,13 @@ index with `git reset --hard`.
123
132
 
124
133
  #### Locking and unlocking mirrors
125
134
 
135
+ Lock to a particular version in the mirror.
136
+
126
137
  braid update --revision 6c1c16b vendor/rails
127
- braid update --head vendor/rails
138
+
139
+ Go back to tracking a particular branch.
140
+
141
+ braid update --branch master vendor/rails
128
142
 
129
143
  #### Showing local changes made to mirrors
130
144
 
data/bin/braid CHANGED
@@ -40,11 +40,11 @@ Main {
40
40
  . braid add http://remote/path local/dir
41
41
  TXT
42
42
 
43
- mixin :argument_url, :optional_local_path, :option_branch, :option_revision, :option_verbose, :option_path
43
+ mixin :argument_url, :optional_local_path, :option_branch, :option_tag, :option_revision, :option_verbose, :option_path
44
44
 
45
45
  run {
46
46
  Braid.verbose = verbose
47
- Braid::Command.run(:add, url, {'path' => local_path, 'branch' => branch, 'revision' => revision, 'remote_path' => path})
47
+ Braid::Command.run(:add, url, {'path' => local_path, 'branch' => branch, 'tag' => tag, 'revision' => revision, 'remote_path' => path})
48
48
  }
49
49
  }
50
50
 
@@ -65,10 +65,12 @@ Main {
65
65
  . braid update local/dir
66
66
  TXT
67
67
 
68
- mixin :optional_local_path, :option_revision, :option_head, :option_verbose, :option_keep_remote
68
+ mixin :optional_local_path, :option_head, :option_revision, :option_tag, :option_branch, :option_verbose, :option_keep_remote
69
69
 
70
70
  run {
71
71
  options = {
72
+ 'branch' => branch,
73
+ 'tag' => tag,
72
74
  'revision' => revision,
73
75
  'head' => head,
74
76
  'keep' => keep
@@ -191,7 +193,16 @@ Main {
191
193
  option(:branch, :b) {
192
194
  optional
193
195
  argument :required
194
- desc 'remote branch name'
196
+ desc 'remote branch name to track'
197
+ attr
198
+ }
199
+ }
200
+
201
+ mixin(:option_tag) {
202
+ option(:tag, :t) {
203
+ optional
204
+ argument :required
205
+ desc 'remote tag name to track'
195
206
  attr
196
207
  }
197
208
  }
@@ -217,7 +228,7 @@ Main {
217
228
  mixin(:option_head) {
218
229
  option(:head) {
219
230
  optional
220
- desc 'mirror head'
231
+ desc 'unused option'
221
232
  attr
222
233
  }
223
234
  }
data/lib/braid/command.rb CHANGED
@@ -45,7 +45,13 @@ module Braid
45
45
  private
46
46
 
47
47
  def setup_remote(mirror)
48
- Command.run(:setup, mirror.path)
48
+ existing_force = Braid.force
49
+ begin
50
+ Braid.force = true
51
+ Command.run(:setup, mirror.path)
52
+ ensure
53
+ Braid.force = existing_force
54
+ end
49
55
  end
50
56
 
51
57
  def clear_remote(mirror, options)
@@ -88,17 +94,32 @@ module Braid
88
94
  "'#{revision[0, 7]}'"
89
95
  end
90
96
 
91
- def validate_new_revision(mirror, new_revision)
92
- return git.rev_parse("#{mirror.remote}/#{mirror.branch}") unless new_revision
97
+ def determine_repository_revision(mirror)
98
+ if mirror.tag
99
+ if use_local_cache?
100
+ Dir.chdir git_cache.path(mirror.url) do
101
+ git.rev_parse(mirror.local_ref)
102
+ end
103
+ else
104
+ raise BraidError, 'unable to retrieve tag version when cache disabled.'
105
+ end
106
+ else
107
+ git.rev_parse(mirror.local_ref)
108
+ end
109
+ end
93
110
 
94
- new_revision = git.rev_parse(new_revision)
95
- old_revision = mirror.revision
111
+ def validate_new_revision(mirror, revision)
112
+ if revision.nil?
113
+ determine_repository_revision(mirror)
114
+ else
115
+ new_revision = git.rev_parse(revision)
96
116
 
97
- if new_revision == old_revision
98
- raise InvalidRevision, 'mirror is already at requested revision'
99
- end
117
+ if new_revision == mirror.revision
118
+ raise InvalidRevision, 'mirror is already at requested revision'
119
+ end
100
120
 
101
- new_revision
121
+ new_revision
122
+ end
102
123
  end
103
124
 
104
125
  def determine_target_revision(mirror, new_revision)
@@ -6,13 +6,18 @@ module Braid
6
6
  mirror = config.add_from_options(url, options)
7
7
  add_config_file
8
8
 
9
- branch_message = (mirror.branch == 'master') ? '' : " branch '#{mirror.branch}'"
9
+ mirror.branch = nil if options['revision']
10
+ raise BraidError, 'Can not add mirror specifying both a revision and a tag' if options['revision'] && mirror.tag
11
+
12
+ branch_message = (mirror.branch.nil? || mirror.branch == 'master') ? '' : " branch '#{mirror.branch}'"
13
+ tag_message = mirror.tag.nil? ? '' : " tag '#{mirror.tag}'"
10
14
  revision_message = options['revision'] ? " at #{display_revision(mirror, options['revision'])}" : ''
11
- msg "Adding mirror of '#{mirror.url}'#{branch_message}#{revision_message}."
15
+ msg "Adding mirror of '#{mirror.url}'#{branch_message}#{tag_message}#{revision_message}."
12
16
 
13
17
  # these commands are explained in the subtree merge guide
14
18
  # http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
15
19
 
20
+ config.update(mirror)
16
21
  setup_remote(mirror)
17
22
  mirror.fetch
18
23
 
@@ -22,7 +27,6 @@ module Braid
22
27
  git.read_tree_prefix_u(target_revision, mirror.path)
23
28
 
24
29
  mirror.revision = new_revision
25
- mirror.lock = new_revision if options['revision']
26
30
  config.update(mirror)
27
31
  add_config_file
28
32
 
@@ -2,6 +2,12 @@ require 'fileutils'
2
2
  require 'tmpdir'
3
3
 
4
4
  module Braid
5
+ class NoPushToTag < BraidError
6
+ def message
7
+ "mirror is based off a tag. Can not push to a tag: #{super}"
8
+ end
9
+ end
10
+
5
11
  module Commands
6
12
  class Push < Command
7
13
  def run(path, options = {})
@@ -9,10 +15,12 @@ module Braid
9
15
 
10
16
  branch = options['branch'] || mirror.branch
11
17
 
18
+ raise NoPushToTag, path unless branch
19
+
12
20
  setup_remote(mirror)
13
21
  mirror.fetch
14
22
 
15
- base_revision = git.rev_parse("#{mirror.remote}/#{mirror.branch}")
23
+ base_revision = determine_repository_revision(mirror)
16
24
  unless mirror.merged?(base_revision)
17
25
  msg 'Mirror is not up to date. Stopping.'
18
26
  clear_remote(mirror, options)
@@ -42,7 +50,7 @@ module Braid
42
50
  git.config(['--local', 'user.name', "\"#{user_name}\""]) if user_name
43
51
  git.config(['--local', 'user.email', "\"#{user_email}\""]) if user_email
44
52
  git.fetch(mirror.cached_url) if File.exist?(mirror.cached_url)
45
- git.fetch(remote_url, "+refs/heads/#{mirror.branch}")
53
+ git.fetch(remote_url, mirror.remote_ref)
46
54
  git.checkout(base_revision)
47
55
  args =[]
48
56
  args << "--directory=#{mirror.remote_path}" if mirror.remote_path
@@ -22,7 +22,13 @@ module Braid
22
22
  mirror.fetch
23
23
  print path.to_s
24
24
  print ' (' + mirror.base_revision + ')'
25
- print ' [LOCKED]' if mirror.locked?
25
+ if mirror.locked?
26
+ print ' [REVISION LOCKED]'
27
+ elsif mirror.tag
28
+ print " [TAG=#{mirror.tag}]"
29
+ else # mirror.branch
30
+ print " [BRANCH=#{mirror.branch}]"
31
+ end
26
32
  msg "Fetching new commits for '#{mirror.path}'." if verbose?
27
33
  new_revision = validate_new_revision(mirror, options['revision'])
28
34
  print ' (Remote Modified)' if new_revision.to_s != mirror.base_revision.to_s
@@ -17,24 +17,35 @@ module Braid
17
17
  end
18
18
 
19
19
  def update_one(path, options = {})
20
+ bail_on_local_changes!
21
+
22
+ raise BraidError, "Do not specify --head option anymore. Please use '--branch MyBranch' to track a branch or '--tag MyTag' to track a branch" if options['head']
23
+
20
24
  mirror = config.get!(path)
21
25
 
22
- revision_message = options['revision'] ? " to #{display_revision(mirror, options['revision'])}" : ''
23
- msg "Updating mirror '#{mirror.path}'#{revision_message}."
26
+ msg "Updating mirror '#{mirror.path}'."
24
27
 
25
28
  was_locked = mirror.locked?
26
-
27
- # check options for lock modification
28
- if mirror.locked?
29
- if options['head']
30
- msg "Unlocking mirror '#{mirror.path}'." if verbose?
31
- mirror.lock = nil
32
- elsif !options['revision']
33
- msg "Mirror '#{mirror.path}' is locked to #{display_revision(mirror, mirror.lock)}. Use --head to force."
34
- return
35
- end
29
+ original_revision = mirror.revision
30
+ original_branch = mirror.branch
31
+ original_tag = mirror.tag
32
+
33
+ raise BraidError, 'Can not update mirror specifying both a revision and a tag' if options['revision'] && options['tag']
34
+ raise BraidError, 'Can not update mirror specifying both a branch and a tag' if options['branch'] && options['tag']
35
+
36
+ if options['tag']
37
+ mirror.tag = options['tag']
38
+ mirror.branch = nil
39
+ elsif options['branch']
40
+ mirror.tag = nil
41
+ mirror.branch = options['branch']
42
+ elsif options['revision']
43
+ mirror.tag = nil
44
+ mirror.branch = nil
36
45
  end
37
46
 
47
+ config.update(mirror)
48
+
38
49
  setup_remote(mirror)
39
50
  msg "Fetching new commits for '#{mirror.path}'." if verbose?
40
51
  mirror.fetch
@@ -48,8 +59,27 @@ module Braid
48
59
  target_revision = determine_target_revision(mirror, new_revision)
49
60
  current_revision = determine_target_revision(mirror, mirror.base_revision)
50
61
 
51
- if (options['revision'] && was_locked && target_revision == current_revision) ||
52
- (options['revision'].nil? && !was_locked && mirror.merged?(git.rev_parse(new_revision)))
62
+ from_desc =
63
+ original_tag ? "tag '#{original_tag}'" :
64
+ !was_locked ? "branch '#{original_branch}'" :
65
+ "revision '#{original_revision}'"
66
+
67
+ switching = true
68
+ if mirror.branch && (original_branch != mirror.branch || (was_locked && !mirror.locked?))
69
+ msg "Switching mirror '#{mirror.path}' to branch '#{mirror.branch}' from #{from_desc}."
70
+ elsif mirror.tag && original_tag != mirror.tag
71
+ msg "Switching mirror '#{mirror.path}' to tag '#{mirror.tag}' from #{from_desc}."
72
+ elsif options['revision'] && original_revision != options['revision']
73
+ msg "Switching mirror '#{mirror.path}' to revision '#{options['revision']}' from #{from_desc}."
74
+ else
75
+ switching = false
76
+ end
77
+
78
+ if !switching &&
79
+ (
80
+ (options['revision'] && was_locked && target_revision == current_revision) ||
81
+ (options['revision'].nil? && !was_locked && mirror.merged?(git.rev_parse(new_revision)))
82
+ )
53
83
  msg "Mirror '#{mirror.path}' is already up to date."
54
84
  clear_remote(mirror, options)
55
85
  return
@@ -58,7 +88,6 @@ module Braid
58
88
  base_revision = mirror.base_revision
59
89
 
60
90
  mirror.revision = new_revision
61
- mirror.lock = new_revision if options['revision']
62
91
 
63
92
  msg "Merging in mirror '#{mirror.path}'." if verbose?
64
93
  in_error = false
data/lib/braid/mirror.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Braid
2
2
  class Mirror
3
- ATTRIBUTES = %w(url branch revision lock path)
3
+ ATTRIBUTES = %w(url branch revision tag path)
4
4
 
5
5
  class UnknownType < BraidError
6
6
  def message
@@ -12,6 +12,11 @@ module Braid
12
12
  'path is required'
13
13
  end
14
14
  end
15
+ class NoTagAndBranch < BraidError
16
+ def message
17
+ 'can not specify both tag and branch configuration'
18
+ end
19
+ end
15
20
 
16
21
  include Operations::VersionControl
17
22
 
@@ -25,14 +30,17 @@ module Braid
25
30
  def self.new_from_options(url, options = {})
26
31
  url = url.sub(/\/$/, '')
27
32
 
28
- branch = options['branch'] || 'master'
33
+ raise NoTagAndBranch if options['tag'] && options['branch']
34
+
35
+ tag = options['tag']
36
+ branch = options['branch'] || (tag.nil? ? 'master' : nil)
29
37
 
30
38
  path = (options['path'] || extract_path_from_url(url)).sub(/\/$/, '')
31
39
  raise PathRequired unless path
32
40
 
33
41
  remote_path = options['remote_path']
34
42
 
35
- attributes = {'url' => url, 'branch' => branch, 'path' => remote_path}
43
+ attributes = {'url' => url, 'branch' => branch, 'path' => remote_path, 'tag' => tag}
36
44
  self.new(path, attributes)
37
45
  end
38
46
 
@@ -41,7 +49,7 @@ module Braid
41
49
  end
42
50
 
43
51
  def locked?
44
- !!lock
52
+ branch.nil? && tag.nil?
45
53
  end
46
54
 
47
55
  def merged?(commit)
@@ -79,6 +87,16 @@ module Braid
79
87
  end
80
88
  end
81
89
 
90
+ def local_ref
91
+ return "#{self.remote}/#{self.branch}" unless self.branch.nil?
92
+ return "tags/#{self.tag}" unless self.tag.nil?
93
+ self.revision
94
+ end
95
+
96
+ def remote_ref
97
+ self.branch.nil? ? "+refs/tags/#{self.tag}" : "+refs/heads/#{self.branch}"
98
+ end
99
+
82
100
  def remote_path
83
101
  self.attributes['path']
84
102
  end
@@ -92,7 +110,7 @@ module Braid
92
110
  end
93
111
 
94
112
  def remote
95
- "#{branch}/braid/#{path}"
113
+ "#{branch || tag || 'revision'}/braid/#{path}"
96
114
  end
97
115
 
98
116
  private
data/lib/braid/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Braid
2
- VERSION = '1.0.17'
2
+ VERSION = '1.0.18'
3
3
  end
@@ -30,6 +30,7 @@ describe 'Adding a mirror in a clean repository' do
30
30
  expect(braids['skit1']['url']).to eq(@vendor_repository_dir)
31
31
  expect(braids['skit1']['revision']).not_to be_nil
32
32
  expect(braids['skit1']['branch']).to eq('master')
33
+ expect(braids['skit1']['tag']).to be_nil
33
34
  expect(braids['skit1']['path']).to be_nil
34
35
  end
35
36
  end
@@ -57,7 +58,90 @@ describe 'Adding a mirror in a clean repository' do
57
58
  expect(braids['skit1']['url']).to eq(@vendor_repository_dir)
58
59
  expect(braids['skit1']['revision']).not_to be_nil
59
60
  expect(braids['skit1']['branch']).to eq('master')
61
+ expect(braids['skit1']['tag']).to be_nil
60
62
  expect(braids['skit1']['path']).to eq('layouts')
61
63
  end
62
64
  end
65
+
66
+ describe 'from a tag in a git repository' do
67
+ before do
68
+ @repository_dir = create_git_repo_from_fixture('shiny', :name => 'Some body', :email => 'somebody@example.com')
69
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
70
+ in_dir(@vendor_repository_dir) do
71
+ run_command('git tag v1')
72
+ end
73
+
74
+ in_dir(@repository_dir) do
75
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --tag v1")
76
+ end
77
+ end
78
+
79
+ it 'should add the files and commit' do
80
+ assert_no_diff("#{FIXTURE_PATH}/skit1/layouts/layout.liquid", "#{@repository_dir}/skit1/layouts/layout.liquid")
81
+
82
+ assert_commit_subject(/Braid: Add mirror 'skit1' at '[0-9a-f]{7}'/)
83
+ assert_commit_author('Some body')
84
+ assert_commit_email('somebody@example.com')
85
+ end
86
+
87
+ it 'should create .braids.json and add the mirror to it' do
88
+ braids = YAML::load_file("#{@repository_dir}/.braids.json")
89
+ expect(braids['skit1']['url']).to eq(@vendor_repository_dir)
90
+ expect(braids['skit1']['revision']).not_to be_nil
91
+ expect(braids['skit1']['branch']).to be_nil
92
+ expect(braids['skit1']['tag']).to eq('v1')
93
+ expect(braids['skit1']['path']).to be_nil
94
+ end
95
+ end
96
+
97
+ describe 'from a revision in a git repository' do
98
+ before do
99
+ @repository_dir = create_git_repo_from_fixture('shiny', :name => 'Some body', :email => 'somebody@example.com')
100
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
101
+ in_dir(@vendor_repository_dir) do
102
+ run_command('git tag v1')
103
+ @revision = run_command('git rev-parse HEAD').strip
104
+ end
105
+
106
+ in_dir(@repository_dir) do
107
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --revision #{@revision}")
108
+ end
109
+ end
110
+
111
+ it 'should add the files and commit' do
112
+ assert_no_diff("#{FIXTURE_PATH}/skit1/layouts/layout.liquid", "#{@repository_dir}/skit1/layouts/layout.liquid")
113
+
114
+ assert_commit_subject(/Braid: Add mirror 'skit1' at '[0-9a-f]{7}'/)
115
+ assert_commit_author('Some body')
116
+ assert_commit_email('somebody@example.com')
117
+ end
118
+
119
+ it 'should create .braids.json and add the mirror to it' do
120
+ braids = YAML::load_file("#{@repository_dir}/.braids.json")
121
+ expect(braids['skit1']['url']).to eq(@vendor_repository_dir)
122
+ expect(braids['skit1']['revision']).not_to be_nil
123
+ expect(braids['skit1']['branch']).to be_nil
124
+ expect(braids['skit1']['tag']).to be_nil
125
+ expect(braids['skit1']['path']).to be_nil
126
+ end
127
+ end
128
+
129
+ describe 'with a git repository' do
130
+ before do
131
+ @repository_dir = create_git_repo_from_fixture('shiny', :name => 'Some body', :email => 'somebody@example.com')
132
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
133
+ in_dir(@vendor_repository_dir) do
134
+ run_command('git tag v1')
135
+ end
136
+ end
137
+
138
+ it 'should generate an error if both tag and revision specified' do
139
+ output = nil
140
+ in_dir(@repository_dir) do
141
+ output = `#{BRAID_BIN} add #{@vendor_repository_dir} --revision X --tag v1`
142
+ end
143
+
144
+ expect(output).to match(/^Braid: Error: Can not add mirror specifying both a revision and a tag$/)
145
+ end
146
+ end
63
147
  end
@@ -6,6 +6,9 @@ describe 'Running braid diff on a mirror' do
6
6
  FileUtils.mkdir_p(TMP_PATH)
7
7
  @repository_dir = create_git_repo_from_fixture('shiny')
8
8
  @vendor_repository_dir = create_git_repo_from_fixture('skit1')
9
+ in_dir(@vendor_repository_dir) do
10
+ run_command('git tag v1')
11
+ end
9
12
  end
10
13
 
11
14
  describe 'braided directly in' do
@@ -173,6 +176,67 @@ index 9f75009..25a4b32 100644
173
176
  <![endif]-->
174
177
  </head>
175
178
 
179
+ -<body class="fixed orange">
180
+ +<body class="fixed green">
181
+ <script type="text/javascript">loadPreferences()</script>
182
+
183
+ <div id="wrapper">
184
+ PATCH
185
+ end
186
+ end
187
+ end
188
+
189
+ describe 'braided as a tag directly in' do
190
+ before do
191
+ in_dir(@repository_dir) do
192
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --tag v1")
193
+ end
194
+ end
195
+
196
+ describe 'with no changes' do
197
+ it 'should emit no output when named in braid diff' do
198
+ diff = nil
199
+ in_dir(@repository_dir) do
200
+ diff = run_command("#{BRAID_BIN} diff skit1")
201
+ end
202
+
203
+ expect(diff).to eq('')
204
+ end
205
+
206
+ it 'should emit only banners when braid diff all' do
207
+ diff = nil
208
+ in_dir(@repository_dir) do
209
+ diff = run_command("#{BRAID_BIN} diff")
210
+ end
211
+
212
+ expect(diff).to eq("=======================================================\nBraid: Diffing skit1\n=======================================================\n")
213
+ end
214
+ end
215
+
216
+ describe 'with changes' do
217
+ before do
218
+ FileUtils.cp_r(File.join(FIXTURE_PATH, 'skit1.1') + '/.', "#{@repository_dir}/skit1")
219
+ in_dir(@repository_dir) do
220
+ run_command('git add *')
221
+ run_command('git commit -m "Some local changes"')
222
+ end
223
+ end
224
+
225
+ it 'should emit diff when named in braid diff' do
226
+ diff = nil
227
+ in_dir(@repository_dir) do
228
+ diff = run_command("#{BRAID_BIN} diff skit1")
229
+ end
230
+
231
+ expect(diff).to eq(<<PATCH)
232
+ diff --git a/layouts/layout.liquid b/layouts/layout.liquid
233
+ index 9f75009..25a4b32 100644
234
+ --- a/layouts/layout.liquid
235
+ +++ b/layouts/layout.liquid
236
+ @@ -22,7 +22,7 @@
237
+ <![endif]-->
238
+ </head>
239
+
176
240
  -<body class="fixed orange">
177
241
  +<body class="fixed green">
178
242
  <script type="text/javascript">loadPreferences()</script>
@@ -146,4 +146,92 @@ describe 'Pushing to a mirror' do
146
146
  end
147
147
  end
148
148
  end
149
+
150
+ describe 'from a git repository braided in as a tag' do
151
+ before do
152
+ @repository_dir = create_git_repo_from_fixture('shiny', :name => 'Some body', :email => 'somebody@example.com')
153
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
154
+ in_dir(@vendor_repository_dir) do
155
+ run_command('git tag v1')
156
+ end
157
+ @file_name = 'layouts/layout.liquid'
158
+
159
+ in_dir(@repository_dir) do
160
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --tag v1")
161
+ end
162
+
163
+ in_dir(@vendor_repository_dir) do
164
+ run_command('git config receive.denyCurrentBranch updateInstead')
165
+ end
166
+
167
+ update_dir_from_fixture('shiny/skit1', 'skit1.1')
168
+ in_dir(@repository_dir) do
169
+ run_command('git add *')
170
+ run_command('git commit -m "Make some changes to vendored files"')
171
+ end
172
+ end
173
+
174
+ context 'with remote updtodate' do
175
+ it 'should fail tring to push without specifying branch' do
176
+ braid_output = nil
177
+ commit_message = 'Make some changes'
178
+ in_dir(@repository_dir) do
179
+ set_editor_message(commit_message)
180
+ braid_output = `#{EDITOR_CMD_PREFIX} #{BRAID_BIN} push skit1`
181
+ end
182
+ expect(braid_output).to match(/Braid: Error: mirror is based off a tag. Can not push to a tag: skit1/)
183
+
184
+ assert_no_diff("#{FIXTURE_PATH}/skit1.1/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
185
+ assert_no_diff("#{FIXTURE_PATH}/skit1/#{@file_name}", "#{@vendor_repository_dir}/#{@file_name}")
186
+ end
187
+
188
+ it 'should push changes to specified branch successfully' do
189
+ commit_message = 'Make some changes'
190
+ braid_output = nil
191
+ in_dir(@repository_dir) do
192
+ set_editor_message(commit_message)
193
+ braid_output = run_command("#{EDITOR_CMD_PREFIX} #{BRAID_BIN} push skit1 --branch MyBranch")
194
+ end
195
+ expect(braid_output).to match(/Braid: Cloning mirror with local changes./)
196
+ expect(braid_output).to match(/Make some changes/)
197
+ expect(braid_output).to match(/Braid: Pushing changes to remote branch MyBranch./)
198
+
199
+ assert_no_diff("#{FIXTURE_PATH}/skit1/#{@file_name}", "#{@vendor_repository_dir}/#{@file_name}")
200
+ assert_no_diff("#{FIXTURE_PATH}/skit1.1/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
201
+
202
+ in_dir(@vendor_repository_dir) do
203
+ run_command('git checkout MyBranch 2>&1')
204
+
205
+ assert_commit_subject(commit_message)
206
+ assert_commit_author('Some body')
207
+ assert_commit_email('somebody@example.com')
208
+ end
209
+
210
+ assert_no_diff("#{FIXTURE_PATH}/skit1.1/#{@file_name}", "#{@vendor_repository_dir}/#{@file_name}")
211
+ end
212
+ end
213
+
214
+ context 'with remote having changes' do
215
+ before do
216
+ update_dir_from_fixture('skit1', 'skit1.1')
217
+ update_dir_from_fixture('skit1', 'skit1.2')
218
+ in_dir(@vendor_repository_dir) do
219
+ run_command('git add *')
220
+ run_command('git commit -m "Update vendored directory"')
221
+ run_command('git tag -f v1')
222
+ end
223
+ end
224
+
225
+ it 'should halt before attempting to push changes' do
226
+ braid_output = nil
227
+ in_dir(@repository_dir) do
228
+ set_editor_message('Make some changes')
229
+ braid_output = run_command("#{EDITOR_CMD_PREFIX} #{BRAID_BIN} push skit1 --branch MyBranch")
230
+ end
231
+ expect(braid_output).to match(/Braid: Mirror is not up to date. Stopping./)
232
+
233
+ assert_no_diff("#{FIXTURE_PATH}/skit1.2/#{@file_name}", "#{TMP_PATH}/skit1/#{@file_name}")
234
+ end
235
+ end
236
+ end
149
237
  end
@@ -21,7 +21,7 @@ describe 'Running braid status on a mirror' do
21
21
  diff = run_command("#{BRAID_BIN} status skit1")
22
22
  end
23
23
 
24
- expect(diff).to match(/^skit1 \([0-9a-f]{40}\)$/)
24
+ expect(diff).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=master\]$/)
25
25
  end
26
26
  end
27
27
 
@@ -35,24 +35,130 @@ describe 'Running braid status on a mirror' do
35
35
  output = run_command("#{BRAID_BIN} status skit1")
36
36
  end
37
37
 
38
- expect(output).to match(/^skit1 \([0-9a-f]{40}\) \(Locally Modified\)$/)
38
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=master\] \(Locally Modified\)$/)
39
39
  end
40
40
  end
41
41
 
42
42
  describe 'with remote changes' do
43
43
  it 'should emit remote modified indicator' do
44
- update_dir_from_fixture('skit1', 'skit1.1')
44
+ update_dir_from_fixture('skit1', 'skit1.1')
45
+ in_dir(@vendor_repository_dir) do
46
+ run_command('git add *')
47
+ run_command('git commit -m "change default color"')
48
+ end
49
+
50
+ output = nil
51
+ in_dir(@repository_dir) do
52
+ output = run_command("#{BRAID_BIN} status skit1")
53
+ end
54
+
55
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=master\] \(Remote Modified\)$/)
56
+ end
57
+ end
58
+ end
59
+
60
+ describe 'braided into branch in' do
61
+ before do
45
62
  in_dir(@vendor_repository_dir) do
46
- run_command('git add *')
47
- run_command('git commit -m "change default color"')
63
+ run_command('git checkout -bbranch1 2>&1')
64
+ end
65
+ in_dir(@repository_dir) do
66
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --branch branch1")
67
+ end
68
+ end
69
+ describe 'with no changes' do
70
+ it 'should only emit version when neither modified' do
71
+ diff = nil
72
+ in_dir(@repository_dir) do
73
+ diff = run_command("#{BRAID_BIN} status skit1")
74
+ end
75
+
76
+ expect(diff).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=branch1\]$/)
77
+ end
78
+ end
79
+
80
+ describe 'with local changes' do
81
+ it 'should emit local modified indicator' do
82
+ output = nil
83
+ in_dir(@repository_dir) do
84
+ File.open("#{@repository_dir}/skit1/foo.txt", 'wb') { |f| f.write('Hi') }
85
+ run_command('git add *')
86
+ run_command('git commit -m "modify mirror"')
87
+ output = run_command("#{BRAID_BIN} status skit1")
88
+ end
89
+
90
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=branch1\] \(Locally Modified\)$/)
48
91
  end
92
+ end
93
+
94
+ describe 'with remote changes' do
95
+ it 'should emit remote modified indicator' do
96
+ update_dir_from_fixture('skit1', 'skit1.1')
97
+ in_dir(@vendor_repository_dir) do
98
+ run_command('git add *')
99
+ run_command('git commit -m "change default color"')
100
+ end
101
+
102
+ output = nil
103
+ in_dir(@repository_dir) do
104
+ output = run_command("#{BRAID_BIN} status skit1")
105
+ end
106
+
107
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[BRANCH=branch1\] \(Remote Modified\)$/)
108
+ end
109
+ end
110
+ end
111
+
112
+ describe 'braided directly in as tag' do
113
+ before do
114
+ in_dir(@vendor_repository_dir) do
115
+ run_command('git tag v1')
116
+ end
117
+
118
+ in_dir(@repository_dir) do
119
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --tag v1")
120
+ end
121
+ end
122
+ describe 'with no changes' do
123
+ it 'should only emit version when neither modified' do
124
+ diff = nil
125
+ in_dir(@repository_dir) do
126
+ diff = run_command("#{BRAID_BIN} status skit1")
127
+ end
128
+
129
+ expect(diff).to match(/^skit1 \([0-9a-f]{40}\) \[TAG=v1\]$/)
130
+ end
131
+ end
132
+
133
+ describe 'with local changes' do
134
+ it 'should emit local modified indicator' do
135
+ output = nil
136
+ in_dir(@repository_dir) do
137
+ File.open("#{@repository_dir}/skit1/foo.txt", 'wb') { |f| f.write('Hi') }
138
+ run_command('git add *')
139
+ run_command('git commit -m "modify mirror"')
140
+ output = run_command("#{BRAID_BIN} status skit1")
141
+ end
142
+
143
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[TAG=v1\] \(Locally Modified\)$/)
144
+ end
145
+ end
146
+
147
+ describe 'with remote changes' do
148
+ it 'should emit remote modified indicator' do
149
+ update_dir_from_fixture('skit1', 'skit1.1')
150
+ in_dir(@vendor_repository_dir) do
151
+ run_command('git add *')
152
+ run_command('git commit -m "change default color"')
153
+ run_command('git tag -f v1')
154
+ end
49
155
 
50
156
  output = nil
51
157
  in_dir(@repository_dir) do
52
158
  output = run_command("#{BRAID_BIN} status skit1")
53
159
  end
54
160
 
55
- expect(output).to match(/^skit1 \([0-9a-f]{40}\) \(Remote Modified\)$/)
161
+ expect(output).to match(/^skit1 \([0-9a-f]{40}\) \[TAG=v1\] \(Remote Modified\)$/)
56
162
  end
57
163
  end
58
164
  end
@@ -7,6 +7,48 @@ describe 'Updating a mirror' do
7
7
  FileUtils.mkdir_p(TMP_PATH)
8
8
  end
9
9
 
10
+ describe 'with a git repository' do
11
+ before do
12
+ @repository_dir = create_git_repo_from_fixture('shiny', :name => 'Some body', :email => 'somebody@example.com')
13
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
14
+ @head_version = nil
15
+ in_dir(@vendor_repository_dir) do
16
+ run_command('git tag v1')
17
+ @head_version = run_command('git rev-parse HEAD')
18
+ end
19
+ in_dir(@repository_dir) do
20
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir}")
21
+ end
22
+ end
23
+
24
+ it 'should generate an error if --head parameter passed' do
25
+ output = nil
26
+ in_dir(@repository_dir) do
27
+ output = `#{BRAID_BIN} update skit1 --head 2>&1`
28
+ end
29
+
30
+ expect(output).to match(/^Braid: Error: Do not specify --head option anymore. Please use '--branch MyBranch' to track a branch or '--tag MyTag' to track a branch$/)
31
+ end
32
+
33
+ it 'should generate an error if both tag and revision specified' do
34
+ output = nil
35
+ in_dir(@repository_dir) do
36
+ output = `#{BRAID_BIN} update skit1 --tag v1 --revision #{@head_version} 2>&1`
37
+ end
38
+
39
+ expect(output).to match(/^Braid: Error: Can not update mirror specifying both a revision and a tag$/)
40
+ end
41
+
42
+ it 'should generate an error if both branch and revision specified' do
43
+ output = nil
44
+ in_dir(@repository_dir) do
45
+ output = `#{BRAID_BIN} update skit1 --branch master --tag v1`
46
+ end
47
+
48
+ expect(output).to match(/^Braid: Error: Can not update mirror specifying both a branch and a tag$/)
49
+ end
50
+ end
51
+
10
52
  describe 'from a git repository' do
11
53
  before do
12
54
  @repository_dir = create_git_repo_from_fixture('shiny')
@@ -150,4 +192,211 @@ describe 'Updating a mirror' do
150
192
  end
151
193
  end
152
194
  end
195
+
196
+ describe 'from a git repository braided in as a tag' do
197
+ before do
198
+ @repository_dir = create_git_repo_from_fixture('shiny')
199
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
200
+ in_dir(@vendor_repository_dir) do
201
+ run_command('git tag v1')
202
+ end
203
+ @file_name = 'layouts/layout.liquid'
204
+
205
+ in_dir(@repository_dir) do
206
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --tag v1")
207
+ end
208
+
209
+ update_dir_from_fixture('skit1', 'skit1.1')
210
+ in_dir(@vendor_repository_dir) do
211
+ run_command('git add *')
212
+ run_command('git commit -m "change default color"')
213
+ end
214
+
215
+ update_dir_from_fixture('skit1', 'skit1.2')
216
+ in_dir(@vendor_repository_dir) do
217
+ run_command('git add *')
218
+ run_command('git commit -m "add a happy note"')
219
+ run_command('git tag -f v1')
220
+ end
221
+ end
222
+
223
+ context 'with no project-specific changes' do
224
+ it 'should add the files and commit' do
225
+ in_dir(@repository_dir) do
226
+ run_command("#{BRAID_BIN} update skit1")
227
+ end
228
+
229
+ assert_no_diff("#{FIXTURE_PATH}/skit1.2/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
230
+
231
+ output = run_command('git log --pretty=oneline').split("\n")
232
+ expect(output.length).to eq(3)
233
+ expect(output[0]).to match(/^[0-9a-f]{40} Braid: Update mirror 'skit1' to '[0-9a-f]{7}'$/)
234
+
235
+ # No temporary commits should be added to the reflog.
236
+ output = `git log -g --pretty=oneline`.split("\n")
237
+ expect(output.length).to eq(3)
238
+ end
239
+ end
240
+
241
+ context 'with mergeable changes to the same file' do
242
+ it 'should auto-merge and commit' do
243
+ run_command("cp #{File.join(FIXTURE_PATH, 'shiny_skit1_mergeable', @file_name)} #{File.join(TMP_PATH, 'shiny', 'skit1', @file_name)}")
244
+
245
+ in_dir(@repository_dir) do
246
+ run_command("git commit -a -m 'mergeable change'")
247
+ run_command("#{BRAID_BIN} update skit1")
248
+ end
249
+
250
+ assert_no_diff("#{FIXTURE_PATH}/shiny_skit1.2_merged/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
251
+
252
+ output = run_command('git log --pretty=oneline').split("\n")
253
+ expect(output.length).to eq(4) # plus 'mergeable change'
254
+ expect(output[0]).to match(/Braid: Update mirror 'skit1' to '[0-9a-f]{7}'/)
255
+ end
256
+ end
257
+
258
+ context 'with conflicting changes' do
259
+ it 'should leave conflict markup with the target revision' do
260
+ run_command("cp #{File.join(FIXTURE_PATH, 'shiny_skit1_conflicting', @file_name)} #{File.join(TMP_PATH, 'shiny', 'skit1', @file_name)}")
261
+
262
+ target_revision = nil
263
+ in_dir(@vendor_repository_dir) do
264
+ target_revision = run_command('git rev-parse HEAD')
265
+ end
266
+
267
+ braid_output = nil
268
+ in_dir(@repository_dir) do
269
+ run_command("git commit -a -m 'conflicting change'")
270
+ braid_output = run_command("#{BRAID_BIN} update skit1")
271
+ end
272
+ expect(braid_output).to match(/Caught merge error\. Breaking\./)
273
+
274
+ run_command("grep -q '>>>>>>> #{target_revision}' #{File.join(TMP_PATH, 'shiny', 'skit1', @file_name)}")
275
+ end
276
+ end
277
+ end
278
+
279
+ tracking_strategy =
280
+ {
281
+ 'branch' => 'master',
282
+ 'tag' => 'v1',
283
+ 'revision' => nil,
284
+ }
285
+
286
+ tracking_strategy.each_pair do |initial_strategy, initial_value|
287
+ describe "from a git repository from tracking strategy #{initial_strategy} '#{initial_value}'" do
288
+ before do
289
+ @repository_dir = create_git_repo_from_fixture('shiny')
290
+ @vendor_repository_dir = create_git_repo_from_fixture('skit1')
291
+ @file_name = 'layouts/layout.liquid'
292
+
293
+ @initial_revision = nil
294
+ in_dir(@vendor_repository_dir) do
295
+ run_command('git tag v1')
296
+ @initial_revision = run_command('git rev-parse HEAD').strip
297
+ end
298
+ in_dir(@repository_dir) do
299
+ run_command("#{BRAID_BIN} add #{@vendor_repository_dir} --#{initial_strategy} #{initial_value || @initial_revision}")
300
+ end
301
+
302
+ update_dir_from_fixture('skit1', 'skit1.1')
303
+ in_dir(@vendor_repository_dir) do
304
+ run_command('git add *')
305
+ run_command('git commit -m "change default color"')
306
+ end
307
+
308
+ @target_revision = nil
309
+ update_dir_from_fixture('skit1', 'skit1.2')
310
+ in_dir(@vendor_repository_dir) do
311
+ run_command('git add *')
312
+ run_command('git commit -m "add a happy note"')
313
+ @target_revision = run_command('git rev-parse HEAD').strip
314
+ run_command('git tag -f v1')
315
+ end
316
+ end
317
+
318
+ context 'with no project-specific changes' do
319
+ if initial_strategy != 'revision'
320
+ it 'should add the files and commit' do
321
+ in_dir(@repository_dir) do
322
+ run_command("#{BRAID_BIN} update skit1")
323
+ end
324
+
325
+ assert_no_diff("#{FIXTURE_PATH}/skit1.2/#{@file_name}", "#{@repository_dir}/skit1/layouts/layout.liquid")
326
+
327
+ output = run_command('git log --pretty=oneline').split("\n")
328
+ expect(output.length).to eq(3)
329
+ expect(output[0]).to match(/^[0-9a-f]{40} Braid: Update mirror 'skit1' to '[0-9a-f]{7}'$/)
330
+
331
+ # No temporary commits should be added to the reflog.
332
+ output = `git log -g --pretty=oneline`.split("\n")
333
+ expect(output.length).to eq(3)
334
+ end
335
+
336
+ context 'with mergeable changes to the same file' do
337
+ it 'should auto-merge and commit' do
338
+ run_command("cp #{File.join(FIXTURE_PATH, 'shiny_skit1_mergeable', @file_name)} #{File.join(TMP_PATH, 'shiny', 'skit1', @file_name)}")
339
+
340
+ in_dir(@repository_dir) do
341
+ run_command("git commit -a -m 'mergeable change'")
342
+ run_command("#{BRAID_BIN} update skit1")
343
+ end
344
+
345
+ assert_no_diff("#{FIXTURE_PATH}/shiny_skit1.2_merged/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
346
+
347
+ output = run_command('git log --pretty=oneline').split("\n")
348
+ expect(output.length).to eq(4) # plus 'mergeable change'
349
+ expect(output[0]).to match(/Braid: Update mirror 'skit1' to '[0-9a-f]{7}'/)
350
+ end
351
+ end
352
+ else
353
+ it 'should not change files as revision not changed' do
354
+ in_dir(@repository_dir) do
355
+ run_command("#{BRAID_BIN} update skit1 --verbose")
356
+ end
357
+
358
+ assert_no_diff("#{FIXTURE_PATH}/skit1/#{@file_name}", "#{@repository_dir}/skit1/#{@file_name}")
359
+
360
+ output = run_command('git log --pretty=oneline').split("\n")
361
+ expect(output.length).to eq(2)
362
+
363
+ # No temporary commits should be added to the reflog.
364
+ output = `git log -g --pretty=oneline`.split("\n")
365
+ expect(output.length).to eq(2)
366
+ end
367
+ end
368
+ end
369
+
370
+ tracking_strategy.each_pair do |target_strategy, target_value|
371
+ describe "to a tracking strategy #{target_strategy} '#{target_value}'" do
372
+ it 'should add the files and commit' do
373
+ output = nil
374
+ in_dir(@repository_dir) do
375
+ output = run_command("#{BRAID_BIN} update skit1 --#{target_strategy} #{target_value || @target_revision}").split("\n")
376
+ end
377
+
378
+ index = 0
379
+ expect(output[index]).to match(/^Braid: Updating mirror 'skit1'.$/)
380
+
381
+ if initial_strategy != target_strategy || target_strategy == 'revision'
382
+ index = index + 1
383
+ expect(output[index]).to match(/^Braid: Switching mirror 'skit1' to #{target_strategy} '#{target_value || @target_revision}' from #{initial_strategy} '#{initial_value || @initial_revision}'.$/)
384
+ end
385
+ index = index + 1
386
+ expect(output[index]).to match(/^Braid: Updated mirror to '[0-9a-f]{7}'.$/)
387
+
388
+ assert_no_diff("#{FIXTURE_PATH}/skit1.2/#{@file_name}", "#{@repository_dir}/skit1/layouts/layout.liquid")
389
+
390
+ output = run_command('git log --pretty=oneline').split("\n")
391
+ expect(output.length).to eq(3)
392
+ expect(output[0]).to match(/^[0-9a-f]{40} Braid: Update mirror 'skit1' to '[0-9a-f]{7}'$/)
393
+
394
+ # No temporary commits should be added to the reflog.
395
+ output = `git log -g --pretty=oneline`.split("\n")
396
+ expect(output.length).to eq(3)
397
+ end
398
+ end
399
+ end
400
+ end
401
+ end
153
402
  end
data/spec/mirror_spec.rb CHANGED
@@ -15,6 +15,58 @@ describe 'Braid::Mirror.new_from_options' do
15
15
  new_from_options('http://path.git', 'path' => 'vendor/tools/mytool/')
16
16
  expect(@mirror.path).to eq('vendor/tools/mytool')
17
17
  end
18
+
19
+ it 'should define local_ref correctly when default branch specified' do
20
+ new_from_options('http://mytool.git')
21
+ expect(@mirror.local_ref).to eq('master/braid/mytool/master')
22
+ end
23
+
24
+ it 'should define local_ref correctly when explicit branch specified' do
25
+ new_from_options('http://mytool.git', 'branch' => 'mybranch')
26
+ expect(@mirror.local_ref).to eq('mybranch/braid/mytool/mybranch')
27
+ end
28
+
29
+ it 'should define local_ref correctly when explicit tag specified' do
30
+ new_from_options('http://mytool.git', 'tag' => 'v1')
31
+ expect(@mirror.local_ref).to eq('tags/v1')
32
+ end
33
+
34
+ it 'should raise an exception if both tag and branch specified' do
35
+ expect {
36
+ new_from_options('http://mytool.git', 'tag' => 'v1', 'branch' => 'mybranch')
37
+ }.to raise_error(Braid::Mirror::NoTagAndBranch)
38
+ end
39
+
40
+ it 'should define remote_ref correctly when default branch specified' do
41
+ new_from_options('http://mytool.git')
42
+ expect(@mirror.remote_ref).to eq('+refs/heads/master')
43
+ end
44
+
45
+ it 'should define remote_ref correctly when explicit branch specified' do
46
+ new_from_options('http://mytool.git', 'branch' => 'mybranch')
47
+ expect(@mirror.remote_ref).to eq('+refs/heads/mybranch')
48
+ end
49
+
50
+ it 'should define remote_ref correctly when explicit tag specified' do
51
+ new_from_options('http://mytool.git', 'tag' => 'v1')
52
+ expect(@mirror.remote_ref).to eq('+refs/tags/v1')
53
+ end
54
+
55
+ it 'should define remote correctly when default branch specified' do
56
+ new_from_options('http://mytool.git')
57
+ expect(@mirror.remote).to eq('master/braid/mytool')
58
+ end
59
+
60
+ it 'should define remote correctly when explicit branch specified' do
61
+ new_from_options('http://mytool.git', 'branch' => 'mybranch')
62
+ expect(@mirror.remote).to eq('mybranch/braid/mytool')
63
+ end
64
+
65
+ it 'should define remote correctly when explicit tag specified' do
66
+ new_from_options('http://mytool.git', 'tag' => 'v1')
67
+ expect(@mirror.remote).to eq('v1/braid/mytool')
68
+ end
69
+
18
70
  end
19
71
 
20
72
  describe 'Braid::Mirror#diff' do
@@ -63,8 +115,8 @@ describe 'Braid::Mirror#inferred_revision' do
63
115
  it 'should return the last commit before the most recent update' do
64
116
  @mirror = new_from_options('git://path')
65
117
  git.expects(:rev_list).times(2).returns(
66
- "#{'a' * 40}\n",
67
- "commit #{'b' * 40}\n#{'t' * 40}\n"
118
+ "#{'a' * 40}\n",
119
+ "commit #{'b' * 40}\n#{'t' * 40}\n"
68
120
  )
69
121
  git.expects(:tree_hash).with(@mirror.path, 'a' * 40).returns('t' * 40)
70
122
  expect(@mirror.send(:inferred_revision)).to eq('b' * 40)
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.0.17
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cristi Balan
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-03-23 00:00:00.000000000 Z
13
+ date: 2017-03-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: main