#!/usr/bin/env ruby

# Create local repo for testing
#
# - create a different repo for each top-level path (asf/infr/private)
# - for each relative URL, create the directory if necessary
# - for each file, copy from the ASF REPO if necessary

$LOAD_PATH.unshift '/srv/whimsy/lib'
require 'whimsy/asf'

ASF_REPO='https://svn.apache.org/repos/' # where to fetch files

LOCAL_FILE='/var/tools/svnrep' # Change this as required

LOCAL_URL='file://' + LOCAL_FILE

svnrepos = ASF::SVN.repo_entries(true)

# Find the top-level directories and create repositories
svnrepos.map{|k,v| v['url'].split('/')[0]}.uniq.sort.each do |tlr|
  repodir = File.join(LOCAL_FILE, tlr)
  unless File.exist? File.join(repodir, 'format')
    cmd = ['svnadmin','create',repodir]
    puts cmd.join(' ')
    system *cmd
  end
end

svnrepos.each do |name, entry|

  url = entry['url']
  svndir = File.join(LOCAL_URL, url)

  # if the relative URL does not exist, create the directory
  revision, err = ASF::SVN.getRevision(svndir)
  unless revision
    puts "Creating #{svndir}"
    system *%w(svn mkdir --parents --message Initial --), svndir
  end

  # for each file, if it does not exist, copy the file from the ASF repo
  (entry['files'] || []).each do |file|
    filepath = File.join(svndir,file)
    revision, err = ASF::SVN.getRevision(filepath)
    unless revision
      puts "Creating #{filepath}"
      Dir.mktmpdir do |tmp|
        infile = File.join(ASF_REPO, url, file)
        out = File.join(tmp, file)
        p infile
        system 'svn', 'export', infile, out
        cmd = %w(svnmucc --message "Initial_create" -- put)
        cmd << out
        cmd << filepath
        system *cmd
      end
    end
  end

end
