Commit 701db816 authored by Eloy Duran's avatar Eloy Duran

Start on simple resolving. We don't try to fix conflicts yet to keep things…

Start on simple resolving. We don't try to fix conflicts yet to keep things simple, so for now that's up to the user.
parent f0193f1f
#dependency 'ASIHTTPRequest', '1.8'
dependency 'ASIWebPageRequest', '= 1.8'
# is part of ASIHTTPRequest 1.8 and 1.8.1 # is part of ASIHTTPRequest 1.8 and 1.8.1
dependency 'Reachability' #, '>= 2.0' dependency 'Reachability' #, '>= 2.0'
# is part of ASIHTTPRequest # is part of ASIHTTPRequest
dependency 'ASIWebPageRequest', '>= 1.8' #dependency 'ASIWebPageRequest', '>= 1.8'
#dependency 'ASIWebPageRequest', '= 1.8'
# this should fail the ASIHTTPRequest 1.8.1 hard requirement # this should fail the ASIHTTPRequest 1.8.1 hard requirement
#dependency 'ASIWebPageRequest', '1.8.0' #dependency 'ASIWebPageRequest', '1.8.0'
...@@ -10,4 +14,5 @@ dependency 'ASIWebPageRequest', '>= 1.8' ...@@ -10,4 +14,5 @@ dependency 'ASIWebPageRequest', '>= 1.8'
# we have a hard requirement here so: # we have a hard requirement here so:
# * the Reachability dependency should be taken from this version # * the Reachability dependency should be taken from this version
# * the ASIWebPageRequest dependency requirement matches this one so should work # * the ASIWebPageRequest dependency requirement matches this one so should work
dependency 'ASIHTTPRequest', '1.8.1' #dependency 'ASIHTTPRequest', '1.8.1'
dependency 'ASIHTTPRequest', '>= 1.8'
...@@ -2,6 +2,7 @@ module Pod ...@@ -2,6 +2,7 @@ module Pod
autoload :Command, 'cocoa_pods/command' autoload :Command, 'cocoa_pods/command'
autoload :Config, 'cocoa_pods/config' autoload :Config, 'cocoa_pods/config'
autoload :Dependency, 'cocoa_pods/dependency' autoload :Dependency, 'cocoa_pods/dependency'
autoload :Resolver, 'cocoa_pods/resolver'
autoload :Source, 'cocoa_pods/source' autoload :Source, 'cocoa_pods/source'
autoload :Spec, 'cocoa_pods/specification' autoload :Spec, 'cocoa_pods/specification'
autoload :Specification, 'cocoa_pods/specification' autoload :Specification, 'cocoa_pods/specification'
......
...@@ -4,7 +4,7 @@ module Pod ...@@ -4,7 +4,7 @@ module Pod
def run def run
if spec = Specification.from_podfile(podfile) if spec = Specification.from_podfile(podfile)
p spec p spec
spec.install! Resolver.new(spec).resolve
else else
$stderr.puts "No Podfile found in current working directory." $stderr.puts "No Podfile found in current working directory."
end end
......
...@@ -4,6 +4,5 @@ require 'rubygems/dependency' ...@@ -4,6 +4,5 @@ require 'rubygems/dependency'
module Pod module Pod
class Dependency < Gem::Dependency class Dependency < Gem::Dependency
end end
end end
...@@ -16,9 +16,7 @@ module Pod ...@@ -16,9 +16,7 @@ module Pod
def search(dependency) def search(dependency)
if dir = @repo.children.find { |c| c.basename.to_s == dependency.name } if dir = @repo.children.find { |c| c.basename.to_s == dependency.name }
set = Specification::Set.new(dir) Specification::Set.new(dir)
set.add_dependency(dependency)
set
end end
end end
end end
......
...@@ -62,7 +62,8 @@ module Pod ...@@ -62,7 +62,8 @@ module Pod
end end
def part_of(name, *version_requirements) def part_of(name, *version_requirements)
@part_of = Dependency.new(name, *version_requirements) #@part_of = Dependency.new(name, *version_requirements)
dependency(name, *version_requirements)
end end
def source_files(*patterns) def source_files(*patterns)
...@@ -75,7 +76,6 @@ module Pod ...@@ -75,7 +76,6 @@ module Pod
attr_reader :dependencies attr_reader :dependencies
def dependency(name, *version_requirements) def dependency(name, *version_requirements)
#version = args || [">= 0"]
@dependencies << Dependency.new(name, *version_requirements) @dependencies << Dependency.new(name, *version_requirements)
end end
...@@ -87,31 +87,14 @@ module Pod ...@@ -87,31 +87,14 @@ module Pod
def to_s def to_s
if from_podfile? if from_podfile?
"#<#{self.class.name} for podfile at `#{@defined_in_file}'>" "podfile at `#{@defined_in_file}'"
else else
"#<#{self.class.name} for `#{@name}' version `#{@version}'>" "`#{@name}' version `#{@version}'"
end end
end end
alias_method :inspect, :to_s
# TODO move to seperate installer class def inspect
def install! "#<#{self.class.name} for #{to_s}>"
#p @name, @version, @authors, @dependencies
@dependency_sets = @dependencies.map { |dep| Source.search(dep) }.flatten
@dependency_sets.each do |set|
p set
p set.podspec
end
end
private
def attr(name, arg)
if arg.nil? || arg.empty?
instance_variable_get("@#{name}")
else
instance_variable_set("@#{name}", block_given? ? yield : arg)
end
end end
end end
......
...@@ -3,10 +3,21 @@ module Pod ...@@ -3,10 +3,21 @@ module Pod
class Set class Set
def initialize(pod_dir) def initialize(pod_dir)
@pod_dir = pod_dir @pod_dir = pod_dir
@required_by = []
end end
def add_dependency(dependency) def required_by(specification, dependency)
@dependency = dependency unless @required_by.empty? || dependency.requirement.satisfied_by?(required_version)
# TODO add graph that shows which dependencies led to this.
required_by = @required_by.map(&:first).join(', ')
raise "#{specification} tries to activate `#{dependency}', " \
"but already activated version `#{required_version}' by #{required_by}."
end
@required_by << [specification, dependency]
end
def dependency
@required_by.inject(Dependency.new(name)) { |previous, (_, dep)| previous.merge(dep) }
end end
def name def name
...@@ -23,12 +34,16 @@ module Pod ...@@ -23,12 +34,16 @@ module Pod
# Return the first version that matches the current dependency. # Return the first version that matches the current dependency.
def required_version def required_version
unless v = versions.find { |v| @dependency.match?(name, v) } unless v = versions.find { |v| dependency.match?(name, v) }
raise "Required version (#{@dependency}) not found for `#{name}'." raise "Required version (#{dependency}) not found for `#{name}'."
end end
v v
end end
def ==(other)
self.class === other && name == other.name
end
def to_s def to_s
"#<#{self.class.name} for `#{name}' with required version `#{required_version}'>" "#<#{self.class.name} for `#{name}' with required version `#{required_version}'>"
end end
...@@ -39,7 +54,7 @@ module Pod ...@@ -39,7 +54,7 @@ module Pod
# Returns Pod::Version instances, for each version directory, sorted from # Returns Pod::Version instances, for each version directory, sorted from
# lowest version to highest. # lowest version to highest.
def versions def versions
@pod_dir.children.map { |v| Version.new(v.basename) }.sort @pod_dir.children.map { |v| Version.new(v.basename) }.sort.reverse
end end
end end
end end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment