Class: Git::URL

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

Overview

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 =

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.freeze

Class Method Summary collapse

Class Method Details

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

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

Examples:

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

Parameters:

  • url (String)

    the Git URL containing the repository directory

Returns:

  • (String)

    the name of the repository directory



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/git/url.rb', line 64

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

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:

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



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

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