On Sat, 14 Dec 2002 05:48:19 +0900, Matt Armstrong <matt / lickey.com> thus spoketh:
> Anders Engströí <aengstrom / gnejs.net> writes:
> 
>> Hi.
>>
>> I'm writing a commitinfo script for CVS using ruby 1.6.7 on Debian
>> Woody. I've created a class that handles all the ugly stuff at a commit,
>> and the actual commitinfo-scripts uses this class to ease the CVS
>> interaction.
>>
>> Now - I want to extract the editors of each file that gets commited.
>> This is done by parsing the $CVSHOME/CVS/fileattr file. I want to get
>> all editors as a Hash where the keys are the names of the editors, and
>> the values are the extra info for the editor. The file format of
>> $CVSHOME/CVS/fileattr is something like:
>>
>> Fname_of_file<tab>attribute_name=attribute_value[;attribute_name=attribute_value...]
>>
>> the attribute containing the editors looks like:
>>
>> _editors=name_of_editor>time+hostname+pathname[,name_of_editor>time+hostname+pathname...]
> 
> I suspect the ugly code reflects the ugly file format you are
> parsing.  Here is my untested attempt.
> 
> editors = Hash.new
> 
> File.open("fileattr") { |line|
>     fname, attrs = line.split("\t", 2)
>     attrs.split(";").each { |attr|
>         next unless attr =~ /^_editors=(.+)/
>         $1.split(",").each { |editor|
>             name, stuff = editor.split(">")
>             editors[name] = stuff
>         }
>     }
> }

Thanks for the input! This is my current code after applying your ideas:

	def editors
		if @editors == nil
			@editors = Hash.new
			fileattr = "#{@cvswd}/CVS/fileattr"
			if File.exist?(fileattr)
				File.open(fileattr){ |file|
					line = nil 
					file.each_line { |l| line = l if l =~ /^F#{name}/ }
					if line != nil
						line.split("\t").last.split(";").each { |attpair|
							next unless attpair =~ /^_editors=(.+)/
							$1.split(",").each { |editor|
								name, stuff = editor.split(">")
								@editors[name] = stuff
							}
						}
					end
				}
			end
		end
		return @editors
	end


the code is implemented in an accessor method (I don't know if the above
is the prefered way to implement 'lazy loading' in Ruby - comments are
welcome :).

Any comments on the above code? Can I optimize it further?

//Anders


-- 
/** 
 * Anders Engströí, aengstrom / gnejs.net
 * -------------------------------------
 * Your mind is like an umbrella. 
 * It doesn't work unless you open it.
 *    /Frank Zappa
 */