<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>docs/api/contrib/console.rst</filename>
    </added>
    <added>
      <filename>docs/api/contrib/files.rst</filename>
    </added>
    <added>
      <filename>docs/api/contrib/project.rst</filename>
    </added>
    <added>
      <filename>docs/api/core/context_managers.rst</filename>
    </added>
    <added>
      <filename>docs/api/core/decorators.rst</filename>
    </added>
    <added>
      <filename>docs/api/core/operations.rst</filename>
    </added>
    <added>
      <filename>docs/api/core/utils.rst</filename>
    </added>
    <added>
      <filename>docs/changes/0.9.rst</filename>
    </added>
    <added>
      <filename>docs/tutorial.rst</filename>
    </added>
    <added>
      <filename>docs/usage/env.rst</filename>
    </added>
    <added>
      <filename>docs/usage/execution.rst</filename>
    </added>
    <added>
      <filename>docs/usage/fab.rst</filename>
    </added>
    <added>
      <filename>docs/usage/fabfiles.rst</filename>
    </added>
    <added>
      <filename>docs/usage/output_controls.rst</filename>
    </added>
    <added>
      <filename>docs/usage/ssh.rst</filename>
    </added>
    <added>
      <filename>paramiko/__init__.py</filename>
    </added>
    <added>
      <filename>paramiko/agent.py</filename>
    </added>
    <added>
      <filename>paramiko/auth_handler.py</filename>
    </added>
    <added>
      <filename>paramiko/ber.py</filename>
    </added>
    <added>
      <filename>paramiko/buffered_pipe.py</filename>
    </added>
    <added>
      <filename>paramiko/channel.py</filename>
    </added>
    <added>
      <filename>paramiko/client.py</filename>
    </added>
    <added>
      <filename>paramiko/common.py</filename>
    </added>
    <added>
      <filename>paramiko/compress.py</filename>
    </added>
    <added>
      <filename>paramiko/config.py</filename>
    </added>
    <added>
      <filename>paramiko/dsskey.py</filename>
    </added>
    <added>
      <filename>paramiko/file.py</filename>
    </added>
    <added>
      <filename>paramiko/hostkeys.py</filename>
    </added>
    <added>
      <filename>paramiko/kex_gex.py</filename>
    </added>
    <added>
      <filename>paramiko/kex_group1.py</filename>
    </added>
    <added>
      <filename>paramiko/logging22.py</filename>
    </added>
    <added>
      <filename>paramiko/message.py</filename>
    </added>
    <added>
      <filename>paramiko/packet.py</filename>
    </added>
    <added>
      <filename>paramiko/pipe.py</filename>
    </added>
    <added>
      <filename>paramiko/pkey.py</filename>
    </added>
    <added>
      <filename>paramiko/primes.py</filename>
    </added>
    <added>
      <filename>paramiko/resource.py</filename>
    </added>
    <added>
      <filename>paramiko/rng.py</filename>
    </added>
    <added>
      <filename>paramiko/rng_posix.py</filename>
    </added>
    <added>
      <filename>paramiko/rng_win32.py</filename>
    </added>
    <added>
      <filename>paramiko/rsakey.py</filename>
    </added>
    <added>
      <filename>paramiko/server.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_attr.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_client.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_file.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_handle.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_server.py</filename>
    </added>
    <added>
      <filename>paramiko/sftp_si.py</filename>
    </added>
    <added>
      <filename>paramiko/ssh_exception.py</filename>
    </added>
    <added>
      <filename>paramiko/transport.py</filename>
    </added>
    <added>
      <filename>paramiko/util.py</filename>
    </added>
    <added>
      <filename>paramiko/win_pageant.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,21 +1,22 @@
 Ordered by date of first contribution:
-  Christian Vest Hansen
-  Rob Cowie
-  Jeff Forcier
-  Travis Cline
-  Niklas Lindstr&#246;m
-  Kevin Horn
-  Max Battcher
-  Alexander Artemenko
-  Dennis Schoen
-  Erick Dennis
-  Sverre Johansen
-  Michael Stephens
-  Armin Ronacher
-  Curt Micol
-  Patrick McNerthney
-  Steve Steiner
-  Ali Saifee
-  Jorge Vargas
+
+Christian Vest Hansen
+Rob Cowie
+Jeff Forcier
+Travis Cline
+Niklas Lindstr&#246;m
+Kevin Horn
+Max Battcher
+Alexander Artemenko
+Dennis Schoen
+Erick Dennis
+Sverre Johansen
+Michael Stephens
+Armin Ronacher
+Curt Micol
+Patrick McNerthney
+Steve Steiner
+Ali Saifee
+Jorge Vargas
 Peter Ellis
 Brian Rosner</diff>
      <filename>AUTHORS</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,14 @@
