self.update

in lib/whimsy/asf/svn.rb [694:766]


    def self.update(path, msg, env, _, options={})
      if File.directory? path
        dir = path
        basename = nil
      else
        dir = File.dirname(path)
        basename = File.basename(path)
      end

      rc = 0
      Dir.mktmpdir do |tmpdir|

        
        self.svn_('checkout', [self.getInfoItem(dir, 'url'), tmpdir], _,
          {depth: 'empty', env: env})

        
        if basename
          tmpfile = File.join(tmpdir, basename)
          self.svn_('update', tmpfile, _, {env: env})
        else
          tmpfile = nil
        end

        
        if not tmpfile
          
          previous_contents = contents = nil
          yield tmpdir, ''
        elsif File.file? tmpfile
          
          previous_contents = File.read(tmpfile)
          contents = yield tmpdir, File.read(tmpfile)
        else
          
          previous_contents = nil
          contents = yield tmpdir, ''
          previous_contents = File.read(tmpfile) if File.file? tmpfile
        end

        
        if contents and not contents.empty?
          File.write tmpfile, contents
          unless previous_contents
            self.svn_('add', tmpfile, _, {env: env}) 
          end
        elsif tmpfile and File.file? tmpfile
          File.unlink tmpfile
          self.svn_('delete', tmpfile, _, {env: env}) 
        end

        if options[:dryrun]
          
          rc = self.svn_('diff', tmpfile || tmpdir, _)
          return rc 
        end

        self.svn_('diff', tmpfile || tmpdir, _) if options[:diff]

        
        rc = self.svn_('commit', tmpfile || tmpdir, _,
            {msg: msg, env: env})

        
        out, _err = self.svn('status', tmpfile || tmpdir) 
        unless rc == 0 && out && out.empty?
          raise "svn failure #{rc} #{path.inspect} #{out}"
        end

      end
      rc 
    end