Class: Buildr::Repositories

Inherits:
Object show all
Includes:
Singleton
Defined in:
lib/buildr/packaging/artifact.rb

Overview

Holds the path to the local repository, URLs for remote repositories, and settings for release server.

You can access this object from the #repositories method. For example:

puts repositories.local
repositories.remote << 'http://example.com/repo'
repositories.release_to = 'sftp://example.com/var/www/public/repo'

Instance Method Summary collapse

Instance Method Details

#localObject

:call-seq:

local => path

Returns the path to the local repository.

The default path is .m2/repository relative to the home directory. You can set this using the M2_REPO environment variable or the repositories/local value in your settings.yaml file.



641
642
643
644
645
# File 'lib/buildr/packaging/artifact.rb', line 641

def local
  @local ||= File.expand_path(ENV['M2_REPO'] || ENV['local_repo'] ||
    (Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['local']) ||
    File.join(ENV['HOME'], '.m2/repository'))
end

#local=(dir) ⇒ Object

:call-seq:

local = path

Sets the path to the local repository.

The best place to set the local repository path is from a buildr.rb file located in the .buildr directory under your home directory. That way all your projects will share the same path, without affecting other developers collaborating on these projects.



656
657
658
# File 'lib/buildr/packaging/artifact.rb', line 656

def local=(dir)
  @local = dir ? File.expand_path(dir) : nil
end

#locate(spec) ⇒ Object

:call-seq:

locate(spec) => path

Locates an artifact in the local repository based on its specification, and returns a file path.

For example:

locate :group=>'log4j', :id=>'log4j', :version=>'1.1'
  => ~/.m2/repository/log4j/log4j/1.1/log4j-1.1.jar


669
670
671
672
# File 'lib/buildr/packaging/artifact.rb', line 669

def locate(spec)
  spec = Artifact.to_hash(spec)
  File.join(local, spec[:group].split('.'), spec[:id], spec[:version], Artifact.hash_to_file_name(spec))
end

#mirrorsObject

:call-seq:

mirrors => Array

Returns an array of all the mirror repository URLs.

Mirrors override remote repositories defined in the project. The best way is to add repositories to the user settings file under ‘$HOME/.buildr/settings.yaml’. For example:

repositories:
  mirrors:
  - http://example.com/repository


685
686
687
688
689
690
691
692
# File 'lib/buildr/packaging/artifact.rb', line 685

def mirrors
  unless @mirrors
    @mirrors = [Buildr.settings.user, Buildr.settings.build].inject([]) { |repos, hash|
      repos | Array(hash['repositories'] && hash['repositories']['mirrors'])
    }
  end
  @mirrors
end

#mirrors=(urls) ⇒ Object

:call-seq:

remote = Array
remote = url
remote = nil

With a String argument, clears the array and set it to that single URL.

With an Array argument, clears the array and set it to these specific URLs.

With nil, clears the array.



704
705
706
707
708
709
710
# File 'lib/buildr/packaging/artifact.rb', line 704

def mirrors=(urls)
  case urls
  when nil then @mirrors = nil
  when Array then @mirrors = urls.dup
  else @mirrors = [urls.to_s]
  end
end

#release_toObject

:call-seq:

release_to => hash

Returns the current release server setting as a Hash. This is a more convenient way to configure the settings, as it allows you to specify the settings progressively.

For example, the Buildfile will contain the repository URL used by all developers:

repositories.release_to[:url] ||= 'sftp://example.com/var/www/repo'

Your private buildr.rb will contain your credentials:

repositories.release_to[:username] = 'john'
repositories.release_to[:password] = 'secret'


846
847
848
849
850
851
852
853
# File 'lib/buildr/packaging/artifact.rb', line 846

def release_to
  unless @release_to
    value = (Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['release_to']) \
      || (Buildr.settings.build['repositories'] && Buildr.settings.build['repositories']['release_to'])
    @release_to = Hash === value ? value.inject({}) { |hash, (key, value)| hash.update(key.to_sym=>value) } : { :url=>Array(value).first }
  end
  @release_to
end

#release_to=(options) ⇒ Object

:call-seq:

release_to = url
release_to = hash

Specifies the release server. Accepts a Hash with different repository settings (e.g. url, username, password), or a String to only set the repository URL.

Besides the URL, all other settings depend on the transport protocol in use.

For example:

repositories.release_to = 'sftp://john:[email protected]/var/www/repo/'

repositories.release_to = { :url=>'sftp://example.com/var/www/repo/',
                             :username='john', :password=>'secret' }

Or in the settings.yaml file:

repositories:
  release_to: sftp://john:[email protected]/var/www/repo/

repositories:
  release_to:
    url: sftp://example.com/var/www/repo/
    username: john
    password: secret


