Class: Piston::Svn::WorkingCopy

Inherits:
WorkingCopy show all
Defined in:
lib/piston/svn/working_copy.rb

Instance Attribute Summary

Attributes inherited from WorkingCopy

#path

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from WorkingCopy

add_handler, #copy_from, guess, handlers, #import, #info, #initialize, #logger, logger, #pistonized?, #recall, #remember, #temp_dir_name, #to_s, #update, #validate!

Constructor Details

This class inherits a constructor from Piston::WorkingCopy

Class Method Details

.clientObject



15
16
17
# File 'lib/piston/svn/working_copy.rb', line 15

def client
  @@client ||= Piston::Svn::Client.instance
end

.svn(*args) ⇒ Object



19
20
21
# File 'lib/piston/svn/working_copy.rb', line 19

def svn(*args)
  client.svn(*args)
end

.understands_dir?(dir) ⇒ Boolean

Returns:

  • (Boolean)


10
11
12
13
# File 'lib/piston/svn/working_copy.rb', line 10

def understands_dir?(dir)
  result = svn(:info, dir) rescue :failed
  result == :failed ? false : true
end

Instance Method Details

#after_remember(path) ⇒ Object



40
41
42
43
44
45
46
47
48
# File 'lib/piston/svn/working_copy.rb', line 40

def after_remember(path)
  begin
    info = svn(:info, path)
  rescue Piston::Svn::Client::CommandError
  ensure
    return unless info =~ /\(not a versioned resource\)/i || info =~ /\(is not under version control\)/i || info.blank?
    svn(:add, path)
  end
end

#createObject



36
37
38
# File 'lib/piston/svn/working_copy.rb', line 36

def create
  svn(:mkdir, path)
end

#exist?Boolean

Returns:

  • (Boolean)


28
29
30
31
32
33
34
# File 'lib/piston/svn/working_copy.rb', line 28

def exist?
  result = svn(:info, path) rescue :failed
  logger.debug {"result: #{result.inspect}"}
  return false if result == :failed
  return false if result.nil? || result.chomp.strip.empty?
  return true if YAML.load(result).has_key?("Path")
end

#externalsObject

Returns all defined externals (recursively) of this WC. Returns a Hash:

{"vendor/rails" => {:revision => :head, :url => "http://dev.rubyonrails.org/svn/rails/trunk"},
 "vendor/plugins/will_paginate" => {:revision => 1234, :url => "http://will_paginate.org/svn/trunk"}}


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/piston/svn/working_copy.rb', line 61

def externals
  externals = svn(:proplist, "--recursive", "--verbose")
  return Hash.new if externals.blank?
  returning(Hash.new) do |result|
    YAML.load(externals).each_pair do |dir, props|
      next if props["svn:externals"].blank?
      next unless dir =~ /Properties on '([^']+)'/
      basedir = self.path + $1
      exts = props["svn:externals"]
      exts.split("\n").each do |external|
        data = external.match(/^([^\s]+)\s+(?:(?:-r|--revision)\s*(\d+)\s+)?(.+)$/)
        case data.length
        when 4
          subdir, rev, url = data[1], data[2].nil? ? :head : data[2].to_i, data[3]
        else
          raise SyntaxError, "Could not parse svn:externals on #{basedir}: #{external}"
        end

        result[basedir + subdir] = {:revision => rev, :url => url}
      end
    end
  end
end

#finalizeObject



50
51
52
53
54
55
# File 'lib/piston/svn/working_copy.rb', line 50

def finalize
  targets = []
  Dir[path + "*"].each do |item|
    svn(:add, item)
  end
end

#merge_changes(to) ⇒ Object



85
86
87
88
89
90
91
92
# File 'lib/piston/svn/working_copy.rb', line 85

def merge_changes(to)
  data = svn(:info, yaml_path)
  info = YAML.load(data)
  initial_revision = info["Last Changed Rev"].to_i
  logger.debug {"Going to merge #{initial_revision} to #{to.revision}"}
  svn(:merge, "--revision", "#{initial_revision}:#{to.revision}", path, path)
  logger.debug {"after merge"}
end

#remove_external_references(*targets) ⇒ Object



94
95
96
# File 'lib/piston/svn/working_copy.rb', line 94

def remove_external_references(*targets)
  svn(:propdel, "svn:externals", *targets)
end

#svn(*args) ⇒ Object



24
25
26
# File 'lib/piston/svn/working_copy.rb', line 24

def svn(*args)
  self.class.svn(*args)
end