module Git::Multi

Constants

DEFAULT_TOKEN
DEFAULT_WORKAREA
GITHUB_CACHE
GIT_MULTI_DIR
HOME
HTML_PAGE
MAN_PAGE
MULTI_REPOS
NAME
ORGANIZATIONS
PIM
SUPERPROJECTS
TOKEN
USERS
VERSION
WORKAREA

Public Class Methods

version() click to toggle source
# File lib/git/multi/version.rb, line 6
def self.version
  "#{NAME} v#{VERSION}"
end

Public Instance Methods

archived_repositories_for(multi_repo = nil) click to toggle source

lists of repositories with a given state

# File lib/git/multi.rb, line 239
def archived_repositories_for(multi_repo = nil)
  repositories_for(multi_repo).find_all(&:archived)
end
cloned_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 289
def cloned_repositories_for(multi_repo = nil)
  repositories_for(multi_repo).find_all { |repo|
    File.directory? repo.local_path
  }
end
env_var(name, default = nil) click to toggle source
# File lib/git/multi/config.rb, line 24
def env_var(name, default = nil)
  value = ENV[name]
  (value.nil? || value.empty?) && default ? default : value
end
excess_repositories_for(multi_repo = nil) click to toggle source

derived lists of repositories

# File lib/git/multi.rb, line 255
def excess_repositories_for(multi_repo = nil)
  repository_full_names = repositories_for(multi_repo).map(&:full_name)
  local_repositories_for(multi_repo).reject { |repo|
    repository_full_names.include? repo.full_name
  }
end
forked_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 243
def forked_repositories_for(multi_repo = nil)
  repositories_for(multi_repo).find_all(&:fork)
end
full_names_for(superproject) click to toggle source
# File lib/git/multi/config.rb, line 10
def full_names_for(superproject)
  list = `git config --get-all superproject.#{superproject}.repo`
  list.split($RS).map(&:strip).map(&:freeze)
end
github_repositories() click to toggle source
# File lib/git/multi.rb, line 107
def github_repositories
  @github_repositories ||= (
    USERS.map { |user| @github_user_repositories[user] } +
    ORGANIZATIONS.map { |org| @github_org_repositories[org] }
  ).flatten
end
github_repositories_for(owner = nil) click to toggle source
# File lib/git/multi.rb, line 114
def github_repositories_for(owner = nil)
  case owner
  when nil
    github_repositories # all of them
  when *USERS
    @github_user_repositories[owner]
  when *ORGANIZATIONS
    @github_org_repositories[owner]
  else
    raise "Unknown owner: #{owner}"
  end
end
global_list(name, default = nil) click to toggle source
# File lib/git/multi/config.rb, line 20
def global_list(name, default = nil)
  global_option(name, default).split(',').map(&:strip).map(&:freeze)
end
global_option(name, default = nil) click to toggle source
# File lib/git/multi/config.rb, line 15
def global_option(name, default = nil)
  value = `git config --global --get #{name}`.chomp.freeze
  value.empty? && default ? default : value
end
local_option(path, name, default = nil) click to toggle source
# File lib/git/multi/config.rb, line 5
def local_option(path, name, default = nil)
  value = `git -C #{path} config --local --get #{name}`.chomp.freeze
  value.empty? && default ? default : value
end
local_repositories() click to toggle source
# File lib/git/multi.rb, line 75
def local_repositories
  @local_repositories ||= (
    USERS.map { |user| @local_user_repositories[user] } +
    ORGANIZATIONS.map { |org| @local_org_repositories[org] }
  ).flatten
end
local_repositories_for(owner = nil) click to toggle source
# File lib/git/multi.rb, line 82
def local_repositories_for(owner = nil)
  case owner
  when nil
    local_repositories # all of them
  when *USERS
    @local_user_repositories[owner]
  when *ORGANIZATIONS
    @local_org_repositories[owner]
  else
    raise "Unknown owner: #{owner}"
  end
end
missing_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 283
def missing_repositories_for(multi_repo = nil)
  repositories_for(multi_repo).find_all { |repo|
    !File.directory? repo.local_path
  }
end
private_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 247
def private_repositories_for(multi_repo = nil)
  repositories_for(multi_repo).find_all(&:private)
end
refresh_repositories() click to toggle source

manage the local repository cache

# File lib/git/multi.rb, line 131
def refresh_repositories
  File.open(GITHUB_CACHE, 'wb') do |file|
    Marshal.dump(github_repositories, file)
  end
end
repositories() click to toggle source
# File lib/git/multi.rb, line 186
def repositories
  if File.size?(GITHUB_CACHE)
    # rubocop:disable Security/MarshalLoad
    @repositories ||= Marshal.load(File.read(GITHUB_CACHE)).tap do |repos|
      repos.each_with_index do |repo, index|
        # ensure 'repo' has handle on an Octokit client
        repo.client = Git::Hub.send(:client)
        # adorn 'repo', which is a Sawyer::Resource
        repo.parent_dir = Pathname.new(File.join(WORKAREA, repo.owner.login))
        repo.local_path = Pathname.new(File.join(WORKAREA, repo.full_name))
        repo.fractional_index = "#{index + 1}/#{repos.count}"
        # fix 'repo' => https://github.com/octokit/octokit.rb/issues/727
        repo.compliant_ssh_url = 'ssh://' + repo.ssh_url.split(':', 2).join('/')
        # remove optional '.git' suffix from 'git@github.com:pvdb/git-multi.git'
        repo.abbreviated_ssh_url = repo.ssh_url.chomp('.git')
        # extend 'repo' with 'just do it' capabilities
        repo.extend Nike
      end
    end
    # rubocop:enable Security/MarshalLoad
  else
    refresh_repositories
    repositories # retry
  end
end
repositories_for(multi_repo = nil) click to toggle source

lists of repos for a given multi-repo

# File lib/git/multi.rb, line 216
def repositories_for(multi_repo = nil)
  case (owner = superproject = full_names = multi_repo)
  when nil
    repositories # all of them
  when Array
    repositories.find_all { |repository|
      full_names.include?(repository.full_name)
    }
  when *USERS, *ORGANIZATIONS
    repositories.find_all { |repository|
      repository.owner.login == owner
    }
  when *SUPERPROJECTS
    repositories_for(full_names_for(superproject))
  else
    raise ArgumentError, multi_repo
  end
end
spurious_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 269
def spurious_repositories_for(multi_repo = nil)
  cloned_repositories_for(multi_repo).find_all { |repo|
    origin_url = local_option(repo.local_path, 'remote.origin.url')

    ![
      repo.clone_url,
      repo.ssh_url,
      repo.compliant_ssh_url,
      repo.abbreviated_ssh_url,
      repo.git_url,
    ].include? origin_url
  }
end
stale_repositories_for(multi_repo = nil) click to toggle source
# File lib/git/multi.rb, line 262
def stale_repositories_for(multi_repo = nil)
  repository_full_names = github_repositories_for(multi_repo).map(&:full_name)
  repositories_for(multi_repo).reject { |repo|
    repository_full_names.include? repo.full_name
  }
end
valid?(multi_repo) click to toggle source

multi-repo support

# File lib/git/multi.rb, line 59
def valid?(multi_repo)
  MULTI_REPOS.include? multi_repo
end