lib/gitlab_git/repository.rb in gitlab_git-7.2.17 vs lib/gitlab_git/repository.rb in gitlab_git-7.2.18

- old
+ new

@@ -1,7 +1,8 @@ # Gitlab::Git::Repository is a wrapper around native Rugged::Repository object require_relative 'encoding_helper' +require_relative 'path_helper' require 'tempfile' require "rubygems/package" module Gitlab module Git @@ -10,10 +11,11 @@ SEARCH_CONTEXT_LINES = 3 class NoRepository < StandardError; end class InvalidBlobName < StandardError; end + class InvalidRef < StandardError; end # Default branch in the repository attr_accessor :root_ref # Full path to repo @@ -805,10 +807,57 @@ def autocrlf=(value) rugged.config['core.autocrlf'] = AUTOCRLF_VALUES.invert[value] end + # Create a new directory with a .gitkeep file. Creates + # all required nested directories (i.e. mkdir -p behavior) + # + # options should contain next structure: + # author: { + # email: 'user@example.com', + # name: 'Test User', + # time: Time.now + # }, + # committer: { + # email: 'user@example.com', + # name: 'Test User', + # time: Time.now + # }, + # commit: { + # message: 'Wow such commit', + # branch: 'master' + # } + def mkdir(path, options = {}) + # Check if this directory exists; if it does, then don't bother + # adding .gitkeep file. + ref = options[:commit][:branch] + path = PathHelper.normalize_path(path).to_s + rugged_ref = rugged.ref(ref) + + raise InvalidRef.new("Invalid ref") if rugged_ref.nil? + target_commit = rugged_ref.target + raise InvalidRef.new("Invalid target commit") if target_commit.nil? + + entry = tree_entry(target_commit, path) + if entry + if entry[:type] == :blob + raise InvalidBlobName.new("Directory already exists as a file") + else + raise InvalidBlobName.new("Directory already exists") + end + end + + options[:file] = { + content: '', + path: "#{path}/.gitkeep", + update: true + } + + Blob.commit(self, options) + end + private # Get the content of a blob for a given commit. If the blob is a commit # (for submodules) then return the blob's OID. def blob_content(commit, blob_name) @@ -899,14 +948,18 @@ end # Find the entry for +path+ in the tree for +commit+ def tree_entry(commit, path) pathname = Pathname.new(path) + first = true tmp_entry = nil pathname.each_filename do |dir| - if tmp_entry.nil? + if first tmp_entry = commit.tree[dir] + first = false + elsif tmp_entry.nil? + return nil else tmp_entry = rugged.lookup(tmp_entry[:oid]) return nil unless tmp_entry.type == :tree tmp_entry = tmp_entry[dir] end