Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'sixcore'
- module SixCore
- ConfigSvn = Struct.new(:program)
- # Core module for Subversion
- class Svn
- attr_accessor(:repos, :user, :pass)
- COMPONENT = 'SixCore::Svn'
- REGEX_LINE = /------------------------------------------------------------------------/
- REGEX_INFO = /r(.*) \| (.*) \| (.*) \| (.*) /
- REGEX_REVISION = /Revision\: (.*)/
- REGEX_MOD = /(^A )|(^M )|(^D )/
- REGEX_PBO = /(.*)\.pbo(.*)/
- REGEX_FOLDER = /(.*)\\(.*)/
- @@log = SixCore.log
- @@config = SixCore::read_config('svn', 'sixcore/config')
- def config
- @@config
- end
- # repos:: String, Repository folder or URL
- # user:: String, Username
- # pass:: String, Password
- def initialize(repos = '', user = '', pass = '')
- @repos = repos
- @user = user
- @pass = pass
- end
- # Command Execution function
- # cmd:: Command to execute, excl repositor, username, password
- def cmd(cmd)
- @@log.debug SixCore::prep_msg('Command', :component => COMPONENT, :verbose => cmd)
- cmd = "#{cmd} #{@repos}" unless @repos.empty?
- cmd = "#{cmd} --username #{@user}" unless @user.empty?
- cmd = "#{cmd} --password #{@pass}" unless @pass.empty?
- SixCore::proc_cmd("#{@@config.program} #{cmd}")
- end
- # Generates diff list between revisions
- # Returns diff list
- # old:: String or Integer, start revision number
- # new:: String or Integer, end revision number
- def diff(old, new)
- cmd("diff -r #{old}:#{new} --summarize").split("\n")
- end
- # Fetches SVN info
- def info()
- cmd('info').split("\n")
- end
- # Fetches SVN List
- def list()
- cmd('list').split("\n")
- end
- # Executes SVN Update
- # Returns Array of Strings
- def update()
- cmd('update').split("\n")
- end
- # Generates log between revisions
- # old:: String or Integer, start revision number
- # new:: String or Integer, end revision number
- # Returns Array of Strings (log)
- def log(old, new)
- cmd("log -r#{old}:#{new}").split("\n")
- end
- # Generates array list of log entry information
- # old:: String or Integer, start revision number
- # new:: String or Integer, end revision number
- # Returns Array of log, split between revision number, committer, log, etc
- def log_split(old, new)
- ar = log(old,new)
- log = []
- i = -1
- entry = []
- com = []
- ar.each do |line|
- if line =~ REGEX_LINE
- unless i == -1
- entry << com
- log << entry
- end
- entry = []
- com = []
- i = 0
- else
- i += 1
- if i == 1
- entry << [$1, $2, $3, $4] if line =~ REGEX_INFO
- elsif i > 2
- com << line unless line.empty?
- end
- end
- end
- return log
- end
- # Reads current revision number from repository
- # Returns revision number
- def read_rev()
- inf = info()
- inf.each do |line| return $1 if line[REGEX_REVISION] end
- end
- # Parses log entry and returns type of change
- # entry:: String, line of svn log
- # folders:: Boolean, include folders?
- # slash:: String, what type of file system / \ should be used
- # Returns Array, Per Entry format: [integer, formatted entry string]
- def parse_entry(entry, folders = true, slash = '/')
- # TODO: slash!
- # substract everything after first \
- if folders
- entrymod = entry.gsub(/\\(.*)/, '')
- else
- entrymod = entry
- end
- id = -1
- case entrymod
- when REGEX_MOD
- unless $1.nil?
- if folders and entry =~ REGEX_FOLDER
- # subfolder, so it's a change
- id = 1
- else
- id = 0
- end
- end
- unless $2.nil?
- id = 1
- end
- unless $3.nil?
- id = 2
- unless entry =~ REGEX_PBO
- if folders and entry =~ REGEX_FOLDER
- # subfolder, so it's a change
- id = 1
- end
- end
- end
- entrymod.gsub!(REGEX_MOD, '')
- return [id, entrymod]
- end
- end
- end
- end
- # Yay
Add Comment
Please, Sign In to add comment