Module: Hoe::Perforce

Defined in:
lib/hoe/perforce.rb

Overview

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.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#perforce_ignoreObject

Returns the value of attribute perforce_ignore.



29
30
31
# File 'lib/hoe/perforce.rb', line 29

def perforce_ignore
  @perforce_ignore
end

Instance Method Details

#define_perforce_tasksObject



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
61
62
63
# 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

#initialize_perforceObject



31
32
33
# File 'lib/hoe/perforce.rb', line 31

def initialize_perforce
  self.perforce_ignore = []
end

#p4_integrate(from, to) ⇒ Object



121
122
123
124
125
# 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

#p4_revert(dir) ⇒ Object



116
117
118
119
# File 'lib/hoe/perforce.rb', line 116

def p4_revert dir
  puts "reverting #{dir}"
  p4sh "p4 revert #{dir}/..."
end

#p4_submit(description) ⇒ Object



127
128
129
# File 'lib/hoe/perforce.rb', line 127

def p4_submit description
  p4sh "p4 submit -d #{description.inspect} ..."
end

#p4sh(cmd) ⇒ Object

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.



72
73
74
# File 'lib/hoe/perforce.rb', line 72

def p4sh cmd
  sh "#{cmd};"
end

#validate_manifest_file(manifest_dir) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# 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 ?f, 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