File: submodule_collection.rb

package info (click to toggle)
ruby-rugged 1.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,752 kB
  • sloc: ansic: 8,722; ruby: 7,473; sh: 99; makefile: 5
file content (53 lines) | stat: -rw-r--r-- 1,831 bytes parent folder | download | duplicates (3)
1
2
3
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Copyright (C) the Rugged contributors.  All rights reserved.
#
# This file is part of Rugged, distributed under the MIT license.
# For full terms see the included LICENSE file.

module Rugged
  class SubmoduleCollection

    # call-seq:
    #   submodules.setup_add(url, path[, options]) -> submodule
    #
    # Add a new +submodule+.
    #
    # This does <tt>"git submodule add"</tt> incuding fetch and checkout of the
    # submodule contents.
    #
    # - +url+: URL for the submodule's remote
    # - +path+: path at which the submodule should be created
    #
    # The +options+ hash accepts all options supported by Rugged::Remote#fetch
    # and the following:
    # :gitlink ::
    #   (defaults to +true+) should workdir contain a
    #   gitlink to the repository in +.git/modules+ vs. repository
    #   directly in workdir.
    #
    # Returns the newly created +submodule+
    def add(url, path, options = {})
      submodule = setup_add(url, path, **options)
      clone_submodule(submodule.repository, **options)
      submodule.finalize_add
    end

    private
    # currently libgit2's `git_submodule_add_setup` initializes a repo
    # with a workdir for the submodule. libgit2's `git_clone` however
    # requires the target for the clone to be an empty dir.
    #
    # This provides a ghetto clone implementation that:
    # 1. fetches the remote
    # 2. sets up a master branch to be tracking origin/master
    # 3. checkouts the submodule
    def clone_submodule(repo, **fetch_options)
      # the remote was just added by setup_add, no need to check presence
      repo.remotes['origin'].fetch(**fetch_options)

      repo.branches.create('master','origin/master')
      repo.branches['master'].upstream = repo.branches['origin/master']

      repo.checkout_head(strategy: :force)
    end
  end
end