diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index 42dde83152798666b9d3d8aeeefa9f41c2db21f8..08dfdcd78fe509a66b84a58e9754f165ba784f93 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -98,11 +98,12 @@ class AbstractDownloadStrategy end class VCSDownloadStrategy < AbstractDownloadStrategy - REF_TYPES = [:branch, :revision, :revisions, :tag].freeze + REF_TYPES = [:tag, :branch, :revisions, :revision].freeze def initialize name, resource super @ref_type, @ref = extract_ref(meta) + @revision = meta[:revision] @clone = HOMEBREW_CACHE.join(cache_filename) end @@ -119,6 +120,15 @@ class VCSDownloadStrategy < AbstractDownloadStrategy else clone_repo end + + if @ref_type == :tag && @revision && current_revision + unless current_revision == @revision + raise <<-EOS.undent + #{@ref} tag should be #{@revision} + but is actually #{current_revision}! + EOS + end + end end def stage @@ -153,6 +163,9 @@ class VCSDownloadStrategy < AbstractDownloadStrategy def update end + def current_revision + end + def extract_ref(specs) key = REF_TYPES.find { |type| specs.key?(type) } return key, specs[key] @@ -570,6 +583,10 @@ class GitDownloadStrategy < VCSDownloadStrategy quiet_system 'git', '--git-dir', git_dir, 'rev-parse', '-q', '--verify', "#{@ref}^{commit}" end + def current_revision + Utils.popen_read('git', '--git-dir', git_dir, 'rev-parse', '-q', '--verify', "HEAD").strip + end + def repo_valid? quiet_system "git", "--git-dir", git_dir, "status", "-s" end