Class: Git::URL Private

Inherits:
Object
  • Object
show all
Defined in:
lib/git/url.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Methods for parsing a Git URL

Any URL that can be passed to git clone can be parsed by this class.

Constant Summary collapse

GIT_ALTERNATIVE_SSH_SYNTAX =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Regexp used to match a Git URL with an alternative SSH syntax such as user@host:path

%r{
  ^
  (?:(?<user>[^@/]+)@)?  # user or nil
  (?<host>[^:/]+)        # host is required
  :(?!/)                 # : serparator is required, but must not be followed by /
  (?<path>.*?)           # path is required
  $
}x

Class Method Summary collapse

Class Method Details

.clone_to(url, bare: false, mirror: false) ⇒ String

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The directory git clone would use for the repository directory for the given URL

Examples:

Deriving the clone directory name

Git::URL.clone_to('https://github.com/ruby-git/ruby-git.git') #=> 'ruby-git'

Parameters:

  • url (String)

    the Git URL containing the repository directory

  • bare (Boolean) (defaults to: false)

    whether the repository should be cloned as bare

  • mirror (Boolean) (defaults to: false)

    whether the repository should be cloned as a mirror

Returns:

  • (String)

    the name of the repository directory



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/git/url.rb', line 69

def self.clone_to(url, bare: false, mirror: false)
  uri = parse(url)
  path_parts = uri.path.split('/')
  path_parts.pop if path_parts.last == '.git'
  directory = path_parts.last
  if bare || mirror
    directory += '.git' unless directory.end_with?('.git')
  elsif directory.end_with?('.git')
    directory = directory[0..-5]
  end
  directory
end

.parse(url) ⇒ Addressable::URI

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parse a Git URL and return an Addressable::URI object

The URI returned can be converted back to a string with 'to_s'. This is guaranteed to return the same URL string that was parsed.

Examples:

Parsing clone target from HTTPS and local paths

uri = Git::URL.parse('https://github.com/ruby-git/ruby-git.git')
  #=> #<Addressable::URI:0x44c URI:https://github.com/ruby-git/ruby-git.git>
uri.scheme #=> "https"
uri.host #=> "github.com"
uri.path #=> "/ruby-git/ruby-git.git"

Git::URL.parse('/Users/James/projects/ruby-git')
  #=> #<Addressable::URI:0x438 URI:/Users/James/projects/ruby-git>

Parameters:

  • url (String)

    the Git URL to parse

Returns:

  • (Addressable::URI)

    the parsed URI



48
49
50
51
52
53
54
# File 'lib/git/url.rb', line 48

def self.parse(url)
  if !url.start_with?('file:') && (m = GIT_ALTERNATIVE_SSH_SYNTAX.match(url))
    GitAltURI.new(user: m[:user], host: m[:host], path: m[:path])
  else
    Addressable::URI.parse(url)
  end
end