braid 1.0.21 → 1.0.22

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: a27f551df379a0352a7631473cb4fd0846972c36
4
- data.tar.gz: e06e3fda1d7876be1062b2a4a37a3455bfadeb06
3
+ metadata.gz: ab9eeee697a55d6b0126b0b7fc83f1ef5bcd72ce
4
+ data.tar.gz: 592d7f2a02f89a1afa3accb32c3e8ab910982ba8
5
5
  SHA512:
6
- metadata.gz: e3b359b14dd78c3eb9c74ba40e00715f1028633b9463b734d157a2907d587c1846087924afb15dfcbb0e7bb633ebdb95a8d829ce0dd47950bf0c350944c09ec1
7
- data.tar.gz: a6cd4f1949074ab61fee5919f80458194c22063bdbce1a307d2cc7add311a7dd1e63ba94486d2d98cb310cd49f6b1c73edc65521f7c549a51a0ce0f7eb01ecd0
6
+ metadata.gz: e0e1aab9e20c6be6b449c14e9c8c9b768e71b58bc81634e737b83358172a39b62044f92cc0dc8e7fb2eb48045ea4b3dfed67b19ac22faae335619040265a2869
7
+ data.tar.gz: 644e0aced9a33f47309f1bf6df77c31e7098b9292e3133a1e44e7f5852b7f2d749f02147425b73f949f9e39d444cc1aa156897613450953906f073ff062d3231
@@ -2,7 +2,6 @@ language: ruby
2
2
  sudo: false
3
3
  rvm:
4
4
  - 2.3.1
5
- - 1.9.3
6
5
  - jruby-19mode
7
6
  addons:
8
7
  apt:
data/bin/braid CHANGED
@@ -1,6 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
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)
4
16
  require 'braid'
5
17
 
6
18
  require 'rubygems'
