Class: Braid::Commands::Add

Inherits:
Braid::Command show all
Defined in:
lib/braid/commands/add.rb

Instance Method Summary collapse

Methods inherited from Braid::Command

#config, #force?, msg, #msg, run, #verbose?

Methods included from Operations::VersionControl

#git, #git_cache

Instance Method Details

#run(url, options = {}) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/braid/commands/add.rb', line 4

def run(url, options = {})
  with_reset_on_error do
    mirror           = config.add_from_options(url, options)
    add_config_file

    mirror.branch = nil if options['revision']
    raise BraidError, 'Can not add mirror specifying both a revision and a tag' if options['revision'] && mirror.tag

    branch_message   = (mirror.branch.nil? || mirror.branch == 'master') ? '' : " branch '#{mirror.branch}'"
    tag_message      = mirror.tag.nil? ? '' : " tag '#{mirror.tag}'"
    revision_message = options['revision'] ? " at #{display_revision(mirror, options['revision'])}" : ''
    msg "Adding mirror of '#{mirror.url}'#{branch_message}#{tag_message}#{revision_message}."

    # these commands are explained in the subtree merge guide
    # http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html

    config.update(mirror)
    setup_remote(mirror)
    mirror.fetch

    new_revision = validate_new_revision(mirror, options['revision'])
    target_item = mirror.upstream_item_for_revision(new_revision)

    git.add_item_to_index(target_item, mirror.path, true)

    mirror.revision = new_revision
    config.update(mirror)
    add_config_file

    git.commit("Add mirror '#{mirror.path}' at #{display_revision(mirror)}")
    msg "Added mirror at #{display_revision(mirror)}."

    clear_remote(mirror, options)
  end
end