Class: Braid::Operations::Git
Instance Method Summary collapse
- #apply(diff, *args) ⇒ Object
- #branch ⇒ Object
- #checkout(treeish) ⇒ Object
- #clone(*args) ⇒ Object
- #commit(message, *args) ⇒ Object
- #diff_tree(src_tree, dst_tree, prefix = nil) ⇒ Object
- #ensure_clean! ⇒ Object
- #fetch(remote = nil, *args) ⇒ Object
- #head ⇒ Object
-
#merge_base(target, source) ⇒ Object
Returns the base commit or nil.
-
#merge_ours(opt) ⇒ Object
Implies no commit.
-
#merge_subtree(opt) ⇒ Object
Implies no commit.
-
#merge_trees(base_treeish, local_treeish, remote_treeish) ⇒ Object
Merge three trees (local_treeish should match the current state of the index) and update the index and working tree.
- #read_ls_files(prefix) ⇒ Object
-
#read_tree_im(treeish) ⇒ Object
Read tree into the root of the index.
-
#read_tree_prefix_i(treeish, prefix) ⇒ Object
Read tree into the index, regardless of the state of the working tree.
-
#read_tree_prefix_u(treeish, prefix) ⇒ Object
Read tree into the index and working tree.
-
#remote_add(remote, path, branch) ⇒ Object
Implies tracking.
- #remote_rm(remote) ⇒ Object
-
#remote_url(remote) ⇒ Object
Checks git remotes.
-
#repo_file_path(path) ⇒ Object
Get the physical path to a file in the git repository (e.g., ‘MERGE_MSG’), taking into account worktree configuration.
- #reset_hard(target) ⇒ Object
- #rev_parse(opt) ⇒ Object
- #rm_r(path) ⇒ Object
-
#rm_r_cached(path) ⇒ Object
Remove from index only.
- #status_clean? ⇒ Boolean
- #tree_hash(path, treeish = 'HEAD') ⇒ Object
-
#with_temporary_index ⇒ Object
Execute a block using a temporary git index file, initially empty.
-
#write_tree ⇒ Object
Write a tree object for the current index and return its ID.
Methods inherited from Proxy
command, #require_version, #require_version!, #version
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class Braid::Operations::Proxy
Instance Method Details
#apply(diff, *args) ⇒ Object
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 |
# File 'lib/braid/operations.rb', line 359 def apply(diff, *args) status, err = nil, nil command = "git apply --index --whitespace=nowarn #{args.join(' ')} -" if USE_OPEN3 Open3.popen3(command) do |stdin, stdout, stderr, wait_thread| stdin.puts(diff) stdin.close err = stderr.read # Under earlier jrubies this is not correctly passed so add in check status = wait_thread.value if wait_thread # Process::Status object returned. end # Handle earlier jrubies such as 1.6.7.2 status = $?.exitstatus if status.nil? else status = Open4.popen4(command) do |pid, stdin, stdout, stderr| stdin.puts(diff) stdin.close err = stderr.read end.exitstatus end raise ShellExecutionError, err unless status == 0 true end |
#branch ⇒ Object
354 355 356 357 |
# File 'lib/braid/operations.rb', line 354 def branch status, out, err = exec!("git branch | grep '*'") out[2..-1] end |
#checkout(treeish) ⇒ Object
203 204 205 206 |
# File 'lib/braid/operations.rb', line 203 def checkout(treeish) invoke(:checkout, treeish) true end |
#clone(*args) ⇒ Object
386 387 388 389 |
# File 'lib/braid/operations.rb', line 386 def clone(*args) # overrides builtin invoke(:clone, *args) end |
#commit(message, *args) ⇒ Object
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
# File 'lib/braid/operations.rb', line 176 def commit(, *args) cmd = 'git commit --no-verify' if # allow nil = Tempfile.new('braid_commit') .print("Braid: #{message}") .flush .close cmd << " -F #{message_file.path}" end cmd << " #{args.join(' ')}" unless args.empty? status, out, err = exec(cmd) .unlink if if status == 0 true elsif out.match(/nothing.* to commit/) false else raise ShellExecutionError, err end end |
#diff_tree(src_tree, dst_tree, prefix = nil) ⇒ Object
334 335 336 337 338 339 |
# File 'lib/braid/operations.rb', line 334 def diff_tree(src_tree, dst_tree, prefix = nil) cmd = "git diff-tree -p --binary #{src_tree} #{dst_tree}" cmd << " --src-prefix=a/#{prefix}/ --dst-prefix=b/#{prefix}/" if prefix status, out, err = exec!(cmd) out end |
#ensure_clean! ⇒ Object
346 347 348 |
# File 'lib/braid/operations.rb', line 346 def ensure_clean! status_clean? || raise(LocalChangesPresent) end |
#fetch(remote = nil, *args) ⇒ Object
198 199 200 201 |
# File 'lib/braid/operations.rb', line 198 def fetch(remote = nil, *args) args.unshift "-n #{remote}" if remote exec!("git fetch #{args.join(' ')}") end |
#head ⇒ Object
350 351 352 |
# File 'lib/braid/operations.rb', line 350 def head rev_parse('HEAD') end |
#merge_base(target, source) ⇒ Object
Returns the base commit or nil.
209 210 211 212 213 |
# File 'lib/braid/operations.rb', line 209 def merge_base(target, source) invoke(:merge_base, target, source) rescue ShellExecutionError nil end |
#merge_ours(opt) ⇒ Object
Implies no commit.
246 247 248 249 |
# File 'lib/braid/operations.rb', line 246 def merge_ours(opt) invoke(:merge, '--allow-unrelated-histories -s ours --no-commit', opt) true end |
#merge_subtree(opt) ⇒ Object
Implies no commit.
252 253 254 255 256 257 258 |
# File 'lib/braid/operations.rb', line 252 def merge_subtree(opt) # TODO which options are needed? invoke(:merge, '-s subtree --no-commit --no-ff', opt) true rescue ShellExecutionError => error raise MergeError, error.out end |
#merge_trees(base_treeish, local_treeish, remote_treeish) ⇒ Object
Merge three trees (local_treeish should match the current state of the index) and update the index and working tree.
The usage of ‘git merge-recursive’ doesn’t seem to be officially documented, but it does accept trees. When a single base is passed, the ‘recursive’ part (i.e., merge of bases) does not come into play and only the trees matter. But for some reason, Git’s smartest tree merge algorithm is only available via the ‘recursive’ strategy.
268 269 270 271 272 273 274 |
# File 'lib/braid/operations.rb', line 268 def merge_trees(base_treeish, local_treeish, remote_treeish) invoke(:merge_recursive, base_treeish, "-- #{local_treeish} #{remote_treeish}") true rescue ShellExecutionError => error # 'CONFLICT' messages go to stdout. raise MergeError, error.out end |
#read_ls_files(prefix) ⇒ Object
276 277 278 |
# File 'lib/braid/operations.rb', line 276 def read_ls_files(prefix) invoke('ls-files', prefix) end |
#read_tree_im(treeish) ⇒ Object
Read tree into the root of the index. This may not be the preferred way to do it, but it seems to work.
295 296 297 298 |
# File 'lib/braid/operations.rb', line 295 def read_tree_im(treeish) invoke(:read_tree, '-im', treeish) true end |
#read_tree_prefix_i(treeish, prefix) ⇒ Object
Read tree into the index, regardless of the state of the working tree. Most useful with a temporary index file.
288 289 290 291 |
# File 'lib/braid/operations.rb', line 288 def read_tree_prefix_i(treeish, prefix) invoke(:read_tree, "--prefix=#{prefix}/ -i", treeish) true end |
#read_tree_prefix_u(treeish, prefix) ⇒ Object
Read tree into the index and working tree.
281 282 283 284 |
# File 'lib/braid/operations.rb', line 281 def read_tree_prefix_u(treeish, prefix) invoke(:read_tree, "--prefix=#{prefix}/ -u", treeish) true end |
#remote_add(remote, path, branch) ⇒ Object
Implies tracking.
222 223 224 225 |
# File 'lib/braid/operations.rb', line 222 def remote_add(remote, path, branch) invoke(:remote, 'add', "-t #{branch} -m #{branch}", remote, path) true end |
#remote_rm(remote) ⇒ Object
227 228 229 230 |
# File 'lib/braid/operations.rb', line 227 def remote_rm(remote) invoke(:remote, 'rm', remote) true end |
#remote_url(remote) ⇒ Object
Checks git remotes.
233 234 235 236 237 238 |
# File 'lib/braid/operations.rb', line 233 def remote_url(remote) key = "remote.#{remote}.url" invoke(:config, key) rescue ShellExecutionError nil end |
#repo_file_path(path) ⇒ Object
Get the physical path to a file in the git repository (e.g., ‘MERGE_MSG’), taking into account worktree configuration. The returned path may be absolute or relative to the current working directory.
167 168 169 170 171 172 173 174 |
# File 'lib/braid/operations.rb', line 167 def repo_file_path(path) if require_version('2.5') # support for --git-path invoke(:rev_parse, '--git-path', path) else # Git < 2.5 doesn't support linked worktrees anyway. File.join(invoke(:rev_parse, '--git-dir'), path) end end |
#reset_hard(target) ⇒ Object
240 241 242 243 |
# File 'lib/braid/operations.rb', line 240 def reset_hard(target) invoke(:reset, '--hard', target) true end |
#rev_parse(opt) ⇒ Object
215 216 217 218 219 |
# File 'lib/braid/operations.rb', line 215 def rev_parse(opt) invoke(:rev_parse, opt) rescue ShellExecutionError raise UnknownRevision, opt end |
#rm_r(path) ⇒ Object
318 319 320 321 |
# File 'lib/braid/operations.rb', line 318 def rm_r(path) invoke(:rm, '-r', path) true end |
#rm_r_cached(path) ⇒ Object
Remove from index only.
324 325 326 327 |
# File 'lib/braid/operations.rb', line 324 def rm_r_cached(path) invoke(:rm, '-r', '--cached', path) true end |
#status_clean? ⇒ Boolean
341 342 343 344 |
# File 'lib/braid/operations.rb', line 341 def status_clean? status, out, err = exec('git status') !out.split("\n").grep(/nothing to commit/).empty? end |
#tree_hash(path, treeish = 'HEAD') ⇒ Object
329 330 331 332 |
# File 'lib/braid/operations.rb', line 329 def tree_hash(path, treeish = 'HEAD') out = invoke(:ls_tree, treeish, '-d', path) out.split[2] end |
#with_temporary_index ⇒ Object
Execute a block using a temporary git index file, initially empty.
306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/braid/operations.rb', line 306 def with_temporary_index Dir.mktmpdir('braid_index') do |dir| orig_index_file = ENV['GIT_INDEX_FILE'] ENV['GIT_INDEX_FILE'] = File.join(dir, 'index') begin yield ensure ENV['GIT_INDEX_FILE'] = orig_index_file end end end |
#write_tree ⇒ Object
Write a tree object for the current index and return its ID.
301 302 303 |
# File 'lib/braid/operations.rb', line 301 def write_tree invoke(:write_tree) end |