Server IP : 104.21.38.3 / Your IP : 172.71.124.89 Web Server : Apache System : Linux krdc-ubuntu-s-2vcpu-4gb-amd-blr1-01.localdomain 5.15.0-142-generic #152-Ubuntu SMP Mon May 19 10:54:31 UTC 2025 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /usr/lib/ruby/3.0.0/bundler/ |
Upload File : |
# frozen_string_literal: true module Bundler module VersionRanges NEq = Struct.new(:version) ReqR = Struct.new(:left, :right) class ReqR Endpoint = Struct.new(:version, :inclusive) do def <=>(other) if version.equal?(INFINITY) return 0 if other.version.equal?(INFINITY) return 1 elsif other.version.equal?(INFINITY) return -1 end comp = version <=> other.version return comp unless comp.zero? if inclusive && !other.inclusive 1 elsif !inclusive && other.inclusive -1 else 0 end end end def to_s "#{left.inclusive ? "[" : "("}#{left.version}, #{right.version}#{right.inclusive ? "]" : ")"}" end INFINITY = begin inf = Object.new def inf.to_s "∞" end def inf.<=>(other) return 0 if other.equal?(self) 1 end inf.freeze end ZERO = Gem::Version.new("0.a") def cover?(v) return false if left.inclusive && left.version > v return false if !left.inclusive && left.version >= v if right.version != INFINITY return false if right.inclusive && right.version < v return false if !right.inclusive && right.version <= v end true end def empty? left.version == right.version && !(left.inclusive && right.inclusive) end def single? left.version == right.version end def <=>(other) return -1 if other.equal?(INFINITY) comp = left <=> other.left return comp unless comp.zero? right <=> other.right end UNIVERSAL = ReqR.new(ReqR::Endpoint.new(Gem::Version.new("0.a"), true), ReqR::Endpoint.new(ReqR::INFINITY, false)).freeze end def self.for_many(requirements) requirements = requirements.map(&:requirements).flatten(1).map {|r| r.join(" ") } requirements << ">= 0.a" if requirements.empty? requirement = Gem::Requirement.new(requirements) self.for(requirement) end def self.for(requirement) ranges = requirement.requirements.map do |op, v| case op when "=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v, true)) when "!=" then NEq.new(v) when ">=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(ReqR::INFINITY, false)) when ">" then ReqR.new(ReqR::Endpoint.new(v, false), ReqR::Endpoint.new(ReqR::INFINITY, false)) when "<" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, false)) when "<=" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, true)) when "~>" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v.bump, false)) else raise "unknown version op #{op} in requirement #{requirement}" end end.uniq ranges, neqs = ranges.partition {|r| !r.is_a?(NEq) } [ranges.sort, neqs.map(&:version)] end def self.empty?(ranges, neqs) !ranges.reduce(ReqR::UNIVERSAL) do |last_range, curr_range| next false unless last_range next false if curr_range.single? && neqs.include?(curr_range.left.version) next curr_range if last_range.right.version == ReqR::INFINITY case last_range.right.version <=> curr_range.left.version # higher when 1 then next ReqR.new(curr_range.left, last_range.right) # equal when 0 if last_range.right.inclusive && curr_range.left.inclusive && !neqs.include?(curr_range.left.version) ReqR.new(curr_range.left, [curr_range.right, last_range.right].max) end # lower when -1 then next false end end end end end