seattle.rb perforce projects are structured as:
project_name/
dev/ History.txt Manifest.txt README.txt Rakefile bin/ lib/ test/ ... 1.0.0/... 1.0.1/... ...
Each release is a branch from project_name/dev to project_name/version. In perforce, branches can be explicit (created via a branch spec) or implicit (created by command-line). This structure can accommodate either but the code below is implicit.
# File lib/hoe/perforce.rb, line 35 def define_perforce_tasks warn :define_perforce_tasks if $DEBUG desc "branch the project from dev to version dir" task :branch do Dir.chdir ".." target_dir = File.directory?(version) ? version : "dev" branching = target_dir == "dev" pkg = File.basename(Dir.pwd) begin p4_integrate "dev", version if branching validate_manifest_file version p4_submit "Branching #{pkg} to version #{version}" if branching rescue => e p4_revert version raise e end Dir.chdir version end task :prerelease => :branch task :postrelease => :announce do system 'rake clean' end end
# File lib/hoe/perforce.rb, line 31 def initialize_perforce self.perforce_ignore = [] end
# File lib/hoe/perforce.rb, line 121 def p4_integrate from, to opened = `p4 opened ... 2>&1` raise "You have files open" unless opened =~ /file\(s\) not opened/ p4sh "p4 integrate #{from}/... #{to}/..." end
# File lib/hoe/perforce.rb, line 116 def p4_revert dir puts "reverting #{dir}" p4sh "p4 revert #{dir}/..." end
# File lib/hoe/perforce.rb, line 127 def p4_submit description p4sh "p4 submit -d #{description.inspect} ..." end
perforce has an annoying “feature” that reads PWD and chdir’s to it. Without either mucking in ENV or forcing a different kind of system call, it’ll be in the original rake directory. I don’t want that for these recipes, so we tack on “;” in order to force the right type of exec.
# File lib/hoe/perforce.rb, line 72 def p4sh cmd sh "#{cmd};" end
# File lib/hoe/perforce.rb, line 76 def validate_manifest_file manifest_dir manifest_file = "#{manifest_dir}/Manifest.txt" raise "#{manifest_file} does not exist" unless test ff, manifest_file manifest = File.new(manifest_file).readlines.map { |x| x.strip } manifest -= perforce_ignore exclusions = with_config do |config, _| config["exclude"] end local_manifest = [] Dir.chdir manifest_dir do system 'rake clean' Find.find '.' do |f| next if f =~ exclusions local_manifest << f.sub(/^\.\//, '') if File.file? f end end local_manifest -= perforce_ignore extra_files = local_manifest - manifest missing_files = manifest - local_manifest msg = [] unless extra_files.empty? then msg << "You have files that are not in your manifest" msg << " #{extra_files.inspect}" end unless missing_files.empty? then msg << "You have files that are missing from your manifest" msg << " #{missing_files.inspect}" end raise msg.join("\n") unless msg.empty? end