def cache!
repository_cached? and return or repository_cached!
unless repository.git?
repository.path.rmtree if repository.path.exist?
repository.path.mkpath
repository.clone!(uri)
raise Error, "failed to clone #{uri}" unless repository.git?
end
repository_clean_once!
unless sha
repository_update_once!
self.sha = fetch_sha_memo
end
unless repository.checked_out?(sha)
repository_update_once! unless repository.has_commit?(sha)
repository.checkout!(sha)
raise Error, "failed to checkout #{sha}" unless repository.checked_out?(sha)
end
end