+=================================
+Fabric Frequently Asked Questions
+=================================
+
 This is a dev-oriented list of FAQs from users. Once we get to maybe 10 or
 more, turn this into an actual document. (Would rather not have a user facing
 FAQ doc with only one or two entries, and too lazy to brainstorm a bunch of
 anticipated FAQs right now...)
 
 1. Why do I sometimes see ``err: stdin: is not a tty``?
--------------------------------------------------------
+=======================================================
 
 This message is typically generated by programs such as ``biff`` or ``mesg``
 lurking within your remote user's ``.profile`` or ``.bashrc`` files (or any
@@ -31,7 +35,7 @@ There are multiple ways to deal with this problem:
 
 
 2. Why can't I run programs in the background with ``&amp;``? It makes Fabric hang.
--------------------------------------------------------------------------------
+===============================================================================
 
 Because Fabric executes a shell on the remote end for each invocation of
 ``run`` or ``sudo``, techniques like backgrounding (or using ``cd``, but see
@@ -55,7 +59,7 @@ and thus your Fabric task will continue executing as intended.
 
 
 3. My remote system doesn't have ``bash`` installed by default, do I need to install ``bash``?
-----------------------------------------------------------------------------------------------
+==============================================================================================
 
 While Fabric is written with ``bash`` in mind, it's not an absolute
 requirement.  Simply change ``env.shell`` to call your desired shell, and
@@ -81,3 +85,22 @@ argument, like so::
     env.shell = &quot;/bin/sh -c&quot;
 
 This has been shown to work on FreeBSD and may work on other systems as well.
+
+
+4. I'm sometimes incorrectly asked for a passphrase instead of a password.
+==========================================================================
+
+Due to a bug of sorts in our SSH layer (Paramiko), it's not currently possible
+for Fabric to always accurately detect the type of authentication needed. We
+have to try and guess whether we're being asked for a private key passphrase or
+a remote server password, and in some cases our guess ends up being wrong.
+
+The most common such situation is where you, the local user, appear to have an
+SSH keychain agent running, but the remote server is not able to honor your SSH
+key, e.g. you haven't yet transferred the public key over or are using an
+incorrect username. In this situation, Fabric will prompt you with &quot;Please
+enter passphrase for private key&quot;, but the text you enter is actually being
+sent to the remote end's password authentication.
+
+We hope to address this in future releases, either by doing heavier
+introspection of Paramiko or patching Paramiko itself.</diff>
      <filename>FAQ</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1,2 @@
-For installation help, please see docs/installation.rst.
+For installation help, please see http://fabfile.org/ or (if using a source
+checkout) docs/installation.rst.</diff>
      <filename>INSTALL</filename>
    </modified>
    <modified>
      <diff>@@ -3,10 +3,10 @@ FAQ
 INSTALL
 LICENSE
 README
-TODO
 docs
 fabfile.py
 fabric
+paramiko
 requirements.txt
 setup.py
 tests</diff>
      <filename>MANIFEST</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,9 @@
-Fabric is a Python library and command-line tool designed to streamline
-deploying applications or performing system administration tasks via SSH.
+**PLEASE NOTE:** This is a release-candidate release of Fabric and is not
+intended for use in production. However, please do test it out on non-critical
+systems and let us know of any issues you encounter. **END NOTE**
+
+Fabric is a Python library and command-line tool for streamlining the use of
+SSH for application deployment or systems administration tasks.
 
 It provides a basic suite of operations for executing local or remote shell
 commands (normally or via ``sudo``) and uploading/downloading files, as well as</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -56,7 +56,6 @@ from fabric.version import get_version
 version = get_version(line_only=True)
 # The full version, including alpha/beta/rc tags.
 release = get_version(verbose=True)
-
 # Restore old path
 sys.path = oldpath[:]
 </diff>
      <filename>docs/conf.py</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,26 @@ There are a number of ways to get involved with Fabric:
   inspect all contributions and either incorporate them or explain why we don't
   feel the change is a good fit.
 
+Style
+-----
+
+Fabric tries hard to honor `PEP-8`_, especially (but not limited to!) the
+following:
+
+* Keep all lines under 80 characters. This goes for the ReST documentation as
+  well as code itself.
+
+  * Exceptions are made for situations where breaking a long string (such as a
+    string being ``print``-ed from source code, or an especially long URL link
+    in documentation) would be kind of a pain.
+
+* Typical Python 4-space (soft-tab) indents. No tabs! No 8 space indents! (No
+  2- or 3-space indents, for that matter!)
+* ``CamelCase`` class names, but ``lowercase_underscore_separated`` everything
+  else.
+
+.. _PEP-8: http://www.python.org/dev/peps/pep-0008/
+
 Branching/Repository Layout
 ===========================
 </diff>
      <filename>docs/development.rst</filename>
    </modified>
    <modified>
      <diff>@@ -10,13 +10,7 @@ About
 
 
 Installation
