Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/git/attributes.rb')
-rw-r--r--lib/gitlab/git/attributes.rb131
1 files changed, 0 insertions, 131 deletions
diff --git a/lib/gitlab/git/attributes.rb b/lib/gitlab/git/attributes.rb
deleted file mode 100644
index 42140ecc993..00000000000
--- a/lib/gitlab/git/attributes.rb
+++ /dev/null
@@ -1,131 +0,0 @@
-module Gitlab
- module Git
- # Class for parsing Git attribute files and extracting the attributes for
- # file patterns.
- #
- # Unlike Rugged this parser only needs a single IO call (a call to `open`),
- # vastly reducing the time spent in extracting attributes.
- #
- # This class _only_ supports parsing the attributes file located at
- # `$GIT_DIR/info/attributes` as GitLab doesn't use any other files
- # (`.gitattributes` is copied to this particular path).
- #
- # Basic usage:
- #
- # attributes = Gitlab::Git::Attributes.new(some_repo.path)
- #
- # attributes.attributes('README.md') # => { "eol" => "lf }
- class Attributes
- # path - The path to the Git repository.
- def initialize(path)
- @path = File.expand_path(path)
- @patterns = nil
- end
-
- # Returns all the Git attributes for the given path.
- #
- # path - A path to a file for which to get the attributes.
- #
- # Returns a Hash.
- def attributes(path)
- full_path = File.join(@path, path)
-
- patterns.each do |pattern, attrs|
- return attrs if File.fnmatch?(pattern, full_path)
- end
-
- {}
- end
-
- # Returns a Hash containing the file patterns and their attributes.
- def patterns
- @patterns ||= parse_file
- end
-
- # Parses an attribute string.
- #
- # These strings can be in the following formats:
- #
- # text # => { "text" => true }
- # -text # => { "text" => false }
- # key=value # => { "key" => "value" }
- #
- # string - The string to parse.
- #
- # Returns a Hash containing the attributes and their values.
- def parse_attributes(string)
- values = {}
- dash = '-'
- equal = '='
- binary = 'binary'
-
- string.split(/\s+/).each do |chunk|
- # Data such as "foo = bar" should be treated as "foo" and "bar" being
- # separate boolean attributes.
- next if chunk == equal
-
- key = chunk
-
- # Input: "-foo"
- if chunk.start_with?(dash)
- key = chunk.byteslice(1, chunk.length - 1)
- value = false
-
- # Input: "foo=bar"
- elsif chunk.include?(equal)
- key, value = chunk.split(equal, 2)
-
- # Input: "foo"
- else
- value = true
- end
-
- values[key] = value
-
- # When the "binary" option is set the "diff" option should be set to
- # the inverse. If "diff" is later set it should overwrite the
- # automatically set value.
- values['diff'] = false if key == binary && value
- end
-
- values
- end
-
- # Iterates over every line in the attributes file.
- def each_line
- full_path = File.join(@path, 'info/attributes')
-
- return unless File.exist?(full_path)
-
- File.open(full_path, 'r') do |handle|
- handle.each_line do |line|
- break unless line.valid_encoding?
-
- yield line.strip
- end
- end
- end
-
- private
-
- # Parses the Git attributes file.
- def parse_file
- pairs = []
- comment = '#'
-
- each_line do |line|
- next if line.start_with?(comment) || line.empty?
-
- pattern, attrs = line.split(/\s+/, 2)
-
- parsed = attrs ? parse_attributes(attrs) : {}
-
- pairs << [File.join(@path, pattern), parsed]
- end
-
- # Newer entries take precedence over older entries.
- pairs.reverse.to_h
- end
- end
- end
-end