integtest/spec/helper/repo.rb (109 lines of code) (raw):

# frozen_string_literal: true require 'fileutils' require_relative 'sh' ## # Helper class for setting up source files for tests. class Repo include Sh attr_reader :name, :root ## # Set to false to prevent adding an Elastic clone when the repo # is initialized attr_accessor :add_elastic_remote def initialize(name, root) @name = name @root = root @add_elastic_remote = true @initialized = false end ## # Write a source file and return the absolute path to that file. def write(source_relative_path, text) realpath = path source_relative_path dir = File.expand_path '..', realpath FileUtils.mkdir_p dir File.open(realpath, 'w:UTF-8') do |f| f.write text end realpath end ## # Read a file in the repo to a string. def read(source_relative_path) realpath = path source_relative_path File.open realpath, 'r:UTF-8', &:read end ## # Append some text to a file. def append(source_relative_path, extra_text) text = read source_relative_path write source_relative_path, text + extra_text end ## # Delete a file in the repo. def delete(source_relative_path) realpath = path source_relative_path File.delete realpath end ## # Copy a file into the source path, returning the destination path. def cp(source_file, dest_relative_path) realpath = path dest_relative_path dir = File.expand_path '..', realpath FileUtils.mkdir_p dir FileUtils.cp source_file, realpath end ## # Transform path fragment for a source file into the path that that file # should have. def path(source_relative_path) File.expand_path(source_relative_path, @root) end ## # Commit all changes to the repo. def commit(message) Dir.chdir @root do init_repo! sh 'git add .' sh "git commit -m '#{message}'" end end ## # Creates a new branch from the current branch and checks it out. def switch_to_new_branch(new_branch) Dir.chdir @root do sh "git checkout -b #{new_branch}" end end ## # Checks out a branch. def switch_to_branch(branch) # TODO: rename to checkout? Dir.chdir @root do sh "git checkout #{branch}" end end ## # Rename the current branch def rename_branch(new_branch) Dir.chdir @root do sh "git branch -m #{new_branch}" end end ## # The hash of the last commit. def short_hash Dir.chdir @root do hash = sh 'git rev-parse --short HEAD' hash.strip end end ## # The hash of the last commit to a file. def last_commit(path) Dir.chdir @root do hash = sh "git log -n 1 --pretty=format:%h -- #{path}" hash.strip end end ## # Create a worktree at `dest` for the branch `branch`. def create_worktree(dest, branch) Dir.chdir @root do sh "git worktree add #{dest} #{branch}" end end ## # Clone this repo from some directory on disk def clone_from(src) @initialized = true sh "git clone #{src} #{@root}" end ## # Push commits in this repo to some remote, maybe a directory on disk. def push_to(dest) Dir.chdir @root do sh "git push #{dest}" end end def merge(ref) Dir.chdir @root do sh "git merge #{ref}" end end def copy_shared_conf FileUtils.mkdir_p @root sh "cp -r /docs_build/shared #{@root}" end private def init_repo! return if @initialized sh 'git init' if @add_elastic_remote # Add an Elastic remote so we get a nice edit url sh 'git remote add elastic git@github.com:elastic/docs.git' end @initialized = true end end