-=====================
-
-.. warning::
-
-    Fabric's primary dependency, Paramiko, has a severe bug in its latest
-    version.  Please see the :doc:`installation` page for more details before
-    using ``easy_install`` or ``pip`` to install Fabric!
+============
 
 Stable releases of Fabric are best installed via ``easy_install`` or ``pip``;
 or you may download TGZ or ZIP source archives from a couple of official
@@ -29,37 +23,67 @@ and the development version.
 
 However, if you want to live on the edge, you can pull down the latest source
 code from our Git repository, or fork us on Github. The :doc:`installation`
-page has details for how to access the source code; there is also a
-documentation section on :doc:`development` with important information about
-Fabric's development process.
+page has details for how to access the source code.
+
+
+Development
+===========
+
+Any hackers interested in improving Fabric (or even users interested in how
+Fabric is put together or released) please see the :doc:`development` page. It
+contains comprehensive info on contributing, repository layout, our release
+strategy, and more.
+
 
+.. _documentation-index:
 
 Documentation
 =============
 
+Please note that all documentation is currently written with Python 2.5 users
+in mind, but with an eye for eventual Python 3.x compatibility. This leads to
+the following patterns that may throw off readers used to Python 2.4 or who
+have already upgraded to Python 2.6:
+
+* ``from __future__ import with_statement``: a &quot;future import&quot; required to
+  use the ``with`` statement in Python 2.5 -- a feature you'll be using
+  frequently. Python 2.6 users don't need to do this.
+* ``&lt;true_value&gt; if &lt;expression&gt; else &lt;false_value&gt;``: Python's relatively new
+  ternary statement, available in 2.5 and newer. Python 2.4 and older used to
+  fake this with ``&lt;expression&gt; and &lt;true_value&gt; or &lt;false_value&gt;`` (which
+  isn't quite the same thing and has some logical loopholes.)
+* ``print(&lt;expression&gt;)`` instead of ``print &lt;expression&gt;``: We use the
+  ``print`` statement's optional parentheses where possible, in order to be
+  more compatible with Python 3.x (in which ``print`` becomes a function.)
+
+.. toctree::
+    :hidden:
+
+    tutorial
+    installation
+    development
+
 Tutorial
 --------
 
 For new users, and/or for an overview of Fabric's basic functionality, please
-see the :doc:`tutorial`. The rest of the documentation will assume you're at
-least passingly familiar with the material contained within.
+see the :doc:`tutorial`. The rest of the documentation will assume you're
+at least passingly familiar with the material contained within.
 
-.. _prose_docs:
+.. _usage-docs:
 
-Prose documentation
+Usage documentation
 -------------------
 
 The following list contains all major sections of Fabric's prose (non-API)
-documentation, which expands upon the concepts outlined in the :doc:`tutorial`
-and also covers advanced topics.
+documentation, which expands upon the concepts outlined in the
+:doc:`tutorial` and also covers advanced topics.
 
 .. toctree::
     :maxdepth: 1
+    :glob:
 
-    installation
-    development
-    usage
-    compatibility
+    usage/*
 
 .. _api_docs:
 
@@ -69,15 +93,26 @@ API documentation
 Fabric maintains two sets of API documentation, autogenerated from the source
 code's docstrings (which are typically very thorough.)
 
+.. _core-api:
+
+Core API
+~~~~~~~~
+
 The **core** API is loosely defined as those functions, classes and methods
-which form the basic building blocks of Fabric (such as `run` and `sudo`) upon
-which everything else (the below &quot;contrib&quot; section, and user fabfiles) builds.
+which form the basic building blocks of Fabric (such as
+`~fabric.operations.run` and `~fabric.operations.sudo`) upon which everything
+else (the below &quot;contrib&quot; section, and user fabfiles) builds.
 
 .. toctree::
     :maxdepth: 1
     :glob:
 
-    api/*
+    api/core/*
+
+.. _contrib-api:
+
+Contrib API
+~~~~~~~~~~~
 
 Fabric's **contrib** package contains commonly useful tools (often merged in
 from user fabfiles) for tasks such as user I/O, modifying remote files, and so
@@ -89,13 +124,21 @@ backwards-compatible) as more use-cases are solved and added.
     :maxdepth: 1
     :glob:
 
-    contrib/*
+    api/contrib/*
+
+Changes from previous versions
+------------------------------
+
+.. toctree::
+    :maxdepth: 1
+    :glob:
 
+    changes/*
 
 Getting help
 ============
 
-If you've scoured the :ref:`prose &lt;prose_docs&gt;` and :ref:`API &lt;api_docs&gt;`
+If you've scoured the :ref:`prose &lt;usage-docs&gt;` and :ref:`API &lt;api_docs&gt;`
 documentation and still can't find an answer to your question, below are
 various support resources that should help. We do request that you do at least
 skim the documentation before posting tickets or mailing list questions,
@@ -126,5 +169,5 @@ Wiki
 There is an official Fabric `MoinMoin &lt;http://moinmo.in&gt;`_ wiki reachable at
 `wiki.fabfile.org &lt;http://wiki.fabfile.org&gt;`_, although as of this writing its
 usage patterns are still being worked out. Like the ticket tracker, spam has
-forced us to put anti-spam measures up; the wiki has a simple, easy captcha in
+forced us to put anti-spam measures up: the wiki has a simple, easy captcha in
 place on the edit form.</diff>
      <filename>docs/index.rst</filename>
    </modified>
    <modified>
      <diff>@@ -3,9 +3,9 @@ Installation
 ============
 
 The most direct way to install Fabric is to obtain the source code and run
-``python setup.py install``. This method works for both release versions and
-development versions of the code, and requires nothing but a basic Python
-installation.
+``python setup.py install``. This method works for both release and development
+versions of the code, and requires nothing but a basic Python installation and
+the `setuptools`_ library.
 
 .. note::
 
@@ -18,10 +18,10 @@ installation.
 Dependencies
 ============
 
-In order to install Fabric, you will need three primary pieces of
-software: the Python programming language, the Paramiko SSH library, and
-the PyCrypto cryptography library (a dependency of Paramiko.) Please read
-on for important details on each dependency -- there are a few gotchas.
+In order to install Fabric, you will need three primary pieces of software: the
+Python programming language, the setuptools library, and the PyCrypto
+cryptography library. Please read on for important details on each dependency
+-- there are a few gotchas.
 
 Python
 ------
@@ -39,40 +39,29 @@ and notes about other Python versions:
   somewhat forward-looking (e.g. using ``print()`` instead of ``print``) and
   will definitely be porting to 3.x in the future once our dependencies and the
   rest of the ecosystem does so as well.
-* A bug in **Python 2.5.0 and 2.5.1** causes errors in
-  `fabric.contrib.files.upload_template` due to its combination of context
-  managers and ``tempfile.NamedTemporaryFile``. The rest of Fabric will work
-  fine on these Python versions, but be aware of this conflict if you do use
-  `upload_template` and are running on something older than Python 2.5.2.
 
-Paramiko
---------
-
-`Paramiko &lt;http://www.lag.net/paramiko/&gt;`_ is a Python implementation of the
-SSH protocol suite, and is what Fabric builds upon for its networking support.
-At this time, **only Paramiko version 1.7.4 is supported!** A more recent
-version, 1.7.5, is on PyPI, but contains `a serious bug
-&lt;https://bugs.launchpad.net/paramiko/+bug/413850&gt;`_ that causes effectively
-random (albeit uncommon) SSHException errors.
+setuptools
+----------
 
-Furthermore, because 1.7.5 is the only version currently uploaded to PyPI (the
-source of ``easy_install`` and ``pip`` installs) we do **not** recommend you
-use those tools to install Fabric until you have installed Paramiko and
-PyCrypto by hand.
+`Setuptools`_ comes with some Python installations by default; if yours doesn't,
+you'll need to grab it. In such situations it's typically packaged as
+``python-setuptools``, ``py25-setuptools`` or similar. Fabric may drop its
+setuptools dependency in the future, or include alternative support for the
+`Distribute`_ project, but for now setuptools is required for installation.
 
-Paramiko 1.7.4 may be downloaded from Paramiko's `old releases directory
-&lt;http://www.lag.net/paramiko/download/&gt;`_ and installed by unpacking and
-running ``python setup.py install``, as with most other Python packages.
+.. _setuptools: http://pypi.python.org/pypi/setuptools
+.. _Distribute: http://pypi.python.org/pypi/distribute
 
 PyCrypto
 --------
 
 `PyCrypto &lt;http://www.amk.ca/python/code/crypto.html&gt;`_ is a dependency of
-Paramiko, providing the low-level (C-based) encryption algorithms used to run
-SSH. You will need version 1.9 or newer, and may install PyCrypto from
-``easy_install`` or ``pip`` without worry. However, unless you are installing
-from a precompiled source such as a Debian apt repository or RedHat RPM, you
-will need the ability to build Python C-based modules from source -- read on.
+Paramiko (which Fabric uses internally for SSH support), providing the
+low-level (C-based) encryption algorithms used to run SSH. You will need
+version 1.9 or newer, and may install PyCrypto from ``easy_install`` or ``pip``
+without worry. However, unless you are installing from a precompiled source
+such as a Debian apt repository or RedHat RPM, you will need the ability to
+build Python C-based modules from source -- read on.
 
 Users on **Unix-based platforms** such as Ubuntu or Mac OS X will need the
 traditional C build toolchain installed (e.g. Developer Tools / XCode Tools on
@@ -92,12 +81,15 @@ If you are interested in doing development work on Fabric (or even just running
 the test suite), you may also need to install some or all of the following
 packages:
 
+* `git &lt;http://git-scm.com&gt;`_ and `Mercurial`_, in order to obtain some of the
+  other dependencies below;
 * `Nose &lt;http://code.google.com/p/python-nose/&gt;`_ &gt;=0.10 
 * `Coverage &lt;http://nedbatchelder.com/code/modules/coverage.html&gt;`_ &gt;=2.85
 * `PyLint &lt;http://www.logilab.org/857&gt;`_ &gt;=0.18
 * `Fudge &lt;http://farmdev.com/projects/fudge/index.html&gt;`_ &gt;=0.9.2
 * `Sphinx &lt;http://sphinx.pocoo.org/&gt;`_ &gt;= 0.6.1
 
+.. _Mercurial: http://mercurial.selenic.com/wiki/
 
 Downloads
 =========
@@ -142,16 +134,10 @@ branches may be of interest and how you can help out, please see the
 Easy_install and Pip
 ====================
 
-Fabric tries hard to play nice with packaging systems such as Python's
-``setuptools``, and as such it may be installed via either `easy_install
+Fabric may be installed via either `easy_install
 &lt;http://wiki.python.org/moin/CheeseShopTutorial&gt;`_ or `pip
 &lt;http://pip.openplans.org&gt;`_.
 
-.. warning::
-
-    Please see the :ref:`above warning concerning Paramiko &lt;paramiko&gt;` before
-    attempting to install Fabric via ``easy_install`` or ``pip``.
-
 Fabric's source distribution also comes with a ``pip`` requirements file
 called ``requirements.txt``, containing the various development requirements
 listed above (note, that's *development* requirements -- not necessary for</diff>
      <filename>docs/installation.rst</filename>
    </modified>
    <modified>
      <diff>@@ -9,21 +9,26 @@ from fabric.contrib.project import rsync_project
 import fabric.version
 
 
-def test():
+def test(args=&quot;&quot;):
     &quot;&quot;&quot;
     Run all unit tests and doctests.
+
+    Specify string argument ``args`` for additional args to ``nosetests``.
     &quot;&quot;&quot;
-    print(local('nosetests -sv --with-doctest', capture=False))
+    print(local('nosetests -sv --with-doctest %s' % args, capture=False))
 
 
-def build_docs(clean='no'):
+def build_docs(clean='no', browse='no'):
     &quot;&quot;&quot;
     Generate the Sphinx documentation.
     &quot;&quot;&quot;
     c = &quot;&quot;
     if clean.lower() in ['yes', 'y']:
         c = &quot;clean &quot;
-    local('cd docs &amp;&amp; make %shtml' % c, capture=False)
+    b = &quot;&quot;
+    if browse.lower() in ['yes', 'y']:
+        b = &quot; &amp;&amp; open _build/html/index.html&quot;
+    local('cd docs; make %shtml%s' % (c, b), capture=False)
 
 
 @hosts('jforcier@fabfile.org')</diff>
      <filename>fabfile.py</filename>
    </modified>
    <modified>
      <diff>@@ -96,10 +96,12 @@ def settings(*args, **kwargs):
     * Most usefully, it allows temporary overriding/updating of ``env`` with
       any provided keyword arguments, e.g. ``with settings(user='foo'):``.
       Original values, if any, will be restored once the ``with`` block closes.
-    * In addition, it will use ``contextlib.nested`` to nest any given
+    * In addition, it will use `contextlib.nested`_ to nest any given
       non-keyword arguments, which should be other context managers, e.g.
       ``with settings(hide('stderr'), show('stdout')):``.
 
+    .. _contextlib.nested: http://docs.python.org/library/contextlib.html#contextlib.nested
+
     These behaviors may be specified at the same time if desired. An example
     will hopefully illustrate why this is considered useful::
 </diff>
      <filename>fabric/context_managers.py</filename>
    </modified>
    <modified>
      <diff>@@ -38,8 +38,10 @@ def roles(*role_list):
     barring an override on the command line, ``my_func`` will be executed
     against the hosts listed in the ``webserver`` and ``dbserver`` roles::
 
-        env.webserver = ['www1', 'www2']
-        env.dbserver = ['db1']
+        env.roledefs.update({
+            'webserver': ['www1', 'www2'],
+            'dbserver': ['db1']
+        })
 
         @roles('webserver', 'dbserver')
         def my_func():</diff>
      <filename>fabric/decorators.py</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,8 @@ _internals = reduce(lambda x, y: x + filter(callable, vars(y).values()),
 def load_settings(path):
     &quot;&quot;&quot;
     Take given file path and return dictionary of any key=value pairs found.
+
+    Usage docs are in docs/usage/fab.rst, in &quot;Settings files.&quot;
     &quot;&quot;&quot;
     if os.path.exists(path):
         comments = lambda s: s and not s.startswith(&quot;#&quot;)
@@ -47,17 +49,7 @@ def find_fabfile():
     &quot;&quot;&quot;
     Attempt to locate a fabfile, either explicitly or by searching parent dirs.
 
-    Uses the value of ``env.fabfile``, which defaults to ``fabfile.py``,
-    as the target of the search. This may be overridden on the command line.
-
-    If ``env.fabfile`` contains path elements other than a filename (e.g.
-    ``../fabfile.py`` or ``dir1/dir2/other.py``) it will be treated as a file
-    path and directly checked for existence without any sort of searching. When
-    in this mode, tile-expansion will be applied, so one may refer to e.g.
-    ``~/special_fabfile.py``.
-
-    Either way, `find_fabfile` will return an absolute path if a file is found,
-    or None otherwise.
+    Usage docs are in docs/usage/fabfiles.rst, in &quot;Fabfile discovery.&quot;
     &quot;&quot;&quot;
     if os.path.dirname(state.env.fabfile):
         expanded = os.path.expanduser(state.env.fabfile)
@@ -235,41 +227,7 @@ def parse_arguments(arguments):
     &quot;&quot;&quot;
     Parse string list into list of tuples: command, args, kwargs, hosts, roles.
 
-    Parses the given list of arguments into command names and, optionally,
-    per-command args/kwargs. Per-command args are attached to the command name
-    with a colon (``:``), are comma-separated, and may use a=b syntax for
-    kwargs.  These args/kwargs are passed into the resulting command as normal
-    Python args/kwargs.
-
-    For example::
-
-        $ fab do_stuff:a,b,c=d
-
-    will result in the function call ``do_stuff(a, b, c=d)``.
-
-    If ``host`` or ``hosts`` kwargs are given, they will be used to fill
-    Fabric's host list (see `get_hosts`). ``hosts`` will override
-    ``host`` if both are given.
-
-    When using ``hosts`` in this way, one must use semicolons (``;``), and must
-    thus quote the host list string to prevent shell interpretation.
-
-    For example::
-
-        $ fab ping_servers:hosts=&quot;a;b;c&quot;,foo=bar
-
-    will result in Fabric's host list for the ``ping_servers`` command being set
-    to ``['a', 'b', 'c']``.
-    
-    ``host`` and ``hosts`` are removed from the kwargs mapping at this point, so
-    commands are not required to expect them. Thus, the resulting call of the
-    above example would be ``ping_servers(foo=bar)``.
-
-    ``role`` or ``roles`` behave the same as ``host``/``hosts``, but are used
-    as role names (which will eventually be turned into additional hosts).
-
-    Host- and role-related arguments may be specified simultaneously, in which
-    case they will be merged into a single effective host list.
+    See docs/usage/fab.rst, section on &quot;per-task arguments&quot; for details.
     &quot;&quot;&quot;
     cmds = []
     for cmd in arguments:</diff>
      <filename>fabric/main.py</filename>
    </modified>
    <modified>
      <diff>@@ -74,6 +74,9 @@ def normalize(host_string, omit_port=False):
     If ``omit_port`` is given and is True, only the host and user are returned.
     &quot;&quot;&quot;
     from fabric.state import env
+    # Gracefully handle &quot;empty&quot; input by returning empty output
+    if not host_string:
+        return ('', '') if omit_port else ('', '', '')
     # Get user, host and port separately
     r = host_regex.match(host_string).groupdict()
     # Add any necessary defaults in
@@ -251,8 +254,8 @@ def prompt_for_password(previous=None, prompt=None):
     from fabric.state import env
     # Construct the prompt we will display to the user (using host if available)
     if 'host' in env:
-        base_password_prompt = &quot;Password for %s&quot; % join_host_strings(*normalize(
-            env.host_string, omit_port=True))
+        host = join_host_strings(*normalize(env.host_string, omit_port=True))
+        base_password_prompt = &quot;Password for %s&quot; % host
     else:
         base_password_prompt = &quot;Password&quot;
     password_prompt = base_password_prompt</diff>
      <filename>fabric/network.py</filename>
    </modified>
    <modified>
      <diff>@@ -93,61 +93,54 @@ def _rc_path():
         )
 
 
-# Options/settings which exist both as environment keys and which can be set
-# on the command line, are defined here. When used via `fab` they will be added
-# to the optparse parser, and either way they are added to `env` below (i.e.
-# the 'dest' value becomes the environment key and the value, the env value).
+# Options/settings which exist both as environment keys and which can be set on
+# the command line, are defined here. When used via `fab` they will be added to
+# the optparse parser, and either way they are added to `env` below (i.e.  the
+# 'dest' value becomes the environment key and the value, the env value).
 #
 # Keep in mind that optparse changes hyphens to underscores when automatically
 # deriving the `dest` name, e.g. `--reject-unknown-hosts` becomes
 # `reject_unknown_hosts`.
 #
 # Furthermore, *always* specify some sort of default to avoid ending up with
-# optparse.NO_DEFAULT (currently a two-tuple)! None is better than ''.
+# optparse.NO_DEFAULT (currently a two-tuple)! In general, None is a better
+# default than ''.
+#
+# User-facing documentation for these are kept in docs/env.rst.
 env_options = [
 
-    # By default, we accept unknown hosts' keys. This option allows users to
-    # disable that behavior (which means Fabric will raise an exception and
-    # terminate when an unknown host key is received from a server).
     make_option('-r', '--reject-unknown-hosts',
         action='store_true',
         default=False,
         help=&quot;reject unknown hosts&quot;
     ),
 
-    # By default, we load the user's ~/.ssh/known_hosts file. In some cases
-    # users may not want this to occur.
     make_option('-D', '--disable-known-hosts',
         action='store_true',
         default=False,
         help=&quot;do not load user known_hosts file&quot;
     ),
 
-    # Username
     make_option('-u', '--user',
         default=_get_system_username(),
         help=&quot;username to use when connecting to remote hosts&quot;
     ),
 
-    # Password
     make_option('-p', '--password',
         default=None,
         help=&quot;password for use with authentication and/or sudo&quot;
     ),
 
-    # Global host list
     make_option('-H', '--hosts',
         default=[],
         help=&quot;comma-separated list of hosts to operate on&quot;
     ),
 
-    # Global role list
     make_option('-R', '--roles',
         default=[],
         help=&quot;comma-separated list of roles to operate on&quot;
     ),
 
-    # Private key file
     make_option('-i', 
         action='append',
         dest='key_filename',
@@ -155,26 +148,22 @@ env_options = [
         help=&quot;path to SSH private key file. May be repeated.&quot;
     ),
 
-    # Fabfile name to look for
     make_option('-f', '--fabfile',
         default='fabfile.py',
         help=&quot;name of fabfile to load, e.g. 'fabfile.py' or '../other.py'&quot;
     ),
 
-    # Default error-handling behavior
     make_option('-w', '--warn-only',
         action='store_true',
         default=False,
         help=&quot;warn, instead of abort, when commands fail&quot;
     ),
 
-    # Shell used when running remote commands
     make_option('-s', '--shell',
         default='/bin/bash -l -c',
         help=&quot;specify a new shell, defaults to '/bin/bash -l -c'&quot;
     ),
 
-    # Config file location
     make_option('-c', '--config',
         dest='rcfile',
         default=_rc_path(),
@@ -202,14 +191,21 @@ env_options = [
 # Global environment dict. Currently a catchall for everything: config settings
 # such as global deep/broad mode, host lists, username etc.
 # Most default values are specified in `env_options` above, in the interests of
-# preserving DRY.
+# preserving DRY: anything in here is generally not settable via the command
+# line.
 env = _AttributeDict({
-    # Version number for --version
-    'version': get_version(),
+    'all_hosts': None, 
+    'command': None,
+    'cwd': '', # Must be empty string, not None, for concatenation purposes
+    'host': None,
+    'host_string': None,
+    'port': None,
+    'real_fabfile': None,
+    'roledefs': {},
     'sudo_prompt': 'sudo password:',
     'use_shell': True,
-    'roledefs': {},
-    'cwd': ''
+    'user': None,
+    'version': get_version(),
 })
 
 # Add in option defaults</diff>
      <filename>fabric/state.py</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ problems with ``__init__.py`` (which is loaded by setup.py during installation,
 which in turn needs access to this version information.)
 &quot;&quot;&quot;
 
-VERSION = (0, 9, 0, 'beta', 1)
+VERSION = (0, 9, 0, 'release candidate', 1)
 
 def get_version(verbose=False, line_only=False):
     &quot;&quot;&quot;
@@ -34,8 +34,10 @@ def get_version(verbose=False, line_only=False):
     # Append alpha/beta modifier if not a final release
     if VERSION[3] != 'final':
         # If non-verbose, just the first letter of the modifier, and no spaces.
+        # (If modifier is &gt;1 word, create acronym.)
         if not verbose:
-            version = '%s%s%s' % (version, VERSION[3][0], VERSION[4])
+            firsts = ''.join([x[0] for x in VERSION[3].split()])
+            version = '%s%s%s' % (version, firsts, VERSION[4])
         # Otherwise, be more generous.
         else:
             version = '%s %s %s' % (version, VERSION[3], VERSION[4])</diff>
      <filename>fabric/version.py</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@
 # execute &quot;pip install Mercurial&quot; before using this file. Otherwise it will
 # bail out upon trying to install Fudge from BitBucket.
 
-paramiko &gt;= 1.7
+pycrypto &gt;= 1.9
 nose
 coverage
 pylint</diff>
      <filename>requirements.txt</filename>
    </modified>
    <modified>
      <diff>@@ -15,15 +15,15 @@ For more information, please see the Fabric website or execute ``fab --help``.
     author='Jeff Forcier',
     author_email='jeff@bitprophet.org',
     url='http://fabfile.org',
-    install_requires=['paramiko &gt;=1.7, &lt;2.0'],
     packages=find_packages(),
+    install_requires=['pycrypto &gt;=1.9'],
     entry_points={
         'console_scripts': [
             'fab = fabric.main:main',
         ]
     },
     classifiers=[
-          'Development Status :: 3 - Alpha',
+          'Development Status :: 5 - Production/Stable',
           'Environment :: Console',
           'Intended Audience :: Developers',
           'Intended Audience :: System Administrators',</diff>
      <filename>setup.py</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@ from utils import mock_streams
 
 def test_host_string_normalization():
     username = _get_system_username()
-    for description, string1, string2 in (
+    for description, input, output in (
         (&quot;Sanity check: equal strings remain equal&quot;,
             'localhost', 'localhost'),
         (&quot;Empty username is same as get_system_username&quot;,
@@ -34,7 +34,7 @@ def test_host_string_normalization():
             'localhost', username + '@localhost:22'),
     ):
         eq_.description = &quot;Host-string normalization: %s&quot; % description
-        yield eq_, normalize(string1), normalize(string2) 
+        yield eq_, normalize(input), normalize(output)
         del eq_.description
 
 def test_normalization_without_port():
@@ -55,6 +55,18 @@ def test_nonword_character_in_username():
         'user-with-hyphens'
     )
 
+def test_normalization_of_empty_input():
+    empties = ('', '', '')
+    for description, input in (
+        (&quot;empty string&quot;, ''),
+        (&quot;None&quot;, None)
+    ):
+        eq_.description = &quot;normalize() returns empty strings for %s input&quot; % (
+            description
+        )
+        yield eq_, normalize(input), empties
+        del eq_.description
+
 def test_host_string_denormalization():
     username = _get_system_username()
     for description, string1, string2 in (</diff>
      <filename>tests/test_network.py</filename>
    </modified>
    <modified>
      <diff>@@ -13,7 +13,9 @@ def test_get_version():
         ((0, 9, 0, 'final'), '0.9', '0.9 final', '0.9'),
         ((0, 9, 1, 'final'), '0.9.1', '0.9.1 final', '0.9'),
         ((0, 9, 0, 'alpha', 1), '0.9a1', '0.9 alpha 1', '0.9'),
-        ((0, 9, 1, 'beta', 1), '0.9.1b1', '0.9.1 beta 1', '0.9')
+        ((0, 9, 1, 'beta', 1), '0.9.1b1', '0.9.1 beta 1', '0.9'),
+        ((0, 9, 0, 'release candidate', 1),
+            '0.9rc1', '0.9 release candidate 1', '0.9')
     ]:
         fabric.version.VERSION = tup
         yield eq_, get_version(), regular_str</diff>
      <filename>tests/test_version.py</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>docs/api/context_managers.rst</filename>
    </removed>
    <removed>
      <filename>docs/api/decorators.rst</filename>
    </removed>
    <removed>
      <filename>docs/api/main.rst</filename>
    </removed>
    <removed>
      <filename>docs/api/operations.rst</filename>
    </removed>
    <removed>
      <filename>docs/api/state.rst</filename>
    </removed>
    <removed>
      <filename>docs/api/utils.rst</filename>
    </removed>
    <removed>
      <filename>docs/compatibility.rst</filename>
    </removed>
    <removed>
      <filename>docs/contrib/console.rst</filename>
    </removed>
    <removed>
      <filename>docs/contrib/files.rst</filename>
    </removed>
    <removed>
      <filename>docs/contrib/project.rst</filename>
    </removed>
    <removed>
      <filename>docs/usage.rst</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>51e9b92c7e24ca0765c81e4e3b09a679e7cd69fc</id>
    </parent>
    <parent>
      <id>652b430a61bb12cad3f87891de50bfb17fbfe432</id>
    </parent>
  </parents>
  <author>
    <name>Jeff Forcier</name>
    <email>jeff@bitprophet.org</email>
  </author>
  <url>http://github.com/bitprophet/fabric/commit/16060c6d72d52639becfefeb374be6b0b24329d5</url>
  <id>16060c6d72d52639becfefeb374be6b0b24329d5</id>
  <committed-date>2009-11-04T10:34:21-08:00</committed-date>
  <authored-date>2009-11-04T10:34:21-08:00</authored-date>
  <message>Merge branch '0.9' (mostly doc-rewrite changes)

Conflicts:
	fabfile.py
	fabric/main.py
	fabric/state.py
	fabric/version.py</message>
  <tree>8f7d0f9379a67ed594e86b14390e4681770afa0f</tree>
  <committer>
    <name>Jeff Forcier</name>
    <email>jeff@bitprophet.org</email>
  </committer>
</commit>
