PageRenderTime 60ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/reposlanger/providers/bitbucket.rb

https://bitbucket.org/pygmael/reposlanger
Ruby | 79 lines | 61 code | 15 blank | 3 comment | 2 complexity | 4ca2d0e06bf94c643ead82eb1301d5fb MD5 | raw file
  1. require 'reposlanger'
  2. module Reposlanger
  3. module Providers
  4. class Bitbucket
  5. include Reposlanger::Provider
  6. def self.api(options = {})
  7. BitBucket.new(defaults.merge(options))
  8. end
  9. def self.repos(options = {})
  10. api.repos.all.map(&:name)
  11. end
  12. def do_push
  13. unless remote_exists?
  14. params = metadata_to_attributes
  15. params[:name] = name
  16. api.repos.create params
  17. end
  18. super
  19. end
  20. def do_pull
  21. self.metadata = attributes_to_metadata
  22. super
  23. end
  24. def clone_url
  25. "git@bitbucket.org:#{api.user}/#{name}.git"
  26. end
  27. # additional utility methods
  28. # map of bitbucket repo attributes to reposlanger metadata
  29. METADATA_MAP = {
  30. :has_wiki => :wiki,
  31. :has_issues => :issues,
  32. :logo => :logo,
  33. :website => :website,
  34. :description => :description,
  35. :is_private => :private,
  36. :no_public_forks => :private,
  37. :language => :language,
  38. }
  39. def metadata_to_attributes
  40. return {} unless metadata
  41. METADATA_MAP.each_with_object({}) do |kv, h|
  42. if val = metadata[kv[1].to_s]
  43. h[kv[0].to_sym] = val
  44. end
  45. end
  46. end
  47. def attributes_to_metadata
  48. repo_attributes = api.repos.get(api.user, name.downcase)
  49. METADATA_MAP.each_with_object({}) do |kv, h|
  50. h[kv[1].to_s] = repo_attributes[kv[0]]
  51. end
  52. end
  53. def remote_exists?
  54. begin
  55. # could memoize this, but would need to be careful to expire
  56. api.repos.get(api.user, name.downcase) && true
  57. rescue BitBucket::Error::NotFound
  58. puts "Bitbucket repo #{name} does not exist"
  59. false
  60. end
  61. end
  62. end
  63. end
  64. end