Module: Git::Multi

Defined in:
lib/git/multi.rb,
lib/git/multi/version.rb,
lib/git/multi/commands.rb,
lib/git/multi/settings.rb

Defined Under Namespace

Modules: Commands, Nike, Settings

Constant Summary collapse

HOME =
Dir.home
DEFAULT_WORKAREA =
File.join(HOME, 'Workarea')
WORKAREA =
git_option('git.multi.workarea', DEFAULT_WORKAREA)
DEFAULT_TOKEN =

same as Octokit

env_var('OCTOKIT_ACCESS_TOKEN')
TOKEN =
git_option('github.token', DEFAULT_TOKEN)
CACHE =
File.join(HOME, '.git', 'multi')
REPOSITORIES =
File.join(CACHE, 'repositories.byte')
USER =
git_option('github.user')
ORGANIZATIONS =
git_option('github.organizations').split(/\s*,\s*/)
MAN_PAGE =
File.expand_path('../../man/git-multi.1', __dir__)
HTML_PAGE =
File.expand_path('../../man/git-multi.html', __dir__)
NAME =
'git-multi'
VERSION =
'1.0.5'
LONG_VERSION =
"%s v%s (%s v%s, %s v%s, %s v%s)" % [
  NAME,
  VERSION,
  'octokit.rb',
  Octokit::VERSION,
  'sawyer',
  Sawyer::VERSION,
  'psych',
  Psych::VERSION,
]
PIM =

gem post_install_message

<<~"EOPIM" # gem post_install_message

The required settings for \033[1mgit multi\33[0m are as follows:

\tgit config --global --add \033[1mgithub.user\033[0m <your_github_username>
\tgit config --global --add \033[1mgithub.organizations\033[0m <your_github_orgs>
\tgit config --global --add \033[1mgithub.token\033[0m <your_github_oauth_token>

Unless your top-level workarea is `${HOME}/Workarea` you should also set:

\tgit config --global --add \033[1mgit.multi.workarea\033[0m <your_root_workarea>

Thanks for using \033[1mgit multi\033[0m ... the ultimate multi-repo

Class Method Summary collapse

Class Method Details

.archived_repositoriesObject

lists of repositories with a given state



138
139
140
# File 'lib/git/multi.rb', line 138

def archived_repositories
  repositories.find_all(&:archived)
end

.cloned_repositoriesObject



187
188
189
190
191
# File 'lib/git/multi.rb', line 187

def cloned_repositories
  repositories.find_all { |project|
    File.directory? project.local_path
  }
end

.excess_repositoriesObject

derived lists of repositories



154
155
156
157
158
159
# File 'lib/git/multi.rb', line 154

def excess_repositories
  repository_full_names = repositories.map(&:full_name)
  local_repositories.reject { |project|
    repository_full_names.include? project.full_name
  }
end

.forked_repositoriesObject



142
143
144
# File 'lib/git/multi.rb', line 142

def forked_repositories
  repositories.find_all(&:fork)
end

.github_repositoriesObject

remote repositories (on GitHub)



68
69
70
71
72
73
# File 'lib/git/multi.rb', line 68

def github_repositories
  @github_repositories ||= (
    Git::Hub.user_repositories(USER) +
    ORGANIZATIONS.map { |org| Git::Hub.org_repositories(org) }
  ).flatten
end

.local_repositoriesObject



57
58
59
60
61
62
# File 'lib/git/multi.rb', line 57

def local_repositories
  (
    @local_user_repositories[USER] +
    ORGANIZATIONS.map { |org| @local_org_repositories[org] }
  ).flatten
end

.missing_repositoriesObject



181
182
183
184
185
# File 'lib/git/multi.rb', line 181

def missing_repositories
  repositories.find_all { |project|
    !File.directory? project.local_path
  }
end

.private_repositoriesObject



146
147
148
# File 'lib/git/multi.rb', line 146

def private_repositories
  repositories.find_all(&:private)
end

.refresh_repositoriesObject



75
76
77
78
79
80
81
# File 'lib/git/multi.rb', line 75

def refresh_repositories
  File.directory?(CACHE) || FileUtils.mkdir_p(CACHE)

  File.open(REPOSITORIES, 'wb') do |file|
    Marshal.dump(github_repositories, file)
  end
end

.repositoriesObject



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/git/multi.rb', line 110

def repositories
  if File.size?(REPOSITORIES)
    @repositories ||= Marshal.load(File.read(REPOSITORIES)).tap do |projects|
      notify "Finished loading #{REPOSITORIES}"
      projects.each_with_index do |project, index|
        # ensure 'project' has handle on an Octokit client
        project.client = Git::Hub.send(:client)
        # adorn 'project', which is a Sawyer::Resource
        project.parent_dir = Pathname.new(File.join(WORKAREA, project.owner.))
        project.local_path = Pathname.new(File.join(WORKAREA, project.full_name))
        project.fractional_index = "#{index + 1}/#{projects.count}"
        # fix 'project' => https://github.com/octokit/octokit.rb/issues/727
        project.compliant_ssh_url = 'ssh://%s/%s' % project.ssh_url.split(':', 2)
        # remove optional '.git' suffix from '[email protected]:pvdb/git-multi.git'
        project.abbreviated_ssh_url = project.ssh_url.chomp('.git')
        # extend 'project' with 'just do it' capabilities
        project.extend Nike
      end
    end
  else
    refresh_repositories and repositories
  end
end

.spurious_repositoriesObject



168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/git/multi.rb', line 168

def spurious_repositories
  cloned_repositories.find_all { |project|
    origin_url = `git -C #{project.local_path} config --get remote.origin.url`.chomp
    ![
      project.clone_url,
      project.ssh_url,
      project.compliant_ssh_url,
      project.abbreviated_ssh_url,
      project.git_url,
    ].include? origin_url
  }
end

.stale_repositoriesObject



161
162
163
164
165
166
# File 'lib/git/multi.rb', line 161

def stale_repositories
  repository_full_names = github_repositories.map(&:full_name)
  repositories.reject { |project|
    repository_full_names.include? project.full_name
  }
end