nanoc-core 4.12.11 → 4.12.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7fc026255728ddb8de8c0756afdfbdc7548e47938d9c4fb464023c0811ae4e2
4
- data.tar.gz: a8531e9c3920f81c9caa88996b1f195eedec21ef392cda04cd2fcf76c0f83106
3
+ metadata.gz: 5f5cba2759d0a1a3fed3b3ecd60b4d48fe74e4e47d9855f585731a52436b407c
4
+ data.tar.gz: cbe6128977455e8109c3991059521a6f97053eda60eccaa4597637c680f89a00
5
5
  SHA512:
6
- metadata.gz: f819fe95a0d25831e51ba4ce360ca76921c01517402bf67d3407d369b1fc8c7f05a7262fe0df1dbfd03e3c3f12d72281d818db19746f294f135e8b017a21a07d
7
- data.tar.gz: c0de0aef8f83c0a7723d755bf804a25f3ca574e308b54b36cac6e0a91ac5b0b2c4658635cd899d18fdc830d51250a151cbb23d69dfdd4b4abd1cde5b12c96a2c
6
+ metadata.gz: 488a4b2b75e2a0a49f1a66f810003f5f11961e156013852cd97e1495bc1b66a0906b7efe1816a760127ed4759cd8926426d0dccc9776d12bb159ac15be3eabc6
7
+ data.tar.gz: 32cc8224e2aaf4abff07af2fb0401211f927bfa1e057c3641acdf043097df4554f4a70142cfcbac37f791f54dfefd196d10e0f48c7637d2692a94134b4850658
@@ -72,10 +72,7 @@ module Nanoc
72
72
  # Error that is raised during site compilation when an item (directly or
73
73
  # indirectly) includes its own item content, leading to endless recursion.
74
74
  class DependencyCycle < ::Nanoc::Core::Error
75
- def initialize(stack)
76
- start_idx = stack.index(stack.last)
77
- cycle = stack[start_idx..-2]
78
-
75
+ def initialize(cycle)
79
76
  msg_bits = []
80
77
  msg_bits << 'The site cannot be compiled because there is a dependency cycle:'
81
78
  msg_bits << ''
@@ -31,35 +31,31 @@ module Nanoc
31
31
  @prio_b = ItemRepIgnorableIterator.new(reps)
32
32
  @prio_c = []
33
33
 
34
- # Stack of things that depend on each other. This is used for
35
- # detecting and reporting circular dependencies.
36
- @stack = []
37
-
38
34
  # List of reps that we’ve already seen. Reps from `reps` will end up
39
35
  # in here. Reps can end up in here even *before* they come from
40
36
  # `reps`, when they are part of a dependency.
41
37
  @seen = Set.new
38
+
39
+ # Record (hard) dependencies. Used for detecting cycles.
40
+ @dependencies = Hash.new { |hash, key| hash[key] = Set.new }
42
41
  end
43
42
 
44
43
  def next
45
44
  # Read prio A
46
45
  @this = @prio_a.pop
47
46
  if @this
48
- @stack.push(@this)
49
47
  return @this
50
48
  end
51
49
 
52
50
  # Read prio B
53
51
  @this = @prio_b.next_ignoring(@seen)
54
52
  if @this
55
- @stack.push(@this)
56
53
  return @this
57
54
  end
58
55
 
59
56
  # Read prio C
60
57
  @this = @prio_c.pop
61
58
  if @this
62
- @stack.push(@this)
63
59
  return @this
64
60
  end
65
61
 
@@ -67,20 +63,18 @@ module Nanoc
67
63
  end
68
64
 
69
65
  def mark_ok
70
- @stack.pop
66
+ # Nothing to do
71
67
  end
72
68
 
73
69
  def mark_failed(dep)
74
- if @stack.include?(dep)
75
- raise Nanoc::Core::Errors::DependencyCycle.new(@stack + [dep])
76
- end
70
+ record_dependency(dep)
77
71
 
78
72
  # `@this` depends on `dep`, so `dep` has to be compiled first. Thus,
79
73
  # move `@this` into priority C, and `dep` into priority A.
80
74
 
81
75
  # Put `@this` (item rep that needs `dep` to be compiled first) into
82
76
  # priority C (lowest prio).
83
- @prio_c.push(@this)
77
+ @prio_c.push(@this) unless @prio_c.include?(@this)
84
78
 
85
79
  # Put `dep` (item rep that needs to be compiled first, before
86
80
  # `@this`) into priority A (highest prio).
@@ -91,6 +85,27 @@ module Nanoc
91
85
  # it then.
92
86
  @seen << dep
93
87
  end
88
+
89
+ private
90
+
91
+ def record_dependency(dep)
92
+ @dependencies[@this] << dep
93
+
94
+ find_cycle(@this, [@this])
95
+ end
96
+
97
+ def find_cycle(dep, path)
98
+ @dependencies[dep].each do |dep1|
99
+ # Check whether this dependency path ends in `@this` again. If it
100
+ # does, we have a cycle (because we started from `@this`).
101
+ if dep1 == @this
102
+ raise Nanoc::Core::Errors::DependencyCycle.new(path)
103
+ end
104
+
105
+ # Continue checking, starting from `dep1` this time.
106
+ find_cycle(dep1, [*path, dep1])
107
+ end
108
+ end
94
109
  end
95
110
 
96
111
  def each
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Nanoc
4
4
  module Core
5
- VERSION = '4.12.11'
5
+ VERSION = '4.12.12'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.12.11
4
+ version: 4.12.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-12 00:00:00.000000000 Z
11
+ date: 2022-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby