# File system operations over Windows Remote Management (WinRM) for Ruby
[![Build Status](https://travis-ci.org/WinRb/winrm-fs.svg?branch=master)](https://travis-ci.org/WinRb/winrm-fs)
[![Gem Version](https://badge.fury.io/rb/winrm-fs.svg)](http://badge.fury.io/rb/winrm-fs)
[![Build status](https://ci.appveyor.com/api/projects/status/wm6apa8ojfhfmwsf?svg=true)](https://ci.appveyor.com/project/winrb/winrm-fs)

## Uploading files
Files may be copied from the local machine to the winrm endpoint. Individual files or directories, as well as arrays of files and directories may be specified:
```ruby
require 'winrm-fs'

service = WinRM::WinRMWebService.new(...
file_manager = WinRM::FS::FileManager.new(service)

# upload file.txt from the current working directory
file_manager.upload('file.txt', 'c:/file.txt')

# upload the my_dir directory to c:/foo/my_dir
file_manager.upload('/Users/sneal/my_dir', 'c:/foo/my_dir')

# upload multiple directories and a file to c:\programData
file_manager.upload([
  '/Users/sneal/foo1',
  '/Users/sneal/foo2'
  '/Users/sneal/fluffy.txt'
], '$env:ProgramData')
```

### Handling progress events
If you want to implemnt your own custom progress handling, you can pass a code
block and use the proggress data that `upload` yields to this block:
```ruby
file_manager.upload('c:/dev/my_dir', '$env:AppData') do |bytes_copied, total_bytes, local_path, remote_path|
  puts "#{bytes_copied}bytes of #{total_bytes}bytes copied"
end
```

## Troubleshooting

If you're having trouble, first of all its most likely a network or WinRM configuration
issue. Take a look at the [WinRM gem troubleshooting](https://github.com/WinRb/WinRM#troubleshooting)
first.

The most [common error](https://github.com/WinRb/winrm-fs/issues/1) with this gem is getting a 500 error because your maxConcurrentOperationsPerUser limit has been reached.

```
The WS-Management service cannot process the request. This user is allowed a
maximum number of 1500 concurrent operations, which has been exceeded. Close
existing operations for this user, or raise the quota for this user.
```

You can workaround this by increasing your operations per user quota.

## Contributing

1. Fork it.
2. Create a branch (git checkout -b my_feature_branch)
3. Run the unit and integration tests (bundle exec rake integration)
4. Commit your changes (git commit -am "Added a sweet feature")
5. Push to the branch (git push origin my_feature_branch)
6. Create a pull requst from your branch into master (Please be sure to provide enough detail for us to cipher what this change is doing)

### Running the tests

We use Bundler to manage dependencies during development.

```
$ bundle install
```

Once you have the dependencies, you can run the unit tests with `rake`:

```
$ bundle exec rake spec
```

To run the integration tests you will need a Windows box with the WinRM service properly configured. Its easiest to use the Vagrant Windows box in the Vagrantilfe of this repo.

1. Create a Windows VM with WinRM configured (see above).
2. Copy the config-example.yml to config.yml - edit this file with your WinRM connection details.
3. Run `bundle exec rake integration`

## WinRM-fs Authors
* Shawn Neal (https://github.com/sneal)
* Matt Wrock (https://github.com/mwrock)

[Contributors](https://github.com/WinRb/winrm-fs/graphs/contributors)
