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.
170 171 172 173 174 |
# File 'lib/gitlab_git/blob.rb', line 170 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.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def commit_id @commit_id end |
#data ⇒ Object
Returns the value of attribute data.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def data @data end |
#id ⇒ Object
Returns the value of attribute id.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def id @id end |
#mode ⇒ Object
Returns the value of attribute mode.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def mode @mode end |
#name ⇒ Object
Returns the value of attribute name.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def name @name end |
#path ⇒ Object
Returns the value of attribute path.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 def path @path end |
#size ⇒ Object
Returns the value of attribute size.
7 8 9 |
# File 'lib/gitlab_git/blob.rb', line 7 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'
},
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'
}
109 110 111 112 113 114 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 |
# File 'lib/gitlab_git/blob.rb', line 109 def commit(repository, , action = :add) file = [:file] = [:author] committer = [:committer] commit = [:commit] repo = repository.rugged ref = 'refs/heads/' + commit[:branch] parents = [] index = repo.index unless repo.empty? last_commit = repo.references[ref].target index.read_tree(last_commit.tree) parents = [last_commit] end if action == :remove index.remove(file[:path]) else oid = repo.write(file[:content], :blob) index.add(path: file[:path], oid: oid, mode: 0100644) 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
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 |
# File 'lib/gitlab_git/blob.rb', line 10 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’
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/gitlab_git/blob.rb', line 58 def find_entry_by_path(repository, root_id, path) root_tree = repository.lookup(root_id) 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
37 38 39 40 41 42 43 44 45 |
# File 'lib/gitlab_git/blob.rb', line 37 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'
}
165 166 167 |
# File 'lib/gitlab_git/blob.rb', line 165 def remove(repository, ) commit(repository, , :remove) end |
Instance Method Details
#empty? ⇒ Boolean
176 177 178 |
# File 'lib/gitlab_git/blob.rb', line 176 def empty? !data || data == '' end |