Class: Gitlab::Git::Blob
- Inherits:
-
Object
- Object
- Gitlab::Git::Blob
- Includes:
- EncodingHelper, Linguist::BlobHelper
- Defined in:
- lib/gitlab_git/blob.rb
Instance Attribute Summary collapse
-
#commit_id ⇒ Object
Returns the value of attribute commit_id.
-
#data ⇒ Object
Returns the value of attribute data.
-
#id ⇒ Object
Returns the value of attribute id.
-
#mode ⇒ Object
Returns the value of attribute mode.
-
#name ⇒ Object
Returns the value of attribute name.
-
#path ⇒ Object
Returns the value of attribute path.
-
#size ⇒ Object
Returns the value of attribute size.
Class Method Summary collapse
-
.commit(repository, options, action = :add) ⇒ Object
Commit file in repository and return commit sha.
- .find(repository, sha, path) ⇒ Object
-
.find_entry_by_path(repository, root_id, path) ⇒ Object
Recursive search of blob id by path.
- .raw(repository, sha) ⇒ Object
-
.remove(repository, options) ⇒ Object
Remove file from repository and return commit sha.
- .submodule_blob(blob_entry, path, sha) ⇒ Object
Instance Method Summary collapse
- #empty? ⇒ Boolean
-
#initialize(options) ⇒ Blob
constructor
A new instance of Blob.
Methods included from EncodingHelper
Constructor Details
#initialize(options) ⇒ Blob
Returns a new instance of Blob.
206 207 208 209 210 |
# File 'lib/gitlab_git/blob.rb', line 206 def initialize() %w(id name path size data mode commit_id).each do |key| self.send("#{key}=", [key.to_sym]) end end |
Instance Attribute Details
#commit_id ⇒ Object
Returns the value of attribute commit_id.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def commit_id @commit_id end |
#data ⇒ Object
Returns the value of attribute data.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def data @data end |
#id ⇒ Object
Returns the value of attribute id.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def id @id end |
#mode ⇒ Object
Returns the value of attribute mode.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def mode @mode end |
#name ⇒ Object
Returns the value of attribute name.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def name @name end |
#path ⇒ Object
Returns the value of attribute path.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def path @path end |
#size ⇒ Object
Returns the value of attribute size.
10 11 12 |
# File 'lib/gitlab_git/blob.rb', line 10 def size @size end |
Class Method Details
.commit(repository, options, action = :add) ⇒ Object
Commit file in repository and return commit sha
options should contain next structure:
file: {
content: 'Lorem ipsum...',
path: 'documents/story.txt',
update: true
},
author: {
email: '[email protected]',
name: 'Test User',
time: Time.now
},
committer: {
email: '[email protected]',
name: 'Test User',
time: Time.now
},
commit: {
message: 'Wow such commit',
branch: 'master'
}
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
# File 'lib/gitlab_git/blob.rb', line 115 def commit(repository, , action = :add) file = [:file] update = file[:update].nil? ? true : file[:update] = [:author] committer = [:committer] commit = [:commit] repo = repository.rugged ref = commit[:branch] parents = [] unless ref.start_with?('refs/') ref = 'refs/heads/' + ref end path_name = PathHelper.normalize_path(file[:path]) # Abort if any invalid characters remain (e.g. ../foo) raise Repository::InvalidBlobName.new("Invalid path") if path_name.each_filename.to_a.include?('..') filename = path_name.to_s index = repo.index unless repo.empty? rugged_ref = repo.references[ref] raise Repository::InvalidRef.new("Invalid branch name") unless rugged_ref last_commit = rugged_ref.target index.read_tree(last_commit.tree) parents = [last_commit] end if action == :remove index.remove(filename) else mode = 0100644 file_entry = index.get(filename) if file_entry raise Repository::InvalidBlobName.new("Filename already exists; update not allowed") unless update # Preserve the current file mode if one is available mode = file_entry[:mode] if file_entry[:mode] end content = file[:content] detect = CharlockHolmes::EncodingDetector.new.detect(content) if content unless detect && detect[:type] == :binary # When writing to the repo directly as we are doing here, # the `core.autocrlf` config isn't taken into account. content.gsub!("\r\n", "\n") if repository.autocrlf end oid = repo.write(content, :blob) index.add(path: filename, oid: oid, mode: mode) end opts = {} opts[:tree] = index.write_tree(repo) opts[:author] = opts[:committer] = committer opts[:message] = commit[:message] opts[:parents] = parents opts[:update_ref] = ref Rugged::Commit.create(repo, opts) end |
.find(repository, sha, path) ⇒ Object
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/gitlab_git/blob.rb', line 13 def find(repository, sha, path) commit = repository.lookup(sha) root_tree = commit.tree blob_entry = find_entry_by_path(repository, root_tree.oid, path) return nil unless blob_entry if blob_entry[:type] == :commit submodule_blob(blob_entry, path, sha) else blob = repository.lookup(blob_entry[:oid]) if blob Blob.new( id: blob.oid, name: blob_entry[:name], size: blob.size, data: blob.content, mode: blob_entry[:filemode].to_s(8), path: path, commit_id: sha, ) end end end |
.find_entry_by_path(repository, root_id, path) ⇒ Object
Recursive search of blob id by path
Ex.
blog/ # oid: 1a
app/ # oid: 2a
models/ # oid: 3a
file.rb # oid: 4a
Blob.find_entry_by_path(repo, ‘1a’, ‘app/file.rb’) # => ‘4a’
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/gitlab_git/blob.rb', line 61 def find_entry_by_path(repository, root_id, path) root_tree = repository.lookup(root_id) # Strip leading slashes path[/^\/*/] = '' path_arr = path.split('/') entry = root_tree.find do |entry| entry[:name] == path_arr[0] end return nil unless entry if path_arr.size > 1 return nil unless entry[:type] == :tree path_arr.shift find_entry_by_path(repository, entry[:oid], path_arr.join('/')) else [:blob, :commit].include?(entry[:type]) ? entry : nil end end |
.raw(repository, sha) ⇒ Object
40 41 42 43 44 45 46 47 48 |
# File 'lib/gitlab_git/blob.rb', line 40 def raw(repository, sha) blob = repository.lookup(sha) Blob.new( id: blob.oid, size: blob.size, data: blob.content, ) end |
.remove(repository, options) ⇒ Object
Remove file from repository and return commit sha
options should contain next structure:
file: {
path: 'documents/story.txt'
},
author: {
email: '[email protected]',
name: 'Test User',
time: Time.now
},
committer: {
email: '[email protected]',
name: 'Test User',
time: Time.now
},
commit: {
message: 'Remove FILENAME',
branch: 'master'
}
201 202 203 |
# File 'lib/gitlab_git/blob.rb', line 201 def remove(repository, ) commit(repository, , :remove) end |
Instance Method Details
#empty? ⇒ Boolean
212 213 214 |
# File 'lib/gitlab_git/blob.rb', line 212 def empty? !data || data == '' end |