Module: ModuleSync::Git
- Includes:
- Constants
- Defined in:
- lib/modulesync/git.rb
Constant Summary
Constants included
from Constants
Constants::CONF_FILE, Constants::GLOBAL_DEFAULTS_KEY, Constants::HOOK_FILE, Constants::MODULESYNC_CONF_FILE, Constants::MODULE_CONF_FILE, Constants::MODULE_FILES_DIR
Class Method Summary
collapse
-
.bump(repo, m, message, module_root, changelog = false) ⇒ Object
-
.local_branch_exists?(repo, branch) ⇒ Boolean
-
.pull(git_base, name, branch, project_root, opts) ⇒ Object
-
.remote_branch_exists?(repo, branch) ⇒ Boolean
-
.switch_branch(repo, branch) ⇒ Object
-
.tag(repo, version, tag_pattern) ⇒ Object
-
.untracked_unignored_files(repo) ⇒ Object
-
.update(name, files, options) ⇒ Object
Git add/rm, git commit, git push.
-
.update_changelog(repo, version, message, module_root) ⇒ Object
-
.update_noop(name, options) ⇒ Object
Class Method Details
.bump(repo, m, message, module_root, changelog = false) ⇒ Object
80
81
82
83
84
85
86
87
88
|
# File 'lib/modulesync/git.rb', line 80
def self.bump(repo, m, message, module_root, changelog=false)
new = m.bump!
puts "Bumped to version #{new}"
repo.add('metadata.json')
self.update_changelog(repo, new, message, module_root) if changelog
repo.commit("Release version #{new}")
repo.push
new
end
|
.local_branch_exists?(repo, branch) ⇒ Boolean
12
13
14
|
# File 'lib/modulesync/git.rb', line 12
def self.local_branch_exists?(repo, branch)
repo.branches.local.collect { |b| b.name }.include?(branch)
end
|
.pull(git_base, name, branch, project_root, opts) ⇒ Object
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/modulesync/git.rb', line 33
def self.pull(git_base, name, branch, project_root, opts)
if ! Dir.exists?(project_root)
Dir.mkdir(project_root)
end
if ! Dir.exists?("#{opts[:project_root]}/#{name}") || ! Dir.exists?("#{opts[:project_root]}/#{name}/.git")
puts "Cloning repository fresh"
remote = opts[:remote] || (git_base.start_with?('file://') ? "#{git_base}/#{name}" : "#{git_base}/#{name}.git")
local = "#{project_root}/#{name}"
puts "Cloning from #{remote}"
repo = ::Git.clone(remote, local)
switch_branch(repo, branch)
else
Dir.chdir("#{project_root}/#{name}") do
puts "Overriding any local changes to repositories in #{project_root}"
repo = ::Git.open('.')
repo.fetch
repo.reset_hard
switch_branch(repo, branch)
if remote_branch_exists?(repo, branch)
repo.pull('origin', branch)
end
end
end
end
|
.remote_branch_exists?(repo, branch) ⇒ Boolean
8
9
10
|
# File 'lib/modulesync/git.rb', line 8
def self.remote_branch_exists?(repo, branch)
repo.branches.remote.collect { |b| b.name }.include?(branch)
end
|
.switch_branch(repo, branch) ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/modulesync/git.rb', line 16
def self.switch_branch(repo, branch)
unless repo.branch.name == branch
if local_branch_exists?(repo, branch)
puts "Switching to branch #{branch}"
repo.checkout(branch)
elsif remote_branch_exists?(repo, branch)
puts "Creating local branch #{branch} from origin/#{branch}"
repo.checkout("origin/#{branch}")
repo.branch(branch).checkout
else
repo.checkout('origin/master')
puts "Creating new branch #{branch}"
repo.branch(branch).checkout
end
end
end
|
.tag(repo, version, tag_pattern) ⇒ Object
90
91
92
93
94
95
|
# File 'lib/modulesync/git.rb', line 90
def self.tag(repo, version, tag_pattern)
tag = tag_pattern % version
puts "Tagging with #{tag}"
repo.add_tag(tag)
repo.push('origin', tag)
end
|
.untracked_unignored_files(repo) ⇒ Object
149
150
151
152
153
154
155
156
157
|
# File 'lib/modulesync/git.rb', line 149
def self.untracked_unignored_files(repo)
ignore_path = "#{repo.dir.path}/.gitignore"
if File.exists?(ignore_path)
ignored = File.open(ignore_path).read.split
else
ignored = []
end
repo.status.untracked.keep_if{|f,_| !ignored.any?{|i| File.fnmatch(i, f)}}
end
|
.update(name, files, options) ⇒ Object
Git add/rm, git commit, git push
98
99
100
101
102
103
104
105
106
107
108
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
143
144
|
# File 'lib/modulesync/git.rb', line 98
def self.update(name, files, options)
module_root = "#{options[:project_root]}/#{name}"
message = options[:message]
if options[:remote_branch]
branch = "#{options[:branch]}:#{options[:remote_branch]}"
else
branch = options[:branch]
end
repo = ::Git.open(module_root)
repo.branch(options[:branch]).checkout
files.each do |file|
if repo.status.deleted.include?(file)
repo.remove(file)
else
repo.add(file)
end
end
begin
opts_commit = {}
opts_push = {}
if options[:amend]
opts_commit = {:amend => true}
end
if options[:force]
opts_push = {:force => true}
end
if options[:pre_commit_script]
script = "#{File.dirname(File.dirname(__FILE__))}/../contrib/#{options[:pre_commit_script]}"
%x[#{script} #{module_root}]
end
repo.commit(message, opts_commit)
repo.push('origin', branch, opts_push)
m = Blacksmith::Modulefile.new("#{module_root}/metadata.json")
if options[:bump]
new = self.bump(repo, m, message, module_root, options[:changelog])
self.tag(repo, new, options[:tag_pattern]) if options[:tag]
end
rescue ::Git::GitExecuteError => git_error
if git_error.message.include? "nothing to commit, working directory clean"
puts "There were no files to update in #{name}. Not committing."
else
puts git_error
exit
end
end
end
|
.update_changelog(repo, version, message, module_root) ⇒ Object
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/modulesync/git.rb', line 62
def self.update_changelog(repo, version, message, module_root)
changelog = "#{module_root}/CHANGELOG.md"
if File.exists?(changelog)
puts "Updating #{changelog} for version #{version}"
changes = File.readlines(changelog)
File.open(changelog, 'w') do |f|
date = Time.now.strftime("%Y-%m-%d")
f.puts "## #{date} - Release #{version}\n\n"
f.puts "#{message}\n\n"
f.puts changes
end
repo.add('CHANGELOG.md')
else
puts "No CHANGELOG.md file found, not updating."
end
end
|
.update_noop(name, options) ⇒ Object
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# File 'lib/modulesync/git.rb', line 159
def self.update_noop(name, options)
puts "Using no-op. Files in #{name} may be changed but will not be committed."
repo = ::Git.open("#{options[:project_root]}/#{name}")
repo.branch(options[:branch]).checkout
puts "Files changed: "
repo.diff('HEAD', '--').each do |diff|
puts diff.patch
end
puts "Files added: "
untracked_unignored_files(repo).each do |file,_|
puts file
end
puts "\n\n"
puts '--------------------------------'
end
|