@@ -20,12 +32,6 @@ Main {
20
32
  You can then merge back or cherry-pick changes.
21
33
  TXT
22
34
 
23
- # Duplicated from Braid::Command.run. :(
24
- def die(msg)
25
- puts "Braid: Error: #{msg}"
26
- exit(1)
27
- end
28
-
29
35
  # The "main" library doesn't provide a way to do this??
30
36
  def check_no_extra_args!
31
37
  if @argv.length > 0
@@ -25,8 +25,8 @@ Gem::Specification.new do |s|
25
25
  s.has_rdoc = false
26
26
  s.rdoc_options = %w(--line-numbers --inline-source --title braid --main)
27
27
 
28
+ s.required_ruby_version = '>= 2.2.0'
28
29
  s.add_dependency(%q<main>, ['>= 4.7.3'])
29
- s.add_dependency(%q<open4>, ['>= 1.0.1']) unless defined?(JRUBY_VERSION)
30
30
 
31
31
  s.add_development_dependency(%q<rspec>, ['>= 3.4.4'])
32
32
  s.add_development_dependency(%q<mocha>, ['>= 0.9.11'])
@@ -31,6 +31,7 @@ module Braid
31
31
  def show_diff(path, options = {})
32
32
  mirror = config.get!(path)
33
33
  setup_remote(mirror)
34
+ mirror.fetch_base_revision_if_missing
34
35
 
35
36
  # We do not need to spend the time to copy the content outside the
36
37
  # mirror from HEAD because --relative will exclude it anyway. Rename
@@ -64,12 +64,27 @@ module Braid
64
64
  end
65
65
 
66
66
  def diff
67
- fetch
67
+ fetch_base_revision_if_missing
68
68
  remote_hash = git.rev_parse(versioned_path(base_revision))
69
69
  local_hash = git.tree_hash(path)
70
70
  remote_hash != local_hash ? git.diff_tree(remote_hash, local_hash) : ''
71
71
  end
72
72
 
73
+ # Re-fetching the remote after deleting and re-adding it may be slow even if
74
+ # all objects are still present in the repository
75
+ # (https://github.com/cristibalan/braid/issues/71). Mitigate this for
76
+ # `braid diff` and other commands that need the diff by skipping the fetch
77
+ # if the base revision is already present in the repository.
78
+ def fetch_base_revision_if_missing
79
+ begin
80
+ # Without ^{commit}, this will happily pass back an object hash even if
81
+ # the object isn't present. See the git-rev-parse(1) man page.
82
+ git.rev_parse(base_revision + "^{commit}")
83
+ rescue Operations::UnknownRevision
84
+ fetch
85
+ end
86
+ end
87
+
73
88
  def fetch
74
89
  git_cache.fetch(url) if cached?
75
90
  git.fetch(remote)
@@ -3,8 +3,7 @@ require 'rubygems'
3
3
  require 'tempfile'
4
4
 
5
5
  module Braid
6
- USE_OPEN3 = defined?(JRUBY_VERSION) || Gem.win_platform?
7
- require USE_OPEN3 ? 'open3' : 'open4'
6
+ require 'open3'
8
7
 
9
8
  module Operations
10
9
  class ShellExecutionError < BraidError
@@ -111,29 +110,8 @@ module Braid
111
110
  cmd.strip!
112
111
 
113
112
  Operations::with_modified_environment({'LANG' => 'C'}) do
114
- out, err = nil
115
- status, pid = 0
116
113
  log(cmd)
117
-
118
- if USE_OPEN3
119
- status = nil
120
- Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thread|
121
- # Under old jrubies this may sometimes throw an exception
122
- stdin.close rescue nil
123
- out = stdout.read
124
- err = stderr.read
125
- # Under earlier jrubies this is not correctly passed so add in check
126
- status = wait_thread.value if wait_thread # Process::Status object returned.
127
- end
128
- # Handle earlier jrubies such as 1.6.7.2
129
- status = $?.exitstatus if status.nil?
130
- else
131
- status = Open4.popen4(cmd) do |pid, stdin, stdout, stderr|
132
- out = stdout.read
133
- err = stderr.read
134
- end.exitstatus
135
- end
136
-
114
+ out, err, status = Open3.capture3(cmd)
137
115
  [status, out, err]
138
116
  end
139
117
  end
@@ -402,33 +380,6 @@ module Braid
402
380
  out[2..-1]
403
381
  end
404
382
 
405
- def apply(diff, *args)
406
- status, err = nil, nil
407
-
408
- command = "git apply --index --whitespace=nowarn #{args.join(' ')} -"
409
-
410
- if USE_OPEN3
411
- Open3.popen3(command) do |stdin, stdout, stderr, wait_thread|
412
- stdin.puts(diff)
413
- stdin.close
414
- err = stderr.read
415
- # Under earlier jrubies this is not correctly passed so add in check
416
- status = wait_thread.value if wait_thread # Process::Status object returned.
417
- end
418
- # Handle earlier jrubies such as 1.6.7.2
419
- status = $?.exitstatus if status.nil?
420
- else
421
- status = Open4.popen4(command) do |pid, stdin, stdout, stderr|
422
- stdin.puts(diff)
423
- stdin.close
424
- err = stderr.read
425
- end.exitstatus
426
- end
427
-
428
- raise ShellExecutionError, err unless status == 0
429
- true
430
- end
431
-
432
383
  def clone(*args)
433
384
  # overrides builtin
434
385
  invoke(:clone, *args)
@@ -1,3 +1,3 @@
1
1
  module Braid
2
- VERSION = '1.0.21'.freeze
2
+ VERSION = '1.0.22'.freeze
3
3
  end
@@ -47,13 +47,7 @@ describe 'Running braid diff with a mirror' do
47
47
  end
48
48
  end
49
49
 
50
- it 'with the mirror specified should emit diff' do
51
- diff = nil
52
- in_dir(@repository_dir) do
53
- diff = run_command("#{BRAID_BIN} diff skit1")
54
- end
55
-
56
- expect(diff).to eq(<<PATCH)
50
+ EXPECTED_DIFF=<<PATCH
57
51
  diff --git a/layouts/layout.liquid b/layouts/layout.liquid
58
52
  index 9f75009..25a4b32 100644
59
53
  --- a/layouts/layout.liquid
@@ -68,6 +62,14 @@ index 9f75009..25a4b32 100644
68
62
 
69
63
  <div id="wrapper">
70
64
  PATCH
65
+
66
+ it 'with the mirror specified should emit diff' do
67
+ diff = nil
68
+ in_dir(@repository_dir) do
69
+ diff = run_command("#{BRAID_BIN} diff skit1")
70
+ end
71
+
72
+ expect(diff).to eq(EXPECTED_DIFF)
71
73
  end
72
74
 
73
75
  it 'without specifying a mirror should emit diff and banners' do
@@ -76,24 +78,50 @@ PATCH
76
78
  diff = run_command("#{BRAID_BIN} diff")
77
79
  end
78
80
 
79
- expect(diff).to eq(<<PATCH)
81
+ expect(diff).to eq(<<BANNER + EXPECTED_DIFF)
80
82
  =======================================================
81
83
  Braid: Diffing skit1
82
84
  =======================================================
83
- diff --git a/layouts/layout.liquid b/layouts/layout.liquid
84
- index 9f75009..25a4b32 100644
85
- --- a/layouts/layout.liquid
86
- +++ b/layouts/layout.liquid
87
- @@ -22,7 +22,7 @@
88
- <![endif]-->
89
- </head>
90
-
91
- -<body class="fixed orange">
92
- +<body class="fixed green">
93
- <script type="text/javascript">loadPreferences()</script>
94
-
95
- <div id="wrapper">
96
- PATCH
85
+ BANNER
86
+ end
87
+
88
+ it 'in a new clone of the downstream repository should fetch the base revision and emit diff' do
89
+ diff = nil
90
+ CLONE_NAME = 'shiny-clone'
91
+ in_dir(TMP_PATH) do
92
+ run_command("git clone --quiet #{@repository_dir} #{CLONE_NAME}")
93
+ end
94
+ clone_dir = File.join(TMP_PATH, CLONE_NAME)
95
+ in_dir(clone_dir) do
96
+ diff = run_command("#{BRAID_BIN} diff skit1")
97
+ end
98
+
99
+ expect(diff).to eq(EXPECTED_DIFF)
100
+ end
101
+
102
+ it 'after pruning the base revision from the repository should fetch it again and emit diff' do
103
+ # Note: It is not the intent of this test case to require that Braid
104
+ # leave objects from the mirror in the main repository after it exits.
105
+ # A design change to stop doing that would legitimately require this
106
+ # test case to be modified or dropped.
107
+ diff = nil
108
+ in_dir(@repository_dir) do
109
+ status_out = run_command("#{BRAID_BIN} status skit1")
110
+ base_revision = /^skit1 \(([0-9a-f]{40})\)/.match(status_out)[1]
111
+ # Make sure the base revision is in the repository as a sanity check.
112
+ run_command("git rev-parse --verify --quiet #{base_revision}^{commit}")
113
+ run_command("git gc --quiet --prune=all")
114
+ # Make sure it's gone now so we know we're actually testing Braid's fetch behavior.
115
+ `git rev-parse --verify --quiet #{base_revision}^{commit}`
116
+ raise "'git gc' did not delete the base revision from the repository." if $?.success?
117
+
118
+ diff = run_command("#{BRAID_BIN} diff skit1")
119
+
120
+ # The base revision should be present again.
121
+ run_command("git rev-parse --verify --quiet #{base_revision}^{commit}")
122
+ end
123
+
124
+ expect(diff).to eq(EXPECTED_DIFF)
97
125
  end
98
126
  end
99
127
 
@@ -69,33 +69,6 @@ describe 'Braid::Mirror.new_from_options' do
69
69
 
70
70
  end
71
71
 
72
- describe 'Braid::Mirror#diff' do
73
- before(:each) do
74
- @mirror = build_mirror('revision' => 'a' * 40, 'url' => 'git://path')
75
- @mirror.stubs(:base_revision).returns(@mirror.revision) # bypass rev_parse
76
- end
77
-
78
- def set_hashes(remote_hash, local_hash)
79
- git.expects(:rev_parse).with("#{@mirror.revision}:").returns(remote_hash)
80
- git.expects(:tree_hash).with(@mirror.path).returns(local_hash)
81
- end
82
-
83
- it 'should return an empty string when the hashes match' do
84
- set_hashes('b' * 40, 'b' * 40)
85
- git.expects(:fetch)
86
- git.expects(:diff_tree).never
87
- expect(@mirror.diff).to eq('')
88
- end
89
-
90
- it 'should generate a diff when the hashes do not match' do
91
- set_hashes('b' * 40, 'c' * 40)
92
- diff = "diff --git a/path b/path\n"
93
- git.expects(:fetch)
94
- git.expects(:diff_tree).with('b' * 40, 'c' * 40).returns(diff)
95
- expect(@mirror.diff).to eq(diff)
96
- end
97
- end
98
-
99
72
  describe 'Braid::Mirror#base_revision' do
100
73
  it 'should be inferred when no revision is set' do
101
74
  @mirror = build_mirror
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.21
4
+ version: 1.0.22
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-05-28 00:00:00.000000000 Z
13
+ date: 2017-12-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: main
@@ -26,20 +26,6 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: 4.7.3
29
- - !ruby/object:Gem::Dependency
30
- name: open4
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: 1.0.1
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- version: 1.0.1
43
29
  - !ruby/object:Gem::Dependency
44
30
  name: rspec
45
31
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
126
  requirements:
141
127
  - - ">="
142
128
  - !ruby/object:Gem::Version
143
- version: '0'
129
+ version: 2.2.0
144
130
  required_rubygems_version: !ruby/object:Gem::Requirement
145
131
  requirements:
146
132
  - - ">="