GEEK: Ruby scripts to compare the contents of directory to svn

A pair of functions I wrote that compare the contents of a configuration directory on a remote server with the expected contents in SVN. compareDir is the first draft and compareDirTwo is the second draft. compareDirTwo compares all of the files in all the directories below, whereas the compareDir only goes one level and doesn't compare the files in the topmost level. The compare flag will cause the function to compare the contents of the files, in addition to checking for existence. It assumes that all files are text files. Pasted here to remind me how I wrote the compareDir function, because I'm deleting it and it has some tricks in it that I want to remember.

def compareDir(host, location, svndir, actualdir, *rest)
    puts "Now comparing the #{actualdir} on #{host}, #{location} with the directory in svn: #{svndir}"
    status = "pass"
    differences = ""
    result = ""
    linebreak = "="*80 + "\n"

    puts message = "host: #{host}\n"
    puts "\n"

    svndirlisting = %x[ svn list #{svndir}]
    tunnel = SSHTunnel.new(host, location)
    actualdir_listing = tunnel.remoteExecute("find #{actualdir} -type d -maxdepth 1 -mindepth 1").to_a
    actualdir_listing.each do |dir|
        puts linebreak
        puts "dir: #{dir}\n"
        message += linebreak
        message += "dir: #{dir}\n"
        dirname = dir.chomp.split(/\//)[3]
        file_list = tunnel.remoteExecute("find #{actualdir}/#{dirname} -maxdepth 1 -mindepth 1").to_a
        file_list.each do |file|
            filename = file.chomp.split(/\//)[4]
            svnfilename = "#{svndir}/#{dirname}/#{filename}"
            svnfile = %x[ svn cat #{svnfilename} ]
            actualfile = tunnel.remoteExecute("cat #{file}")
            differences = stringDiff(svnfile, actualfile)
            if differences != ""
                    puts result = "FAILED:\n"
                    status = "fail"
            else
                    puts result = "PASSED:\n"
            end
            puts filenames = "svn: #{svnfilename} \nactual: #{file}\n"
            puts differences
            message += result
            message += filenames
            message += differences
        end
    end
    tunnel.destroySSHTunnel

#        puts message

    if status != "pass"
             flunk
    end
end
def compareDirTwo(host, location, svndir, actualdir, compare="true", *rest)
    puts "Now comparing the #{actualdir} on #{host}, #{location} with the directory in svn: #{svndir}"
    status = "pass"
    differences = ""
    result = ""
    linebreak = "="*80 + "\n"

    puts message = "host: #{host}\n"
    puts "\n"

    puts "svnlist:\n"
    svn = %x[ svn -R list #{svndir}].to_a
    # Get a list of all files/directories from svn.  Remove  the trailing / from directories. Prepend the base directory.
    svnall = svn.collect { |name| actualdir + "/" + name.chomp.gsub(/\/$/,'') }
    svnall.map { |file| puts "#{file}" }

    puts linebreak
    puts "svnfiles:\n"
    # Get a list of only files from svn
    svnfiles = svn.delete_if { |name| name =~ %r[(.*)/$] }
    svnfiles.map { |file| puts "#{file}" }

    puts linebreak
    tunnel = SSHTunnel.new(host, location)
    actual = tunnel.remoteExecute("find #{actualdir}").to_a.collect { |name| name.chomp }
    actual = actual.delete_if { |name| name == "#{actualdir}" }
    puts "actual:\n"
    actual.map { |file| puts "#{file}" }
    if compare:
        svnfiles.each do |file|
                 svnfilename = "#{svndir}/#{file}"
                 svnfile = %x[ svn cat #{svnfilename} ]
                 actualfile = tunnel.remoteExecute("cat #{actualdir}/#{file}")
                 differences = stringDiff(svnfile, actualfile)
                if differences != ""
                        puts result = "FAILED:\n"
                        status = "fail"
                else
                        puts result = "PASSED:\n"
                end
                puts filenames = "svn: #{svnfilename} \ractual: #{actualdir}/#{file}\r"
                puts differences
                message += result
                message += filenames
                message += differences
        end
    end
    tunnel.destroySSHTunnel

    differences = actual - svnall
    if differences != []:
        puts "These files are in the #{actualdir} directory on #{host}, #{location} but are not in svn:\n", differences
        message += "FAILED:\n"
        status = "fail"
    end

    return status, message, differences

end

Post a Comment

You must be logged in to post a comment.