Class: Match::GitHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/match/git_helper.rb

Class Method Summary collapse

Class Method Details

.branch_exists?(branch) ⇒ Boolean

Checks if a specific branch exists in the git repo

Returns:

  • (Boolean)


114
115
116
117
118
119
120
121
122
123
# File 'lib/match/git_helper.rb', line 114

def self.branch_exists?(branch)
  return unless @dir

  result = Dir.chdir(@dir) do
    FastlaneCore::CommandExecutor.execute(command: "git branch --list origin/#{branch.shellescape} --no-color -r",
                                          print_all: $verbose,
                                          print_command: $verbose)
  end
  return !result.empty?
end

.checkout_branch(branch) ⇒ Object

Create and checkout an specific branch in the git repo



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/match/git_helper.rb', line 88

def self.checkout_branch(branch)
  return unless @dir

  commands = []
  if branch_exists?(branch)
    # Checkout the branch if it already exists
    commands << "git checkout #{branch.shellescape}"
  else
    # If a new branch is being created, we create it as an 'orphan' to not inherit changes from the master branch.
    commands << "git checkout --orphan #{branch.shellescape}"
    # We also need to reset the working directory to not transfer any uncommitted changes to the new branch.
    commands << "git reset --hard"
  end

  UI.message "Checking out branch #{branch}..."

  Dir.chdir(@dir) do
    commands.each do |command|
      FastlaneCore::CommandExecutor.execute(command: command,
                                            print_all: $verbose,
                                            print_command: $verbose)
    end
  end
end

.clear_changesObject



79
80
81
82
83
84
85
# File 'lib/match/git_helper.rb', line 79

def self.clear_changes
  return unless @dir

  FileUtils.rm_rf(@dir)
  UI.success "🔒  Successfully encrypted certificates repo" # so the user is happy
  @dir = nil
end

.clone(git_url, shallow_clone, manual_password: nil, skip_docs: false, branch: "master") ⇒ Object



3
4
5
6
7
8
9
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/match/git_helper.rb', line 3

def self.clone(git_url, shallow_clone, manual_password: nil, skip_docs: false, branch: "master")
  return @dir if @dir

  @dir = Dir.mktmpdir

  # GIT_TERMINAL_PROMPT will fail the `git clone` command if user credentials are missing
  command = "GIT_TERMINAL_PROMPT=0 git clone '#{git_url}' '#{@dir}'"
  command << " --depth 1" if shallow_clone

  UI.message "Cloning remote git repo..."
  FastlaneCore::CommandExecutor.execute(command: command,
                                      print_all: $verbose,
                                  print_command: $verbose)

  UI.user_error!("Error cloning repo, make sure you have access to it '#{git_url}'") unless File.directory?(@dir)

  checkout_branch(branch) unless branch == "master"

  if !Helper.test? and GitHelper.match_version(@dir).nil? and manual_password.nil? and File.exist?(File.join(@dir, "README.md"))
    UI.important "Migrating to new match..."
    ChangePassword.update(params: { git_url: git_url,
                                git_branch: branch,
                             shallow_clone: shallow_clone },
                                      from: "",
                                        to: Encrypt.new.password(git_url))
    return self.clone(git_url, shallow_clone)
  end

  copy_readme(@dir) unless skip_docs
  Encrypt.new.decrypt_repo(path: @dir, git_url: git_url, manual_password: manual_password)

  return @dir
end

.commit_changes(path, message, git_url, branch = "master") ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/match/git_helper.rb', line 55

def self.commit_changes(path, message, git_url, branch = "master")
  Dir.chdir(path) do
    return if `git status`.include?("nothing to commit")

    Encrypt.new.encrypt_repo(path: path, git_url: git_url)
    File.write("match_version.txt", Match::VERSION) # unencrypted

    commands = []
    commands << "git add -A"
    commands << "git commit -m #{message.shellescape}"
    commands << "git push origin #{branch.shellescape}"

    UI.message "Pushing changes to remote git repo..."

    commands.each do |command|
      FastlaneCore::CommandExecutor.execute(command: command,
                                          print_all: $verbose,
                                      print_command: $verbose)
    end
  end
  FileUtils.rm_rf(path)
  @dir = nil
end

.copy_readme(directory) ⇒ Object

Copies the README.md into the git repo



126
127
128
129
# File 'lib/match/git_helper.rb', line 126

def self.copy_readme(directory)
  template = File.read("#{Match::ROOT}/lib/assets/READMETemplate.md")
  File.write(File.join(directory, "README.md"), template)
end

.generate_commit_message(params) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/match/git_helper.rb', line 37

def self.generate_commit_message(params)
  # 'Automatic commit via fastlane'
  [
    "[fastlane]",
    "Updated",
    params[:app_identifier],
    "for",
    params[:type].to_s
  ].join(" ")
end

.match_version(workspace) ⇒ Object



48
49
50
51
52
53
# File 'lib/match/git_helper.rb', line 48

def self.match_version(workspace)
  path = File.join(workspace, "match_version.txt")
  if File.exist?(path)
    Gem::Version.new(File.read(path))
  end
end