class Fbe::Iterate
def over(timeout: 2 * 60, &)
-
(nil)
- Nothing is returned
Other tags:
- Yield: - Repository ID and the next number to be considered
Parameters:
-
timeout
(Float
) -- How many seconds to spend as a maximum
def over(timeout: 2 * 60, &) raise 'Use "as" first' if @label.nil? raise 'Use "by" first' if @query.nil? seen = {} oct = Fbe.octo(loog: @loog, options: @options, global: @global) if oct.off_quota @loog.debug('We are off GitHub quota, cannot even start, sorry') return end repos = Fbe.unmask_repos(loog: @loog, options: @options, global: @global) restarted = [] start = Time.now loop do if oct.off_quota @loog.info("We are off GitHub quota, time to stop after #{start.ago}") break end repos.each do |repo| if oct.off_quota @loog.debug("We are off GitHub quota, we must skip #{repo}") break end if Time.now - start > timeout $loog.info("We are doing this for #{start.ago} already, won't check #{repo}") next end next if restarted.include?(repo) seen[repo] = 0 if seen[repo].nil? if seen[repo] >= @repeats @loog.debug("We've seen too many (#{seen[repo]}) in #{repo}, let's see next one") next end rid = oct.repo_id_by_name(repo) before = @fb.query( "(agg (and (eq what '#{@label}') (eq where 'github') (eq repository #{rid})) (first latest))" ).one @fb.query("(and (eq what '#{@label}') (eq where 'github') (eq repository #{rid}))").delete! before = before.nil? ? @since : before.first nxt = @fb.query(@query).one(@fb, before:, repository: rid) after = if nxt.nil? @loog.debug("Next element after ##{before} not suggested, re-starting from ##{@since}: #{@query}") restarted << repo @since else @loog.debug("Next is ##{nxt}, starting from it...") yield(rid, nxt) end raise "Iterator must return an Integer, while #{after.class} returned" unless after.is_a?(Integer) f = @fb.insert f.where = 'github' f.repository = rid f.latest = if after.nil? @loog.debug("After is nil at #{repo}, setting the 'latest' to ##{nxt}") nxt else @loog.debug("After is ##{after} at #{repo}, setting the 'latest' to it") after end f.what = @label seen[repo] += 1 end unless seen.any? { |r, v| v < @repeats && !restarted.include?(r) } @loog.debug("No more repos to scan (out of #{repos.size}), quitting after #{start.ago}") break end if restarted.size == repos.size @loog.debug("All #{repos.size} repos restarted, quitting after #{start.ago}") break end if Time.now - start > timeout $loog.info("We are iterating for #{start.ago} already, time to give up") break end end @loog.debug("Finished scanning #{repos.size} repos in #{start.ago}: #{seen.map { |k, v| "#{k}:#{v}" }.join(', ')}") end