On 8/23/06, Cameron, Gemma (UK) <Gemma.Cameron / baesystems.com> wrote:
> OK so no one has used ruby to drive clearcase... might have to be a
> pet project to create a gem for this; gem's gem. heh

This isn't all that surprising -- ClearCase is hella expensive and the
last time that I dealt with it was eight years ago. No other company
I've worked for uses it.

> Now my problem is a very simple one and I don't seem to be typing the
> right things into google or looking up the right things in anvil to
> find it so I thought I could ask you guys for some ideas...

> Problem:
>   I want to parse the STDIN generated when I do a clearcase update and
>   for every line that contains:
>           Loading "path_to_a_file.txt" (0 bytes)
>   What I want to get from this line is the filename (stuff in the
>   quotes) so I can send it to a method to be zipped. Initially before
>   I try to zip the file it would be nice to do some debugging by
>   printing the filenames into a text file. This is what I have so far:
>
>     def updateView
>       Dir.chdir("f:")
>       Dir.chdir(getPathToView)
>       system("cleartool update -rename #{getPathToView}") if viewCreated?
>       parseOutput
>       print "\nUpdated #{getPathToView}\n"
>     end
>
>     def parseOutput
>       $stdin.each { |line|
>       if line =~ [^Loading]
>         file = line.match(/".*"/)
>         zipUp(file)
>         puts "matched!"
>       end
>       }
>     end
>
>     def zipUp(file)
>       Zip::ZipFile::open("updated.zip", true) { |zf|
>       zf.add(file, file)
>       }
>     end

A couple of things. It is common Ruby parlance to use underscores in
method names instead of interCaps. So updateView would become
update_view. Second, in your updateView, where are you getting the
"getPathToView" value? Is it another method (like #viewCreated?)? Also,
you probably want to use a pipe -- I haven't done this on Windows -- so
look at popen if it'll work on Windows. Otherwise, do:

  def update_view(path_to_view, drive = nil)
    Dir.chdir("#{drive}#{path_to_view}") do |dir|
      if view_created?(path_to_view)
        output = `cleartool update -rename #{path_to_view}`
        parse_output output
        puts "\nUpdated #{path_to_view}"
      end
    end
  end

  def parse_output(input)
    input.split($/).each do |line|
      if line =~ %r{^Loading} # or /^Loading/
        file = line.split(//)[1]
        zip_up(file)
        puts "Matched #{file}"
      end
    end
  end

  def zip_up(file)
    Zip::ZipFile::open("updated.zip", true) { |zf|
      zf.add(file, file)
    }
  end

Not tested, obviously, since I don't have CC.

-austin
-- 
Austin Ziegler * halostatue / gmail.com * http://www.halostatue.ca/
               * austin / halostatue.ca * http://www.halostatue.ca/feed/
               * austin / zieglers.ca