830
831
832
833
# File 'lib/buildr/packaging/artifact.rb', line 830

def release_to=(options)
  options = { :url=>options } unless Hash === options
  @release_to = options
end

#remoteObject

:call-seq:

remote => Array

Returns an array of all the remote repository URLs.

When downloading artifacts, repositories are accessed in the order in which they appear here. The best way is to add repositories individually, for example:

repositories.remote << 'http://example.com/repo'

You can also specify remote repositories in the settings.yaml (per user) and build.yaml (per build) files. Both sets of URLs are loaded by default into this array, URLs from the personal setting showing first.

For example:

repositories:
  remote:
  - http://example.com/repo
  - http://elsewhere.com/repo


730
731
732
733
734
735
736
737
738
739
740
741
# File 'lib/buildr/packaging/artifact.rb', line 730

def remote
  unless mirrors.empty?
    info "Remote repositories overridden by mirrors #{mirrors.map(&:to_s).join(", ")}"
    mirrors
  end
  unless @remote
    @remote = [Buildr.settings.user, Buildr.settings.build].inject([]) { |repos, hash|
      repos | Array(hash['repositories'] && hash['repositories']['remote'])
    }
  end
  @remote
end

#remote=(urls) ⇒ Object

:call-seq:

remote = Array
remote = url
remote = nil

With a String argument, clears the array and set it to that single URL.

With an Array argument, clears the array and set it to these specific URLs.

With nil, clears the array.



799
800
801
802
803
804
805
# File 'lib/buildr/packaging/artifact.rb', line 799

def remote=(urls)
  case urls
  when nil then @remote = nil
  when Array then @remote = urls.dup
  else @remote = [urls.to_s]
  end
end

#remote_uriObject

:call-seq:

remote_uri => Array

Returns an array of all the remote repositories as instances of URI

Supports

* String urls: "http://example.com/repo"
* URI: URI.parse( "http://example.com/repo" )
* Hash: { :url => "http://example.com/repo", :user => "user", :pass => "pass" }


753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
# File 'lib/buildr/packaging/artifact.rb', line 753

def remote_uri
  remote

  uris = []
  @remote.each do |repo|
    case repo
    when nil then
      # ignore nil
    when URI then
      uris << repo
    when Hash then
      url = (repo[:url] || repo['url'] )
      if url
        uri = URI.parse(url)
        if ( username = (repo[:username] || repo['username'] || repo[:user] || repo['user']) )
          uri.user = username
        end

        if ( password = (repo[:password] || repo['password'] || repo[:pass] || repo['pass']) )
          uri.password = password
        end
        uris << uri
      else
        fail( "Repository Hash format missing url: #{repo}" )
      end

    when String then
      uris << URI.parse(repo)
    else
      fail( "Unsupported Repository format: #{repo}" )
    end
  end

  uris
end

#snapshot_toObject

:call-seq:

snapshot_to => hash

Returns the current snapshot release server setting as a Hash. This is a more convenient way to configure the settings, as it allows you to specify the settings progressively.

For example, the Buildfile will contain the repository URL used by all developers:

repositories.snapshot_to[:url] ||= 'sftp://example.com/var/www/repo'

Your private buildr.rb will contain your credentials:

repositories.snapshot_to[:username] = 'john'
repositories.snapshot_to[:password] = 'secret'


894
895
896
897
898
899
900
901
# File 'lib/buildr/packaging/artifact.rb', line 894

def snapshot_to
  unless @snapshot_to
    value = (Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['snapshot_to']) \
      || (Buildr.settings.build['repositories'] && Buildr.settings.build['repositories']['snapshot_to'])
    @snapshot_to = Hash === value ? value.inject({}) { |hash, (key, value)| hash.update(key.to_sym=>value) } : { :url=>Array(value).first }
  end
  @snapshot_to
end

#snapshot_to=(options) ⇒ Object

:call-seq:

snapshot_to = url
snapshot_to = hash

Specifies the release server. Accepts a Hash with different repository settings (e.g. url, username, password), or a String to only set the repository URL.

Besides the URL, all other settings depend on the transport protocol in use.

For example:

repositories.snapshot_to = 'sftp://john:[email protected]/var/www/repo/'

repositories.snapshot_to = { :url=>'sftp://example.com/var/www/repo/',
                             :username='john', :password=>'secret' }

Or in the settings.yaml file:

repositories:
  snapshot_to: sftp://john:[email protected]/var/www/repo/

repositories:
  snapshot_to:
    url: sftp://example.com/var/www/repo/
    username: john
    password: secret


878
879
880
881
# File 'lib/buildr/packaging/artifact.rb', line 878

def snapshot_to=(options)
  options = { :url=>options } unless Hash === options
  @snapshot_to = options
end