require 'base64' class Gitlab::Client # Defines methods related to repository files. # @see https://docs.gitlab.com/ce/api/repository_files.html module RepositoryFiles # Get the contents of a file # # @example # Gitlab.file_contents(42, 'Gemfile') # Gitlab.repo_file_contents(3, 'Gemfile', 'ed899a2f4b50b4370feeea94676502b42383c746') # # @param [Integer, String] project The ID or name of a project. # @param [String] filepath The relative path of the file in the repository # @param [String] ref The name of a repository branch or tag or if not given the default branch. # @return [String] def file_contents(project, filepath, ref='master') get "/projects/#{url_encode project}/repository/files/#{url_encode filepath}/raw", query: { ref: ref}, format: nil, headers: { Accept: 'text/plain' }, parser: ::Gitlab::Request::Parser end alias_method :repo_file_contents, :file_contents # Gets a repository file. # # @example # Gitlab.get_file(42, "README.md", "master") # # @param [Integer, String] project The ID or name of a project. # @param [String] file_path The full path of the file. # @param [String] ref The name of branch, tag or commit. # @return [Gitlab::ObjectifiedHash] def get_file(project, file_path, ref) get("/projects/#{url_encode project}/repository/files/#{url_encode file_path}", query: { ref: ref }) end # Creates a new repository file. # # @example # Gitlab.create_file(42, "path", "branch", "content", "commit message") # # @param [Integer, String] project The ID or name of a project. # @param [String] path full path to new file. # @param [String] branch the name of the branch. # @param [String] content file content. # @param [String] commit_message ...commit message. # @param [Hash] options Optional additional details for commit # @option options [String] :author_name Commit author's name # @option options [String] :author_email Commit author's email address # @return [Gitlab::ObjectifiedHash] def create_file(project, path, branch, content, commit_message, options = {}) post("/projects/#{url_encode project}/repository/files/#{url_encode path}", body: { branch: branch, commit_message: commit_message }.merge(options).merge(encoded_content_attributes(content))) end # Edits an existing repository file. # # @example # Gitlab.edit_file(42, "path", "branch", "content", "commit message") # # @param [Integer, String] project The ID or name of a project. # @param [String] path full path of file to update. # @param [String] branch the name of the branch to commit changes to. # @param [String] content new file content. # @param [String] commit_message ...commit message. # @param [Hash] options Optional additional details for commit # @option options [String] :author_name Commit author's name # @option options [String] :author_email Commit author's email address # @return [Gitlab::ObjectifiedHash] def edit_file(project, path, branch, content, commit_message, options = {}) put("/projects/#{url_encode project}/repository/files/#{url_encode path}", body: { branch: branch, commit_message: commit_message }.merge(options).merge(encoded_content_attributes(content))) end # Removes an existing repository file. # # @example # Gitlab.remove_file(42, "path", "branch", "commit message") # # @param [Integer, String] project The ID or name of a project. # @param [String] path full path of file to delete. # @param [String] branch the name of the branch to commit the deletion to. # @param [String] commit_message ...a commit message ;) # @param [Hash] options Optional additional details for commit # @option options [String] :author_name Commit author's name # @option options [String] :author_email Commit author's email address # @return [Gitlab::ObjectifiedHash] def remove_file(project, path, branch, commit_message, options = {}) delete("/projects/#{url_encode project}/repository/files/#{url_encode path}", body: { branch: branch, commit_message: commit_message }.merge(options)) end private def encoded_content_attributes(content) { encoding: 'base64', content: Base64.encode64(content) } end end end