97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # typed: strict
 | |
| # frozen_string_literal: true
 | |
| 
 | |
| require "utils/git"
 | |
| require "utils/popen"
 | |
| 
 | |
| # Extensions to {Pathname} for querying Git repository information.
 | |
| # @see Utils::Git
 | |
| # @api private
 | |
| module GitRepositoryExtension
 | |
|   extend T::Sig
 | |
| 
 | |
|   sig { returns(T::Boolean) }
 | |
|   def git?
 | |
|     join(".git").exist?
 | |
|   end
 | |
| 
 | |
|   # Gets the URL of the Git origin remote.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_origin
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "config", "--get", "remote.origin.url", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Sets the URL of the Git origin remote.
 | |
|   sig { params(origin: String).returns(T.nilable(T::Boolean)) }
 | |
|   def git_origin=(origin)
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     safe_system "git", "remote", "set-url", "origin", origin, chdir: self
 | |
|   end
 | |
| 
 | |
|   # Gets the full commit hash of the HEAD commit.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_head
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "rev-parse", "--verify", "-q", "HEAD", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Gets a short commit hash of the HEAD commit.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_short_head
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "rev-parse", "--short=4", "--verify", "-q", "HEAD", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Gets the relative date of the last commit, e.g. "1 hour ago"
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_last_commit
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "show", "-s", "--format=%cr", "HEAD", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Gets the name of the currently checked-out branch, or HEAD if the repository is in a detached HEAD state.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_branch
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "rev-parse", "--abbrev-ref", "HEAD", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Gets the name of the default origin HEAD branch.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_origin_branch
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "symbolic-ref", "-q", "--short", "refs/remotes/origin/HEAD", chdir: self)
 | |
|          .chomp.presence&.split("/")&.last
 | |
|   end
 | |
| 
 | |
|   # Returns true if the repository's current branch matches the default origin branch.
 | |
|   sig { returns(T.nilable(T::Boolean)) }
 | |
|   def git_default_origin_branch?
 | |
|     git_origin_branch == git_branch
 | |
|   end
 | |
| 
 | |
|   # Returns the date of the last commit, in YYYY-MM-DD format.
 | |
|   sig { returns(T.nilable(String)) }
 | |
|   def git_last_commit_date
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "show", "-s", "--format=%cd", "--date=short", "HEAD", chdir: self).chomp.presence
 | |
|   end
 | |
| 
 | |
|   # Gets the full commit message of the specified commit, or of the HEAD commit if unspecified.
 | |
|   sig { params(commit: String).returns(T.nilable(String)) }
 | |
|   def git_commit_message(commit = "HEAD")
 | |
|     return unless git? && Utils::Git.available?
 | |
| 
 | |
|     Utils.popen_read("git", "log", "-1", "--pretty=%B", commit, "--", chdir: self, err: :out).strip.presence
 | |
|   end
 | |
| end
 | 
