Class | RSCM::ClearCase |
In: |
lib/rscm/scm/clearcase.rb
|
Parent: | Base |
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" |
config_spec | [RW] | |
stgloc | [RW] | |
stream | [RW] | |
tag | [RW] |
# File lib/rscm/scm/clearcase.rb, line 23 23: def initialize(stream=nil, stgloc=nil, tag=nil, config_spec=DEFAULT_CONFIG_SPEC) 24: @stream, @stgloc, @tag, @config_spec = stream, stgloc, tag, config_spec 25: end
# File lib/rscm/scm/clearcase.rb, line 115 115: def catcs(options={}) 116: Dir.chdir(checkout_dir) do 117: catcs_cmd = "cleartool catcs" 118: execute(catcs_cmd, options) do |io| 119: yield io 120: end 121: end 122: end
# File lib/rscm/scm/clearcase.rb, line 74 74: def checked_out? 75: !Dir["#{checkout_dir}/*"].empty? 76: end
# File lib/rscm/scm/clearcase.rb, line 78 78: def destroy_working_copy(options={}) 79: execute("cleartool rmview #{checkout_dir}", options) do |io| 80: io.read 81: end 82: end
# File lib/rscm/scm/clearcase.rb, line 84 84: def import_central(options={}) 85: execute("clearfsimport -recurse -nsetevent #{options[:dir]} #{checkout_dir}", options) do |io| 86: io.read 87: end 88: end
What‘s loaded into view
# File lib/rscm/scm/clearcase.rb, line 133 133: def load_rules 134: result = [] 135: catcs do |io| 136: io.each_line do |line| 137: if(line =~ /^load[\s]*(.*)$/) 138: return result << $1 139: end 140: end 141: end 142: result 143: end
Non-RSCM API methods
# File lib/rscm/scm/clearcase.rb, line 92 92: def mkview!(options={}) 93: # Create view (working copy) 94: mkview_cmd = "cleartool mkview -snapshot -stream #{@stream} -stgloc #{@stgloc} -tag #{@tag} #{@checkout_dir}" 95: execute(mkview_cmd, options) do |io| 96: puts io.read 97: end 98: end
# File lib/rscm/scm/clearcase.rb, line 27 27: def revisions(from_identifier, options={}) 28: options = { 29: :from_identifier => from_identifier, 30: :to_identifier => Time.infinity, 31: :relative_path => nil 32: }.merge(options) 33: 34: checkout unless checked_out? 35: rules = load_rules 36: vob = vob(rules[0]) 37: result = Revisions.new 38: 39: unless vob 40: STDERR.puts "No vob found. Please set load rules in the view: #{checkout_dir}" 41: return result 42: end 43: with_working_dir(checkout_dir) do 44: since = (from_identifier + 1).strftime(TIME_FORMAT) 45: cmd = "cleartool lshistory -recurse -nco -since #{since} -fmt \"#{LOG_FORMAT}\" -pname #{vob}" 46: execute(cmd, options) do |io| 47: # escape all quotes, except the one at the beginning and end. this is a bit ugly... 48: raw_yaml = io.read 49: fixed_yaml = raw_yaml.gsub(/^ message: \"/, " message: #{MAGIC_TOKEN}") 50: fixed_yaml = fixed_yaml.gsub(/\"\n\n/, "#{MAGIC_TOKEN}\n\n") 51: fixed_yaml = fixed_yaml.gsub(/\"/, "\\\"") 52: fixed_yaml = fixed_yaml.gsub(MAGIC_TOKEN, "\"") 53: 54: files = YAML.load(fixed_yaml) 55: files.each do |file| 56: file.path.gsub!(/\\/, "/") 57: file.status = STATUSES[file.status] 58: rev = revision(file.native_revision_identifier) 59: if(rev && matches_load_rules?(rules, file.path)) 60: file.native_revision_identifier = rev 61: file.previous_native_revision_identifier = revision(file.previous_native_revision_identifier) 62: t = file.time 63: # the time now has escaped quotes.. 64: file.time = Time.utc(t[2..5],t[6..7],t[8..9],t[11..12],t[13..14],t[15..16]) 65: file.message.strip! 66: result.add(file) 67: end 68: end 69: end 70: end 71: result 72: end
# File lib/rscm/scm/clearcase.rb, line 100 100: def update_load_rules!(options={}) 101: Dir.chdir(checkout_dir) do 102: # tempfile is broken on windows (!!) 103: cfg_spec_file = "__rscm.cfgspec" 104: config_spec_file = File.open(cfg_spec_file, "w") do |io| 105: io.write(@config_spec) 106: end 107: 108: setcs_cmd = "cleartool setcs #{cfg_spec_file}" 109: Better.popen(setcs_cmd, "w") do |io| 110: io.write "yes\n" 111: end 112: end 113: end
# File lib/rscm/scm/clearcase.rb, line 124 124: def vob(load_rule) 125: if(load_rule =~ /[\\\/]*([\w]*)/) 126: $1 127: else 128: nil 129: end 130: end
# File lib/rscm/scm/clearcase.rb, line 147 147: def checkout_silent(to_identifier, options={}, &proc) 148: if(checked_out?) 149: execute("cleartool update .", options) 150: else 151: mkview! 152: 153: # Set load rules (by setting config spec) 154: #update_load_rules! 155: end 156: end