Class RSCM::ClearCase
In: lib/rscm/scm/clearcase.rb
Parent: Base

Methods

Constants

LOG_FORMAT = "- !ruby/object:RSCM::RevisionFile\\n developer: %u\\n time: \\\"%Nd\\\"\\n native_revision_identifier: %Vn\\n previous_native_revision_identifier: %PVn\\n path: %En\\n status: %o\\n message: \\\"%Nc\\\"\\n\\n"
TIME_FORMAT = "%d-%b-%Y.%H:%M:%S"
MAGIC_TOKEN = "9q8w7e6r5t4y"
STATUSES = { "checkin" => RevisionFile::MODIFIED, "mkelem" => RevisionFile::ADDED, "rmelem" => RevisionFile::DELETED, }
DEFAULT_CONFIG_SPEC = "element * CHECKEDOUT\nelement * /main/LATEST"

Attributes

config_spec  [RW] 
stgloc  [RW] 
stream  [RW] 
tag  [RW] 

Public Class methods

[Source]

    # File lib/rscm/scm/clearcase.rb, line 21
21:     def initialize(stream=nil, stgloc=nil, tag=nil, config_spec=DEFAULT_CONFIG_SPEC)
22:       @stream, @stgloc, @tag, @config_spec = stream, stgloc, tag, config_spec
23:     end

Public Instance methods

[Source]

     # File lib/rscm/scm/clearcase.rb, line 107
107:     def catcs
108:       Dir.chdir(checkout_dir) do
109:         catcs_cmd = "cleartool catcs"
110:         Better.popen(catcs_cmd) do |io|
111:           yield io
112:         end
113:       end
114:     end

[Source]

    # File lib/rscm/scm/clearcase.rb, line 66
66:     def checked_out?
67:       !Dir["#{checkout_dir}/*"].empty?
68:     end

[Source]

    # File lib/rscm/scm/clearcase.rb, line 70
70:     def destroy_working_copy
71:       Better.popen("cleartool rmview #{checkout_dir}") do |io|
72:         io.read
73:       end
74:     end

[Source]

    # File lib/rscm/scm/clearcase.rb, line 76
76:     def import_central(dir, message)
77:       Better.popen("clearfsimport -recurse -nsetevent #{dir} #{checkout_dir}") do |io|
78:         io.read
79:       end
80:     end

What‘s loaded into view

[Source]

     # File lib/rscm/scm/clearcase.rb, line 125
125:     def load_rules
126:       result = []
127:       catcs do |io|
128:         io.each_line do |line|
129:           if(line =~ /^load[\s]*(.*)$/)
130:             return result << $1
131:           end
132:         end
133:       end
134:       result
135:     end

Non-RSCM API methods

[Source]

    # File lib/rscm/scm/clearcase.rb, line 84
84:     def mkview!
85:        # Create view (working copy)
86:        mkview_cmd = "cleartool mkview -snapshot -stream #{@stream} -stgloc #{@stgloc} -tag #{@tag} #{@checkout_dir}"
87:        Better.popen(mkview_cmd) do |io|
88:          puts io.read
89:        end
90:     end

[Source]

    # File lib/rscm/scm/clearcase.rb, line 25
25:     def revisions(from_identifier, to_identifier=Time.infinity, relative_path=nil)
26:       checkout unless checked_out?
27:       rules = load_rules
28:       vob = vob(rules[0])
29:       result = Revisions.new
30:       
31:       unless vob
32:         STDERR.puts "No vob found. Please set load rules in the view: #{checkout_dir}"
33:         return result 
34:       end
35:       with_working_dir(checkout_dir) do
36:         since = (from_identifier + 1).strftime(TIME_FORMAT)
37:         cmd = "cleartool lshistory -recurse -nco -since #{since} -fmt \"#{LOG_FORMAT}\" -pname #{vob}"
38:         Better.popen(cmd) do |io|
39:           # escape all quotes, except the one at the beginning and end. this is a bit ugly...
40:           raw_yaml = io.read
41:           fixed_yaml = raw_yaml.gsub(/^  message: \"/, "  message: #{MAGIC_TOKEN}")
42:           fixed_yaml = fixed_yaml.gsub(/\"\n\n/, "#{MAGIC_TOKEN}\n\n")
43:           fixed_yaml = fixed_yaml.gsub(/\"/, "\\\"")
44:           fixed_yaml = fixed_yaml.gsub(MAGIC_TOKEN, "\"")
45:  
46:           files = YAML.load(fixed_yaml)
47:           files.each do |file|
48:             file.path.gsub!(/\\/, "/")
49:             file.status = STATUSES[file.status]
50:             rev = revision(file.native_revision_identifier)
51:             if(rev && matches_load_rules?(rules, file.path))
52:               file.native_revision_identifier = rev
53:               file.previous_native_revision_identifier = revision(file.previous_native_revision_identifier)
54:               t = file.time
55:               # the time now has escaped quotes..
56:               file.time = Time.utc(t[2..5],t[6..7],t[8..9],t[11..12],t[13..14],t[15..16])
57:               file.message.strip!
58:               result.add(file)
59:             end
60:           end
61:         end
62:       end
63:       result
64:     end

[Source]

     # File lib/rscm/scm/clearcase.rb, line 92
 92:     def update_load_rules!
 93:       Dir.chdir(checkout_dir) do
 94:         # tempfile is broken on windows (!!)
 95:         cfg_spec_file = "__rscm.cfgspec"
 96:         config_spec_file = File.open(cfg_spec_file, "w") do |io|
 97:           io.write(@config_spec)
 98:         end
 99: 
100:         setcs_cmd = "cleartool setcs #{cfg_spec_file}"
101:         Better.popen(setcs_cmd, "w") do |io|
102:           io.write "yes\n"
103:         end
104:       end
105:     end

[Source]

     # File lib/rscm/scm/clearcase.rb, line 116
116:     def vob(load_rule)
117:       if(load_rule =~ /[\\\/]*([\w]*)/)
118:         $1
119:       else
120:         nil
121:       end
122:     end

Protected Instance methods

[Source]

     # File lib/rscm/scm/clearcase.rb, line 139
139:     def checkout_silent(to_identifier=nil)
140:       if(checked_out?)
141:         with_working_dir(checkout_dir) do
142:           Better.popen("cleartool update .") do |io|
143:             io.read
144:           end
145:         end
146:       else
147:         mkview!
148:  
149:         # Set load rules (by setting config spec)
150:         #update_load_rules!
151:       end
152:     end

Administrative files that should be ignored when counting files.

[Source]

     # File lib/rscm/scm/clearcase.rb, line 155
155:     def ignore_paths
156:       return [/.*\.updt/]
157:     end

[Validate]