summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorNikolaus Rath <Nikolaus@rath.org>2016-03-09 10:08:37 -0800
committerNikolaus Rath <Nikolaus@rath.org>2016-03-09 10:08:37 -0800
commit32ed9e148324948297c3699e4efc7c1b83bb1d34 (patch)
treed2beedf9959ba9711fea6a93c8d95ceff8fa3006 /doc
parent438e143e4284715312f5fd6b1fbfec7e52fb94e0 (diff)
Import s3ql_1.9.orig.tar.bz2
Diffstat (limited to 'doc')
-rw-r--r--doc/html/.buildinfo2
-rw-r--r--doc/html/_sources/backends.txt64
-rw-r--r--doc/html/_sources/contrib.txt10
-rw-r--r--doc/html/_sources/general.txt3
-rw-r--r--doc/html/_sources/installation.txt12
-rw-r--r--doc/html/_sources/mount.txt36
-rw-r--r--doc/html/_static/jquery.js2896
-rw-r--r--doc/html/about.html10
-rw-r--r--doc/html/adm.html10
-rw-r--r--doc/html/backends.html62
-rw-r--r--doc/html/contrib.html22
-rw-r--r--doc/html/fsck.html10
-rw-r--r--doc/html/general.html13
-rw-r--r--doc/html/index.html15
-rw-r--r--doc/html/installation.html19
-rw-r--r--doc/html/issues.html10
-rw-r--r--doc/html/man/adm.html10
-rw-r--r--doc/html/man/cp.html10
-rw-r--r--doc/html/man/ctrl.html10
-rw-r--r--doc/html/man/expire_backups.html10
-rw-r--r--doc/html/man/fsck.html10
-rw-r--r--doc/html/man/index.html10
-rw-r--r--doc/html/man/lock.html10
-rw-r--r--doc/html/man/mkfs.html10
-rw-r--r--doc/html/man/mount.html10
-rw-r--r--doc/html/man/pcp.html10
-rw-r--r--doc/html/man/rm.html10
-rw-r--r--doc/html/man/stat.html10
-rw-r--r--doc/html/man/umount.html10
-rw-r--r--doc/html/mkfs.html10
-rw-r--r--doc/html/mount.html59
-rw-r--r--doc/html/objects.inv2
-rw-r--r--doc/html/resources.html10
-rw-r--r--doc/html/search.html10
-rw-r--r--doc/html/searchindex.js2
-rw-r--r--doc/html/special.html10
-rw-r--r--doc/html/tips.html10
-rw-r--r--doc/html/umount.html10
-rw-r--r--doc/latex/manual.aux41
-rw-r--r--doc/latex/manual.log60
-rw-r--r--doc/latex/manual.out15
-rw-r--r--doc/latex/manual.tex131
-rw-r--r--doc/latex/manual.toc19
-rw-r--r--doc/man/fsck.s3ql.12
-rw-r--r--doc/man/mkfs.s3ql.12
-rw-r--r--doc/man/mount.s3ql.12
-rw-r--r--doc/man/s3qladm.12
-rw-r--r--doc/man/s3qlcp.12
-rw-r--r--doc/man/s3qlctrl.12
-rw-r--r--doc/man/s3qllock.12
-rw-r--r--doc/man/s3qlrm.12
-rw-r--r--doc/man/s3qlstat.12
-rw-r--r--doc/man/umount.s3ql.12
-rw-r--r--doc/manual.pdfbin288374 -> 291785 bytes
54 files changed, 1783 insertions, 1950 deletions
diff --git a/doc/html/.buildinfo b/doc/html/.buildinfo
index 894c40d..9f8c682 100644
--- a/doc/html/.buildinfo
+++ b/doc/html/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 8f275c745db10f503f3e08ac29c53c72
+config: 982cc6fc313773c008194a09c6aac6e3
tags: fbb0d17656682115ca4d033fb2f83ba1
diff --git a/doc/html/_sources/backends.txt b/doc/html/_sources/backends.txt
index 002793f..088f6ec 100644
--- a/doc/html/_sources/backends.txt
+++ b/doc/html/_sources/backends.txt
@@ -6,7 +6,8 @@
Storage Backends
==================
-The following backends are currently available in S3QL:
+All storage backends respect the ``http_proxy`` and ``https_proxy``
+environment variables.
Google Storage
==============
@@ -150,15 +151,65 @@ consistency guarantees that completely eliminate any of the described
problems.
+OpenStack/Swift
+===============
+
+OpenStack_ is an open-source cloud server application suite. Swift_ is
+the cloud storage module of OpenStack. Swift/OpenStack storage is
+offered by many different companies.
+
+The storage URL for the OpenStack backend has the form ::
+
+ swift://<hostname>[:<port>]/<container>[/<prefix>]
+
+Note that the storage container must already exist. Most OpenStack
+providers offer a web frontend that you can use to create storage
+containers. *prefix* can be an arbitrary prefix that will be prepended
+to all object names used by S3QL. This allows you to store several
+S3QL file systems in the same container.
+
+The OpenStack backend always uses HTTPS connections. Note, however,
+that at this point S3QL does not verify the server certificate (cf.
+`issue 267 <http://code.google.com/p/s3ql/issues/detail?id=267>`_).
+
+.. _OpenStack: http://www.openstack.org/
+.. _Swift: http://openstack.org/projects/storage/
+
+
+RackSpace CloudFiles
+====================
+
+RackSpace_ CloudFiles uses OpenStack internally, so you can use the
+OpenStack/Swift backend (see above). The hostname for CloudFiles
+containers is ``auth.api.rackspacecloud.com``. Use your normal
+RackSpace user name for the backend login, and your RackSpace API key
+as the backend passphrase. You can create a storage container for S3QL
+using the `Control Panel <https://manage.rackspacecloud.com/>`_ (go to
+*Cloud Files* under *Hosting*).
+
+You should note that opinions about RackSpace differ widely among S3QL
+users and developers. On the one hand, people praise RackSpace for
+their backing of the (open source) OpenStack project. On the other
+hand, their heavily advertised "fanatical support" is in practice
+often not only `less than helpful
+<http://code.google.com/p/s3ql/issues/detail?id=243#c5>`_, but their
+support agents also seem to be `downright incompetent
+<http://code.google.com/p/s3ql/issues/detail?id=243#c11>`_. However,
+there are reports that the support quality increases dramatically once
+you are a customer and use the "Live Chat" link when you are logged
+into the control panel.
+
+.. _RackSpace: http://www.rackspace.com/
+
S3 compatible
=============
-S3QL is also able to access other, S3 compatible storage services like
-OpenStack_ for which no specific backend exists. Note that when
-accessing such services, only the lowest common denominator of
-available features can be used, so it is generally recommended to use
-a service specific backend instead.
+S3QL is also able to access other, S3 compatible storage services for
+which no specific backend exists. Note that when accessing such
+services, only the lowest common denominator of available features can
+be used, so it is generally recommended to use a service specific
+backend instead.
The storage URL for accessing an arbitrary S3 compatible storage
service is ::
@@ -173,7 +224,6 @@ to use HTTPS connections. Note, however, that at this point S3QL does
not verify the server certificate (cf. `issue 267
<http://code.google.com/p/s3ql/issues/detail?id=267>`_).
-.. _OpenStack: http://www.openstack.org/
Local
=====
diff --git a/doc/html/_sources/contrib.txt b/doc/html/_sources/contrib.txt
index 7cbe997..c87a731 100644
--- a/doc/html/_sources/contrib.txt
+++ b/doc/html/_sources/contrib.txt
@@ -80,10 +80,10 @@ For a full list of available options, run :program:`expire_backups.py
--help`.
-s3ql.conf
-=========
+s3ql_upstart.conf
+=================
-``s3ql.conf`` is an example upstart job definition file. It defines a
-job that automatically mounts an S3QL file system on system start, and
-properly unmounts it when the system is shut down.
+``s3ql_upstart.conf`` is an example upstart job definition file. It
+defines a job that automatically mounts an S3QL file system on system
+start, and properly unmounts it when the system is shut down.
diff --git a/doc/html/_sources/general.txt b/doc/html/_sources/general.txt
index e95ab8e..e13bf20 100644
--- a/doc/html/_sources/general.txt
+++ b/doc/html/_sources/general.txt
@@ -110,8 +110,7 @@ On the plus side, if a backend looses or corrupts some of the stored
data, S3QL *will* detect the problem. Missing data will be detected
when running `fsck.s3ql` or when attempting to access the data in the
mounted file system. In the later case you will get an IO Error, and
-on unmounting S3QL will warn you that the file system is damaged and
-you need to run `fsck.s3ql`.
+the S3QL mount point will become inaccessible.
`fsck.s3ql` will report all the affected files and move them into the
`/lost+found` directory of the file system.
diff --git a/doc/html/_sources/installation.txt b/doc/html/_sources/installation.txt
index 17b45f2..947371c 100644
--- a/doc/html/_sources/installation.txt
+++ b/doc/html/_sources/installation.txt
@@ -33,18 +33,12 @@ that is not the case.
so under Linux you should actually use *2.6.26 or newer whenever
possible*.
-* `Python <http://www.python.org/>`_, version 2.6.6 or newer, but not
- Python 3.x. Make sure to also install the development headers.
-
+* `Python <http://www.python.org/>`_ 2.7 (but not Python 3.x). Make
+ sure to also install the development headers.
+
* The `PyCrypto++ Python Module
<http://pypi.python.org/pypi/pycryptopp>`_. To check if this module
is installed, try to execute `python -c 'import pycryptopp'`.
-
-* The `argparse Python Module
- <http://pypi.python.org/pypi/argparse>`_. To check if this module is
- installed, try to execute `python -c 'import argparse; print
- argparse.__version__'`. If argparse is installed, this will print
- the version number. You need version 1.1 or later.
* `SQLite <http://www.sqlite.org/>`_ version 3.7.0 or newer. SQLite
has to be installed as a *shared library* with development headers.
diff --git a/doc/html/_sources/mount.txt b/doc/html/_sources/mount.txt
index 4f220cd..af87953 100644
--- a/doc/html/_sources/mount.txt
+++ b/doc/html/_sources/mount.txt
@@ -39,38 +39,20 @@ For maximum file system performance, the best algorithm therefore
depends on your network connection speed: the compression algorithm
should be fast enough to saturate your network connection.
-To find the optimal algorithm for your system, S3QL ships with a
-program called `benchmark.py` in the `contrib` directory. You should
-run this program on a file that has a size that is roughly equal to
-the block size of your file system and has similar contents. It will
-then determine the compression speeds for the different algorithms and
-the upload speeds for the specified backend and recommend the best
-algorithm that is fast enough to saturate your network connection.
+To find the optimal algorithm and number of parallel compression
+threads for your system, S3QL ships with a program called
+`benchmark.py` in the `contrib` directory. You should run this program
+on a file that has a size that is roughly equal to the block size of
+your file system and has similar contents. It will then determine the
+compression speeds for the different algorithms and the upload speeds
+for the specified backend and recommend the best algorithm that is
+fast enough to saturate your network connection.
Obviously you should make sure that there is little other system load
when you run `benchmark.py` (i.e., don't compile software or encode
videos at the same time).
-Parallel Compression
-====================
-
-If you are running S3QL on a system with multiple cores, you might
-want to set the ``--threads`` value larger than one. This will
-instruct S3QL to compress and encrypt several blocks at the same time.
-
-If you want to do this in combination with using the LZMA compression
-algorithm, you should keep an eye on memory usage though. Every
-LZMA compression threads requires about 200 MB of RAM.
-
-
-.. NOTE::
-
- To determine the optimal compression algorithm for your network
- connection when using multiple threads, you can pass the
- ``--compression-threads`` option to `contrib/benchmark.py`.
-
-
Notes about Caching
===================
@@ -120,7 +102,7 @@ init script for each S3QL file system.
If your system is using upstart, an appropriate job can be defined
as follows (and should be placed in `/etc/init/`):
-.. literalinclude:: ../contrib/s3ql.conf
+.. literalinclude:: ../contrib/s3ql_upstart.conf
:linenos:
:lines: 5-
diff --git a/doc/html/_static/jquery.js b/doc/html/_static/jquery.js
index eda55db..11e6d06 100644
--- a/doc/html/_static/jquery.js
+++ b/doc/html/_static/jquery.js
@@ -1,5 +1,5 @@
/*!
- * jQuery JavaScript Library v1.7
+ * jQuery JavaScript Library v1.6.4
* http://jquery.com/
*
* Copyright 2011, John Resig
@@ -11,7 +11,7 @@
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
- * Date: Thu Nov 3 16:18:21 2011 -0400
+ * Date: Mon Sep 12 18:54:48 2011 -0400
*/
(function( window, undefined ) {
@@ -140,7 +140,7 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(html) -> $(array)
if ( match[1] ) {
context = context instanceof jQuery ? context[0] : context;
- doc = ( context ? context.ownerDocument || context : document );
+ doc = (context ? context.ownerDocument || context : document);
// If a single string is passed in and it's a single tag
// just do a createElement and skip the rest
@@ -157,7 +157,7 @@ jQuery.fn = jQuery.prototype = {
} else {
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+ selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
}
return jQuery.merge( this, selector );
@@ -187,7 +187,7 @@ jQuery.fn = jQuery.prototype = {
// HANDLE: $(expr, $(...))
} else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
+ return (context || rootjQuery).find( selector );
// HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
@@ -201,7 +201,7 @@ jQuery.fn = jQuery.prototype = {
return rootjQuery.ready( selector );
}
- if ( selector.selector !== undefined ) {
+ if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
@@ -213,7 +213,7 @@ jQuery.fn = jQuery.prototype = {
selector: "",
// The current version of jQuery being used
- jquery: "1.7",
+ jquery: "1.6.4",
// The default length of a jQuery object is 0
length: 0,
@@ -258,7 +258,7 @@ jQuery.fn = jQuery.prototype = {
ret.context = this.context;
if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+ ret.selector = this.selector + (this.selector ? " " : "") + selector;
} else if ( name ) {
ret.selector = this.selector + "." + name + "(" + selector + ")";
}
@@ -279,7 +279,7 @@ jQuery.fn = jQuery.prototype = {
jQuery.bindReady();
// Add the callback
- readyList.add( fn );
+ readyList.done( fn );
return this;
},
@@ -434,7 +434,7 @@ jQuery.extend({
}
// If there are functions bound, to execute
- readyList.fireWith( document, [ jQuery ] );
+ readyList.resolveWith( document, [ jQuery ] );
// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
@@ -448,7 +448,7 @@ jQuery.extend({
return;
}
- readyList = jQuery.Callbacks( "once memory" );
+ readyList = jQuery._Deferred();
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
@@ -504,8 +504,8 @@ jQuery.extend({
return obj && typeof obj === "object" && "setInterval" in obj;
},
- isNumeric: function( obj ) {
- return obj != null && rdigit.test( obj ) && !isNaN( obj );
+ isNaN: function( obj ) {
+ return obj == null || !rdigit.test( obj ) || isNaN( obj );
},
type: function( obj ) {
@@ -573,7 +573,7 @@ jQuery.extend({
.replace( rvalidtokens, "]" )
.replace( rvalidbraces, "")) ) {
- return ( new Function( "return " + data ) )();
+ return (new Function( "return " + data ))();
}
jQuery.error( "Invalid JSON: " + data );
@@ -703,22 +703,18 @@ jQuery.extend({
return ret;
},
- inArray: function( elem, array, i ) {
- var len;
-
- if ( array ) {
- if ( indexOf ) {
- return indexOf.call( array, elem, i );
- }
+ inArray: function( elem, array ) {
+ if ( !array ) {
+ return -1;
+ }
- len = array.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+ if ( indexOf ) {
+ return indexOf.call( array, elem );
+ }
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in array && array[ i ] === elem ) {
- return i;
- }
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
}
}
@@ -854,7 +850,7 @@ jQuery.extend({
},
now: function() {
- return ( new Date() ).getTime();
+ return (new Date()).getTime();
},
// Use of jQuery.browser is frowned upon.
@@ -956,378 +952,193 @@ function doScrollCheck() {
jQuery.ready();
}
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
- define( "jquery", [], function () { return jQuery; } );
-}
-
return jQuery;
})();
-// String to Object flags format cache
-var flagsCache = {};
-
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
- var object = flagsCache[ flags ] = {},
- i, length;
- flags = flags.split( /\s+/ );
- for ( i = 0, length = flags.length; i < length; i++ ) {
- object[ flags[i] ] = true;
- }
- return object;
-}
+var // Promise methods
+ promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+ // Static reference to slice
+ sliceDeferred = [].slice;
-/*
- * Create a callback list using the following parameters:
- *
- * flags: an optional list of space-separated flags that will change how
- * the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( flags ) {
-
- // Convert flags from String-formatted to Object-formatted
- // (we check in cache first)
- flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
-
- var // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = [],
- // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Add one or several callbacks to the list
- add = function( args ) {
- var i,
- length,
- elem,
- type,
- actual;
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- // Inspect recursively
- add( elem );
- } else if ( type === "function" ) {
- // Add if not in unique mode and callback is not in
- if ( !flags.unique || !self.has( elem ) ) {
- list.push( elem );
- }
- }
- }
- },
- // Fire callbacks
- fire = function( context, args ) {
- args = args || [];
- memory = !flags.memory || [ context, args ];
- firing = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
- memory = true; // Mark as halted
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( !flags.once ) {
- if ( stack && stack.length ) {
- memory = stack.shift();
- self.fireWith( memory[ 0 ], memory[ 1 ] );
- }
- } else if ( memory === true ) {
- self.disable();
- } else {
- list = [];
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- var length = list.length;
- add( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away, unless previous
- // firing was halted (stopOnFalse)
- } else if ( memory && memory !== true ) {
- firingStart = length;
- fire( memory[ 0 ], memory[ 1 ] );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- var args = arguments,
- argIndex = 0,
- argLength = args.length;
- for ( ; argIndex < argLength ; argIndex++ ) {
- for ( var i = 0; i < list.length; i++ ) {
- if ( args[ argIndex ] === list[ i ] ) {
- // Handle firingIndex and firingLength
- if ( firing ) {
- if ( i <= firingLength ) {
- firingLength--;
- if ( i <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- // Remove the element
- list.splice( i--, 1 );
- // If we have some unicity property then
- // we only need to do this once
- if ( flags.unique ) {
- break;
- }
+jQuery.extend({
+ // Create a simple deferred (one callbacks list)
+ _Deferred: function() {
+ var // callbacks list
+ callbacks = [],
+ // stored [ context , args ]
+ fired,
+ // to avoid firing when already doing so
+ firing,
+ // flag to know if the deferred has been cancelled
+ cancelled,
+ // the deferred itself
+ deferred = {
+
+ // done( f1, f2, ...)
+ done: function() {
+ if ( !cancelled ) {
+ var args = arguments,
+ i,
+ length,
+ elem,
+ type,
+ _fired;
+ if ( fired ) {
+ _fired = fired;
+ fired = 0;
+ }
+ for ( i = 0, length = args.length; i < length; i++ ) {
+ elem = args[ i ];
+ type = jQuery.type( elem );
+ if ( type === "array" ) {
+ deferred.done.apply( deferred, elem );
+ } else if ( type === "function" ) {
+ callbacks.push( elem );
}
}
- }
- }
- return this;
- },
- // Control if a given callback is in the list
- has: function( fn ) {
- if ( list ) {
- var i = 0,
- length = list.length;
- for ( ; i < length; i++ ) {
- if ( fn === list[ i ] ) {
- return true;
+ if ( _fired ) {
+ deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
}
}
- }
- return false;
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory || memory === true ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( stack ) {
- if ( firing ) {
- if ( !flags.once ) {
- stack.push( [ context, args ] );
+ return this;
+ },
+
+ // resolve with given context and args
+ resolveWith: function( context, args ) {
+ if ( !cancelled && !fired && !firing ) {
+ // make sure args are available (#8421)
+ args = args || [];
+ firing = 1;
+ try {
+ while( callbacks[ 0 ] ) {
+ callbacks.shift().apply( context, args );
+ }
+ }
+ finally {
+ fired = [ context, args ];
+ firing = 0;
}
- } else if ( !( flags.once && memory ) ) {
- fire( context, args );
}
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!memory;
- }
- };
-
- return self;
-};
-
+ return this;
+ },
+ // resolve with this as context and given arguments
+ resolve: function() {
+ deferred.resolveWith( this, arguments );
+ return this;
+ },
+ // Has this deferred been resolved?
+ isResolved: function() {
+ return !!( firing || fired );
+ },
-var // Static reference to slice
- sliceDeferred = [].slice;
+ // Cancel
+ cancel: function() {
+ cancelled = 1;
+ callbacks = [];
+ return this;
+ }
+ };
-jQuery.extend({
+ return deferred;
+ },
+ // Full fledged deferred (two callbacks list)
Deferred: function( func ) {
- var doneList = jQuery.Callbacks( "once memory" ),
- failList = jQuery.Callbacks( "once memory" ),
- progressList = jQuery.Callbacks( "memory" ),
- state = "pending",
- lists = {
- resolve: doneList,
- reject: failList,
- notify: progressList
+ var deferred = jQuery._Deferred(),
+ failDeferred = jQuery._Deferred(),
+ promise;
+ // Add errorDeferred methods, then and promise
+ jQuery.extend( deferred, {
+ then: function( doneCallbacks, failCallbacks ) {
+ deferred.done( doneCallbacks ).fail( failCallbacks );
+ return this;
},
- promise = {
- done: doneList.add,
- fail: failList.add,
- progress: progressList.add,
-
- state: function() {
- return state;
- },
-
- // Deprecated
- isResolved: doneList.fired,
- isRejected: failList.fired,
-
- then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
- },
- pipe: function( fnDone, fnFail, fnProgress ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ],
- progress: [ fnProgress, "notify" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- obj = promise;
- } else {
- for ( var key in promise ) {
- obj[ key ] = promise[ key ];
+ always: function() {
+ return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+ },
+ fail: failDeferred.done,
+ rejectWith: failDeferred.resolveWith,
+ reject: failDeferred.resolve,
+ isRejected: failDeferred.isResolved,
+ pipe: function( fnDone, fnFail ) {
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( {
+ done: [ fnDone, "resolve" ],
+ fail: [ fnFail, "reject" ]
+ }, function( handler, data ) {
+ var fn = data[ 0 ],
+ action = data[ 1 ],
+ returned;
+ if ( jQuery.isFunction( fn ) ) {
+ deferred[ handler ](function() {
+ returned = fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise().then( newDefer.resolve, newDefer.reject );
+ } else {
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+ }
+ });
+ } else {
+ deferred[ handler ]( newDefer[ action ] );
}
+ });
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ if ( obj == null ) {
+ if ( promise ) {
+ return promise;
}
- return obj;
+ promise = obj = {};
}
- },
- deferred = promise.promise({}),
- key;
-
- for ( key in lists ) {
- deferred[ key ] = lists[ key ].fire;
- deferred[ key + "With" ] = lists[ key ].fireWith;
- }
-
- // Handle state
- deferred.done( function() {
- state = "resolved";
- }, failList.disable, progressList.lock ).fail( function() {
- state = "rejected";
- }, doneList.disable, progressList.lock );
-
+ var i = promiseMethods.length;
+ while( i-- ) {
+ obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+ }
+ return obj;
+ }
+ });
+ // Make sure only one callback list will be used
+ deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+ // Unexpose cancel
+ delete deferred.cancel;
// Call given func if any
if ( func ) {
func.call( deferred, deferred );
}
-
- // All done!
return deferred;
},
// Deferred helper
when: function( firstParam ) {
- var args = sliceDeferred.call( arguments, 0 ),
+ var args = arguments,
i = 0,
length = args.length,
- pValues = new Array( length ),
count = length,
- pCount = length,
deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
firstParam :
- jQuery.Deferred(),
- promise = deferred.promise();
+ jQuery.Deferred();
function resolveFunc( i ) {
return function( value ) {
args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
if ( !( --count ) ) {
- deferred.resolveWith( deferred, args );
+ // Strange bug in FF4:
+ // Values changed onto the arguments object sometimes end up as undefined values
+ // outside the $.when method. Cloning the object into a fresh array solves the issue
+ deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
}
};
}
- function progressFunc( i ) {
- return function( value ) {
- pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- deferred.notifyWith( promise, pValues );
- };
- }
if ( length > 1 ) {
- for ( ; i < length; i++ ) {
- if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+ for( ; i < length; i++ ) {
+ if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+ args[ i ].promise().then( resolveFunc(i), deferred.reject );
} else {
--count;
}
@@ -1338,13 +1149,12 @@ jQuery.extend({
} else if ( deferred !== firstParam ) {
deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
}
- return promise;
+ return deferred.promise();
}
});
-
jQuery.support = (function() {
var div = document.createElement( "div" ),
@@ -1369,7 +1179,7 @@ jQuery.support = (function() {
// Preliminary tests
div.setAttribute("className", "t");
- div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
all = div.getElementsByTagName( "*" );
@@ -1408,15 +1218,12 @@ jQuery.support = (function() {
// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55/.test( a.style.opacity ),
+ opacity: /^0.55$/.test( a.style.opacity ),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,
- // Make sure unknown elements (like HTML5 elems) are handled appropriately
- unknownElems: !!div.getElementsByTagName( "nav" ).length,
-
// Make sure that if no value is specified for a checkbox
// that it defaults to "on".
// (WebKit defaults to "" instead)
@@ -1429,9 +1236,6 @@ jQuery.support = (function() {
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",
- // Tests for enctype support on a form(#6743)
- enctype: !!document.createElement("form").enctype,
-
// Will be defined later
submitBubbles: true,
changeBubbles: true,
@@ -1469,7 +1273,7 @@ jQuery.support = (function() {
div.cloneNode( true ).fireEvent( "onclick" );
}
- // Check if a radio maintains its value
+ // Check if a radio maintains it's value
// after being appended to the DOM
input = document.createElement("input");
input.value = "t";
@@ -1479,7 +1283,7 @@ jQuery.support = (function() {
input.setAttribute("checked", "checked");
div.appendChild( input );
fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
+ fragment.appendChild( div.firstChild );
// WebKit doesn't clone checked state correctly in fragments
support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
@@ -1489,11 +1293,7 @@ jQuery.support = (function() {
// Figure out if the W3C box model works as expected
div.style.width = div.style.paddingLeft = "1px";
- // We don't want to do body-related feature tests on frameset
- // documents, which lack a body. So we use
- // document.getElementsByTagName("body")[0], which is undefined in
- // frameset documents, while document.body isn’t. (7398)
- body = document.getElementsByTagName("body")[ 0 ];
+ body = document.getElementsByTagName( "body" )[ 0 ];
// We use our own, invisible, body unless the body is already present
// in which case we use a div (#9239)
testElement = document.createElement( body ? "div" : "body" );
@@ -1508,8 +1308,8 @@ jQuery.support = (function() {
if ( body ) {
jQuery.extend( testElementStyle, {
position: "absolute",
- left: "-999px",
- top: "-999px"
+ left: "-1000px",
+ top: "-1000px"
});
}
for ( i in testElementStyle ) {
@@ -1575,8 +1375,12 @@ jQuery.support = (function() {
( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
}
+ // Remove the body element we added
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+
// Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
// We only care about the case where non-standard event systems
// are used, namely in IE. Short-circuiting here helps us to
// avoid an eval call (in setAttribute) which can cause CSP
@@ -1597,67 +1401,6 @@ jQuery.support = (function() {
}
}
- // Run fixed position tests at doc ready to avoid a crash
- // related to the invisible body in IE8
- jQuery(function() {
- var container, outer, inner, table, td, offsetSupport,
- conMarginTop = 1,
- ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
- vb = "visibility:hidden;border:0;",
- style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
- html = "<div " + style + "><div></div></div>" +
- "<table " + style + " cellpadding='0' cellspacing='0'>" +
- "<tr><td></td></tr></table>";
-
- // Reconstruct a container
- body = document.getElementsByTagName("body")[0];
- if ( !body ) {
- // Return for frameset docs that don't have a body
- // These tests cannot be done
- return;
- }
-
- container = document.createElement("div");
- container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
- body.insertBefore( container, body.firstChild );
-
- // Construct a test element
- testElement = document.createElement("div");
- testElement.style.cssText = ptlm + vb;
-
- testElement.innerHTML = html;
- container.appendChild( testElement );
- outer = testElement.firstChild;
- inner = outer.firstChild;
- td = outer.nextSibling.firstChild.firstChild;
-
- offsetSupport = {
- doesNotAddBorder: ( inner.offsetTop !== 5 ),
- doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
- };
-
- inner.style.position = "fixed";
- inner.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
- inner.style.position = inner.style.top = "";
-
- outer.style.overflow = "hidden";
- outer.style.position = "relative";
-
- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
- body.removeChild( container );
- testElement = container = null;
-
- jQuery.extend( support, offsetSupport );
- });
-
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-
// Null connected elements to avoid leaks in IE
testElement = fragment = select = opt = body = marginDiv = div = input = null;
@@ -1694,6 +1437,7 @@ jQuery.extend({
hasData: function( elem ) {
elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
return !!elem && !isEmptyDataObject( elem );
},
@@ -1702,7 +1446,7 @@ jQuery.extend({
return;
}
- var privateCache, thisCache, ret,
+ var thisCache, ret,
internalKey = jQuery.expando,
getByName = typeof name === "string",
@@ -1716,12 +1460,11 @@ jQuery.extend({
// Only defining an ID for JS objects if its cache already exists allows
// the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
- isEvents = name === "events";
+ id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
// Avoid doing any more work than we need to when trying to get data on an
// object that has no data at all
- if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+ if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
return;
}
@@ -1738,8 +1481,9 @@ jQuery.extend({
if ( !cache[ id ] ) {
cache[ id ] = {};
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
+ // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+ // metadata on plain JS objects when the object is serialized using
+ // JSON.stringify
if ( !isNode ) {
cache[ id ].toJSON = jQuery.noop;
}
@@ -1749,33 +1493,34 @@ jQuery.extend({
// shallow copied over onto the existing cache
if ( typeof name === "object" || typeof name === "function" ) {
if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
+ cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
} else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ cache[ id ] = jQuery.extend(cache[ id ], name);
}
}
- privateCache = thisCache = cache[ id ];
+ thisCache = cache[ id ];
- // jQuery data() is stored in a separate object inside the object's internal data
+ // Internal jQuery data is stored in a separate object inside the object's data
// cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
+ // data
+ if ( pvt ) {
+ if ( !thisCache[ internalKey ] ) {
+ thisCache[ internalKey ] = {};
}
- thisCache = thisCache.data;
+ thisCache = thisCache[ internalKey ];
}
if ( data !== undefined ) {
thisCache[ jQuery.camelCase( name ) ] = data;
}
- // Users should not attempt to inspect the internal events object using jQuery.data,
- // it is undocumented and subject to change. But does anyone listen? No.
- if ( isEvents && !thisCache[ name ] ) {
- return privateCache.events;
+ // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+ // not attempt to inspect the internal events object using jQuery.data, as this
+ // internal data object is undocumented and subject to change.
+ if ( name === "events" && !thisCache[name] ) {
+ return thisCache[ internalKey ] && thisCache[ internalKey ].events;
}
// Check for both converted-to-camel and non-converted data property names
@@ -1803,7 +1548,7 @@ jQuery.extend({
return;
}
- var thisCache, i, l,
+ var thisCache,
// Reference to internal data cache key
internalKey = jQuery.expando,
@@ -1824,41 +1569,28 @@ jQuery.extend({
if ( name ) {
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
+ thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
if ( thisCache ) {
- // Support space separated names
- if ( jQuery.isArray( name ) ) {
- name = name;
- } else if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces
+ // Support interoperable removal of hyphenated or camelcased keys
+ if ( !thisCache[ name ] ) {
name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split( " " );
- }
}
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
+ delete thisCache[ name ];
// If there is no data left in the cache, we want to continue
// and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+ if ( !isEmptyDataObject(thisCache) ) {
return;
}
}
}
// See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
+ if ( pvt ) {
+ delete cache[ id ][ internalKey ];
// Don't destroy the parent cache unless the internal data object
// had been the only thing left in it
@@ -1867,6 +1599,8 @@ jQuery.extend({
}
}
+ var internalCache = cache[ id ][ internalKey ];
+
// Browsers that fail expando deletion also refuse to delete expandos on
// the window, but it will allow it on all other JS objects; other browsers
// don't care
@@ -1877,9 +1611,23 @@ jQuery.extend({
cache[ id ] = null;
}
- // We destroyed the cache and need to eliminate the expando on the node to avoid
+ // We destroyed the entire user cache at once because it's faster than
+ // iterating through each key, but we need to continue to persist internal
+ // data if it existed
+ if ( internalCache ) {
+ cache[ id ] = {};
+ // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+ // metadata on plain JS objects when the object is serialized using
+ // JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+
+ cache[ id ][ internalKey ] = internalCache;
+
+ // Otherwise, we need to eliminate the expando on the node to avoid
// false lookups in the cache for entries that no longer exist
- if ( isNode ) {
+ } else if ( isNode ) {
// IE does not allow us to delete expando properties from nodes,
// nor does it have a removeAttribute function on Document nodes;
// we must handle all of these cases
@@ -1914,15 +1662,14 @@ jQuery.extend({
jQuery.fn.extend({
data: function( key, value ) {
- var parts, attr, name,
- data = null;
+ var data = null;
if ( typeof key === "undefined" ) {
if ( this.length ) {
data = jQuery.data( this[0] );
- if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
- attr = this[0].attributes;
+ if ( this[0].nodeType === 1 ) {
+ var attr = this[0].attributes, name;
for ( var i = 0, l = attr.length; i < l; i++ ) {
name = attr[i].name;
@@ -1932,7 +1679,6 @@ jQuery.fn.extend({
dataAttr( this[0], name, data[ name ] );
}
}
- jQuery._data( this[0], "parsedAttrs", true );
}
}
@@ -1944,7 +1690,7 @@ jQuery.fn.extend({
});
}
- parts = key.split(".");
+ var parts = key.split(".");
parts[1] = parts[1] ? "." + parts[1] : "";
if ( value === undefined ) {
@@ -1993,7 +1739,7 @@ function dataAttr( elem, key, data ) {
data = data === "true" ? true :
data === "false" ? false :
data === "null" ? null :
- jQuery.isNumeric( data ) ? parseFloat( data ) :
+ !jQuery.isNaN( data ) ? parseFloat( data ) :
rbrace.test( data ) ? jQuery.parseJSON( data ) :
data;
} catch( e ) {}
@@ -2009,14 +1755,11 @@ function dataAttr( elem, key, data ) {
return data;
}
-// checks a cache object for emptiness
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
function isEmptyDataObject( obj ) {
for ( var name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
if ( name !== "toJSON" ) {
return false;
}
@@ -2032,17 +1775,17 @@ function handleQueueMarkDefer( elem, type, src ) {
var deferDataKey = type + "defer",
queueDataKey = type + "queue",
markDataKey = type + "mark",
- defer = jQuery._data( elem, deferDataKey );
+ defer = jQuery.data( elem, deferDataKey, undefined, true );
if ( defer &&
- ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
- ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+ ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+ ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
// Give room for hard-coded callbacks to fire first
// and eventually mark/queue something else on the element
setTimeout( function() {
- if ( !jQuery._data( elem, queueDataKey ) &&
- !jQuery._data( elem, markDataKey ) ) {
+ if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+ !jQuery.data( elem, markDataKey, undefined, true ) ) {
jQuery.removeData( elem, deferDataKey, true );
- defer.fire();
+ defer.resolve();
}
}, 0 );
}
@@ -2052,8 +1795,8 @@ jQuery.extend({
_mark: function( elem, type ) {
if ( elem ) {
- type = ( type || "fx" ) + "mark";
- jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+ type = (type || "fx") + "mark";
+ jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
}
},
@@ -2066,9 +1809,9 @@ jQuery.extend({
if ( elem ) {
type = type || "fx";
var key = type + "mark",
- count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+ count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
if ( count ) {
- jQuery._data( elem, key, count );
+ jQuery.data( elem, key, count, true );
} else {
jQuery.removeData( elem, key, true );
handleQueueMarkDefer( elem, type, "mark" );
@@ -2077,15 +1820,13 @@ jQuery.extend({
},
queue: function( elem, type, data ) {
- var q;
if ( elem ) {
- type = ( type || "fx" ) + "queue";
- q = jQuery._data( elem, type );
-
+ type = (type || "fx") + "queue";
+ var q = jQuery.data( elem, type, undefined, true );
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
if ( !q || jQuery.isArray(data) ) {
- q = jQuery._data( elem, type, jQuery.makeArray(data) );
+ q = jQuery.data( elem, type, jQuery.makeArray(data), true );
} else {
q.push( data );
}
@@ -2099,7 +1840,7 @@ jQuery.extend({
var queue = jQuery.queue( elem, type ),
fn = queue.shift(),
- hooks = {};
+ defer;
// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === "inprogress" ) {
@@ -2110,17 +1851,16 @@ jQuery.extend({
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === "fx" ) {
- queue.unshift( "inprogress" );
+ queue.unshift("inprogress");
}
- jQuery._data( elem, type + ".run", hooks );
- fn.call( elem, function() {
- jQuery.dequeue( elem, type );
- }, hooks );
+ fn.call(elem, function() {
+ jQuery.dequeue(elem, type);
+ });
}
if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue " + type + ".run", true );
+ jQuery.removeData( elem, type + "queue", true );
handleQueueMarkDefer( elem, type, "queue" );
}
}
@@ -2152,14 +1892,14 @@ jQuery.fn.extend({
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || "fx";
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
+ return this.queue( type, function() {
+ var elem = this;
+ setTimeout(function() {
+ jQuery.dequeue( elem, type );
+ }, time );
});
},
clearQueue: function( type ) {
@@ -2190,9 +1930,9 @@ jQuery.fn.extend({
if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+ jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
count++;
- tmp.add( resolve );
+ tmp.done( resolve );
}
}
resolve();
@@ -2210,8 +1950,7 @@ var rclass = /[\n\t\r]/g,
rfocusable = /^(?:button|input|object|select|textarea)$/i,
rclickable = /^a(?:rea)?$/i,
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- nodeHook, boolHook, fixSpecified;
+ nodeHook, boolHook;
jQuery.fn.extend({
attr: function( name, value ) {
@@ -2223,11 +1962,11 @@ jQuery.fn.extend({
jQuery.removeAttr( this, name );
});
},
-
+
prop: function( name, value ) {
return jQuery.access( this, name, value, true, jQuery.prop );
},
-
+
removeProp: function( name ) {
name = jQuery.propFix[ name ] || name;
return this.each(function() {
@@ -2286,7 +2025,7 @@ jQuery.fn.extend({
}
if ( (value && typeof value === "string") || value === undefined ) {
- classNames = ( value || "" ).split( rspace );
+ classNames = (value || "").split( rspace );
for ( i = 0, l = this.length; i < l; i++ ) {
elem = this[ i ];
@@ -2347,10 +2086,8 @@ jQuery.fn.extend({
},
hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
+ var className = " " + selector + " ";
+ for ( var i = 0, l = this.length; i < l; i++ ) {
if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
return true;
}
@@ -2360,9 +2097,9 @@ jQuery.fn.extend({
},
val: function( value ) {
- var hooks, ret, isFunction,
+ var hooks, ret,
elem = this[0];
-
+
if ( !arguments.length ) {
if ( elem ) {
hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
@@ -2373,9 +2110,9 @@ jQuery.fn.extend({
ret = elem.value;
- return typeof ret === "string" ?
+ return typeof ret === "string" ?
// handle most common string cases
- ret.replace(rreturn, "") :
+ ret.replace(rreturn, "") :
// handle cases where value is null/undef or number
ret == null ? "" : ret;
}
@@ -2383,7 +2120,7 @@ jQuery.fn.extend({
return undefined;
}
- isFunction = jQuery.isFunction( value );
+ var isFunction = jQuery.isFunction( value );
return this.each(function( i ) {
var self = jQuery(this), val;
@@ -2431,7 +2168,7 @@ jQuery.extend({
},
select: {
get: function( elem ) {
- var value, i, max, option,
+ var value,
index = elem.selectedIndex,
values = [],
options = elem.options,
@@ -2443,10 +2180,8 @@ jQuery.extend({
}
// Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
// Don't return options that are disabled or in a disabled optgroup
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
@@ -2498,11 +2233,15 @@ jQuery.extend({
height: true,
offset: true
},
-
+
+ attrFix: {
+ // Always normalize to ensure hook usage
+ tabindex: "tabIndex"
+ },
+
attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
+ var nType = elem.nodeType;
+
// don't get/set attributes on text, comment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
return undefined;
@@ -2517,13 +2256,25 @@ jQuery.extend({
return jQuery.prop( elem, name, value );
}
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ var ret, hooks,
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
- // All attributes are lowercase
- // Grab necessary hook if one is defined
+ // Normalize the name if needed
if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ name = jQuery.attrFix[ name ] || name;
+
+ hooks = jQuery.attrHooks[ name ];
+
+ if ( !hooks ) {
+ // Use boolHook for boolean attributes
+ if ( rboolean.test( name ) ) {
+ hooks = boolHook;
+
+ // Use nodeHook if available( IE6/7 )
+ } else if ( nodeHook ) {
+ hooks = nodeHook;
+ }
+ }
}
if ( value !== undefined ) {
@@ -2554,26 +2305,17 @@ jQuery.extend({
}
},
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, l,
- i = 0;
-
+ removeAttr: function( elem, name ) {
+ var propName;
if ( elem.nodeType === 1 ) {
- attrNames = ( value || "" ).split( rspace );
- l = attrNames.length;
+ name = jQuery.attrFix[ name ] || name;
- for ( ; i < l; i++ ) {
- name = attrNames[ i ].toLowerCase();
- propName = jQuery.propFix[ name ] || name;
+ jQuery.attr( elem, name, "" );
+ elem.removeAttribute( name );
- // See #9699 for explanation of this approach (setting first, then removal)
- jQuery.attr( elem, name, "" );
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && propName in elem ) {
- elem[ propName ] = false;
- }
+ // Set corresponding property to false for boolean attributes
+ if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+ elem[ propName ] = false;
}
}
},
@@ -2632,17 +2374,17 @@ jQuery.extend({
frameborder: "frameBorder",
contenteditable: "contentEditable"
},
-
+
prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
+ var nType = elem.nodeType;
// don't get/set properties on text, comment and attribute nodes
if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
return undefined;
}
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+ var ret, hooks,
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
if ( notxml ) {
// Fix name and attach hooks
@@ -2655,7 +2397,7 @@ jQuery.extend({
return ret;
} else {
- return ( elem[ name ] = value );
+ return (elem[ name ] = value);
}
} else {
@@ -2667,7 +2409,7 @@ jQuery.extend({
}
}
},
-
+
propHooks: {
tabIndex: {
get: function( elem ) {
@@ -2685,17 +2427,16 @@ jQuery.extend({
}
});
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+// Add the tabindex propHook to attrHooks for back-compat
+jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
// Hook for boolean attributes
boolHook = {
get: function( elem, name ) {
// Align boolean attributes with corresponding properties
// Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+ var attrNode;
+ return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
name.toLowerCase() :
undefined;
},
@@ -2720,20 +2461,16 @@ boolHook = {
};
// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- fixSpecified = {
- name: true,
- id: true
- };
-
+if ( !jQuery.support.getSetAttribute ) {
+
// Use this for any attribute in IE6/7
// This fixes almost every IE6/7 issue
nodeHook = jQuery.valHooks.button = {
get: function( elem, name ) {
var ret;
ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+ // Return undefined if nodeValue is empty string
+ return ret && ret.nodeValue !== "" ?
ret.nodeValue :
undefined;
},
@@ -2744,13 +2481,10 @@ if ( !getSetAttribute ) {
ret = document.createAttribute( name );
elem.setAttributeNode( ret );
}
- return ( ret.nodeValue = value + "" );
+ return (ret.nodeValue = value + "");
}
};
- // Apply the nodeHook to tabindex
- jQuery.attrHooks.tabindex.set = nodeHook.set;
-
// Set width and height to auto instead of 0 on empty string( Bug #8150 )
// This is for removals
jQuery.each([ "width", "height" ], function( i, name ) {
@@ -2763,18 +2497,6 @@ if ( !getSetAttribute ) {
}
});
});
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
}
@@ -2798,7 +2520,7 @@ if ( !jQuery.support.style ) {
return elem.style.cssText.toLowerCase() || undefined;
},
set: function( elem, value ) {
- return ( elem.style.cssText = "" + value );
+ return (elem.style.cssText = "" + value);
}
};
}
@@ -2823,11 +2545,6 @@ if ( !jQuery.support.optSelected ) {
});
}
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
// Radios and checkboxes getter/setter
if ( !jQuery.support.checkOn ) {
jQuery.each([ "radio", "checkbox" ], function() {
@@ -2843,7 +2560,7 @@ jQuery.each([ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
set: function( elem, value ) {
if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
}
}
});
@@ -2857,122 +2574,111 @@ var rnamespaces = /\.(.*)$/,
rperiod = /\./g,
rspaces = / /g,
rescape = /[^\w\s.|`]/g,
- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
- rhoverHack = /\bhover(\.\S+)?/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
- quickParse = function( selector ) {
- var quick = rquickIs.exec( selector );
- if ( quick ) {
- // 0 1 2 3
- // [ _, tag, id, class ]
- quick[1] = ( quick[1] || "" ).toLowerCase();
- quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
- }
- return quick;
- },
- quickIs = function( elem, m ) {
- return (
- (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
- (!m[2] || elem.id === m[2]) &&
- (!m[3] || m[3].test( elem.className ))
- );
- },
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+ fcleanup = function( nm ) {
+ return nm.replace(rescape, "\\$&");
};
/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
*/
jQuery.event = {
- add: function( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, quick, handlers, special;
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function( elem, types, handler, data ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+ if ( handler === false ) {
+ handler = returnFalse;
+ } else if ( !handler ) {
+ // Fixes bug #7229. Fix recommended by jdalton
return;
}
- // Caller can pass in an object of custom data in lieu of the handler
+ var handleObjIn, handleObj;
+
if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}
- // Make sure that the handler has a unique ID, used to find/remove it later
+ // Make sure that the function being executed has a unique ID
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
+ // Init the element's event structure
+ var elemData = jQuery._data( elem );
+
+ // If no elemData is found then we must be trying to bind to one of the
+ // banned noData elements
+ if ( !elemData ) {
+ return;
+ }
+
+ var events = elemData.events,
+ eventHandle = elemData.handle;
+
if ( !events ) {
elemData.events = events = {};
}
- eventHandle = elemData.handle;
+
if ( !eventHandle ) {
elemData.handle = eventHandle = function( e ) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
}
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native events in IE.
+ eventHandle.elem = elem;
+
// Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
- types = hoverHack(types).split( " " );
- for ( t = 0; t < types.length; t++ ) {
+ types = types.split(" ");
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
+ var type, i = 0, namespaces;
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
+ while ( (type = types[ i++ ]) ) {
+ handleObj = handleObjIn ?
+ jQuery.extend({}, handleObjIn) :
+ { handler: handler, data: data };
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
+ // Namespaced event handlers
+ if ( type.indexOf(".") > -1 ) {
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ handleObj.namespace = namespaces.slice(0).sort().join(".");
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: tns[1],
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- namespace: namespaces.join(".")
- }, handleObjIn );
+ } else {
+ namespaces = [];
+ handleObj.namespace = "";
+ }
- // Delegated event; pre-analyze selector so it's processed quickly on event dispatch
- if ( selector ) {
- handleObj.quick = quickParse( selector );
- if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
- handleObj.isPositional = true;
- }
+ handleObj.type = type;
+ if ( !handleObj.guid ) {
+ handleObj.guid = handler.guid;
}
- // Init the event handler queue if we're the first
- handlers = events[ type ];
+ // Get the current list of functions bound to this event
+ var handlers = events[ type ],
+ special = jQuery.event.special[ type ] || {};
+
+ // Init the event handler queue
if ( !handlers ) {
handlers = events[ type ] = [];
- handlers.delegateCount = 0;
- // Only use addEventListener/attachEvent if the special events handler returns false
+ // Check for a special event handler
+ // Only use addEventListener/attachEvent if the special
+ // events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
// Bind the global event handler to the element
if ( elem.addEventListener ) {
@@ -2992,14 +2698,10 @@ jQuery.event = {
}
}
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
+ // Add the function to the element's handler list
+ handlers.push( handleObj );
- // Keep track of which events have ever been used, for event optimization
+ // Keep track of which events have been used, for event optimization
jQuery.event.global[ type ] = true;
}
@@ -3010,87 +2712,129 @@ jQuery.event = {
global: {},
// Detach an event or set of events from an element
- remove: function( elem, types, handler, selector ) {
+ remove: function( elem, types, handler, pos ) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
- var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- t, tns, type, namespaces, origCount,
- j, events, special, handle, eventType, handleObj;
+ if ( handler === false ) {
+ handler = returnFalse;
+ }
+
+ var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+ events = elemData && elemData.events;
- if ( !elemData || !(events = elemData.events) ) {
+ if ( !elemData || !events ) {
return;
}
- // Once for each type.namespace in types; type may be omitted
- types = hoverHack( types || "" ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = tns[2];
+ // types is actually an event object here
+ if ( types && types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- namespaces = namespaces? "." + namespaces : "";
- for ( j in events ) {
- jQuery.event.remove( elem, j + namespaces, handler, selector );
- }
- return;
+ // Unbind all events for the element
+ if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+ types = types || "";
+
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types );
}
- special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+ return;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ while ( (type = types[ i++ ]) ) {
+ origType = type;
+ handleObj = null;
+ all = type.indexOf(".") < 0;
+ namespaces = [];
+
+ if ( !all ) {
+ // Namespaced event handlers
+ namespaces = type.split(".");
+ type = namespaces.shift();
+
+ namespace = new RegExp("(^|\\.)" +
+ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ eventType = events[ type ];
- // Only need to loop for special events or selective removal
- if ( handler || namespaces || selector || special.remove ) {
+ if ( !eventType ) {
+ continue;
+ }
+
+ if ( !handler ) {
for ( j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ];
- if ( !handler || handler.guid === handleObj.guid ) {
- if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
- if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
- eventType.splice( j--, 1 );
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ jQuery.event.remove( elem, origType, handleObj.handler, j );
+ eventType.splice( j--, 1 );
+ }
+ }
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+
+ for ( j = pos || 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( handler.guid === handleObj.guid ) {
+ // remove the given handler for the given type
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ if ( pos == null ) {
+ eventType.splice( j--, 1 );
+ }
+
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
}
}
+
+ if ( pos != null ) {
+ break;
+ }
}
- } else {
- // Removing all events
- eventType.length = 0;
}
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
+ // remove generic event handler if no more handlers exist
+ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
jQuery.removeEvent( elem, type, elemData.handle );
}
+ ret = null;
delete events[ type ];
}
}
// Remove the expando if it's no longer used
if ( jQuery.isEmptyObject( events ) ) {
- handle = elemData.handle;
+ var handle = elemData.handle;
if ( handle ) {
handle.elem = null;
}
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, [ "events", "handle" ], true );
+ delete elemData.events;
+ delete elemData.handle;
+
+ if ( jQuery.isEmptyObject( elemData ) ) {
+ jQuery.removeData( elem, undefined, true );
+ }
}
},
-
+
// Events that are safe to short-circuit if no handlers are attached.
// Native DOM events should not be added, they may have inline handlers.
customEvent: {
@@ -3100,23 +2844,18 @@ jQuery.event = {
},
trigger: function( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
// Event object or event type
var type = event.type || event,
namespaces = [],
- cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+ exclusive;
- if ( type.indexOf( "!" ) >= 0 ) {
+ if ( type.indexOf("!") >= 0 ) {
// Exclusive events trigger only for the exact event (no namespaces)
type = type.slice(0, -1);
exclusive = true;
}
- if ( type.indexOf( "." ) >= 0 ) {
+ if ( type.indexOf(".") >= 0 ) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split(".");
type = namespaces.shift();
@@ -3138,300 +2877,230 @@ jQuery.event = {
new jQuery.Event( type );
event.type = type;
- event.isTrigger = true;
event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
+ event.namespace = namespaces.join(".");
+ event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+
// triggerHandler() and global events don't bubble or run the default action
if ( onlyHandlers || !elem ) {
event.preventDefault();
+ event.stopPropagation();
}
// Handle a global trigger
if ( !elem ) {
-
// TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+ jQuery.each( jQuery.cache, function() {
+ // internalKey variable is just used to make it easier to find
+ // and potentially change this stuff later; currently it just
+ // points to jQuery.expando
+ var internalKey = jQuery.expando,
+ internalCache = this[ internalKey ];
+ if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+ jQuery.event.trigger( event, data, internalCache.handle.elem );
}
- }
+ });
+ return;
+ }
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}
// Clean up the event in case it is being reused
event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
+ event.target = elem;
// Clone any incoming data and prepend the event, creating the handler arg list
data = data != null ? jQuery.makeArray( data ) : [];
data.unshift( event );
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+ var cur = elem,
+ // IE doesn't like method names with a colon (#3533, #8272)
+ ontype = type.indexOf(":") < 0 ? "on" + type : "";
- bubbleType = special.delegateType || type;
- old = null;
- for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
- }
+ // Fire event on the current element, then bubble up the DOM tree
+ do {
+ var handle = jQuery._data( cur, "handle" );
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old && old === elem.ownerDocument ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length; i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ event.currentTarget = cur;
if ( handle ) {
handle.apply( cur, data );
}
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) ) {
- handle.apply( cur, data );
- }
- if ( event.isPropagationStopped() ) {
- break;
+ // Trigger an inline bound script
+ if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+ event.result = false;
+ event.preventDefault();
}
- }
- event.type = type;
+
+ // Bubble up to document, then to window
+ cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+ } while ( cur && !event.isPropagationStopped() );
// If nobody prevented the default action, do it now
if ( !event.isDefaultPrevented() ) {
+ var old,
+ special = jQuery.event.special[ type ] || {};
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+ if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
// Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+ // Can't use an .isFunction)() check here because IE6/7 fails that test.
+ // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+ try {
+ if ( ontype && elem[ type ] ) {
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ old = elem[ ontype ];
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
+ if ( old ) {
+ elem[ ontype ] = null;
+ }
- if ( old ) {
- elem[ ontype ] = null;
+ jQuery.event.triggered = type;
+ elem[ type ]();
}
+ } catch ( ieError ) {}
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
+ if ( old ) {
+ elem[ ontype ] = old;
}
+
+ jQuery.event.triggered = undefined;
}
}
-
+
return event.result;
},
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
+ handle: function( event ) {
event = jQuery.event.fix( event || window.event );
-
- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments, 0 ),
+ // Snapshot the handlers list since a called handler may add/remove events.
+ var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
run_all = !event.exclusive && !event.namespace,
- specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
- handlerQueue = [],
- i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
+ args = Array.prototype.slice.call( arguments, 0 );
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ // Use the fix-ed Event rather than the (read-only) native event
args[0] = event;
- event.delegateTarget = this;
-
- // Determine handlers that should run if there are delegated events
- // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
- selMatch = {};
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
- hit = selMatch[ sel ];
-
- if ( handleObj.isPositional ) {
- // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
- hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
- } else if ( hit === undefined ) {
- hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
- }
- if ( hit ) {
- matches.push( handleObj );
+ event.currentTarget = this;
+
+ for ( var j = 0, l = handlers.length; j < l; j++ ) {
+ var handleObj = handlers[ j ];
+
+ // Triggered event must 1) be non-exclusive and have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event.
+ if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handleObj.handler;
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ var ret = handleObj.handler.apply( this, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
}
}
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
}
}
}
-
return event.result;
},
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
+ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix: function( event ) {
if ( event[ jQuery.expando ] ) {
return event;
}
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
event = jQuery.Event( originalEvent );
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
+ for ( var i = this.props.length, prop; i; ) {
+ prop = this.props[ --i ];
event[ prop ] = originalEvent[ prop ];
}
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+ // Fix target property, if necessary
if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
+ // Fixes #1925 where srcElement might not be defined either
+ event.target = event.srcElement || document;
}
- // Target should not be a text node (#504, Safari)
+ // check if target is a textnode (safari)
if ( event.target.nodeType === 3 ) {
event.target = event.target.parentNode;
}
- // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
- if ( event.metaKey === undefined ) {
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement ) {
+ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var eventDocument = event.target.ownerDocument || document,
+ doc = eventDocument.documentElement,
+ body = eventDocument.body;
+
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+ event.which = event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey ) {
event.metaKey = event.ctrlKey;
}
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button !== undefined ) {
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+ }
+
+ return event;
},
+ // Deprecated, use jQuery.guid instead
+ guid: 1E8,
+
+ // Deprecated, use jQuery.proxy instead
+ proxy: jQuery.proxy,
+
special: {
ready: {
// Make sure the ready event is setup
- setup: jQuery.bindReady
+ setup: jQuery.bindReady,
+ teardown: jQuery.noop
},
- focus: {
- delegateType: "focusin",
- noBubble: true
- },
- blur: {
- delegateType: "focusout",
- noBubble: true
+ live: {
+ add: function( handleObj ) {
+ jQuery.event.add( this,
+ liveConvert( handleObj.origType, handleObj.selector ),
+ jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+ },
+
+ remove: function( handleObj ) {
+ jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+ }
},
beforeunload: {
@@ -3448,35 +3117,9 @@ jQuery.event = {
}
}
}
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
}
};
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
jQuery.removeEvent = document.removeEventListener ?
function( elem, type, handle ) {
if ( elem.removeEventListener ) {
@@ -3491,7 +3134,7 @@ jQuery.removeEvent = document.removeEventListener ?
jQuery.Event = function( src, props ) {
// Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
+ if ( !this.preventDefault ) {
return new jQuery.Event( src, props );
}
@@ -3502,8 +3145,8 @@ jQuery.Event = function( src, props ) {
// Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+ this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+ src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
// Event type
} else {
@@ -3515,8 +3158,9 @@ jQuery.Event = function( src, props ) {
jQuery.extend( this, props );
}
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
+ // timeStamp is buggy for some events on Firefox(#3843)
+ // So we won't rely on the native value
+ this.timeStamp = jQuery.now();
// Mark it as fixed
this[ jQuery.expando ] = true;
@@ -3572,132 +3216,216 @@ jQuery.Event.prototype = {
isImmediatePropagationStopped: returnFalse
};
-// Create mouseenter/leave events using mouseover/out and event-time checks
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+ // Check if mouse(over|out) are still within the same parent element
+ var related = event.relatedTarget,
+ inside = false,
+ eventType = event.type;
+
+ event.type = event.data;
+
+ if ( related !== this ) {
+
+ if ( related ) {
+ inside = jQuery.contains( this, related );
+ }
+
+ if ( !inside ) {
+
+ jQuery.event.handle.apply( this, arguments );
+
+ event.type = eventType;
+ }
+ }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+ event.type = event.data;
+ jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout"
}, function( orig, fix ) {
- jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector,
- oldType, ret;
-
- // For a real mouseover/out, always call the handler; for
- // mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
- oldType = event.type;
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = oldType;
- }
- return ret;
+ jQuery.event.special[ orig ] = {
+ setup: function( data ) {
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function( data ) {
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
}
};
});
-// IE submit delegation
+// submit delegation
if ( !jQuery.support.submitBubbles ) {
jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
+ setup: function( data, namespaces ) {
+ if ( !jQuery.nodeName( this, "form" ) ) {
+ jQuery.event.add(this, "click.specialSubmit", function( e ) {
+ // Avoid triggering error on non-existent type attribute in IE VML (#7071)
+ var elem = e.target,
+ type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ trigger( "submit", this, arguments );
+ }
+ });
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !form._submit_attached ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- // Form was submitted, bubble the event up the tree
- if ( this.parentNode ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- });
- form._submit_attached = true;
- }
- });
- // return undefined since we don't need an event listener
- },
+ jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ trigger( "submit", this, arguments );
+ }
+ });
+
+ } else {
return false;
}
+ },
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialSubmit" );
}
};
+
}
-// IE change delegation and checkbox/radio fix
+// change delegation, happens here so we have bind.
if ( !jQuery.support.changeBubbles ) {
+ var changeFilters,
+
+ getVal = function( elem ) {
+ var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
+ val = elem.value;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ val = elem.checked;
+
+ } else if ( type === "select-multiple" ) {
+ val = elem.selectedIndex > -1 ?
+ jQuery.map( elem.options, function( elem ) {
+ return elem.selected;
+ }).join("-") :
+ "";
+
+ } else if ( jQuery.nodeName( elem, "select" ) ) {
+ val = elem.selectedIndex;
+ }
+
+ return val;
+ },
+
+ testChange = function testChange( e ) {
+ var elem = e.target, data, val;
+
+ if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+ return;
+ }
+
+ data = jQuery._data( elem, "_change_data" );
+ val = getVal(elem);
+
+ // the current data will be also retrieved by beforeactivate
+ if ( e.type !== "focusout" || elem.type !== "radio" ) {
+ jQuery._data( elem, "_change_data", val );
+ }
+
+ if ( data === undefined || val === data ) {
+ return;
+ }
+
+ if ( data != null || val ) {
+ e.type = "change";
+ e.liveFired = undefined;
+ jQuery.event.trigger( e, arguments[1], elem );
+ }
+ };
+
jQuery.event.special.change = {
+ filters: {
+ focusout: testChange,
- setup: function() {
+ beforedeactivate: testChange,
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed ) {
- this._just_changed = false;
- jQuery.event.simulate( "change", this, event, true );
- }
- });
+ click: function( e ) {
+ var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+ if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+ testChange.call( this, e );
}
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
+ },
- if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- elem._change_attached = true;
+ // Change has to be called before submit
+ // Keydown will be called before keypress, which is used in submit-event delegation
+ keydown: function( e ) {
+ var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+ if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+ type === "select-multiple" ) {
+ testChange.call( this, e );
}
- });
+ },
+
+ // Beforeactivate happens also before the previous element is blurred
+ // with this event you can't trigger a change event, but you can store
+ // information
+ beforeactivate: function( e ) {
+ var elem = e.target;
+ jQuery._data( elem, "_change_data", getVal(elem) );
+ }
},
- handle: function( event ) {
- var elem = event.target;
+ setup: function( data, namespaces ) {
+ if ( this.type === "file" ) {
+ return false;
+ }
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
}
+
+ return rformElems.test( this.nodeName );
},
- teardown: function() {
- jQuery.event.remove( this, "._change" );
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialChange" );
return rformElems.test( this.nodeName );
}
};
+
+ changeFilters = jQuery.event.special.change.filters;
+
+ // Handle when the input is .focus()'d
+ changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ // Don't pass args or remember liveFired; they apply to the donor event.
+ var event = jQuery.extend( {}, args[ 0 ] );
+ event.type = type;
+ event.originalEvent = {};
+ event.liveFired = undefined;
+ jQuery.event.handle.call( elem, event );
+ if ( event.isDefaultPrevented() ) {
+ args[ 0 ].preventDefault();
+ }
}
// Create "bubbling" focus and blur events
@@ -3705,10 +3433,7 @@ if ( !jQuery.support.focusinBubbles ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
// Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
+ var attaches = 0;
jQuery.event.special[ fix ] = {
setup: function() {
@@ -3722,120 +3447,89 @@ if ( !jQuery.support.focusinBubbles ) {
}
}
};
+
+ function handler( donor ) {
+ // Donor event is always a native one; fix it and switch its type.
+ // Let focusin/out handler cancel the donor focus/blur event.
+ var e = jQuery.event.fix( donor );
+ e.type = fix;
+ e.originalEvent = {};
+ jQuery.event.trigger( e, null, e.target );
+ if ( e.isDefaultPrevented() ) {
+ donor.preventDefault();
+ }
+ }
});
}
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
+jQuery.each(["bind", "one"], function( i, name ) {
+ jQuery.fn[ name ] = function( type, data, fn ) {
+ var handler;
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
- // ( types-Object, data )
- data = selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
+ // Handle object literals
+ if ( typeof type === "object" ) {
+ for ( var key in type ) {
+ this[ name ](key, data, type[key], fn);
}
return this;
}
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
+ if ( arguments.length === 2 || data === false ) {
+ fn = data;
+ data = undefined;
}
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
+ if ( name === "one" ) {
+ handler = function( event ) {
+ jQuery( this ).unbind( event, handler );
+ return fn.apply( this, arguments );
};
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on.call( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- var handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
- handleObj.selector,
- handleObj.handler
- );
- return this;
+ handler.guid = fn.guid || jQuery.guid++;
+ } else {
+ handler = fn;
}
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( var type in types ) {
- this.off( type, selector, types[ type ] );
+
+ if ( type === "unload" && name !== "one" ) {
+ this.one( type, data, fn );
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.add( this[i], type, handler, data );
}
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
}
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
+ };
+});
+
+jQuery.fn.extend({
+ unbind: function( type, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" && !type.preventDefault ) {
+ for ( var key in type ) {
+ this.unbind(key, type[key]);
+ }
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.remove( this[i], type, fn );
+ }
+ }
+
return this;
},
delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
+ return this.live( types, data, fn, selector );
},
+
undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+ if ( arguments.length === 0 ) {
+ return this.unbind( "live" );
+
+ } else {
+ return this.die( types, null, fn, selector );
+ }
},
trigger: function( type, data ) {
@@ -3843,6 +3537,7 @@ jQuery.fn.extend({
jQuery.event.trigger( type, data, this );
});
},
+
triggerHandler: function( type, data ) {
if ( this[0] ) {
return jQuery.event.trigger( type, data, this[0], true );
@@ -3856,8 +3551,8 @@ jQuery.fn.extend({
i = 0,
toggler = function( event ) {
// Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+ var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
// Make sure that clicks stop
event.preventDefault();
@@ -3880,9 +3575,178 @@ jQuery.fn.extend({
}
});
+var liveMap = {
+ focus: "focusin",
+ blur: "focusout",
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+ var type, i = 0, match, namespaces, preType,
+ selector = origSelector || this.selector,
+ context = origSelector ? this : jQuery( this.context );
+
+ if ( typeof types === "object" && !types.preventDefault ) {
+ for ( var key in types ) {
+ context[ name ]( key, data, types[key], selector );
+ }
+
+ return this;
+ }
+
+ if ( name === "die" && !types &&
+ origSelector && origSelector.charAt(0) === "." ) {
+
+ context.unbind( origSelector );
+
+ return this;
+ }
+
+ if ( data === false || jQuery.isFunction( data ) ) {
+ fn = data || returnFalse;
+ data = undefined;
+ }
+
+ types = (types || "").split(" ");
+
+ while ( (type = types[ i++ ]) != null ) {
+ match = rnamespaces.exec( type );
+ namespaces = "";
+
+ if ( match ) {
+ namespaces = match[0];
+ type = type.replace( rnamespaces, "" );
+ }
+
+ if ( type === "hover" ) {
+ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+ continue;
+ }
+
+ preType = type;
+
+ if ( liveMap[ type ] ) {
+ types.push( liveMap[ type ] + namespaces );
+ type = type + namespaces;
+
+ } else {
+ type = (liveMap[ type ] || type) + namespaces;
+ }
+
+ if ( name === "live" ) {
+ // bind live handler
+ for ( var j = 0, l = context.length; j < l; j++ ) {
+ jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+ }
+
+ } else {
+ // unbind live handler
+ context.unbind( "live." + liveConvert( type, selector ), fn );
+ }
+ }
+
+ return this;
+ };
+});
+
+function liveHandler( event ) {
+ var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+ elems = [],
+ selectors = [],
+ events = jQuery._data( this, "events" );
+
+ // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+ if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+ return;
+ }
+
+ if ( event.namespace ) {
+ namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.liveFired = this;
+
+ var live = events.live.slice(0);
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+ selectors.push( handleObj.selector );
+
+ } else {
+ live.splice( j--, 1 );
+ }
+ }
+
+ match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+ for ( i = 0, l = match.length; i < l; i++ ) {
+ close = match[i];
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+ elem = close.elem;
+ related = null;
+
+ // Those two events require additional checking
+ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+ event.type = handleObj.preType;
+ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+ // Make sure not to accidentally match a child element with the same selector
+ if ( related && jQuery.contains( elem, related ) ) {
+ related = elem;
+ }
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+ }
+ }
+ }
+ }
+
+ for ( i = 0, l = elems.length; i < l; i++ ) {
+ match = elems[i];
+
+ if ( maxLevel && match.level > maxLevel ) {
+ break;
+ }
+
+ event.currentTarget = match.elem;
+ event.data = match.handleObj.data;
+ event.handleObj = match.handleObj;
+
+ ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+ if ( ret === false || event.isPropagationStopped() ) {
+ maxLevel = match.level;
+
+ if ( ret === false ) {
+ stop = false;
+ }
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+ "change select submit keydown keypress keyup error").split(" "), function( i, name ) {
// Handle event binding
jQuery.fn[ name ] = function( data, fn ) {
@@ -3899,14 +3763,6 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
if ( jQuery.attrFn ) {
jQuery.attrFn[ name ] = true;
}
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
});
@@ -3920,13 +3776,11 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
(function(){
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- expando = "sizcache" + (Math.random() + '').replace('.', ''),
done = 0,
toString = Object.prototype.toString,
hasDuplicate = false,
baseHasDuplicate = true,
rBackslash = /\\/g,
- rReturn = /\r\n/g,
rNonWord = /\W/;
// Here we check if the JavaScript engine is using some sort of
@@ -3978,7 +3832,7 @@ var Sizzle = function( selector, context, results, seed ) {
if ( parts.length > 1 && origPOS.exec( selector ) ) {
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
+ set = posProcess( parts[0] + parts[1], context );
} else {
set = Expr.relative[ parts[0] ] ?
@@ -3992,7 +3846,7 @@ var Sizzle = function( selector, context, results, seed ) {
selector += parts.shift();
}
- set = posProcess( selector, set, seed );
+ set = posProcess( selector, set );
}
}
@@ -4111,17 +3965,18 @@ Sizzle.matchesSelector = function( node, expr ) {
};
Sizzle.find = function( expr, context, isXML ) {
- var set, i, len, match, type, left;
+ var set;
if ( !expr ) {
return [];
}
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var match,
+ type = Expr.order[i];
if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- left = match[1];
+ var left = match[1];
match.splice( 1, 1 );
if ( left.substr( left.length - 1 ) !== "\\" ) {
@@ -4147,18 +4002,17 @@ Sizzle.find = function( expr, context, isXML ) {
Sizzle.filter = function( expr, set, inplace, not ) {
var match, anyFound,
- type, found, item, filter, left,
- i, pass,
old = expr,
result = [],
curLoop = set,
isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
while ( expr && set.length ) {
- for ( type in Expr.filter ) {
+ for ( var type in Expr.filter ) {
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- filter = Expr.filter[ type ];
- left = match[1];
+ var found, item,
+ filter = Expr.filter[ type ],
+ left = match[1];
anyFound = false;
@@ -4184,10 +4038,10 @@ Sizzle.filter = function( expr, set, inplace, not ) {
}
if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i, curLoop );
- pass = not ^ found;
+ var pass = not ^ !!found;
if ( inplace && found != null ) {
if ( pass ) {
@@ -4241,45 +4095,6 @@ Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;
};
-/**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
- var i, node,
- nodeType = elem.nodeType,
- ret = "";
-
- if ( nodeType ) {
- if ( nodeType === 1 ) {
- // Use textContent || innerText for elements
- if ( typeof elem.textContent === 'string' ) {
- return elem.textContent;
- } else if ( typeof elem.innerText === 'string' ) {
- // Replace IE's carriage returns
- return elem.innerText.replace( rReturn, '' );
- } else {
- // Traverse it's children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( i = 0; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- if ( node.nodeType !== 8 ) {
- ret += getText( node );
- }
- }
- }
- return ret;
-};
-
var Expr = Sizzle.selectors = {
order: [ "ID", "NAME", "TAG" ],
@@ -4667,7 +4482,7 @@ var Expr = Sizzle.selectors = {
return filter( elem, i, match, array );
} else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+ return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
} else if ( name === "not" ) {
var not = match[3];
@@ -4686,10 +4501,7 @@ var Expr = Sizzle.selectors = {
},
CHILD: function( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
+ var type = match[1],
node = elem;
switch ( type ) {
@@ -4717,18 +4529,18 @@ var Expr = Sizzle.selectors = {
return true;
case "nth":
- first = match[2];
- last = match[3];
+ var first = match[2],
+ last = match[3];
if ( first === 1 && last === 0 ) {
return true;
}
- doneName = match[0];
- parent = elem.parentNode;
+ var doneName = match[0],
+ parent = elem.parentNode;
- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
- count = 0;
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
for ( node = parent.firstChild; node; node = node.nextSibling ) {
if ( node.nodeType === 1 ) {
@@ -4736,10 +4548,10 @@ var Expr = Sizzle.selectors = {
}
}
- parent[ expando ] = doneName;
+ parent.sizcache = doneName;
}
- diff = elem.nodeIndex - last;
+ var diff = elem.nodeIndex - last;
if ( first === 0 ) {
return diff === 0;
@@ -4755,7 +4567,7 @@ var Expr = Sizzle.selectors = {
},
TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
},
CLASS: function( elem, match ) {
@@ -4765,9 +4577,7 @@ var Expr = Sizzle.selectors = {
ATTR: function( elem, match ) {
var name = match[1],
- result = Sizzle.attr ?
- Sizzle.attr( elem, name ) :
- Expr.attrHandle[ name ] ?
+ result = Expr.attrHandle[ name ] ?
Expr.attrHandle[ name ]( elem ) :
elem[ name ] != null ?
elem[ name ] :
@@ -4778,8 +4588,6 @@ var Expr = Sizzle.selectors = {
return result == null ?
type === "!=" :
- !type && Sizzle.attr ?
- result != null :
type === "=" ?
value === check :
type === "*=" ?
@@ -4960,6 +4768,26 @@ if ( document.documentElement.compareDocumentPosition ) {
};
}
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += Sizzle.getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+};
+
// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
@@ -5237,13 +5065,13 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
elem = elem[dir];
while ( elem ) {
- if ( elem[ expando ] === doneName ) {
+ if ( elem.sizcache === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 && !isXML ){
- elem[ expando ] = doneName;
+ elem.sizcache = doneName;
elem.sizset = i;
}
@@ -5270,14 +5098,14 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
elem = elem[dir];
while ( elem ) {
- if ( elem[ expando ] === doneName ) {
+ if ( elem.sizcache === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 ) {
if ( !isXML ) {
- elem[ expando ] = doneName;
+ elem.sizcache = doneName;
elem.sizset = i;
}
@@ -5325,7 +5153,7 @@ Sizzle.isXML = function( elem ) {
return documentElement ? documentElement.nodeName !== "HTML" : false;
};
-var posProcess = function( selector, context, seed ) {
+var posProcess = function( selector, context ) {
var match,
tmpSet = [],
later = "",
@@ -5341,16 +5169,13 @@ var posProcess = function( selector, context, seed ) {
selector = Expr.relative[selector] ? selector + "*" : selector;
for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet, seed );
+ Sizzle( selector, root[i], tmpSet );
}
return Sizzle.filter( later, tmpSet );
};
// EXPOSE
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-Sizzle.selectors.attrMap = {};
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.filters;
@@ -5436,33 +5261,43 @@ jQuery.fn.extend({
},
is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- POS.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
+ return !!selector && ( typeof selector === "string" ?
+ jQuery.filter( selector, this ).length > 0 :
+ this.filter( selector ).length > 0 );
},
closest: function( selectors, context ) {
var ret = [], i, l, cur = this[0];
- // Array (deprecated as of jQuery 1.7)
+ // Array
if ( jQuery.isArray( selectors ) ) {
- var level = 1;
+ var match, selector,
+ matches = {},
+ level = 1;
+
+ if ( cur && selectors.length ) {
+ for ( i = 0, l = selectors.length; i < l; i++ ) {
+ selector = selectors[i];
+
+ if ( !matches[ selector ] ) {
+ matches[ selector ] = POS.test( selector ) ?
+ jQuery( selector, context || this.context ) :
+ selector;
+ }
+ }
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( i = 0; i < selectors.length; i++ ) {
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( selector in matches ) {
+ match = matches[ selector ];
- if ( jQuery( cur ).is( selectors[ i ] ) ) {
- ret.push({ selector: selectors[ i ], elem: cur, level: level });
+ if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+ ret.push({ selector: selector, elem: cur, level: level });
+ }
}
- }
- cur = cur.parentNode;
- level++;
+ cur = cur.parentNode;
+ level++;
+ }
}
return ret;
@@ -5669,7 +5504,7 @@ function winnow( elements, qualifier, keep ) {
} else if ( qualifier.nodeType ) {
return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
+ return (elem === qualifier) === keep;
});
} else if ( typeof qualifier === "string" ) {
@@ -5685,38 +5520,20 @@ function winnow( elements, qualifier, keep ) {
}
return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+ return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
});
}
-function createSafeFragment( document ) {
- var list = nodeNames.split( " " ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
- "header hgroup mark meter nav output progress section summary time video",
- rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
rleadingWhitespace = /^\s+/,
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
rtagName = /<([\w:]+)/,
rtbody = /<tbody/i,
rhtml = /<|&#?\w+;/,
- rnoInnerhtml = /<(?:script|style)/i,
rnocache = /<(?:script|object|embed|option|style)/i,
- rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rscriptType = /\/(java|ecma)script/i,
@@ -5730,8 +5547,7 @@ var nodeNames = "abbr article aside audio canvas datalist details figcaption fig
col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
area: [ 1, "<map>", "</map>" ],
_default: [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document );
+ };
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
@@ -5912,7 +5728,7 @@ jQuery.fn.extend({
null;
// See if we can take a shortcut and just use innerHTML
- } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ } else if ( typeof value === "string" && !rnocache.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
@@ -6038,7 +5854,7 @@ jQuery.fn.extend({
// in certain situations (Bug #8070).
// Fragments from the fragment cache must always be cloned and never used
// in place.
- results.cacheable || ( l > 1 && i < lastIndex ) ?
+ results.cacheable || (l > 1 && i < lastIndex) ?
jQuery.clone( fragment, true, true ) :
fragment
);
@@ -6067,26 +5883,27 @@ function cloneCopyEvent( src, dest ) {
return;
}
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
+ var internalKey = jQuery.expando,
+ oldData = jQuery.data( src ),
+ curData = jQuery.data( dest, oldData );
+
+ // Switch to use the internal data object, if it exists, for the next
+ // stage of data copying
+ if ( (oldData = oldData[ internalKey ]) ) {
+ var events = oldData.events;
+ curData = curData[ internalKey ] = jQuery.extend({}, oldData);
- if ( events ) {
- delete curData.handle;
- curData.events = {};
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+ for ( var type in events ) {
+ for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+ }
}
}
}
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
}
function cloneFixAttributes( src, dest ) {
@@ -6148,15 +5965,14 @@ function cloneFixAttributes( src, dest ) {
}
jQuery.buildFragment = function( args, nodes, scripts ) {
- var fragment, cacheable, cacheresults, doc,
- first = args[ 0 ];
-
- // nodes may contain either an explicit document object,
- // a jQuery collection or context object.
- // If nodes[0] contains a valid object to assign to doc
- if ( nodes && nodes[0] ) {
- doc = nodes[0].ownerDocument || nodes[0];
- }
+ var fragment, cacheable, cacheresults, doc;
+
+ // nodes may contain either an explicit document object,
+ // a jQuery collection or context object.
+ // If nodes[0] contains a valid object to assign to doc
+ if ( nodes && nodes[0] ) {
+ doc = nodes[0].ownerDocument || nodes[0];
+ }
// Ensure that an attr object doesn't incorrectly stand in as a document object
// Chrome and Firefox seem to allow this to occur and will throw exception
@@ -6169,15 +5985,12 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
// Cloning options loses the selected state, so don't cache them
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
- if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
- first.charAt(0) === "<" && !rnocache.test( first ) &&
- (jQuery.support.checkClone || !rchecked.test( first )) &&
- (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
+ if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+ args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
cacheable = true;
- cacheresults = jQuery.fragments[ first ];
+ cacheresults = jQuery.fragments[ args[0] ];
if ( cacheresults && cacheresults !== 1 ) {
fragment = cacheresults;
}
@@ -6189,7 +6002,7 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
}
if ( cacheable ) {
- jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+ jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
}
return { fragment: fragment, cacheable: cacheable };
@@ -6215,7 +6028,7 @@ jQuery.each({
} else {
for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = ( i > 0 ? this.clone(true) : this ).get();
+ var elems = (i > 0 ? this.clone(true) : this).get();
jQuery( insert[i] )[ original ]( elems );
ret = ret.concat( elems );
}
@@ -6226,10 +6039,10 @@ jQuery.each({
});
function getAll( elem ) {
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
+ if ( "getElementsByTagName" in elem ) {
return elem.getElementsByTagName( "*" );
- } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+ } else if ( "querySelectorAll" in elem ) {
return elem.querySelectorAll( "*" );
} else {
@@ -6245,11 +6058,9 @@ function fixDefaultChecked( elem ) {
}
// Finds all inputs and passes them to fixDefaultChecked
function findInputs( elem ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "input" ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
fixDefaultChecked( elem );
- // Skip scripts, get other children
- } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+ } else if ( "getElementsByTagName" in elem ) {
jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
}
}
@@ -6337,20 +6148,11 @@ jQuery.extend({
elem = elem.replace(rxhtmlTag, "<$1></$2>");
// Trim whitespace, otherwise indexOf won't work as expected
- var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+ var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement("div");
- // Append wrapper element to unknown element safe doc fragment
- if ( context === document ) {
- // Use the fragment we've already created for this document
- safeFragment.appendChild( div );
- } else {
- // Use a fragment created with the owner document
- createSafeFragment( context ).appendChild( div );
- }
-
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];
@@ -6431,9 +6233,7 @@ jQuery.extend({
},
cleanData: function( elems ) {
- var data, id,
- cache = jQuery.cache,
- special = jQuery.event.special,
+ var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;
for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
@@ -6444,7 +6244,7 @@ jQuery.extend({
id = elem[ jQuery.expando ];
if ( id ) {
- data = cache[ id ];
+ data = cache[ id ] && cache[ id ][ internalKey ];
if ( data && data.events ) {
for ( var type in data.events ) {
@@ -6706,7 +6506,7 @@ if ( !jQuery.support.opacity ) {
set: function( elem, value ) {
var style = elem.style,
currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+ opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
filter = currentStyle && currentStyle.filter || style.filter || "";
// IE has trouble with opacity if it does not have layout
@@ -6780,32 +6580,25 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) {
if ( document.documentElement.currentStyle ) {
currentStyle = function( elem, name ) {
- var left, rsLeft, uncomputed,
+ var left,
ret = elem.currentStyle && elem.currentStyle[ name ],
+ rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
style = elem.style;
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret === null && style && (uncomputed = style[ name ]) ) {
- ret = uncomputed;
- }
-
// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
-
// Remember the original values
left = style.left;
- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
// Put in the new values to get a computed value out
if ( rsLeft ) {
elem.runtimeStyle.left = elem.currentStyle.left;
}
- style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+ style.left = name === "fontSize" ? "1em" : (ret || 0);
ret = style.pixelLeft + "px";
// Revert the changed values
@@ -6873,7 +6666,7 @@ if ( jQuery.expr && jQuery.expr.filters ) {
var width = elem.offsetWidth,
height = elem.offsetHeight;
- return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+ return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
};
jQuery.expr.filters.visible = function( elem ) {
@@ -6927,7 +6720,7 @@ var r20 = /%20/g,
// Document location segments
ajaxLocParts,
-
+
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = ["*/"] + ["*"];
@@ -6966,7 +6759,7 @@ function addToPrefiltersOrTransports( structure ) {
placeBefore;
// For each dataType in the dataTypeExpression
- for ( ; i < length; i++ ) {
+ for(; i < length; i++ ) {
dataType = dataTypes[ i ];
// We control if we're asked to add before
// any existing element
@@ -6997,7 +6790,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
executeOnly = ( structure === prefilters ),
selection;
- for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+ for(; i < length && ( executeOnly || !selection ); i++ ) {
selection = list[ i ]( options, originalOptions, jqXHR );
// If we got redirected to another dataType
// we try there if executing only and not done already
@@ -7028,7 +6821,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
function ajaxExtend( target, src ) {
var key, deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
- for ( key in src ) {
+ for( key in src ) {
if ( src[ key ] !== undefined ) {
( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
}
@@ -7287,7 +7080,7 @@ jQuery.extend({
jQuery( callbackContext ) : jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
+ completeDeferred = jQuery._Deferred(),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// ifModified key
@@ -7437,7 +7230,7 @@ jQuery.extend({
// We extract error from statusText
// then normalize statusText and status for non-aborts
error = statusText;
- if ( !statusText || status ) {
+ if( !statusText || status ) {
statusText = "error";
if ( status < 0 ) {
status = 0;
@@ -7466,7 +7259,7 @@ jQuery.extend({
}
// Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+ completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
if ( fireGlobals ) {
globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
@@ -7481,14 +7274,14 @@ jQuery.extend({
deferred.promise( jqXHR );
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.add;
+ jqXHR.complete = completeDeferred.done;
// Status-dependent callbacks
jqXHR.statusCode = function( map ) {
if ( map ) {
var tmp;
if ( state < 2 ) {
- for ( tmp in map ) {
+ for( tmp in map ) {
statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
}
} else {
@@ -7565,7 +7358,7 @@ jQuery.extend({
ret = s.url.replace( rts, "$1_=" + ts );
// if nothing was replaced, add timestamp to the end
- s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+ s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
}
}
@@ -7743,7 +7536,7 @@ function ajaxHandleResponses( s, jqXHR, responses ) {
firstDataType;
// Fill responseXXX fields
- for ( type in responseFields ) {
+ for( type in responseFields ) {
if ( type in responses ) {
jqXHR[ responseFields[type] ] = responses[ type ];
}
@@ -7822,13 +7615,13 @@ function ajaxConvert( s, response ) {
conv2;
// For each dataType in the chain
- for ( i = 1; i < length; i++ ) {
+ for( i = 1; i < length; i++ ) {
// Create converters map
// with lowercased keys
if ( i === 1 ) {
- for ( key in s.converters ) {
- if ( typeof key === "string" ) {
+ for( key in s.converters ) {
+ if( typeof key === "string" ) {
converters[ key.toLowerCase() ] = s.converters[ key ];
}
}
@@ -7839,7 +7632,7 @@ function ajaxConvert( s, response ) {
current = dataTypes[ i ];
// If current is auto dataType, update it to prev
- if ( current === "*" ) {
+ if( current === "*" ) {
current = prev;
// If no auto and dataTypes are actually different
} else if ( prev !== "*" && prev !== current ) {
@@ -7851,7 +7644,7 @@ function ajaxConvert( s, response ) {
// If there is no direct converter, search transitively
if ( !conv ) {
conv2 = undefined;
- for ( conv1 in converters ) {
+ for( conv1 in converters ) {
tmp = conv1.split( " " );
if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
conv2 = converters[ tmp[1] + " " + current ];
@@ -8290,11 +8083,11 @@ jQuery.fn.extend({
var elem, display;
if ( speed || speed === 0 ) {
- return this.animate( genFx("show", 3), speed, easing, callback );
+ return this.animate( genFx("show", 3), speed, easing, callback);
} else {
for ( var i = 0, j = this.length; i < j; i++ ) {
- elem = this[ i ];
+ elem = this[i];
if ( elem.style ) {
display = elem.style.display;
@@ -8308,8 +8101,8 @@ jQuery.fn.extend({
// Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
- if ( display === "" && jQuery.css(elem, "display") === "none" ) {
- jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+ jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
}
}
}
@@ -8317,13 +8110,13 @@ jQuery.fn.extend({
// Set the display of most of the elements in a second loop
// to avoid the constant reflow
for ( i = 0; i < j; i++ ) {
- elem = this[ i ];
+ elem = this[i];
if ( elem.style ) {
display = elem.style.display;
if ( display === "" || display === "none" ) {
- elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+ elem.style.display = jQuery._data(elem, "olddisplay") || "";
}
}
}
@@ -8337,17 +8130,12 @@ jQuery.fn.extend({
return this.animate( genFx("hide", 3), speed, easing, callback);
} else {
- var elem, display,
- i = 0,
- j = this.length;
-
- for ( ; i < j; i++ ) {
- elem = this[i];
- if ( elem.style ) {
- display = jQuery.css( elem, "display" );
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ if ( this[i].style ) {
+ var display = jQuery.css( this[i], "display" );
- if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
- jQuery._data( elem, "olddisplay", display );
+ if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+ jQuery._data( this[i], "olddisplay", display );
}
}
}
@@ -8392,7 +8180,7 @@ jQuery.fn.extend({
},
animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed( speed, easing, callback );
+ var optall = jQuery.speed(speed, easing, callback);
if ( jQuery.isEmptyObject( prop ) ) {
return this.each( optall.complete, [ false ] );
@@ -8401,7 +8189,7 @@ jQuery.fn.extend({
// Do not change referenced properties as per-property easing will be lost
prop = jQuery.extend( {}, prop );
- function doAnimation() {
+ return this[ optall.queue === false ? "each" : "queue" ](function() {
// XXX 'this' does not always have a nodeName when running the
// test suite
@@ -8412,9 +8200,9 @@ jQuery.fn.extend({
var opt = jQuery.extend( {}, optall ),
isElement = this.nodeType === 1,
hidden = isElement && jQuery(this).is(":hidden"),
- name, val, p, e,
- parts, start, end, unit,
- method;
+ name, val, p,
+ display, e,
+ parts, start, end, unit;
// will store per property easing and be used to determine when an animation is complete
opt.animatedProperties = {};
@@ -8450,17 +8238,25 @@ jQuery.fn.extend({
opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
// Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
+ // animations on inline elements that are having width/height
+ // animated
if ( jQuery.css( this, "display" ) === "inline" &&
jQuery.css( this, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+ if ( !jQuery.support.inlineBlockNeedsLayout ) {
this.style.display = "inline-block";
} else {
- this.style.zoom = 1;
+ display = defaultDisplay( this.nodeName );
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( display === "inline" ) {
+ this.style.display = "inline-block";
+
+ } else {
+ this.style.display = "inline";
+ this.style.zoom = 1;
+ }
}
}
}
@@ -8474,17 +8270,8 @@ jQuery.fn.extend({
e = new jQuery.fx( this, opt, p );
val = prop[ p ];
- if ( rfxtypes.test( val ) ) {
-
- // Tracks whether to show or hide based on private
- // data attached to the element
- method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
- if ( method ) {
- jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
- e[ method ]();
- } else {
- e[ val ]();
- }
+ if ( rfxtypes.test(val) ) {
+ e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
} else {
parts = rfxnum.exec( val );
@@ -8497,7 +8284,7 @@ jQuery.fn.extend({
// We need to compute starting value
if ( unit !== "px" ) {
jQuery.style( this, p, (end || 1) + unit);
- start = ( (end || 1) / e.cur() ) * start;
+ start = ((end || 1) / e.cur()) * start;
jQuery.style( this, p, start + unit);
}
@@ -8516,71 +8303,39 @@ jQuery.fn.extend({
// For JS strict compliance
return true;
- }
-
- return optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
+ });
},
- stop: function( type, clearQueue, gotoEnd ) {
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
+ stop: function( clearQueue, gotoEnd ) {
+ if ( clearQueue ) {
+ this.queue([]);
}
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var i,
- hadTimers = false,
- timers = jQuery.timers,
- data = jQuery._data( this );
+ this.each(function() {
+ var timers = jQuery.timers,
+ i = timers.length;
// clear marker counters if we know they won't be
if ( !gotoEnd ) {
jQuery._unmark( true, this );
}
-
- function stopQueue( elem, data, i ) {
- var hooks = data[ i ];
- jQuery.removeData( elem, i, true );
- hooks.stop( gotoEnd );
- }
-
- if ( type == null ) {
- for ( i in data ) {
- if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
- stopQueue( this, data, i );
- }
- }
- } else if ( data[ i = type + ".run" ] && data[ i ].stop ){
- stopQueue( this, data, i );
- }
-
- for ( i = timers.length; i--; ) {
- if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
- if ( gotoEnd ) {
-
+ while ( i-- ) {
+ if ( timers[i].elem === this ) {
+ if (gotoEnd) {
// force the next step to be the last
- timers[ i ]( true );
- } else {
- timers[ i ].saveState();
+ timers[i](true);
}
- hadTimers = true;
- timers.splice( i, 1 );
- }
- }
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( !( gotoEnd && hadTimers ) ) {
- jQuery.dequeue( this, type );
+ timers.splice(i, 1);
+ }
}
});
+
+ // start the next in the queue if the last step wasn't forced
+ if ( !gotoEnd ) {
+ this.dequeue();
+ }
+
+ return this;
}
});
@@ -8599,7 +8354,7 @@ function clearFxNow() {
function genFx( type, num ) {
var obj = {};
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
obj[ this ] = type;
});
@@ -8608,9 +8363,9 @@ function genFx( type, num ) {
// Generate shortcuts for custom animations
jQuery.each({
- slideDown: genFx( "show", 1 ),
- slideUp: genFx( "hide", 1 ),
- slideToggle: genFx( "toggle", 1 ),
+ slideDown: genFx("show", 1),
+ slideUp: genFx("hide", 1),
+ slideToggle: genFx("toggle", 1),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
@@ -8622,31 +8377,25 @@ jQuery.each({
jQuery.extend({
speed: function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
complete: fn || !fn && easing ||
jQuery.isFunction( speed ) && speed,
duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
};
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
// Queueing
opt.old = opt.complete;
-
opt.complete = function( noUnmark ) {
if ( jQuery.isFunction( opt.old ) ) {
opt.old.call( this );
}
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
+ if ( opt.queue !== false ) {
+ jQuery.dequeue( this );
} else if ( noUnmark !== false ) {
jQuery._unmark( this );
}
@@ -8660,7 +8409,7 @@ jQuery.extend({
return firstNum + diff * p;
},
swing: function( p, n, firstNum, diff ) {
- return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
}
},
@@ -8683,12 +8432,12 @@ jQuery.fx.prototype = {
this.options.step.call( this.elem, this.now, this );
}
- ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
},
// Get the current size
cur: function() {
- if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+ if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
return this.elem[ this.prop ];
}
@@ -8706,22 +8455,17 @@ jQuery.fx.prototype = {
fx = jQuery.fx;
this.startTime = fxNow || createFxNow();
+ this.start = from;
this.end = to;
- this.now = this.start = from;
- this.pos = this.state = 0;
this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+ this.now = this.start;
+ this.pos = this.state = 0;
function t( gotoEnd ) {
- return self.step( gotoEnd );
+ return self.step(gotoEnd);
}
- t.queue = this.options.queue;
t.elem = this.elem;
- t.saveState = function() {
- if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
- jQuery._data( self.elem, "fxshow" + self.prop, self.start );
- }
- };
if ( t() && jQuery.timers.push(t) && !timerId ) {
timerId = setInterval( fx.tick, fx.interval );
@@ -8730,20 +8474,14 @@ jQuery.fx.prototype = {
// Simple 'show' function
show: function() {
- var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
-
// Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.show = true;
// Begin the animation
- // Make sure that we start at a small width/height to avoid any flash of content
- if ( dataShow !== undefined ) {
- // This show is picking up where a previous hide or show left off
- this.custom( this.cur(), dataShow );
- } else {
- this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
- }
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
// Start by showing the element
jQuery( this.elem ).show();
@@ -8752,20 +8490,20 @@ jQuery.fx.prototype = {
// Simple 'hide' function
hide: function() {
// Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.hide = true;
// Begin the animation
- this.custom( this.cur(), 0 );
+ this.custom(this.cur(), 0);
},
// Each step of an animation
step: function( gotoEnd ) {
- var p, n, complete,
- t = fxNow || createFxNow(),
+ var t = fxNow || createFxNow(),
done = true,
elem = this.elem,
- options = this.options;
+ options = this.options,
+ i, n;
if ( gotoEnd || t >= options.duration + this.startTime ) {
this.now = this.end;
@@ -8774,8 +8512,8 @@ jQuery.fx.prototype = {
options.animatedProperties[ this.prop ] = true;
- for ( p in options.animatedProperties ) {
- if ( options.animatedProperties[ p ] !== true ) {
+ for ( i in options.animatedProperties ) {
+ if ( options.animatedProperties[i] !== true ) {
done = false;
}
}
@@ -8784,36 +8522,25 @@ jQuery.fx.prototype = {
// Reset the overflow
if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
- jQuery.each( [ "", "X", "Y" ], function( index, value ) {
- elem.style[ "overflow" + value ] = options.overflow[ index ];
+ jQuery.each( [ "", "X", "Y" ], function (index, value) {
+ elem.style[ "overflow" + value ] = options.overflow[index];
});
}
// Hide the element if the "hide" operation was done
if ( options.hide ) {
- jQuery( elem ).hide();
+ jQuery(elem).hide();
}
// Reset the properties, if the item has been hidden or shown
if ( options.hide || options.show ) {
- for ( p in options.animatedProperties ) {
- jQuery.style( elem, p, options.orig[ p ] );
- jQuery.removeData( elem, "fxshow" + p, true );
- // Toggle data is no longer needed
- jQuery.removeData( elem, "toggle" + p, true );
+ for ( var p in options.animatedProperties ) {
+ jQuery.style( elem, p, options.orig[p] );
}
}
// Execute the complete function
- // in the event that the complete function throws an exception
- // we must ensure it won't be called twice. #5684
-
- complete = options.complete;
- if ( complete ) {
-
- options.complete = false;
- complete.call( elem );
- }
+ options.complete.call( elem );
}
return false;
@@ -8827,8 +8554,8 @@ jQuery.fx.prototype = {
this.state = n / options.duration;
// Perform the easing function, defaults to swing
- this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
- this.now = this.start + ( (this.end - this.start) * this.pos );
+ this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+ this.now = this.start + ((this.end - this.start) * this.pos);
}
// Perform the next step of the animation
this.update();
@@ -8840,15 +8567,9 @@ jQuery.fx.prototype = {
jQuery.extend( jQuery.fx, {
tick: function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
+ for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+ if ( !timers[i]() ) {
+ timers.splice(i--, 1);
}
}
@@ -8878,7 +8599,7 @@ jQuery.extend( jQuery.fx, {
_default: function( fx ) {
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
- fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+ fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
} else {
fx.elem[ fx.prop ] = fx.now;
}
@@ -8886,14 +8607,6 @@ jQuery.extend( jQuery.fx, {
}
});
-// Adds width/height step functions
-// Do not set anything below 0
-jQuery.each([ "width", "height" ], function( i, prop ) {
- jQuery.fx.step[ prop ] = function( fx ) {
- jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
- };
-});
-
if ( jQuery.expr && jQuery.expr.filters ) {
jQuery.expr.filters.animated = function( elem ) {
return jQuery.grep(jQuery.timers, function( fn ) {
@@ -8910,6 +8623,7 @@ function defaultDisplay( nodeName ) {
var body = document.body,
elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
display = elem.css( "display" );
+
elem.remove();
// If the simple way fails,
@@ -8937,6 +8651,7 @@ function defaultDisplay( nodeName ) {
iframeDoc.body.appendChild( elem );
display = jQuery.css( elem, "display" );
+
body.removeChild( iframe );
}
@@ -9013,6 +8728,8 @@ if ( "getBoundingClientRect" in document.documentElement ) {
return jQuery.offset.bodyOffset( elem );
}
+ jQuery.offset.initialize();
+
var computedStyle,
offsetParent = elem.offsetParent,
prevOffsetParent = elem,
@@ -9025,7 +8742,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
left = elem.offsetLeft;
while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
break;
}
@@ -9037,7 +8754,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
top += elem.offsetTop;
left += elem.offsetLeft;
- if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+ if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}
@@ -9046,7 +8763,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
offsetParent = elem.offsetParent;
}
- if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}
@@ -9059,7 +8776,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
left += body.offsetLeft;
}
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
top += Math.max( docElem.scrollTop, body.scrollTop );
left += Math.max( docElem.scrollLeft, body.scrollLeft );
}
@@ -9069,12 +8786,46 @@ if ( "getBoundingClientRect" in document.documentElement ) {
}
jQuery.offset = {
+ initialize: function() {
+ var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+ html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+ jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+ container.innerHTML = html;
+ body.insertBefore( container, body.firstChild );
+ innerDiv = container.firstChild;
+ checkDiv = innerDiv.firstChild;
+ td = innerDiv.nextSibling.firstChild.firstChild;
+
+ this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+ this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+ checkDiv.style.position = "fixed";
+ checkDiv.style.top = "20px";
+
+ // safari subtracts parent border width here which is 5px
+ this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+ checkDiv.style.position = checkDiv.style.top = "";
+
+ innerDiv.style.overflow = "hidden";
+ innerDiv.style.position = "relative";
+
+ this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+ this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+ body.removeChild( container );
+ jQuery.offset.initialize = jQuery.noop;
+ },
bodyOffset: function( body ) {
var top = body.offsetTop,
left = body.offsetLeft;
- if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+ jQuery.offset.initialize();
+
+ if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
}
@@ -9094,7 +8845,7 @@ jQuery.offset = {
curOffset = curElem.offset(),
curCSSTop = jQuery.css( elem, "top" ),
curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+ calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
props = {}, curPosition = {}, curTop, curLeft;
// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
@@ -9111,11 +8862,11 @@ jQuery.offset = {
options = options.call( elem, i, curOffset );
}
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
+ if (options.top != null) {
+ props.top = (options.top - curOffset.top) + curTop;
}
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
+ if (options.left != null) {
+ props.left = (options.left - curOffset.left) + curLeft;
}
if ( "using" in options ) {
@@ -9128,7 +8879,6 @@ jQuery.offset = {
jQuery.fn.extend({
-
position: function() {
if ( !this[0] ) {
return null;
@@ -9231,20 +8981,16 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
// innerHeight and innerWidth
jQuery.fn[ "inner" + name ] = function() {
var elem = this[0];
- return elem ?
- elem.style ?
+ return elem && elem.style ?
parseFloat( jQuery.css( elem, type, "padding" ) ) :
- this[ type ]() :
null;
};
// outerHeight and outerWidth
jQuery.fn[ "outer" + name ] = function( margin ) {
var elem = this[0];
- return elem ?
- elem.style ?
+ return elem && elem.style ?
parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
- this[ type ]() :
null;
};
@@ -9284,7 +9030,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
var orig = jQuery.css( elem, type ),
ret = parseFloat( orig );
- return jQuery.isNumeric( ret ) ? ret : orig;
+ return jQuery.isNaN( ret ) ? orig : ret;
// Set the width or height on the element (default to pixels if value is unitless)
} else {
@@ -9297,4 +9043,4 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;
-})( window );
+})(window);
diff --git a/doc/html/about.html b/doc/html/about.html
index 6c7b764..3c47f43 100644
--- a/doc/html/about.html
+++ b/doc/html/about.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>About S3QL &mdash; S3QL v1.8.1 documentation</title>
+ <title>About S3QL &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="#" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Installation" href="installation.html" />
<link rel="prev" title="S3QL User’s Guide" href="index.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="index.html" title="S3QL User’s Guide"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -182,7 +182,7 @@ will, although being inconvenient, not endanger any stored data.</p>
<li class="right" >
<a href="index.html" title="S3QL User’s Guide"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/adm.html b/doc/html/adm.html
index bcf0b09..beeacde 100644
--- a/doc/html/adm.html
+++ b/doc/html/adm.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Managing Buckets &mdash; S3QL v1.8.1 documentation</title>
+ <title>Managing Buckets &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Mounting" href="mount.html" />
<link rel="prev" title="File System Creation" href="mkfs.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="mkfs.html" title="File System Creation"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -207,7 +207,7 @@ for help on the mailing list first (see <a class="reference internal" href="reso
<li class="right" >
<a href="mkfs.html" title="File System Creation"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/backends.html b/doc/html/backends.html
index 55a6929..1c3b4fb 100644
--- a/doc/html/backends.html
+++ b/doc/html/backends.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Storage Backends &mdash; S3QL v1.8.1 documentation</title>
+ <title>Storage Backends &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="File System Creation" href="mkfs.html" />
<link rel="prev" title="General Information" href="general.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="general.html" title="General Information"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -50,6 +50,8 @@
<li class="toctree-l1 current"><a class="current reference internal" href="">Storage Backends</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#google-storage">Google Storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="#amazon-s3">Amazon S3</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#openstack-swift">OpenStack/Swift</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#rackspace-cloudfiles">RackSpace CloudFiles</a></li>
<li class="toctree-l2"><a class="reference internal" href="#s3-compatible">S3 compatible</a></li>
<li class="toctree-l2"><a class="reference internal" href="#local">Local</a></li>
<li class="toctree-l2"><a class="reference internal" href="#ssh-sftp">SSH/SFTP</a></li>
@@ -92,7 +94,8 @@
<div class="section" id="storage-backends">
<span id="id1"></span><h1>Storage Backends<a class="headerlink" href="#storage-backends" title="Permalink to this headline">¶</a></h1>
-<p>The following backends are currently available in S3QL:</p>
+<p>All storage backends respect the <tt class="docutils literal"><span class="pre">http_proxy</span></tt> and <tt class="docutils literal"><span class="pre">https_proxy</span></tt>
+environment variables.</p>
<div class="section" id="google-storage">
<h2>Google Storage<a class="headerlink" href="#google-storage" title="Permalink to this headline">¶</a></h2>
<p><a class="reference external" href="http://code.google.com/apis/storage/">Google Storage</a> is an online
@@ -208,13 +211,50 @@ consistency guarantees that completely eliminate any of the described
problems.</p>
</div>
</div>
+<div class="section" id="openstack-swift">
+<h2>OpenStack/Swift<a class="headerlink" href="#openstack-swift" title="Permalink to this headline">¶</a></h2>
+<p><a class="reference external" href="http://www.openstack.org/">OpenStack</a> is an open-source cloud server application suite. <a class="reference external" href="http://openstack.org/projects/storage/">Swift</a> is
+the cloud storage module of OpenStack. Swift/OpenStack storage is
+offered by many different companies.</p>
+<p>The storage URL for the OpenStack backend has the form</p>
+<div class="highlight-commandline"><div class="highlight"><pre><span class="l">swift://</span><span class="nv">&lt;hostname&gt;</span><span class="ge">[:&lt;port&gt;]</span><span class="l">/</span><span class="nv">&lt;container&gt;</span><span class="ge">[/&lt;prefix&gt;]</span><span class="l"></span>
+</pre></div>
+</div>
+<p>Note that the storage container must already exist. Most OpenStack
+providers offer a web frontend that you can use to create storage
+containers. <em>prefix</em> can be an arbitrary prefix that will be prepended
+to all object names used by S3QL. This allows you to store several
+S3QL file systems in the same container.</p>
+<p>The OpenStack backend always uses HTTPS connections. Note, however,
+that at this point S3QL does not verify the server certificate (cf.
+<a class="reference external" href="http://code.google.com/p/s3ql/issues/detail?id=267">issue 267</a>).</p>
+</div>
+<div class="section" id="rackspace-cloudfiles">
+<h2>RackSpace CloudFiles<a class="headerlink" href="#rackspace-cloudfiles" title="Permalink to this headline">¶</a></h2>
+<p><a class="reference external" href="http://www.rackspace.com/">RackSpace</a> CloudFiles uses OpenStack internally, so you can use the
+OpenStack/Swift backend (see above). The hostname for CloudFiles
+containers is <tt class="docutils literal"><span class="pre">auth.api.rackspacecloud.com</span></tt>. Use your normal
+RackSpace user name for the backend login, and your RackSpace API key
+as the backend passphrase. You can create a storage container for S3QL
+using the <a class="reference external" href="https://manage.rackspacecloud.com/">Control Panel</a> (go to
+<em>Cloud Files</em> under <em>Hosting</em>).</p>
+<p>You should note that opinions about RackSpace differ widely among S3QL
+users and developers. On the one hand, people praise RackSpace for
+their backing of the (open source) OpenStack project. On the other
+hand, their heavily advertised &#8220;fanatical support&#8221; is in practice
+often not only <a class="reference external" href="http://code.google.com/p/s3ql/issues/detail?id=243#c5">less than helpful</a>, but their
+support agents also seem to be <a class="reference external" href="http://code.google.com/p/s3ql/issues/detail?id=243#c11">downright incompetent</a>. However,
+there are reports that the support quality increases dramatically once
+you are a customer and use the &#8220;Live Chat&#8221; link when you are logged
+into the control panel.</p>
+</div>
<div class="section" id="s3-compatible">
<h2>S3 compatible<a class="headerlink" href="#s3-compatible" title="Permalink to this headline">¶</a></h2>
-<p>S3QL is also able to access other, S3 compatible storage services like
-<a class="reference external" href="http://www.openstack.org/">OpenStack</a> for which no specific backend exists. Note that when
-accessing such services, only the lowest common denominator of
-available features can be used, so it is generally recommended to use
-a service specific backend instead.</p>
+<p>S3QL is also able to access other, S3 compatible storage services for
+which no specific backend exists. Note that when accessing such
+services, only the lowest common denominator of available features can
+be used, so it is generally recommended to use a service specific
+backend instead.</p>
<p>The storage URL for accessing an arbitrary S3 compatible storage
service is</p>
<div class="highlight-commandline"><div class="highlight"><pre><span class="l">s3c://</span><span class="nv">&lt;hostname&gt;</span><span class="l">:</span><span class="nv">&lt;port&gt;</span><span class="l">/</span><span class="nv">&lt;bucketname&gt;</span><span class="l">/</span><span class="nv">&lt;prefix&gt;</span><span class="l"></span>
@@ -270,7 +310,7 @@ with <a class="reference external" href="http://fuse.sourceforge.net/sshfs.html"
<li class="right" >
<a href="general.html" title="General Information"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/contrib.html b/doc/html/contrib.html
index ef30a11..60a0ef5 100644
--- a/doc/html/contrib.html
+++ b/doc/html/contrib.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Contributed Programs &mdash; S3QL v1.8.1 documentation</title>
+ <title>Contributed Programs &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Tips &amp; Tricks" href="tips.html" />
<link rel="prev" title="Checking for Errors" href="fsck.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="fsck.html" title="Checking for Errors"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -60,7 +60,7 @@
<li class="toctree-l2"><a class="reference internal" href="#pcp-py">pcp.py</a></li>
<li class="toctree-l2"><a class="reference internal" href="#s3-backup-sh">s3_backup.sh</a></li>
<li class="toctree-l2"><a class="reference internal" href="#expire-backups-py">expire_backups.py</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#s3ql-conf">s3ql.conf</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#s3ql-upstart-conf">s3ql_upstart.conf</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tips.html">Tips &amp; Tricks</a></li>
@@ -203,11 +203,11 @@ tamper with the state file.</p>
<p>For a full list of available options, run <strong class="program">expire_backups.py
&#8211;help</strong>.</p>
</div>
-<div class="section" id="s3ql-conf">
-<h2>s3ql.conf<a class="headerlink" href="#s3ql-conf" title="Permalink to this headline">¶</a></h2>
-<p><tt class="docutils literal"><span class="pre">s3ql.conf</span></tt> is an example upstart job definition file. It defines a
-job that automatically mounts an S3QL file system on system start, and
-properly unmounts it when the system is shut down.</p>
+<div class="section" id="s3ql-upstart-conf">
+<h2>s3ql_upstart.conf<a class="headerlink" href="#s3ql-upstart-conf" title="Permalink to this headline">¶</a></h2>
+<p><tt class="docutils literal"><span class="pre">s3ql_upstart.conf</span></tt> is an example upstart job definition file. It
+defines a job that automatically mounts an S3QL file system on system
+start, and properly unmounts it when the system is shut down.</p>
</div>
</div>
@@ -226,7 +226,7 @@ properly unmounts it when the system is shut down.</p>
<li class="right" >
<a href="fsck.html" title="Checking for Errors"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/fsck.html b/doc/html/fsck.html
index a7a3a66..4ed9e3f 100644
--- a/doc/html/fsck.html
+++ b/doc/html/fsck.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Checking for Errors &mdash; S3QL v1.8.1 documentation</title>
+ <title>Checking for Errors &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Contributed Programs" href="contrib.html" />
<link rel="prev" title="Unmounting" href="umount.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="umount.html" title="Unmounting"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -150,7 +150,7 @@ specified multiple times.</td></tr>
<li class="right" >
<a href="umount.html" title="Unmounting"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/general.html b/doc/html/general.html
index 035008c..446c5e8 100644
--- a/doc/html/general.html
+++ b/doc/html/general.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>General Information &mdash; S3QL v1.8.1 documentation</title>
+ <title>General Information &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Storage Backends" href="backends.html" />
<link rel="prev" title="Installation" href="installation.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="installation.html" title="Installation"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -185,8 +185,7 @@ backend alone.</p>
data, S3QL <em>will</em> detect the problem. Missing data will be detected
when running <tt class="docutils literal"><span class="pre">fsck.s3ql</span></tt> or when attempting to access the data in the
mounted file system. In the later case you will get an IO Error, and
-on unmounting S3QL will warn you that the file system is damaged and
-you need to run <tt class="docutils literal"><span class="pre">fsck.s3ql</span></tt>.</p>
+the S3QL mount point will become inaccessible.</p>
<p><tt class="docutils literal"><span class="pre">fsck.s3ql</span></tt> will report all the affected files and move them into the
<tt class="docutils literal"><span class="pre">/lost+found</span></tt> directory of the file system.</p>
<p>You should be aware that, because of S3QL&#8217;s data de-duplication
@@ -237,7 +236,7 @@ will ever be a concern.</p>
<li class="right" >
<a href="installation.html" title="Installation"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/index.html b/doc/html/index.html
index 86b9425..f277be1 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>S3QL User’s Guide &mdash; S3QL v1.8.1 documentation</title>
+ <title>S3QL User’s Guide &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="#" />
+ <link rel="top" title="S3QL v1.9 documentation" href="#" />
<link rel="next" title="About S3QL" href="about.html" />
</head>
<body>
@@ -33,7 +33,7 @@
<li class="right" style="margin-right: 10px">
<a href="about.html" title="About S3QL"
accesskey="N">next</a></li>
- <li><a href="#">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="#">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -102,6 +102,8 @@
<li class="toctree-l1"><a class="reference internal" href="backends.html">Storage Backends</a><ul>
<li class="toctree-l2"><a class="reference internal" href="backends.html#google-storage">Google Storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="backends.html#amazon-s3">Amazon S3</a></li>
+<li class="toctree-l2"><a class="reference internal" href="backends.html#openstack-swift">OpenStack/Swift</a></li>
+<li class="toctree-l2"><a class="reference internal" href="backends.html#rackspace-cloudfiles">RackSpace CloudFiles</a></li>
<li class="toctree-l2"><a class="reference internal" href="backends.html#s3-compatible">S3 compatible</a></li>
<li class="toctree-l2"><a class="reference internal" href="backends.html#local">Local</a></li>
<li class="toctree-l2"><a class="reference internal" href="backends.html#ssh-sftp">SSH/SFTP</a></li>
@@ -117,7 +119,6 @@
</li>
<li class="toctree-l1"><a class="reference internal" href="mount.html">Mounting</a><ul>
<li class="toctree-l2"><a class="reference internal" href="mount.html#compression-algorithms">Compression Algorithms</a></li>
-<li class="toctree-l2"><a class="reference internal" href="mount.html#parallel-compression">Parallel Compression</a></li>
<li class="toctree-l2"><a class="reference internal" href="mount.html#notes-about-caching">Notes about Caching</a></li>
<li class="toctree-l2"><a class="reference internal" href="mount.html#automatic-mounting">Automatic Mounting</a></li>
</ul>
@@ -138,7 +139,7 @@
<li class="toctree-l2"><a class="reference internal" href="contrib.html#pcp-py">pcp.py</a></li>
<li class="toctree-l2"><a class="reference internal" href="contrib.html#s3-backup-sh">s3_backup.sh</a></li>
<li class="toctree-l2"><a class="reference internal" href="contrib.html#expire-backups-py">expire_backups.py</a></li>
-<li class="toctree-l2"><a class="reference internal" href="contrib.html#s3ql-conf">s3ql.conf</a></li>
+<li class="toctree-l2"><a class="reference internal" href="contrib.html#s3ql-upstart-conf">s3ql_upstart.conf</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tips.html">Tips &amp; Tricks</a><ul>
@@ -180,7 +181,7 @@
<li class="right" style="margin-right: 10px">
<a href="about.html" title="About S3QL"
>next</a></li>
- <li><a href="#">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="#">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/installation.html b/doc/html/installation.html
index 785a402..d265a76 100644
--- a/doc/html/installation.html
+++ b/doc/html/installation.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Installation &mdash; S3QL v1.8.1 documentation</title>
+ <title>Installation &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="General Information" href="general.html" />
<link rel="prev" title="About S3QL" href="about.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="about.html" title="About S3QL"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -111,17 +111,12 @@ kernel 2.6.26 you will get significantly better write performance,
so under Linux you should actually use <em>2.6.26 or newer whenever
possible</em>.</p>
</li>
-<li><p class="first"><a class="reference external" href="http://www.python.org/">Python</a>, version 2.6.6 or newer, but not
-Python 3.x. Make sure to also install the development headers.</p>
+<li><p class="first"><a class="reference external" href="http://www.python.org/">Python</a> 2.7 (but not Python 3.x). Make
+sure to also install the development headers.</p>
</li>
<li><p class="first">The <a class="reference external" href="http://pypi.python.org/pypi/pycryptopp">PyCrypto++ Python Module</a>. To check if this module
is installed, try to execute <tt class="docutils literal"><span class="pre">python</span> <span class="pre">-c</span> <span class="pre">'import</span> <span class="pre">pycryptopp'</span></tt>.</p>
</li>
-<li><p class="first">The <a class="reference external" href="http://pypi.python.org/pypi/argparse">argparse Python Module</a>. To check if this module is
-installed, try to execute <tt class="docutils literal"><span class="pre">python</span> <span class="pre">-c</span> <span class="pre">'import</span> <span class="pre">argparse;</span> <span class="pre">print</span>
-<span class="pre">argparse.__version__'</span></tt>. If argparse is installed, this will print
-the version number. You need version 1.1 or later.</p>
-</li>
<li><p class="first"><a class="reference external" href="http://www.sqlite.org/">SQLite</a> version 3.7.0 or newer. SQLite
has to be installed as a <em>shared library</em> with development headers.</p>
</li>
@@ -189,7 +184,7 @@ have to run <tt class="docutils literal"><span class="pre">sudo</span> <span cla
<li class="right" >
<a href="about.html" title="About S3QL"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/issues.html b/doc/html/issues.html
index dd6d5a1..a78c2c6 100644
--- a/doc/html/issues.html
+++ b/doc/html/issues.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Known Issues &mdash; S3QL v1.8.1 documentation</title>
+ <title>Known Issues &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Manpages" href="man/index.html" />
<link rel="prev" title="Tips &amp; Tricks" href="tips.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="tips.html" title="Tips &amp; Tricks"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -162,7 +162,7 @@ the backend.</p>
<li class="right" >
<a href="tips.html" title="Tips &amp; Tricks"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/man/adm.html b/doc/html/man/adm.html
index fd3788b..c590ae6 100644
--- a/doc/html/man/adm.html
+++ b/doc/html/man/adm.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qladm command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qladm command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The mount.s3ql command" href="mount.html" />
<link rel="prev" title="The mkfs.s3ql command" href="mkfs.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="mkfs.html" title="The mkfs.s3ql command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -201,7 +201,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="mkfs.html" title="The mkfs.s3ql command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/cp.html b/doc/html/man/cp.html
index 7918ab5..0a9f386 100644
--- a/doc/html/man/cp.html
+++ b/doc/html/man/cp.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qlcp command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qlcp command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qlrm command" href="rm.html" />
<link rel="prev" title="The s3qlctrl command" href="ctrl.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="ctrl.html" title="The s3qlctrl command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -207,7 +207,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="ctrl.html" title="The s3qlctrl command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/ctrl.html b/doc/html/man/ctrl.html
index b914824..cb4661c 100644
--- a/doc/html/man/ctrl.html
+++ b/doc/html/man/ctrl.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qlctrl command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qlctrl command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qlcp command" href="cp.html" />
<link rel="prev" title="The s3qlstat command" href="stat.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="stat.html" title="The s3qlstat command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -198,7 +198,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="stat.html" title="The s3qlstat command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/expire_backups.html b/doc/html/man/expire_backups.html
index 6d25572..33848e5 100644
--- a/doc/html/man/expire_backups.html
+++ b/doc/html/man/expire_backups.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The expire_backups command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The expire_backups command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="Further Resources / Getting Help" href="../resources.html" />
<link rel="prev" title="The pcp command" href="pcp.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="pcp.html" title="The pcp command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -228,7 +228,7 @@ error occured.</p>
<li class="right" >
<a href="pcp.html" title="The pcp command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/fsck.html b/doc/html/man/fsck.html
index fad3fb8..ff25292 100644
--- a/doc/html/man/fsck.html
+++ b/doc/html/man/fsck.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The fsck.s3ql command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The fsck.s3ql command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The pcp command" href="pcp.html" />
<link rel="prev" title="The umount.s3ql command" href="umount.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="umount.html" title="The umount.s3ql command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -189,7 +189,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="umount.html" title="The umount.s3ql command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/index.html b/doc/html/man/index.html
index 5f2cd9c..bc752d1 100644
--- a/doc/html/man/index.html
+++ b/doc/html/man/index.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Manpages &mdash; S3QL v1.8.1 documentation</title>
+ <title>Manpages &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="next" title="The mkfs.s3ql command" href="mkfs.html" />
<link rel="prev" title="Known Issues" href="../issues.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="../issues.html" title="Known Issues"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -135,7 +135,7 @@ here in the User&#8217;s Guide.</p>
<li class="right" >
<a href="../issues.html" title="Known Issues"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/man/lock.html b/doc/html/man/lock.html
index 5319305..0894ee7 100644
--- a/doc/html/man/lock.html
+++ b/doc/html/man/lock.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qllock command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qllock command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The umount.s3ql command" href="umount.html" />
<link rel="prev" title="The s3qlrm command" href="rm.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="rm.html" title="The s3qlrm command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -198,7 +198,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="rm.html" title="The s3qlrm command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/mkfs.html b/doc/html/man/mkfs.html
index 9b4cbd6..ed2699a 100644
--- a/doc/html/man/mkfs.html
+++ b/doc/html/man/mkfs.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The mkfs.s3ql command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The mkfs.s3ql command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qladm command" href="adm.html" />
<link rel="prev" title="Manpages" href="index.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="index.html" title="Manpages"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -196,7 +196,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="index.html" title="Manpages"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/mount.html b/doc/html/man/mount.html
index 55fa01f..8b60d76 100644
--- a/doc/html/man/mount.html
+++ b/doc/html/man/mount.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The mount.s3ql command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The mount.s3ql command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qlstat command" href="stat.html" />
<link rel="prev" title="The s3qladm command" href="adm.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="adm.html" title="The s3qladm command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -254,7 +254,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="adm.html" title="The s3qladm command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/pcp.html b/doc/html/man/pcp.html
index 7807e0f..5aea1bf 100644
--- a/doc/html/man/pcp.html
+++ b/doc/html/man/pcp.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The pcp command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The pcp command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The expire_backups command" href="expire_backups.html" />
<link rel="prev" title="The fsck.s3ql command" href="fsck.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="fsck.html" title="The fsck.s3ql command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -171,7 +171,7 @@ error occured.</p>
<li class="right" >
<a href="fsck.html" title="The fsck.s3ql command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/rm.html b/doc/html/man/rm.html
index 68e30be..efc69e7 100644
--- a/doc/html/man/rm.html
+++ b/doc/html/man/rm.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qlrm command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qlrm command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qllock command" href="lock.html" />
<link rel="prev" title="The s3qlcp command" href="cp.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="cp.html" title="The s3qlcp command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -171,7 +171,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="cp.html" title="The s3qlcp command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/stat.html b/doc/html/man/stat.html
index 968901a..318e7fc 100644
--- a/doc/html/man/stat.html
+++ b/doc/html/man/stat.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The s3qlstat command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The s3qlstat command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The s3qlctrl command" href="ctrl.html" />
<link rel="prev" title="The mount.s3ql command" href="mount.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="mount.html" title="The mount.s3ql command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -166,7 +166,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="mount.html" title="The mount.s3ql command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/man/umount.html b/doc/html/man/umount.html
index 5b6f05b..1d86d5a 100644
--- a/doc/html/man/umount.html
+++ b/doc/html/man/umount.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The umount.s3ql command &mdash; S3QL v1.8.1 documentation</title>
+ <title>The umount.s3ql command &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="../index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="../index.html" />
<link rel="up" title="Manpages" href="index.html" />
<link rel="next" title="The fsck.s3ql command" href="fsck.html" />
<link rel="prev" title="The s3qllock command" href="lock.html" />
@@ -38,7 +38,7 @@
<li class="right" >
<a href="lock.html" title="The s3qllock command"
accesskey="P">previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Manpages</a> &raquo;</li>
</ul>
</div>
@@ -176,7 +176,7 @@ system, conventional locations are <tt class="file docutils literal"><span class
<li class="right" >
<a href="lock.html" title="The s3qllock command"
>previous</a> |</li>
- <li><a href="../index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="../index.html">S3QL v1.9 documentation</a> &raquo;</li>
<li><a href="index.html" >Manpages</a> &raquo;</li>
</ul>
</div>
diff --git a/doc/html/mkfs.html b/doc/html/mkfs.html
index 88beede..b824cef 100644
--- a/doc/html/mkfs.html
+++ b/doc/html/mkfs.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>File System Creation &mdash; S3QL v1.8.1 documentation</title>
+ <title>File System Creation &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Managing Buckets" href="adm.html" />
<link rel="prev" title="Storage Backends" href="backends.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="backends.html" title="Storage Backends"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -157,7 +157,7 @@ option to prevent accidental creation of an encrypted bucket.</p>
<li class="right" >
<a href="backends.html" title="Storage Backends"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/mount.html b/doc/html/mount.html
index 62ee5d3..c6a2b53 100644
--- a/doc/html/mount.html
+++ b/doc/html/mount.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Mounting &mdash; S3QL v1.8.1 documentation</title>
+ <title>Mounting &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Advanced S3QL Features" href="special.html" />
<link rel="prev" title="Managing Buckets" href="adm.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="adm.html" title="Managing Buckets"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -52,7 +52,6 @@
<li class="toctree-l1"><a class="reference internal" href="adm.html">Managing Buckets</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="">Mounting</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#compression-algorithms">Compression Algorithms</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#parallel-compression">Parallel Compression</a></li>
<li class="toctree-l2"><a class="reference internal" href="#notes-about-caching">Notes about Caching</a></li>
<li class="toctree-l2"><a class="reference internal" href="#automatic-mounting">Automatic Mounting</a></li>
</ul>
@@ -222,32 +221,18 @@ compression ratios than zlib.</p>
<p>For maximum file system performance, the best algorithm therefore
depends on your network connection speed: the compression algorithm
should be fast enough to saturate your network connection.</p>
-<p>To find the optimal algorithm for your system, S3QL ships with a
-program called <tt class="docutils literal"><span class="pre">benchmark.py</span></tt> in the <tt class="docutils literal"><span class="pre">contrib</span></tt> directory. You should
-run this program on a file that has a size that is roughly equal to
-the block size of your file system and has similar contents. It will
-then determine the compression speeds for the different algorithms and
-the upload speeds for the specified backend and recommend the best
-algorithm that is fast enough to saturate your network connection.</p>
+<p>To find the optimal algorithm and number of parallel compression
+threads for your system, S3QL ships with a program called
+<tt class="docutils literal"><span class="pre">benchmark.py</span></tt> in the <tt class="docutils literal"><span class="pre">contrib</span></tt> directory. You should run this program
+on a file that has a size that is roughly equal to the block size of
+your file system and has similar contents. It will then determine the
+compression speeds for the different algorithms and the upload speeds
+for the specified backend and recommend the best algorithm that is
+fast enough to saturate your network connection.</p>
<p>Obviously you should make sure that there is little other system load
when you run <tt class="docutils literal"><span class="pre">benchmark.py</span></tt> (i.e., don&#8217;t compile software or encode
videos at the same time).</p>
</div>
-<div class="section" id="parallel-compression">
-<h2>Parallel Compression<a class="headerlink" href="#parallel-compression" title="Permalink to this headline">¶</a></h2>
-<p>If you are running S3QL on a system with multiple cores, you might
-want to set the <tt class="docutils literal"><span class="pre">--threads</span></tt> value larger than one. This will
-instruct S3QL to compress and encrypt several blocks at the same time.</p>
-<p>If you want to do this in combination with using the LZMA compression
-algorithm, you should keep an eye on memory usage though. Every
-LZMA compression threads requires about 200 MB of RAM.</p>
-<div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">To determine the optimal compression algorithm for your network
-connection when using multiple threads, you can pass the
-<tt class="docutils literal"><span class="pre">--compression-threads</span></tt> option to <tt class="docutils literal"><span class="pre">contrib/benchmark.py</span></tt>.</p>
-</div>
-</div>
<div class="section" id="notes-about-caching">
<h2>Notes about Caching<a class="headerlink" href="#notes-about-caching" title="Permalink to this headline">¶</a></h2>
<p>S3QL maintains a local cache of the file system data to speed up
@@ -314,7 +299,12 @@ as follows (and should be placed in <tt class="docutils literal"><span class="pr
26
27
28
-29</pre></div></td><td class="code"><div class="highlight"><pre><span class="l">description &quot;S3QL Backup File System&quot;</span>
+29
+30
+31
+32
+33
+34</pre></div></td><td class="code"><div class="highlight"><pre><span class="l">description &quot;S3QL Backup File System&quot;</span>
<span class="l">author &quot;Nikolaus Rath </span><span class="nv">&lt;Nikolaus@rath.org&gt;</span><span class="l">&quot;</span>
<span class="l"># This assumes that eth0 provides your internet connection</span>
@@ -324,6 +314,9 @@ as follows (and should be placed in <tt class="docutils literal"><span class="pr
<span class="l">env BUCKET=&quot;s3://my-backup-bla&quot;</span>
<span class="l">env MOUNTPOINT=&quot;/mnt/backup&quot;</span>
+<span class="l">env USER=&quot;myusername&quot;</span>
+<span class="l">env AUTHFILE=&quot;/path/to/authinfo2&quot;</span>
+
<span class="l">expect stop</span>
<span class="l">script</span>
@@ -336,12 +329,14 @@ as follows (and should be placed in <tt class="docutils literal"><span class="pr
<span class="l"> rm -rf &quot;$DIR&quot;</span>
<span class="l"> # Check and mount file system</span>
-<span class="l"> fsck.s3ql --batch &quot;$BUCKET&quot;</span>
-<span class="l"> exec mount.s3ql --upstart &quot;$BUCKET&quot; &quot;$MOUNTPOINT&quot;</span>
+<span class="l"> su -s /bin/sh -c &#39;exec &quot;$0&quot; &quot;$@&quot;&#39; &quot;$USER&quot; -- \</span>
+<span class="l"> fsck.s3ql --batch --authfile &quot;$AUTHFILE&quot; &quot;$BUCKET&quot;</span>
+<span class="l"> exec su -s /bin/sh -c &#39;exec &quot;$0&quot; &quot;$@&quot;&#39; &quot;$USER&quot; -- \</span>
+<span class="l"> mount.s3ql --upstart --authfile &quot;$AUTHFILE&quot; &quot;$BUCKET&quot; &quot;$MOUNTPOINT&quot;</span>
<span class="l">end script</span>
<span class="l">pre-stop script</span>
-<span class="l"> umount.s3ql &quot;$MOUNTPOINT&quot;</span>
+<span class="l"> su -s /bin/sh -c &#39;exec &quot;$0&quot; &quot;$@&quot;&#39; &quot;$USER&quot; -- umount.s3ql &quot;$MOUNTPOINT&quot;</span>
<span class="l">end script</span>
</pre></div>
</td></tr></table></div>
@@ -382,7 +377,7 @@ mounted.</li>
<li class="right" >
<a href="adm.html" title="Managing Buckets"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/objects.inv b/doc/html/objects.inv
index 57932c3..a0eaca2 100644
--- a/doc/html/objects.inv
+++ b/doc/html/objects.inv
@@ -1,6 +1,6 @@
# Sphinx inventory version 2
# Project: S3QL
-# Version: 1.8.1
+# Version: 1.9
# The remainder of this file is compressed using zlib.
xÚ}RMÕ0 ¼çWD‚k¡½q$Ø•@À‰c•¦Þ×hó…í<xÿ·i«×z‹Æ3ã±c›ò¥Ë€ ƒ‰4ñðÆ›¼n^kv™nFþ…^sÍ»ÓÙÅ“žJúª¤\$nèö§ß›M°ñÞ°K±š¾Ô÷›lÚÛoŸÔ ¢‹üÞ+W´ªD$oÕûÜå_q¯ÔÊi„Ór©ËÛÂ#DvvŽ!Vsêé­BþÑ[Æ^ KûÏi(–Ùæ=ߦÈèúu@©ßä‹š¶á“}Ús)ƒukVYF…M/Þ߀A;>“ÌØ’¤­„¯æsËè;<=€~Ÿâ£;¬ƒ“ìF,ºÞȶâ@{‹­ ·Ù¸mô»PDc'w“ÿwIRoæzÛÞ­ªš>fo£É4&æéMdù››è¸ÎáÐáƒ!Ö` ’;ƒ¼B:?+å
ùPûjãVˆŽä~H-+è¼3½óŽ/G§XÙÍ5ûK\ a6X!P*háÙGlð6OA9fíʵ弟ե=`ô \ No newline at end of file
diff --git a/doc/html/resources.html b/doc/html/resources.html
index 7c8ee0b..2781962 100644
--- a/doc/html/resources.html
+++ b/doc/html/resources.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Further Resources / Getting Help &mdash; S3QL v1.8.1 documentation</title>
+ <title>Further Resources / Getting Help &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="prev" title="The expire_backups command" href="man/expire_backups.html" />
</head>
<body>
@@ -33,7 +33,7 @@
<li class="right" style="margin-right: 10px">
<a href="man/expire_backups.html" title="The expire_backups command"
accesskey="P">previous</a></li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -105,7 +105,7 @@ can subscribe by sending a mail to
<li class="right" style="margin-right: 10px">
<a href="man/expire_backups.html" title="The expire_backups command"
>previous</a></li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/search.html b/doc/html/search.html
index 6cb9a49..9379711 100644
--- a/doc/html/search.html
+++ b/doc/html/search.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Search &mdash; S3QL v1.8.1 documentation</title>
+ <title>Search &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -24,7 +24,7 @@
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
@@ -35,7 +35,7 @@
<div class="related">
<h3>Navigation</h3>
<ul>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -100,7 +100,7 @@
<div class="related">
<h3>Navigation</h3>
<ul>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js
index dc1ceef..d020221 100644
--- a/doc/html/searchindex.js
+++ b/doc/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({objects:{},terms:{suffici:1,all:[0,1,2,3,5,7,8,11,12,13,14,15,17,19,20,21,22,23,24,25,26,27],code:[8,17,0,22,11,23,10,25,21,3,4,26,6,20],partial:12,global:[],mnt:[5,14,27],month:[5,25],prefix:[12,1],stumbl:7,notquitesecret:1,follow:[0,1,2,3,4,5,6,7,8,10,11,12,13,14,15,16,17,19,20,22,23,24,25,26,27],disk:[14,21],whose:12,decid:[14,1],middl:7,depend:[8,9,22,23,1,25,3,5,14,20,27],million:[],ulimit:[27,20],readabl:21,send:16,rel:[12,4],init:[27,7],program:[0,2,3,4,5,6,7,8,9,10,11,13,15,17,19,20,22,23,24,25,26,27],those:12,under:[12,22],aris:12,sha256:21,neglig:[],worth:7,introduc:[17,13],sourc:[17,21,22,4,5,13],everi:[17,0,27,1,25,12,5,14,13],risk:[],mkf:[8,2,23,18,9],far:14,faq:16,account:[20,12,27],util:[14,19],pycryptopp:22,failur:1,veri:[21,12,7],affect:[17,27,7,13,1],tri:[15,7],administr:[0,13],level:[26,13],did:21,list:[21,22,25,26,12,13,5,15,16],upload:[21,11,27,24,26,12,13,5,14,20,7],previou:[5,15,12],"try":[5,25,12,22,1],larg:[17,14,7,13],stderr:27,small:[14,7],blocksiz:[],mount:[17,9,0,20,18,11,27,10,24,1,26,12,7,3,5,6,14,15,13],dir:[17,27],pleas:[21,16],upper:12,smaller:[14,20,27,21,7],slower:[17,27,13],ifac:27,ten:12,whitespac:[],compens:1,sync:4,sign:12,consequ:1,hors:[0,13],design:[0,21,13,1],pass:[27,4],download:[15,22,3],further:[9,15,16],correspond:12,port:12,rath:27,even:[8,0,11,24,1,12,19,13],what:[5,25,15,26,1],bzip2:[21,20,27],sub:7,entir:[21,0,10,13],descriptor:[27,20],section:[12,1],abl:[0,11,24,1,12,13,16],weren:16,asia:[],find:[0,12,27,7,13],access:[21,20,27,1,12,15,7],delet:[9,0,10,25,12,3,5,15,13],version:[8,17,0,20,22,11,23,10,24,19,25,2,12,21,3,4,26,6,15,27,7],suspect:19,consecut:12,"new":[8,0,20,23,1,25,26,12,5,15,27,13],net:[27,22],ever:1,"public":[],contrast:[0,13],metadata:[9,20,27,3,26,14,15,13],elimin:12,full:[8,17,0,11,23,10,26,21,3,5,6,20,27,13],themselv:1,absolut:[5,25,12],pacif:[],gener:[9,0,22,1,25,12,7,5,15,13],never:[],privat:[],here:[26,12,18],satisfi:22,explicitli:7,modif:7,address:7,path:[8,20,22,23,19,2,12,3,15,27],becom:[5,25,14,12,1],modifi:[17,21,13],sinc:[27,1,25,12,5,7],valu:[27,20,7,1],wait:[11,14,27,24,7],dry:25,convert:12,joes_bucket:[],howev:[17,0,27,21,25,12,13,5,14,7],checksum:21,larger:27,step:5,amount:[26,14,12,21],throughput:[],action:[26,15,13,3],implement:1,magnitud:[17,13],chanc:[],control:13,fstab:[27,7],decrypt:1,appli:[14,12,1],modul:[8,20,1,23,19,2,3,26,22,15,27],apw:22,filenam:14,unix:[14,21,7],visibl:12,instal:[8,9,0,20,18,22,17,11,23,10,26,3,5,6,15],total:[27,13],establish:1,from:[8,17,0,20,22,19,23,21,1,25,2,12,3,4,5,14,15,27,13],describ:[12,1],would:[17,1,25,12,5,13],apswvers:22,upgrad:[9,15,22,3],impos:[],few:[5,12,22],concret:1,call:[17,0,27,10,1,25,26,12,5,6,14,20,13],usr:[8,17,0,11,23,10,26,3,5,6,20],recommend:[5,27,12,7,1],taken:[17,21,20,27,13],tape:[0,13],bill:1,type:[],until:[11,27,7,13,24],more:[21,22,1,13,4,26,7],sort:[5,25],desir:26,st_nlink:7,src:[17,13],peopl:[],hundr:[],relat:12,benchmark:[5,9,27],"19283712_yourname_s3ql":[],notic:[14,12],enhanc:5,warn:[26,10,15,13,1],sqlitelibvers:[],sens:14,known:[9,21,7],rare:[],hold:[12,1],unpack:22,cach:[8,9,21,20,23,19,2,13,3,26,15,27,7],must:[17,22,12,3,15,13],worst:[0,13],none:[8,20,1,27,19,3,15],word:[],sometim:15,restor:[17,9,14,15,13],dest:17,setup:22,work:[21,22,24,25,5,14,7],uniqu:1,conceptu:21,remain:27,wors:12,obvious:27,can:[0,1,2,3,5,6,7,8,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],about:[9,21,27,6,14,13],root:[17,0,11,27,10,24,26,6,20,13],fetch:[17,13],overrid:12,sqlite:22,prompt:[8,19],tar:14,give:[5,25,14,15],process:[11,27,24,12,4,5,14,20,7],lock:[0,13],sudo:22,share:[8,17,0,22,11,23,10,26,3,5,6,20],accept:[8,17,0,20,19,11,23,10,24,1,25,2,3,4,26,6,15,27],high:[21,20,27,4],critic:21,minimum:[14,20,27,21],want:[11,27,24,25,5,14,16],onlin:[0,12,21,13],unfortun:[14,12,7],occur:[8,17,0,11,23,10,1,25,3,4,26,6,20],ratio:27,alwai:[17,27,25,13,5,7],end:[27,15],turn:[5,25,27,7],rather:[25,12,13,5,14,7],anoth:1,ordinari:[17,11,24,13],write:[8,9,21,20,22,17,27,19,12,7,3,5,14,15,13],how:[5,25,14],manpag:[9,18],env:27,webpag:12,verifi:[12,7],simpl:[5,25,13],updat:[5,21,12,7],product:[],resourc:[9,15,16],job:[5,27],max:[2,23,20,27],earlier:[7,1],pyliblzma:22,badli:[15,3],wrong:[15,3],endang:21,mai:[17,0,20,22,27,16,21,24,1,26,12,7,3,5,14,15,13],multipl:[8,15,23,19,2,3,20,27],redund:[5,25,21,12],secondari:[],data:[8,17,21,20,19,11,23,27,24,1,2,12,7,3,5,14,15,26,13],grow:[21,27],physic:[5,17,0,15,13],man:[18,7],"short":[0,12,13],attempt:[8,27,7,1],practic:[14,12],third:14,read:[8,17,21,20,19,23,1,2,12,3,14,15,27,13],neitheristhi:1,author:[27,7],favorit:[],apsw:22,element:27,issu:[17,9,0,22,27,16,10,21,12,7,26,6,13],inform:[9,27,1,25,26,20,13],maintain:27,combin:[14,12,27,20,1],allow:[17,0,20,27,10,25,26,12,4,5,6,14,15,13],enter:[2,23],exclus:14,volum:27,order:[17,13,1],talk:12,oper:[8,17,0,20,11,23,10,1,25,21,3,4,26,6,15,27],creation:[2,23,9],help:[9,22,16,26,13,3,5,15,7],over:[17,21,23,2,12,14,20,27,13],move:[21,15,1],soon:[],topsecret:[],increas:[14,20,27],appar:12,effici:7,still:[17,21,11,27,24,1,12,13],dynam:[21,22],paramet:1,group:[27,20],overwrit:[2,23],rogerbinn:22,fix:[0,25,12,13,5,7],inadvert:[17,13],better:[27,22,4],window:12,html:[],restart:[27,7],persist:1,mail:[21,15,22,16],main:[10,13],might:[17,0,27,16,10,19,13,26,6,7],documents_januari:[17,13],them:[17,11,24,1,12,15,13],good:[0,25,13,5,14,7],synopsi:[8,17,0,11,23,10,25,3,4,26,6,20],thei:[17,0,18,21,25,12,5,14,13],python:[27,22,1],promin:7,safe:[17,14,13],fuse4bsd:22,dai:[5,25],initi:[],dat:[5,25],terminolog:[9,1],therebi:12,instead:[17,11,24,1,12,13,7],interrupt:15,potenti:12,now:[0,22,25,12,5,13],bigger:[2,23],choic:22,term:[5,25,1],eventu:12,somewher:[8,17,0,11,23,10,3,26,6,20,13],name:[17,23,1,25,2,12,5,14,20,27,13],joesdomain:[],authent:[8,9,20,19,23,1,2,12,3,15,27],achiev:[5,17,21,27,13],mode:[27,20],each:[5,25,27,20,1],debug:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],found:[14,1],beneath:13,confid:[],side:1,mean:[21,12,7],compil:27,s3ql:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],mkfifo:27,chunk:7,hard:[14,21],idea:[5,25,0,7,13],procedur:[17,13],realli:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,14,15,27,7],contrib:[5,14,27],meta:[26,14,13],"static":22,expect:[27,12,1],year:[5,25,21,12],s3_copi:[5,9],happen:[0,12,13,1],todo:[],special:[17,13],out:[21,12,7],lzma:[21,20,22,27],ftp:[],shown:12,network:[17,14,27,21,13],space:[17,21,7,13],open:[11,27,24],newli:[],log_fifo:27,content:[17,21,27,0,1,3,13],suitabl:[21,22],rational:0,internet:[21,27],print:[8,17,0,20,22,11,23,10,24,19,25,2,3,4,26,6,15,27],eth0:27,bla:27,correct:[5,25],common:[17,0,12,13],foreground:[27,20],shut:[5,11,24,7],after:[17,0,21,1,12,14,15,13],insid:17,advanc:[9,13],migrat:5,documents_janurai:[],manipul:21,situat:14,given:7,free:[21,12],standard:[5,25,21,12,27],inod:[],reason:[10,27,24,1,25,12,13,5,14,19,7],base:27,theori:12,ask:[22,23,2,12,15,7],org:27,"byte":[],likelihood:12,afterward:14,bash:14,care:[17,21,7,13],wai:[0,27,21,1,12,13,14,7],thread:[5,27,20],befor:[17,21,11,27,24,1,12,13,7],could:[17,13],success:[],refus:[5,25],keep:[0,27,1,25,5,13],recov:[0,13],thing:[15,3],length:12,rais:[27,20],place:[27,12],perman:[9,0,27,12,14,13],pycrypto:22,principl:27,confus:7,neglect:1,first:[21,22,27,1,12,14,15,7],origin:[],softwar:27,rang:[5,25],becaus:[17,21,27,1,12,5,13],directli:12,malici:[0,13],carri:21,onc:[0,11,27,21,24,12,14,20,13],clariti:[],s3q:[],number:[21,22,27,25,13,4,5,14,20,7],capac:21,restrict:[26,27,20],date:[5,25],instruct:[27,22],alreadi:[17,22,7,13],done:[27,12],wrapper:[5,4],llfuse:22,indistinguish:21,miss:[25,1],s3c:12,size:[21,23,2,13,26,14,20,27,7],differ:[17,21,22,27,1,26,3,5,14,15,13],convent:[8,17,0,11,23,10,3,26,6,20,7],script:[5,14,27,7],profil:[27,20],unknown:21,interact:3,s3qllock:[9,0,18,10,5,14,13],system:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,27],least:[22,27,25,12,5,20],parallel:[9,27,4,5,14,20],checkpoint:1,attack:[0,7,13],necessarili:12,demonstr:5,s3qlrm:[9,0,18,10,25,5,13],termin:[11,24,7,1],lost:[12,1],john:12,"final":13,store:[8,9,21,20,19,23,1,25,2,12,3,5,14,15,27,7],low:[21,12],servi:7,luckili:[],consol:12,option:[0,2,3,4,5,6,7,8,10,11,13,14,15,17,19,20,22,23,24,25,26,27],especi:[14,21],shelf:[0,13],tool:12,copi:[17,9,21,1,13,4,5,14,15,7],specifi:[8,20,19,23,27,1,25,2,12,3,5,15,26,7],arbitrari:[14,12],part:[21,27,1,25,4,5],pars:1,mostli:[],consult:[8,23,20,3],exactli:[5,17,25,13],than:[10,23,1,25,2,13,5,14,20,27,7],wide:[27,22],target:[8,17,20,27,19,3,14,15,13],cachedir:[8,15,23,19,2,3,20,27],whenev:[14,22,27,1],prevent:[2,0,23,13],remov:[17,9,0,22,27,10,25,26,7,5,6,13],eleg:21,tree:[17,9,0,10,4,5,21,13],second:[27,1,25,12,5,14,20],structur:[21,15],exampl:[21,1,25,13,5,14,7],matter:[26,14,15],temporarili:27,friend:14,video:27,minut:[5,25],led:1,pre:27,unencrypt:[2,23],sai:[17,13],comput:[5,25,21,27],entail:[],plaintext:[],explicit:14,ram:27,mind:1,argument:[26,15,3],peculiar:12,"13th":21,packag:[5,22],expir:27,increment:[],disadvantag:[17,13],need:[17,20,22,27,1,25,12,5,15,13],seem:14,exclud:[0,13],paramiko:[],caus:[12,1],built:22,equival:[5,25],min:[27,20],irrepar:15,destroi:[0,13],moreov:13,blindli:7,atim:7,accuraci:[5,25],note:[17,9,21,22,11,27,24,25,12,7,4,5,14,15,13],also:[0,1,3,4,5,6,13,8,10,11,12,14,17,18,20,21,22,23,24,25,26,27],builtin:[],denomin:12,take:[17,21,13,3,26,14,15,7],which:[17,10,22,21,1,25,12,13,5,7],discrep:[],transmit:[],environ:22,uplink:5,singl:[14,20,27],swordfish:1,mktemp:27,begin:1,sure:[20,22,27,12,14,15,7],unless:[2,0,23,13],distribut:[5,27,22],plenti:[],normal:[27,20,1],buffer:7,who:[11,27,20,24],compress:[9,21,27,5,20,13],most:[8,17,20,19,27,1,25,12,7,3,5,15,13],beta:21,said:[],rigor:[5,25],plan:[],stricli:[],choos:[],homepag:[8,17,0,11,23,10,3,26,6,20],"class":[8,17,0,11,23,10,25,26,3,4,5,6,20],three:[27,12,22],simplic:21,renam:21,correctli:[7,19],ship:[25,27,22,4],url:[8,20,19,23,1,2,12,3,15,27],doc:[8,17,0,11,23,10,26,3,5,6,20],clear:[17,15,13],later:[17,0,22,1,12,13,7],cover:14,drive:[0,13],destruct:[0,13],doe:[21,27,24,1,12,7],declar:21,snapshot:[17,9,21,26,13],runtim:[9,13],determin:[5,27,1],sourceforg:[],occasion:12,usual:27,hmac:21,gracefulli:[5,25],myawssecretaccesskei:[],theoret:14,show:25,carefulli:1,random:[],syntax:[27,19,2,26,15,13],connect:[14,12,27,21],permiss:[5,21,20,27],bucketnam:12,newest:[14,3],anywai:[],rotat:[8,15,27,19,3,20],redirect:27,current:[5,15,12,25,7],onli:[17,25,0,20,22,11,27,10,24,21,26,12,7,4,5,6,14,15,13],slow:7,locat:[8,17,0,11,23,10,1,3,26,6,20,13],execut:[5,15,22,13],transact:21,configur:[9,27,13],activ:[8,17,0,20,19,11,23,10,24,1,25,2,12,3,4,26,6,15,27,13],state:[5,25,21,7],haven:[],authinfo:[],latenc:[14,21,4],suppos:12,rich:12,factor:[5,12],folder:[17,22,13],local:[8,9,0,22,17,11,23,10,12,21,3,26,6,14,20,27],defin:[5,25,27,1],contribut:[5,9],variou:[26,15,3],get:[8,9,0,20,22,19,23,27,1,25,2,16,3,5,15,26,13],googlegroup:16,nasti:[0,13],stop:27,autom:[5,21],regularli:[17,13],ssl:7,s3rr:[],cannot:[5,25],ssh:[9,14,12],report:[21,22,16,1],reconstruct:[5,25,1],requir:[8,21,1,27,19,25,26,5,22,20,7],myawsaccesskeyid:[],reveal:21,enabl:[],dramat:14,intrins:14,method:[27,22],provid:[21,22,27,1,12,7],bad:14,statist:[6,13,9],though:[27,12,1],contain:[22,27,25,3,5,15],userspac:[],nowher:[],where:[26,15,3,1],valid:[12,13],caches:[26,27,20,13],wiki:[22,16],kernel:22,set:[5,14,20,27],bucket1:1,bucket3:1,bucket2:1,startup:27,maximum:[5,2,23,20,27],see:[8,17,0,20,11,23,10,1,25,26,12,7,3,4,5,6,14,15,27,13],num:[27,20],s3qlcp:[5,9,17,18,13],fail:[12,22,7],close:[11,24],optimum:14,whatsoev:[0,21,13],best:[14,12,22,27],concern:1,infinit:21,awar:1,statu:[8,9,0,17,11,23,10,25,12,21,3,4,26,6,20,7],detect:[21,12,1],extend:21,inconveni:21,hopefulli:7,databas:21,boundari:[5,25],label:[2,23],favor:21,enough:[14,20,27],between:[5,25,27,20],"import":[5,22,1],neither:[0,13],across:21,attribut:21,check:[8,9,22,27,19,12,15,7],amazon:[9,21,1,12,5,7],august:[],kei:[21,12],weak:[],inconsist:7,southeast:[],lazi:[11,24],hardlink:[17,21,13],joe:[5,1],expire_backup:[5,9,18,25],solv:14,come:[5,14,21],local0:27,addit:[17,10,27,21,1,3,26,15,13],both:[17,21,13,1],protect:[0,21,13],accident:[2,0,23,13],last:1,irregular:[5,25],extens:21,someth:[17,13],region:[5,12],alon:1,quiet:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],against:[0,22,21,13],configpars:1,etc:[17,27,7,13],instanc:14,freeli:27,corrupt:1,com:[8,17,0,22,11,23,10,25,3,4,26,6,14,20,16],pcp:[5,9,14,18,4],independ:[21,20,27],load:27,simpli:[0,13],figur:1,inspir:[17,13],buti:[],period:[0,13],insist:14,batch:[8,27,19],written:[21,20,27,1],littl:[27,12,22],shutdown:27,linux:[27,22],averag:12,guid:[8,9,18,23,3,20],assum:27,duplic:[17,21,1,12,5,13],quit:22,worthless:[0,13],strong:[8,17,0,11,23,10,25,3,4,26,6,20],nikolau:27,west:[],devic:27,due:[12,7],been:[0,19,11,27,21,24,1,25,12,7,5,14,15,13],mark:[8,19],compon:21,secret:12,much:4,interpret:27,interest:13,subscrib:16,monthli:[17,13],immedi:[10,11,27,24,12,13],strategi:[5,25],legaci:12,infect:[0,13],upstart:[5,27,20],great:[0,13],ani:[8,17,0,22,23,21,1,25,2,12,16,5,13],rsync_arg:14,zero:14,understand:[27,20],togeth:1,els:15,tradition:[0,13],s3qlstat:[6,18,13,9],present:12,"case":[17,0,22,21,1,25,5,14,15,13],replic:[5,17,21,13],trojan:[0,13],ident:[17,21,13,1],look:14,gnu:7,solid:21,plain:[2,23],servic:[21,12,1],zlib:[27,20],histor:1,trick:[9,14],documents_februari:[17,13],invok:[26,15],abov:[5,25,1],error:[8,9,0,20,17,11,23,10,1,25,21,3,4,26,6,19,7],login:[12,1],invoc:[5,25],ahax:4,loos:[12,1],jibbadup:[],earli:[22,7],runlevel:27,argpars:22,have:[17,0,20,22,11,23,16,21,24,1,25,2,12,7,4,5,14,15,27,13],advantag:[5,25,0,13],stdout:27,almost:14,mtime:7,therefor:[5,27,12,7,1],remount:12,worri:[],destin:[17,14,13,4],exit:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],gsutil:[],conf:[5,9],incom:[],revis:[15,3],dedic:[27,7],sever:[21,22,27,1,12,4,5,14,20],tamper:[5,25],unmount:[9,11,27,24,1,12,5,14,19,7],develop:[9,21,12,22],minim:21,perform:[9,21,22,27,1,26,12,3,4,5,14,15,7],media:12,make:[17,0,20,22,27,21,1,25,12,13,5,14,15,7],flushcach:[26,13],same:[17,27,1,25,12,5,14,15,13],"while":[0,22,27,21,24,12,26,13],handl:[17,21,27,25,12,13,5,14,7],renumb:[],unexpectedli:7,split:21,auto:[27,20],pai:12,document:[8,17,0,11,23,10,3,26,6,20,13],infer:[5,25],complet:[17,22,27,1,25,26,12,5,20,13],week:[5,25],geograph:12,archiv:[21,12,22],hostnam:12,closest:12,lie:17,optim:27,keyr:[],confidenti:[],upon:7,effect:[17,21,13,1],cycl:[5,25],solut:5,remot:[14,12,21],fuse:[27,7],temporari:12,user:[8,9,0,18,22,17,11,23,10,24,19,12,21,3,26,6,14,20,27,13],mani:[5,25,21,1],extern:[0,12,13],encrypt:[21,27,1,2,3,23],typic:[17,13],recent:[5,25,27,15,7],gss:12,appropri:27,kept:[8,15,27,19,3,20],older:15,nevertheless:[5,1],entri:[27,20,1],thu:1,irrelev:[],well:[0,20,27,10,1,25,5,15,13],without:[8,17,0,21,19,12,13,14,15,7],command:[0,1,2,3,4,5,6,7,8,9,10,11,13,15,17,18,19,20,22,23,24,25,26,27],thi:[0,1,2,3,4,5,6,7,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27],filesystem:[27,19,2,14,20,23],gzip:21,credenti:[8,20,1,23,19,2,3,15,27],spend:14,ubuntu:22,left:7,compromis:14,identifi:[12,1],just:[8,17,0,20,11,23,10,24,19,25,2,12,3,4,26,6,14,15,27,13],less:1,conform:21,tip:[9,14],lowest:12,obtain:[],rest:14,bandwidth:[5,21],touch:[17,13],openstack:[21,12],passphras:[9,15,3,1],roughli:27,speed:[5,27],yet:[12,7],web:12,viru:[0,13],detach:[11,24],homedir:[],easi:14,hint:[26,15,3],point:[21,11,27,1,12,20],had:[5,17,25,13],except:1,param:15,thousand:[27,12],add:[0,13],spread:[2,23],nor:[0,13],versa:[17,13],input:[8,19],logger:27,subsequ:[5,25,12],launchpad:22,match:12,build:22,bin:[14,22],applic:[7,1],transpar:21,preserv:[5,21],big:[14,7],regard:[17,13],exception:[],traffic:12,know:[5,17,25,13],background:[11,24],amp:14,bit:21,password:[2,23,12,1],recurs:[5,9,10,13],presum:1,like:[17,0,27,21,12,13,4,20,7],loss:[12,1],daemon:[27,20],ctime:7,specif:[0,22,1,12,13,26,15,7],header:[22,1],should:[8,17,0,20,22,19,11,23,10,24,1,7,3,26,6,14,15,27,13],anyth:[],manual:[11,22,24,16],resolv:[12,16],noth:[0,13],princip:7,necessari:15,either:[12,13,3,26,15,7],output:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],per:27,page:18,yyyi:[5,25],imagin:[5,25,0,13],right:14,old:[8,0,20,22,27,19,25,12,3,5,15,13],often:[14,1],deal:[],ll23bi:1,interv:[5,25,14,20,27],compat:[9,12],some:[8,17,0,20,22,11,23,10,24,1,25,26,12,21,3,4,5,6,19,7],umount:[9,18,11,27,24,7],self:22,certain:[],strongest:[],"export":[27,20],flush:[27,13],guarante:[5,25,12],server:[14,12,7],librari:[22,7],"24h":[27,20],rsync:[17,0,13,4,5,14,7],backend:[8,9,17,11,23,24,1,2,12,7,3,26,14,20,27,13],confirm:[10,13],stronger:12,freebsd:22,avoid:[5,25],exec:27,definit:[5,25],februari:[17,13],protocol:1,usernam:1,equal:27,leav:7,slash:12,cif:27,damag:[5,25,15,1],creep:21,refer:[18,1],machin:[],core:[5,27],plu:1,object:[2,20,12,27,23],run:[0,20,22,19,27,1,25,26,13,3,5,15,7],itself:[12,22,1],power:5,certif:[12,7],reach:[8,15,27,19,3,20],intellig:[5,25,21],view:18,usag:[5,17,27,25,13],symlink:21,speak:27,host:[],unreason:7,although:[21,10,7,13],januari:[17,13],bi23ll:1,immut:[9,0,10,5,21,14,13],"__version__":22,stage:[],sshf:[14,12],comparison:[],deflat:21,actual:[15,14,12,22],proce:22,memori:27,http:[8,17,0,22,11,23,10,25,12,3,4,26,6,20],storebackup:[17,13],acl:21,messag:[8,15,23,19,2,3,20,27],fals:[27,20],commit:[24,7],backup:[17,9,0,27,21,1,25,12,3,5,14,15,13],disabl:[8,15,27,19,3,20],block:[21,11,27,24,1,13,26,7],repair:8,client:[],real:12,encount:[16,7],xyz:[],within:[13,1],encod:27,automat:[5,9,27,12,15],two:[17,21,15,13],down:[5,11,24,7],ahv:14,authinfo2:[8,15,23,19,2,3,20,27],ensur:[5,25,14,21],chang:[17,9,0,27,21,12,7,3,26,15,13],insuffici:7,storag:[8,9,0,20,19,17,11,23,21,24,1,2,12,7,3,5,14,15,27,13],your:[8,17,0,18,22,11,23,10,25,26,12,3,5,6,14,20,27,13],durabl:1,manag:[9,12,15],east:[],fast:[9,21,27,13],fusermount:[11,24,7],prepar:26,her:[0,13],transfer:[5,14,21],support:[17,21,27,12,13,20,7],question:16,s3_backup:[5,9],"long":[5,25,14,7,1],avail:[8,0,20,23,25,12,7,3,5,15,27,13],start:[22,27,1,12,4,5,14],reli:[7,1],trigger:[12,13],includ:[22,21,12,18,7],lot:14,"var":12,succeed:[8,17,0,11,23,10,25,3,4,26,6,20],individu:[27,20,4],"function":15,properli:5,tracker:[21,22,16],form:[5,25,12,1],offer:[17,12,13],forc:[8,2,23,19],basic:[],continu:24,sigstop:[27,20],satur:27,measur:5,newer:[12,22],don:[27,20],line:[26,21],bug:[21,22,16,7],faster:[10,12,13],info:[8,15,27,19,3,26,20],commun:1,made:[17,21,0,14,13],furthermor:[21,1],consist:[12,1],possibl:[0,22,27,21,12,13,14,15,7],"default":[8,20,23,19,25,2,3,4,5,15,27],bucket:[9,23,1,2,12,3,5,15,27,7],displai:[],tell:[5,25,27],asynchron:21,authfil:[8,20,1,23,19,2,3,15,27],below:[12,13],limit:[17,0,27,10,1,26,12,7,5,6,20,13],unnot:12,problem:[8,17,0,16,21,1,25,12,7,5,14,13],similar:27,significantli:[5,22,1],featur:[17,9,0,21,1,12,13],creat:[17,0,20,23,10,25,2,12,5,21,15,27,13],classic:[],retriev:[14,12,27,20,4],dure:[15,20,12,27],day_hour:[5,25],stabl:21,s3qlctrl:[26,9,14,18,13],strongli:[5,25],workaround:14,decreas:4,file:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,23,24,25,26,27],home:[5,14,12],request:12,exist:[17,0,23,10,1,25,2,12,5,13],improv:[5,9,14,4],mybucket:14,dd_hh:[5,25],link:22,probabl:[21,25,5,14,15,13],otherwis:[27,20],again:[0,12,24,13],readi:12,relatim:7,umask:27,googl:[8,9,0,22,17,11,23,10,25,12,21,3,4,26,6,20],sequenti:[],when:[8,0,20,19,27,21,1,25,12,7,3,4,5,14,15,13],detail:[5,14,12,7],prepend:12,field:[],other:[17,0,22,27,10,21,12,16,26,6,20,13],futur:[17,0,10,13,26,6,7],rememb:[],test:[21,22],you:[17,0,20,22,19,11,23,16,10,24,1,25,2,12,7,5,14,15,27,13],shrink:21,rid:[0,13],particular:1,variabl:22,intend:[],clean:[8,19],fulli:[],mountpoint:[27,24,12,26,6,14,20,13],"return":[8,17,0,11,23,10,24,25,3,4,26,6,20,7],fsck:[8,9,18,19,27,1,12,15],briefli:[],releas:21,track:[5,25],log:[8,20,19,27,1,12,3,26,15,13],consid:[12,16,1],sql:24,noleaf:7,ppa:22,pool:[],stai:[27,20],reduc:[5,12],infrequ:1,longer:[21,0,24,25,13,5,15,7],algorithm:[5,9,21,20,27],vice:[17,13],directori:[0,1,2,3,4,5,7,8,10,11,12,13,14,15,17,19,20,21,22,23,25,27],reliabl:[9,12,1],descript:[8,17,0,11,23,10,25,3,4,26,6,14,20,27],save:[25,14,21,1],rule:14,sftp:[9,12],depth:[],ignor:[],obj:[2,23,20,27],back:[0,13],time:[8,0,20,19,23,21,1,25,2,12,7,3,5,14,15,27,13],backward:[],s3qladm:[9,15,18,3],daili:[]},objtypes:{},titles:["The <strong class=\"program\">s3qllock</strong> command","General Information","File System Creation","The <strong class=\"program\">s3qladm</strong> command","The <strong class=\"program\">pcp</strong> command","Contributed Programs","The <strong class=\"program\">s3qlstat</strong> command","Known Issues","The <strong class=\"program\">fsck.s3ql</strong> command","S3QL User&#8217;s Guide","The <strong class=\"program\">s3qlrm</strong> command","The <strong class=\"program\">umount.s3ql</strong> command","Storage Backends","Advanced S3QL Features","Tips &amp; Tricks","Managing Buckets","Further Resources / Getting Help","The <strong class=\"program\">s3qlcp</strong> command","Manpages","Checking for Errors","The <strong class=\"program\">mount.s3ql</strong> command","About S3QL","Installation","The <strong class=\"program\">mkfs.s3ql</strong> command","Unmounting","The <strong class=\"program\">expire_backups</strong> command","The <strong class=\"program\">s3qlctrl</strong> command","Mounting"],objnames:{},filenames:["man/lock","general","mkfs","man/adm","man/pcp","contrib","man/stat","issues","man/fsck","index","man/rm","man/umount","backends","special","tips","adm","resources","man/cp","man/index","fsck","man/mount","about","installation","man/mkfs","umount","man/expire_backups","man/ctrl","mount"]}) \ No newline at end of file
+Search.setIndex({objects:{},terms:{suffici:1,all:[0,1,2,3,5,7,8,11,12,13,14,15,17,19,20,21,22,23,24,25,26,27],code:[8,17,0,22,11,23,10,25,21,3,4,26,6,20],partial:12,global:[],mnt:[5,14,27],month:[5,25],prefix:[12,1],stumbl:7,notquitesecret:1,follow:[0,1,2,3,4,5,6,7,8,10,11,13,14,15,16,17,19,20,22,23,24,25,26,27],disk:[14,21],whose:12,decid:[14,1],middl:7,depend:[8,9,22,23,1,25,3,5,14,20,27],million:[],ulimit:[27,20],readabl:21,send:16,rel:[12,4],init:[27,7],program:[0,2,3,4,5,6,7,8,9,10,11,13,15,17,19,20,22,23,24,25,26,27],those:12,under:[12,22],aris:12,sha256:21,neglig:[],worth:7,introduc:[17,13],sourc:[17,21,22,12,4,5,13],everi:[17,0,1,25,12,5,14,13],risk:[],mkf:[8,2,23,18,9],far:14,faq:16,account:[20,12,27],util:[14,19],pycryptopp:22,failur:1,veri:[21,12,7],affect:[17,27,7,13,1],tri:[15,7],administr:[0,13],level:[26,13],did:21,list:[21,22,25,26,12,13,5,15,16],upload:[21,11,27,24,26,12,13,5,14,20,7],previou:[5,15,12],"try":[5,25,12,22,1],larg:[17,14,7,13],stderr:27,small:[14,7],blocksiz:[],mount:[17,9,0,20,18,11,27,10,24,1,26,12,7,3,5,6,14,15,13],dir:[17,27],pleas:[21,16],upper:12,smaller:[14,20,27,21,7],slower:[17,27,13],ifac:27,ten:12,whitespac:[],compens:1,sync:4,sign:12,consequ:1,hors:[0,13],design:[0,21,13,1],pass:4,download:[15,22,3],further:[9,15,16],correspond:12,myusernam:27,port:12,rath:27,even:[8,0,11,24,1,12,19,13],what:[5,25,15,26,1],bzip2:[21,20,27],sub:7,entir:[21,0,10,13],descriptor:[27,20],section:[12,1],abl:[0,11,24,1,12,13,16],weren:16,asia:[],find:[0,12,27,7,13],access:[21,20,27,1,12,15,7],delet:[9,0,10,25,12,3,5,15,13],version:[8,17,0,20,22,11,23,10,24,19,25,2,12,21,3,4,26,6,15,27,7],suspect:19,consecut:12,"new":[8,0,20,23,1,25,26,12,5,15,27,13],net:[27,22],ever:1,"public":[],contrast:[0,13],metadata:[9,20,27,3,26,14,15,13],elimin:12,full:[8,17,0,11,23,10,26,21,3,5,6,20,27,13],themselv:1,absolut:[5,25,12],pacif:[],gener:[9,0,22,1,25,12,7,5,15,13],never:[],privat:[],here:[26,12,18],satisfi:22,explicitli:7,modif:7,address:7,path:[8,20,22,23,19,2,12,3,15,27],becom:[5,25,14,12,1],modifi:[17,21,13],sinc:[27,1,25,12,5,7],valu:[27,20,7,1],wait:[11,14,27,24,7],dry:25,convert:12,joes_bucket:[],howev:[17,0,27,21,25,12,13,5,14,7],checksum:21,larger:[],step:5,amount:[26,14,12,21],throughput:[],action:[26,15,13,3],opinion:12,implement:1,magnitud:[17,13],chanc:[],control:[12,13],fstab:[27,7],appli:[14,12,1],modul:[8,20,22,19,23,1,2,12,3,26,15,27],apw:22,filenam:14,unix:[14,21,7],api:12,visibl:12,instal:[8,9,0,20,18,22,17,11,23,10,26,3,5,6,15],total:[27,13],establish:1,cloud:12,rackspacecloud:12,from:[8,17,0,20,22,19,23,21,1,25,2,12,3,4,5,14,15,27,13],describ:[12,1],would:[17,1,25,12,5,13],apswvers:22,upgrad:[9,15,22,3],impos:[],few:[5,12,22],live:12,concret:1,call:[17,0,27,10,1,25,26,12,5,6,14,20,13],usr:[8,17,0,11,23,10,26,3,5,6,20],recommend:[5,27,12,7,1],taken:[17,21,20,27,13],tape:[0,13],bill:1,type:[],until:[11,27,7,13,24],more:[21,22,1,13,4,26,7],sort:[5,25],desir:26,st_nlink:7,src:[17,13],peopl:12,hundr:[],relat:12,benchmark:[5,9,27],"19283712_yourname_s3ql":[],notic:[14,12],enhanc:5,warn:[26,10,15,13,1],sqlitelibvers:[],agent:12,sens:14,known:[9,21,7],rare:[],compani:12,hold:[12,1],unpack:22,cach:[8,9,21,20,23,19,2,13,3,26,15,27,7],must:[17,22,12,3,15,13],worst:[0,13],none:[8,20,1,27,19,3,15],word:[],sometim:15,restor:[17,9,14,15,13],dest:17,setup:22,work:[21,22,24,25,5,14,7],uniqu:1,conceptu:21,remain:27,wors:12,obvious:27,can:[0,1,2,3,5,6,7,8,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],about:[9,21,27,12,6,14,13],root:[17,0,11,27,10,24,26,6,20,13],fetch:[17,13],overrid:12,sqlite:22,prompt:[8,19],tar:14,give:[5,25,14,15],process:[11,27,24,12,4,5,14,20,7],lock:[0,13],sudo:22,share:[8,17,0,22,11,23,10,26,3,5,6,20],accept:[8,17,0,20,19,11,23,10,24,1,25,2,3,4,26,6,15,27],high:[21,20,27,4],critic:21,minimum:[14,20,27,21],want:[11,27,24,25,5,14,16],onlin:[0,12,21,13],unfortun:[14,12,7],occur:[8,17,0,11,23,10,1,25,3,4,26,6,20],ratio:27,alwai:[17,27,25,12,13,5,7],end:[27,15],turn:[5,25,27,7],rather:[25,12,13,5,14,7],anoth:1,ordinari:[17,11,24,13],write:[8,9,21,20,22,17,27,19,12,7,3,5,14,15,13],how:[5,25,14],manpag:[9,18],env:27,webpag:12,verifi:[12,7],simpl:[5,25,13],updat:[5,21,12,7],product:[],resourc:[9,15,16],job:[5,27],max:[2,23,20,27],earlier:[7,1],pyliblzma:22,badli:[15,3],wrong:[15,3],endang:21,mai:[17,0,20,22,27,16,21,24,1,26,12,7,3,5,14,15,13],multipl:[8,15,23,19,2,3,20,27],redund:[5,25,21,12],secondari:[],data:[8,17,21,20,19,11,23,27,24,1,2,12,7,3,5,14,15,26,13],grow:[21,27],physic:[5,17,0,15,13],man:[18,7],indistinguish:21,"short":[0,12,13],attempt:[8,27,7,1],practic:[14,12],third:14,read:[8,17,21,20,19,23,1,2,12,3,14,15,27,13],neitheristhi:1,author:[27,7],favorit:[],apsw:22,element:27,issu:[17,9,0,22,27,16,10,21,12,7,26,6,13],inform:[9,27,1,25,26,20,13],maintain:27,combin:[14,12,27,20,1],allow:[17,0,20,27,10,25,26,12,4,5,6,14,15,13],enter:[2,23],exclus:14,volum:27,order:[17,13,1],talk:12,oper:[8,17,0,20,11,23,10,1,25,21,3,4,26,6,15,27],frontend:12,help:[9,22,16,26,12,13,3,5,15,7],east:[],over:[17,21,23,2,12,14,20,27,13],move:[21,15,1],soon:[],damag:[5,25,15],topsecret:[],increas:[14,12,27,20],appar:12,effici:7,still:[17,21,11,27,24,1,12,13],dynam:[21,22],paramet:1,group:[27,20],overwrit:[2,23],rogerbinn:22,fix:[0,25,12,13,5,7],inadvert:[17,13],better:[27,22,4],window:12,html:[],restart:[27,7],persist:1,mail:[21,15,22,16],main:[10,13],might:[17,0,16,10,19,13,26,6,7],documents_januari:[17,13],them:[17,11,24,1,12,15,13],good:[0,25,13,5,14,7],synopsi:[8,17,0,11,23,10,25,3,4,26,6,20],thei:[17,0,18,21,25,12,5,14,13],python:[27,22,1],promin:7,safe:[17,14,13],fuse4bsd:22,dai:[5,25],initi:[],dat:[5,25],terminolog:[9,1],therebi:12,instead:[17,11,24,1,12,13,7],interrupt:15,potenti:12,now:[0,22,25,12,5,13],bigger:[2,23],choic:22,term:[5,25,1],eventu:12,somewher:[8,17,0,11,23,10,3,26,6,20,13],name:[17,23,1,25,2,12,5,14,20,27,13],joesdomain:[],authent:[8,9,20,19,23,1,2,12,3,15,27],achiev:[5,17,21,27,13],mode:[27,20],each:[5,25,27,20,1],debug:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],found:[14,1],beneath:13,confid:[],side:1,mean:[21,12,7],compil:27,s3ql:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27],mkfifo:27,chunk:7,hard:[14,21],idea:[5,25,0,7,13],procedur:[17,13],realli:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,14,15,27,7],contrib:[5,14,27],meta:[26,14,13],"static":22,expect:[27,12,1],year:[5,25,21,12],s3_copi:[5,9],happen:[0,12,13,1],todo:[],special:[17,13],out:[21,12,7],lzma:[21,20,22,27],ftp:[],shown:12,network:[17,14,27,21,13],space:[17,21,7,13],open:[11,27,12,24],newli:[],log_fifo:27,content:[17,21,27,0,1,3,13],cloudfil:[9,12],suitabl:[21,22],rational:0,internet:[21,27],print:[8,17,0,20,22,11,23,10,24,19,25,2,3,4,26,6,15,27],eth0:27,bla:27,correct:[5,25],common:[17,0,12,13],foreground:[27,20],shut:[5,11,24,7],after:[17,0,21,1,12,14,15,13],insid:17,advanc:[9,13],migrat:5,documents_janurai:[],manipul:21,situat:14,given:7,free:[21,12],standard:[5,25,21,12,27],inod:[],reason:[10,27,24,1,25,12,13,5,14,19,7],base:27,theori:12,ask:[22,23,2,12,15,7],org:27,"byte":[],likelihood:12,afterward:14,bash:14,care:[17,21,7,13],wai:[0,27,21,1,12,13,14,7],thread:[5,27,20],befor:[17,21,11,27,24,1,12,13,7],guarante:[5,25,12],could:[17,13],success:[],refus:[5,25],keep:[5,25,0,13,1],recov:[0,13],thing:[15,3],length:12,rais:[27,20],place:[27,12],perman:[9,0,27,12,14,13],pycrypto:22,principl:27,confus:7,neglect:1,first:[21,22,27,1,12,14,15,7],origin:[],softwar:27,rang:[5,25],becaus:[17,21,27,1,12,5,13],directli:12,malici:[0,13],carri:21,onc:[0,11,27,21,24,12,14,20,13],clariti:[],s3q:[],number:[21,22,27,25,13,4,5,14,20,7],capac:21,restrict:[26,27,20],date:[5,25],instruct:22,alreadi:[17,12,22,7,13],done:[27,12],wrapper:[5,4],llfuse:22,stabl:21,otherwis:[27,20],miss:[25,1],s3c:12,size:[21,23,2,13,26,14,20,27,7],differ:[17,21,22,27,1,26,12,3,5,14,15,13],convent:[8,17,0,11,23,10,3,26,6,20,7],script:[5,14,27,7],profil:[27,20],unknown:21,interact:3,s3qllock:[9,0,18,10,5,14,13],system:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,27],least:[22,27,25,12,5,20],parallel:[5,14,20,27,4],checkpoint:1,attack:[0,7,13],necessarili:12,demonstr:5,s3qlrm:[9,0,18,10,25,5,13],termin:[11,24,7,1],lost:[12,1],john:12,"final":13,store:[8,9,21,20,19,23,1,25,2,12,3,5,14,15,27,7],low:[21,12],servi:7,luckili:[],consol:12,option:[0,2,3,4,5,6,7,8,10,11,13,14,15,17,19,20,22,23,24,25,26,27],especi:[14,21],shelf:[0,13],tool:12,copi:[17,9,21,1,13,4,5,14,15,7],inaccess:1,specifi:[8,20,19,23,27,1,25,2,12,3,5,15,26,7],arbitrari:[14,12],part:[21,27,1,25,4,5],pars:1,mostli:[],consult:[8,23,20,3],exactli:[5,17,25,13],than:[10,23,1,25,2,12,7,5,14,20,27,13],wide:[27,12,22],target:[8,17,20,27,19,3,14,15,13],cachedir:[8,15,23,19,2,3,20,27],whenev:[14,22,27,1],prevent:[2,0,23,13],remov:[17,9,0,22,27,10,25,26,7,5,6,13],eleg:21,tree:[17,9,0,10,4,5,21,13],second:[27,1,25,12,5,14,20],structur:[21,15],exampl:[21,1,25,13,5,14,7],project:12,matter:[26,14,15],temporarili:27,friend:14,video:27,minut:[5,25],led:1,pre:27,unencrypt:[2,23],sai:[17,13],comput:[5,25,21,27],entail:[],plaintext:[],explicit:14,ram:[],mind:1,argument:[26,15,3],peculiar:12,"13th":21,packag:[5,22],expir:27,increment:[],disadvantag:[17,13],need:[17,20,22,27,25,12,5,15,13],seem:[14,12],exclud:[0,13],paramiko:[],caus:[12,1],built:22,equival:[5,25],min:[27,20],irrepar:15,destroi:[0,13],moreov:13,blindli:7,atim:7,accuraci:[5,25],note:[17,9,21,22,11,27,24,25,12,7,4,5,14,15,13],also:[0,1,3,4,5,6,13,8,10,11,12,14,17,18,20,21,22,23,24,25,26,27],builtin:[],denomin:12,take:[17,21,13,3,26,14,15,7],which:[17,10,22,21,1,25,12,13,5,7],discrep:[],transmit:[],environ:[12,22],uplink:5,singl:[14,20,27],swordfish:1,mktemp:27,begin:1,sure:[20,22,27,12,14,15,7],unless:[2,0,23,13],distribut:[5,27,22],plenti:[],normal:[20,12,27,1],buffer:7,who:[11,27,20,24],compress:[9,21,27,5,20,13],most:[8,17,20,19,27,1,25,12,7,3,5,15,13],beta:21,said:[],rigor:[5,25],plan:[],strongest:[],stricli:[],choos:[],homepag:[8,17,0,11,23,10,3,26,6,20],"class":[8,17,0,11,23,10,25,26,3,4,5,6,20],three:[27,12,22],simplic:21,renam:21,correctli:[7,19],ship:[25,27,22,4],url:[8,20,19,23,1,2,12,3,15,27],doc:[8,17,0,11,23,10,26,3,5,6,20],clear:[17,15,13],later:[17,0,1,12,13,7],cover:14,drive:[0,13],destruct:[0,13],doe:[21,27,24,1,12,7],declar:21,snapshot:[17,9,21,26,13],runtim:[9,13],determin:[5,27,1],sourceforg:[],occasion:12,usual:27,hmac:21,gracefulli:[5,25],myawssecretaccesskei:[],theoret:14,show:25,carefulli:1,random:[],syntax:[27,19,2,26,15,13],connect:[14,12,27,21],permiss:[5,21,20,27],bucketnam:12,newest:[14,3],anywai:[],rotat:[8,15,27,19,3,20],redirect:27,current:[5,15,12,25,7],onli:[17,25,0,20,22,11,27,10,24,21,26,12,7,4,5,6,14,15,13],slow:7,locat:[8,17,0,11,23,10,1,3,26,6,20,13],execut:[5,15,22,13],transact:21,configur:[9,27,13],activ:[8,17,0,20,19,11,23,10,24,1,25,2,12,3,4,26,6,15,27,13],state:[5,25,21,7],haven:[],authinfo:[],latenc:[14,21,4],suppos:12,rich:12,factor:[5,12],folder:[17,22,13],local:[8,9,0,22,17,11,23,10,12,21,3,26,6,14,20,27],defin:[5,25,27,1],contribut:[5,9],variou:[26,15,3],get:[8,9,0,20,22,19,23,27,1,25,2,16,3,5,15,26,13],googlegroup:16,nasti:[0,13],stop:27,autom:[5,21],regularli:[17,13],ssl:7,s3rr:[],cannot:[5,25],ssh:[9,14,12],chat:12,report:[21,12,22,16,1],reconstruct:[5,25,1],requir:[8,21,1,27,19,25,26,5,22,20,7],myawsaccesskeyid:[],reveal:21,enabl:[],dramat:[14,12],intrins:14,method:[27,22],provid:[21,22,27,1,12,7],bad:14,statist:[6,13,9],though:[12,1],contain:[22,27,25,12,3,5,15],userspac:[],nowher:[],where:[26,15,3,1],valid:[12,13],caches:[26,27,20,13],wiki:[22,16],kernel:22,set:[5,14,20,27],bucket1:1,speak:27,bucket3:1,bucket2:1,startup:27,maximum:[5,2,23,20,27],see:[8,17,0,20,11,23,10,1,25,26,12,7,3,4,5,6,14,15,27,13],num:[27,20],s3qlcp:[5,9,17,18,13],fail:[12,22,7],close:[11,24],optimum:14,whatsoev:[0,21,13],best:[14,12,22,27],concern:1,infinit:21,awar:1,statu:[8,9,0,17,11,23,10,25,12,21,3,4,26,6,20,7],detect:[21,12,1],extend:21,inconveni:21,hopefulli:7,databas:21,boundari:[5,25],label:[2,23],favor:21,enough:[14,20,27],between:[5,25,27,20],"import":[5,22,1],neither:[0,13],across:21,attribut:21,check:[8,9,22,27,19,12,15,7],amazon:[9,21,1,12,5,7],august:[],kei:[21,12],weak:[],inconsist:7,southeast:[],lazi:[11,24],hardlink:[17,21,13],joe:[5,1],expire_backup:[5,9,18,25],solv:14,advertis:12,come:[5,14,21],local0:27,addit:[17,10,27,21,1,3,26,15,13],both:[17,21,13,1],protect:[0,21,13],accident:[2,0,23,13],last:1,irregular:[5,25],extens:21,someth:[17,13],region:[5,12],alon:1,quiet:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],against:[0,22,21,13],configpars:1,etc:[17,27,7,13],instanc:14,freeli:27,corrupt:1,com:[8,17,0,22,11,23,10,25,12,3,4,26,6,14,20,16],pcp:[5,9,14,18,4],independ:[21,20,27],load:27,among:12,simpli:[0,13],figur:1,inspir:[17,13],buti:[],period:[0,13],insist:14,batch:[8,27,19],written:[21,20,27,1],littl:[27,12,22],shutdown:27,linux:[27,22],averag:12,respect:12,guid:[8,9,18,23,3,20],assum:27,panel:12,duplic:[17,21,1,12,5,13],quit:22,worthless:[0,13],strong:[8,17,0,11,23,10,25,3,4,26,6,20],nikolau:27,west:[],rackspac:[9,12],devic:27,due:[12,7],been:[0,19,11,27,21,24,1,25,12,7,5,14,15,13],mark:[8,19],compon:21,secret:12,much:4,interpret:27,interest:13,subscrib:16,monthli:[17,13],immedi:[10,11,27,24,12,13],strategi:[5,25],legaci:12,infect:[0,13],upstart:[5,27,20],great:[0,13],ani:[8,17,0,22,23,21,1,25,2,12,16,5,13],rsync_arg:14,zero:14,understand:[27,20],togeth:1,els:15,tradition:[0,13],s3qlstat:[6,18,13,9],c11:[],present:12,"case":[17,0,22,21,1,25,5,14,15,13],replic:[5,17,21,13],trojan:[0,13],ident:[17,21,13,1],look:14,gnu:7,solid:21,plain:[2,23],servic:[21,12,1],zlib:[27,20],histor:1,trick:[9,14],documents_februari:[17,13],invok:[26,15],abov:[5,25,12,1],error:[8,9,0,20,17,11,23,10,1,25,21,3,4,26,6,19,7],login:[12,1],invoc:[5,25],ahax:4,loos:[12,1],jibbadup:[],earli:[22,7],runlevel:27,argpars:[],have:[17,0,20,22,11,23,16,21,24,1,25,2,12,7,4,5,14,15,27,13],advantag:[5,25,0,13],stdout:27,almost:14,therefor:[5,27,12,7,1],remount:12,worri:[],destin:[17,14,13,4],archiv:[21,12,22],gsutil:[],conf:[5,9],incom:[],revis:[15,3],dedic:[27,7],sever:[21,22,27,1,12,4,5,14,20],tamper:[5,25],unmount:[9,11,27,24,19,12,5,14,7],develop:[9,21,12,22],minim:21,perform:[9,21,22,27,1,26,12,3,4,5,14,15,7],media:12,make:[17,0,20,22,27,21,1,25,12,13,5,14,15,7],flushcach:[26,13],same:[17,27,1,25,12,5,14,15,13],"while":[0,22,27,21,24,12,26,13],handl:[17,21,27,25,12,13,5,14,7],renumb:[],unexpectedli:7,split:21,auto:[27,20],pai:12,document:[8,17,0,11,23,10,3,26,6,20,13],infer:[5,25],complet:[17,22,27,1,25,26,12,5,20,13],week:[5,25],geograph:12,http:[8,17,0,22,11,23,10,25,12,3,4,26,6,20],hostnam:12,closest:12,lie:17,optim:27,keyr:[],confidenti:[],upon:7,effect:[17,21,13,1],cycl:[5,25],hand:12,remot:[14,12,21],fuse:[27,7],temporari:12,user:[8,9,0,18,22,17,11,23,10,24,19,12,21,3,26,6,14,20,27,13],mani:[5,25,21,12,1],extern:[0,12,13],encrypt:[2,21,23,3,1],typic:[17,13],recent:[5,25,27,15,7],gss:12,appropri:27,kept:[8,15,27,19,3,20],older:15,nevertheless:[5,1],entri:[27,20,1],thu:1,irrelev:[],well:[0,20,27,10,1,25,5,15,13],without:[8,17,0,21,19,12,13,14,15,7],command:[0,1,2,3,4,5,6,7,8,9,10,11,13,15,17,18,19,20,22,23,24,25,26,27],thi:[0,1,2,3,4,5,6,7,8,10,12,13,14,15,16,17,19,20,21,22,23,24,25,26,27],filesystem:[27,19,2,14,20,23],gzip:21,credenti:[8,20,1,23,19,2,3,15,27],spend:14,ubuntu:22,left:7,compromis:14,identifi:[12,1],just:[8,17,0,20,11,23,10,24,19,25,2,12,3,4,26,6,14,15,27,13],less:[12,1],conform:21,tip:[9,14],lowest:12,obtain:[],rest:14,bandwidth:[5,21],heavili:12,touch:[17,13],openstack:[9,21,12],passphras:[9,12,15,3,1],roughli:27,speed:[5,27],yet:[12,7],web:12,viru:[0,13],detach:[11,24],homedir:[],easi:14,hint:[26,15,3],qualiti:12,point:[21,11,27,1,12,20],had:[5,17,25,13],except:1,param:15,thousand:[27,12],add:[0,13],spread:[2,23],nor:[0,13],versa:[17,13],input:[8,19],logger:27,subsequ:[5,25,12],launchpad:22,match:12,build:22,bin:[14,22,27],applic:[12,7,1],transpar:21,preserv:[5,21],big:[14,7],regard:[17,13],exception:[],traffic:12,know:[5,17,25,13],background:[11,24],amp:14,bit:21,password:[2,23,12,1],recurs:[5,9,10,13],presum:1,like:[17,0,27,21,12,13,4,20,7],loss:[12,1],daemon:[27,20],swift:[9,12],ctime:7,specif:[0,22,1,12,13,26,15,7],header:[22,1],should:[8,17,0,20,22,19,11,23,10,24,1,12,7,3,26,6,14,15,27,13],anyth:[],manual:[11,22,24,16],resolv:[12,16],noth:[0,13],princip:7,necessari:15,either:[12,13,3,26,15,7],leav:7,output:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],per:27,page:18,yyyi:[5,25],imagin:[5,25,0,13],right:14,old:[8,0,20,22,27,19,25,12,3,5,15,13],often:[14,12,1],deal:[],ll23bi:1,interv:[5,25,14,20,27],compat:[9,12],some:[8,17,0,20,22,11,23,10,24,1,25,26,12,21,3,4,5,6,19,7],umount:[9,18,11,27,24,7],self:22,certain:[],intern:12,"export":[27,20],flush:[27,13],home:[5,14,12],server:[14,12,7],fanat:12,librari:[22,7],"24h":[27,20],rsync:[17,0,13,4,5,14,7],confirm:[10,13],stronger:12,freebsd:22,avoid:[5,25],exec:27,definit:[5,25],februari:[17,13],protocol:1,usernam:1,equal:27,exit:[8,17,0,20,11,23,10,24,19,25,2,3,4,26,6,15,27],slash:12,cif:27,auth:12,backend:[8,9,17,11,23,24,1,2,12,7,3,26,14,20,27,13],creep:21,refer:[18,1],machin:[],core:5,plu:1,object:[2,20,12,27,23],run:[0,20,22,19,27,1,25,26,13,3,5,15,7],itself:[12,22,1],power:5,certif:[12,7],reach:[8,15,27,19,3,20],intellig:[5,25,21],view:18,usag:[5,17,25,13],symlink:21,solut:5,host:12,unreason:7,although:[21,10,7,13],januari:[17,13],bi23ll:1,immut:[9,0,10,5,21,14,13],"__version__":22,stage:[],sshf:[14,12],comparison:[],deflat:21,actual:[15,14,12,22],proce:22,memori:[],storebackup:[17,13],acl:21,messag:[8,15,23,19,2,3,20,27],fals:[27,20],commit:[24,7],backup:[17,9,0,27,21,1,25,12,3,5,14,15,13],disabl:[8,15,27,19,3,20],block:[21,11,27,24,1,13,26,7],repair:8,client:[],real:12,encount:[16,7],xyz:[],within:[13,1],encod:27,automat:[5,9,27,12,15],two:[17,21,15,13],down:[5,11,24,7],creation:[2,23,9],ahv:14,authinfo2:[8,15,23,19,2,3,20,27],ensur:[5,25,14,21],chang:[17,9,0,27,21,12,7,3,26,15,13],insuffici:7,storag:[8,9,0,20,19,17,11,23,21,24,1,2,12,7,3,5,14,15,27,13],your:[8,17,0,18,22,11,23,10,25,26,12,3,5,6,14,20,27,13],durabl:1,manag:[9,12,15],https_proxi:12,fast:[9,21,27,13],fusermount:[11,24,7],prepar:26,her:[0,13],transfer:[5,14,21],support:[17,21,27,12,13,20,7],question:16,s3_backup:[5,9],"long":[5,25,14,7,1],custom:12,avail:[8,0,20,23,25,12,7,3,5,15,27,13],start:[22,27,1,12,4,5,14],reli:[7,1],trigger:[12,13],includ:[22,21,12,18,7],lot:14,suit:12,"var":12,succeed:[8,17,0,11,23,10,25,3,4,26,6,20],individu:[27,20,4],"function":15,properli:5,tracker:[21,22,16],form:[5,25,12,1],offer:[17,12,13],forc:[8,2,23,19],basic:[],continu:24,sigstop:[27,20],satur:27,measur:5,newer:[12,22],don:[27,20],line:[26,21],downright:12,bug:[21,22,16,7],faster:[10,12,13],info:[8,15,27,19,3,26,20],commun:1,made:[17,21,0,14,13],furthermor:[21,1],consist:[12,1],possibl:[0,22,27,21,12,13,14,15,7],"default":[8,20,23,19,25,2,3,4,5,15,27],bucket:[9,23,1,2,12,3,5,15,27,7],displai:[],tell:[5,25,27],asynchron:21,authfil:[8,20,1,23,19,2,3,15,27],below:[12,13],limit:[17,0,27,10,1,26,12,7,5,6,20,13],s3ql_upstart:[5,9],unnot:12,problem:[8,17,0,16,21,1,25,12,7,5,14,13],similar:27,significantli:[5,22,1],featur:[17,9,0,21,1,12,13],creat:[17,0,20,23,10,25,2,12,5,21,15,27,13],classic:[],retriev:[14,12,27,20,4],dure:[15,20,12,27],day_hour:[5,25],decrypt:1,s3qlctrl:[26,9,14,18,13],strongli:[5,25],workaround:14,decreas:4,file:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,23,24,25,26,27],mtime:7,request:12,exist:[17,0,23,10,1,25,2,12,5,13],improv:[5,9,14,4],mybucket:14,dd_hh:[5,25],link:[12,22],probabl:[21,25,5,14,15,13],http_proxi:12,again:[0,12,24,13],readi:12,relatim:7,umask:27,googl:[8,9,0,22,17,11,23,10,25,12,21,3,4,26,6,20],sequenti:[],when:[8,0,20,19,27,21,1,25,12,7,3,4,5,14,15,13],detail:[5,14,12,7],prepend:12,prais:12,field:[],other:[17,0,22,27,10,21,12,16,26,6,20,13],futur:[17,0,10,13,26,6,7],rememb:[],test:[21,22],you:[17,0,20,22,19,11,23,16,10,24,1,25,2,12,7,5,14,15,27,13],shrink:21,rid:[0,13],particular:1,variabl:[12,22],intend:[],clean:[8,19],fulli:[],mountpoint:[27,24,12,26,6,14,20,13],"return":[8,17,0,11,23,10,24,25,3,4,26,6,20,7],fsck:[8,9,18,19,27,1,12,15],briefli:[],releas:21,track:[5,25],log:[8,20,19,27,1,12,3,26,15,13],consid:[12,16,1],sql:24,noleaf:7,ppa:22,pool:[],stai:[27,20],reduc:[5,12],infrequ:1,longer:[21,0,24,25,13,5,15,7],algorithm:[5,9,21,20,27],vice:[17,13],directori:[0,1,2,3,4,5,7,8,10,11,12,13,14,15,17,19,20,21,22,23,25,27],reliabl:[9,12,1],incompet:12,descript:[8,17,0,11,23,10,25,3,4,26,6,14,20,27],save:[25,14,21,1],rule:14,sftp:[9,12],depth:[],ignor:[],obj:[2,23,20,27],back:[0,12,13],time:[8,0,20,19,23,21,1,25,2,12,7,3,5,14,15,27,13],backward:[],s3qladm:[9,15,18,3],daili:[]},objtypes:{},titles:["The <strong class=\"program\">s3qllock</strong> command","General Information","File System Creation","The <strong class=\"program\">s3qladm</strong> command","The <strong class=\"program\">pcp</strong> command","Contributed Programs","The <strong class=\"program\">s3qlstat</strong> command","Known Issues","The <strong class=\"program\">fsck.s3ql</strong> command","S3QL User&#8217;s Guide","The <strong class=\"program\">s3qlrm</strong> command","The <strong class=\"program\">umount.s3ql</strong> command","Storage Backends","Advanced S3QL Features","Tips &amp; Tricks","Managing Buckets","Further Resources / Getting Help","The <strong class=\"program\">s3qlcp</strong> command","Manpages","Checking for Errors","The <strong class=\"program\">mount.s3ql</strong> command","About S3QL","Installation","The <strong class=\"program\">mkfs.s3ql</strong> command","Unmounting","The <strong class=\"program\">expire_backups</strong> command","The <strong class=\"program\">s3qlctrl</strong> command","Mounting"],objnames:{},filenames:["man/lock","general","mkfs","man/adm","man/pcp","contrib","man/stat","issues","man/fsck","index","man/rm","man/umount","backends","special","tips","adm","resources","man/cp","man/index","fsck","man/mount","about","installation","man/mkfs","umount","man/expire_backups","man/ctrl","mount"]}) \ No newline at end of file
diff --git a/doc/html/special.html b/doc/html/special.html
index 4d436ec..cb2db96 100644
--- a/doc/html/special.html
+++ b/doc/html/special.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Advanced S3QL Features &mdash; S3QL v1.8.1 documentation</title>
+ <title>Advanced S3QL Features &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Unmounting" href="umount.html" />
<link rel="prev" title="Mounting" href="mount.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="mount.html" title="Mounting"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -263,7 +263,7 @@ been flushed.</td>
<li class="right" >
<a href="mount.html" title="Mounting"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/tips.html b/doc/html/tips.html
index 9163035..09d76ed 100644
--- a/doc/html/tips.html
+++ b/doc/html/tips.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Tips &amp; Tricks &mdash; S3QL v1.8.1 documentation</title>
+ <title>Tips &amp; Tricks &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Known Issues" href="issues.html" />
<link rel="prev" title="Contributed Programs" href="contrib.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="contrib.html" title="Contributed Programs"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -187,7 +187,7 @@ details.</p>
<li class="right" >
<a href="contrib.html" title="Contributed Programs"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/html/umount.html b/doc/html/umount.html
index 869435e..614640b 100644
--- a/doc/html/umount.html
+++ b/doc/html/umount.html
@@ -7,13 +7,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Unmounting &mdash; S3QL v1.8.1 documentation</title>
+ <title>Unmounting &mdash; S3QL v1.9 documentation</title>
<link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
- VERSION: '1.8.1',
+ VERSION: '1.9',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
@@ -23,7 +23,7 @@
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="author" title="About these documents" href="about.html" />
- <link rel="top" title="S3QL v1.8.1 documentation" href="index.html" />
+ <link rel="top" title="S3QL v1.9 documentation" href="index.html" />
<link rel="next" title="Checking for Errors" href="fsck.html" />
<link rel="prev" title="Advanced S3QL Features" href="special.html" />
</head>
@@ -37,7 +37,7 @@
<li class="right" >
<a href="special.html" title="Advanced S3QL Features"
accesskey="P">previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="sphinxsidebar">
@@ -143,7 +143,7 @@ upload data in the background for a while longer.</p>
<li class="right" >
<a href="special.html" title="Advanced S3QL Features"
>previous</a> |</li>
- <li><a href="index.html">S3QL v1.8.1 documentation</a> &raquo;</li>
+ <li><a href="index.html">S3QL v1.9 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
diff --git a/doc/latex/manual.aux b/doc/latex/manual.aux
index 00e879d..0ba0e09 100644
--- a/doc/latex/manual.aux
+++ b/doc/latex/manual.aux
@@ -63,13 +63,18 @@
\newlabel{backends:reduced-redundancy-storage-rrs}{{4.2.1}{10}{Reduced Redundancy Storage (RRS)\relax }{subsection.4.2.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.2}Potential issues when using the US Standard storage region}{10}{subsection.4.2.2}}
\newlabel{backends:potential-issues-when-using-the-us-standard-storage-region}{{4.2.2}{10}{Potential issues when using the US Standard storage region\relax }{subsection.4.2.2}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {4.3}S3 compatible}{10}{section.4.3}}
-\newlabel{backends:s3-compatible}{{4.3}{10}{S3 compatible\relax }{section.4.3}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {4.4}Local}{11}{section.4.4}}
-\newlabel{backends:openstack}{{4.4}{11}{Local\relax }{section.4.4}{}}
-\newlabel{backends:local}{{4.4}{11}{Local\relax }{section.4.4}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {4.5}SSH/SFTP}{11}{section.4.5}}
-\newlabel{backends:ssh-sftp}{{4.5}{11}{SSH/SFTP\relax }{section.4.5}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.3}OpenStack/Swift}{10}{section.4.3}}
+\newlabel{backends:openstack-swift}{{4.3}{10}{OpenStack/Swift\relax }{section.4.3}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.4}RackSpace CloudFiles}{11}{section.4.4}}
+\newlabel{backends:rackspace-cloudfiles}{{4.4}{11}{RackSpace CloudFiles\relax }{section.4.4}{}}
+\newlabel{backends:swift}{{4.4}{11}{RackSpace CloudFiles\relax }{section.4.4}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.5}S3 compatible}{11}{section.4.5}}
+\newlabel{backends:s3-compatible}{{4.5}{11}{S3 compatible\relax }{section.4.5}{}}
+\newlabel{backends:rackspace}{{4.5}{11}{S3 compatible\relax }{section.4.5}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.6}Local}{11}{section.4.6}}
+\newlabel{backends:local}{{4.6}{11}{Local\relax }{section.4.6}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {4.7}SSH/SFTP}{12}{section.4.7}}
+\newlabel{backends:ssh-sftp}{{4.7}{12}{SSH/SFTP\relax }{section.4.7}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}File System Creation}{13}{chapter.5}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
@@ -95,16 +100,14 @@
\newlabel{mount::doc}{{7}{17}{Mounting\relax }{chapter.7}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Compression Algorithms}{18}{section.7.1}}
\newlabel{mount:compression-algorithms}{{7.1}{18}{Compression Algorithms\relax }{section.7.1}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {7.2}Parallel Compression}{18}{section.7.2}}
-\newlabel{mount:parallel-compression}{{7.2}{18}{Parallel Compression\relax }{section.7.2}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {7.3}Notes about Caching}{19}{section.7.3}}
-\newlabel{mount:notes-about-caching}{{7.3}{19}{Notes about Caching\relax }{section.7.3}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.1}Maximum Number of Cache Entries}{19}{subsection.7.3.1}}
-\newlabel{mount:maximum-number-of-cache-entries}{{7.3.1}{19}{Maximum Number of Cache Entries\relax }{subsection.7.3.1}{}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {7.3.2}Cache Flushing and Expiration}{19}{subsection.7.3.2}}
-\newlabel{mount:cache-flushing-and-expiration}{{7.3.2}{19}{Cache Flushing and Expiration\relax }{subsection.7.3.2}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {7.4}Automatic Mounting}{19}{section.7.4}}
-\newlabel{mount:automatic-mounting}{{7.4}{19}{Automatic Mounting\relax }{section.7.4}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {7.2}Notes about Caching}{18}{section.7.2}}
+\newlabel{mount:notes-about-caching}{{7.2}{18}{Notes about Caching\relax }{section.7.2}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.1}Maximum Number of Cache Entries}{19}{subsection.7.2.1}}
+\newlabel{mount:maximum-number-of-cache-entries}{{7.2.1}{19}{Maximum Number of Cache Entries\relax }{subsection.7.2.1}{}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.2}Cache Flushing and Expiration}{19}{subsection.7.2.2}}
+\newlabel{mount:cache-flushing-and-expiration}{{7.2.2}{19}{Cache Flushing and Expiration\relax }{subsection.7.2.2}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {7.3}Automatic Mounting}{19}{section.7.3}}
+\newlabel{mount:automatic-mounting}{{7.3}{19}{Automatic Mounting\relax }{section.7.3}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {8}Advanced S3QL Features}{21}{chapter.8}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
@@ -153,8 +156,8 @@
\newlabel{contrib:s3-backup-sh}{{11.4}{29}{s3\_backup.sh\relax }{section.11.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {11.5}expire\_backups.py}{30}{section.11.5}}
\newlabel{contrib:expire-backups-py}{{11.5}{30}{expire\_backups.py\relax }{section.11.5}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {11.6}s3ql.conf}{31}{section.11.6}}
-\newlabel{contrib:s3ql-conf}{{11.6}{31}{s3ql.conf\relax }{section.11.6}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {11.6}s3ql\_upstart.conf}{31}{section.11.6}}
+\newlabel{contrib:s3ql-upstart-conf}{{11.6}{31}{s3ql\_upstart.conf\relax }{section.11.6}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {12}Tips \& Tricks}{33}{chapter.12}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
diff --git a/doc/latex/manual.log b/doc/latex/manual.log
index 3670d6c..28a69ce 100644
--- a/doc/latex/manual.log
+++ b/doc/latex/manual.log
@@ -1,4 +1,4 @@
-This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2011.11.28) 6 DEC 2011 09:16
+This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2011.10.2) 21 JAN 2012 13:29
entering extended mode
%&-line parsing enabled.
**manual.tex
@@ -794,12 +794,12 @@ p/pdftex.map): fontmap entry for `ugqbo8r' already exists, duplicates ignored
LaTeX Font Info: Font shape `T1/ptm/bx/n' in size <10> not available
(Font) Font shape `T1/ptm/b/n' tried instead on input line 2.
LaTeX Font Info: Font shape `T1/phv/bx/n' in size <10> not available
-(Font) Font shape `T1/phv/b/n' tried instead on input line 40.
+(Font) Font shape `T1/phv/b/n' tried instead on input line 41.
pdfTeX warning (ext4): destination with the same identifier (name{page.i}) has
been already used, duplicate ignored
<to be read again>
\relax
-l.40 ...{\numberline {9}Unmounting}{25}{chapter.9}
+l.41 ...{\numberline {9}Unmounting}{25}{chapter.9}
[1
])
@@ -832,11 +832,11 @@ File: t1pcr.fd 2001/06/04 font definitions for T1/pcr.
] [4]
Chapter 3.
LaTeX Font Info: Font shape `T1/pcr/m/it' in size <9> not available
-(Font) Font shape `T1/pcr/m/sl' tried instead on input line 382.
+(Font) Font shape `T1/pcr/m/sl' tried instead on input line 376.
[5
]
-Underfull \hbox (badness 10000) in paragraph at lines 427--428
+Underfull \hbox (badness 10000) in paragraph at lines 421--422
[]
@@ -846,36 +846,36 @@ Underfull \hbox (badness 10000) in paragraph at lines 427--428
Chapter 4.
[9]
LaTeX Font Info: Font shape `T1/phv/bx/n' in size <12> not available
-(Font) Font shape `T1/phv/b/n' tried instead on input line 562.
-[10] [11] [12
-
-]
+(Font) Font shape `T1/phv/b/n' tried instead on input line 556.
+[10] [11] [12]
Chapter 5.
-Underfull \hbox (badness 10000) in paragraph at lines 699--701
+Underfull \hbox (badness 10000) in paragraph at lines 737--739
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
-[13] [14
+[13
+
+] [14
]
Chapter 6.
-Underfull \hbox (badness 10000) in paragraph at lines 759--761
+Underfull \hbox (badness 10000) in paragraph at lines 797--799
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
[15]
-Underfull \hbox (badness 10000) in paragraph at lines 834--835
+Underfull \hbox (badness 10000) in paragraph at lines 872--873
[]
[16]
Chapter 7.
-Underfull \hbox (badness 10000) in paragraph at lines 864--866
+Underfull \hbox (badness 10000) in paragraph at lines 902--904
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
@@ -895,7 +895,7 @@ Chapter 9.
]
Chapter 10.
-Underfull \hbox (badness 10000) in paragraph at lines 1334--1336
+Underfull \hbox (badness 10000) in paragraph at lines 1361--1363
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
@@ -905,7 +905,7 @@ Underfull \hbox (badness 10000) in paragraph at lines 1334--1336
]
Chapter 11.
[29]
-Underfull \hbox (badness 10000) in paragraph at lines 1473--1478
+Underfull \hbox (badness 10000) in paragraph at lines 1500--1505
[]\T1/ptm/b/n/10 expire_backups \T1/ptm/m/n/10 us-age is sim-ple. It re-quires
back-ups to have names of the forms
[]
@@ -921,7 +921,7 @@ Chapter 13.
] [36]
Chapter 14.
-Underfull \hbox (badness 10000) in paragraph at lines 1728--1730
+Underfull \hbox (badness 10000) in paragraph at lines 1755--1757
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
@@ -929,25 +929,25 @@ Underfull \hbox (badness 10000) in paragraph at lines 1728--1730
[37
]
-Underfull \hbox (badness 10000) in paragraph at lines 1807--1809
+Underfull \hbox (badness 10000) in paragraph at lines 1834--1836
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
[38]
-Underfull \hbox (badness 10000) in paragraph at lines 1886--1888
+Underfull \hbox (badness 10000) in paragraph at lines 1913--1915
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
[39] [40] [41] [42] [43] [44] [45] [46]
-Underfull \hbox (badness 10000) in paragraph at lines 2451--2453
+Underfull \hbox (badness 10000) in paragraph at lines 2478--2480
[]\T1/ptm/m/n/10 Read au-then-ti-ca-tion cre-den-tials from this file (de-fault
:
[]
[47] [48]
-Underfull \hbox (badness 10000) in paragraph at lines 2594--2599
+Underfull \hbox (badness 10000) in paragraph at lines 2621--2626
[]\T1/ptm/b/n/10 expire_backups \T1/ptm/m/n/10 us-age is sim-ple. It re-quires
back-ups to have names of the forms
[]
@@ -959,13 +959,13 @@ Chapter 15.
No file manual.ind.
[51] (./manual.aux) )
Here is how much of TeX's memory you used:
- 8329 strings out of 495021
- 113346 string characters out of 1181034
- 199894 words of memory out of 3000000
- 11122 multiletter control sequences out of 15000+50000
+ 8333 strings out of 495021
+ 113423 string characters out of 1181035
+ 200000 words of memory out of 3000000
+ 11125 multiletter control sequences out of 15000+50000
58515 words of font info for 65 fonts, out of 3000000 for 9000
29 hyphenation exceptions out of 8191
- 45i,12n,48p,278b,492s stack positions out of 5000i,500n,10000p,200000b,50000s
+ 45i,12n,49p,278b,469s stack positions out of 5000i,500n,10000p,200000b,50000s
{/usr/share/texmf-texlive/fonts/enc/dvips/base/8r.enc}</us
r/share/texmf-texlive/fonts/type1/urw/courier/ucrr8a.pfb></usr/share/texmf-texl
ive/fonts/type1/urw/courier/ucrro8a.pfb></usr/share/texmf-texlive/fonts/type1/u
@@ -973,9 +973,9 @@ rw/helvetic/uhvb8a.pfb></usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvbo
8a.pfb></usr/share/texmf-texlive/fonts/type1/urw/times/utmb8a.pfb></usr/share/t
exmf-texlive/fonts/type1/urw/times/utmr8a.pfb></usr/share/texmf-texlive/fonts/t
ype1/urw/times/utmri8a.pfb>
-Output written on manual.pdf (55 pages, 288374 bytes).
+Output written on manual.pdf (55 pages, 291785 bytes).
PDF statistics:
- 803 PDF objects out of 1000 (max. 8388607)
- 210 named destinations out of 1000 (max. 500000)
- 489 words of extra memory for PDF output out of 10000 (max. 10000000)
+ 814 PDF objects out of 1000 (max. 8388607)
+ 211 named destinations out of 1000 (max. 500000)
+ 497 words of extra memory for PDF output out of 10000 (max. 10000000)
diff --git a/doc/latex/manual.out b/doc/latex/manual.out
index e1db91b..7c6943b 100644
--- a/doc/latex/manual.out
+++ b/doc/latex/manual.out
@@ -11,9 +11,11 @@
\BOOKMARK [0][-]{chapter.4}{Storage Backends}{}
\BOOKMARK [1][-]{section.4.1}{Google Storage}{chapter.4}
\BOOKMARK [1][-]{section.4.2}{Amazon S3}{chapter.4}
-\BOOKMARK [1][-]{section.4.3}{S3 compatible}{chapter.4}
-\BOOKMARK [1][-]{section.4.4}{Local}{chapter.4}
-\BOOKMARK [1][-]{section.4.5}{SSH/SFTP}{chapter.4}
+\BOOKMARK [1][-]{section.4.3}{OpenStack/Swift}{chapter.4}
+\BOOKMARK [1][-]{section.4.4}{RackSpace CloudFiles}{chapter.4}
+\BOOKMARK [1][-]{section.4.5}{S3 compatible}{chapter.4}
+\BOOKMARK [1][-]{section.4.6}{Local}{chapter.4}
+\BOOKMARK [1][-]{section.4.7}{SSH/SFTP}{chapter.4}
\BOOKMARK [0][-]{chapter.5}{File System Creation}{}
\BOOKMARK [0][-]{chapter.6}{Managing Buckets}{}
\BOOKMARK [1][-]{section.6.1}{Changing the Passphrase}{chapter.6}
@@ -22,9 +24,8 @@
\BOOKMARK [1][-]{section.6.4}{Restoring Metadata Backups}{chapter.6}
\BOOKMARK [0][-]{chapter.7}{Mounting}{}
\BOOKMARK [1][-]{section.7.1}{Compression Algorithms}{chapter.7}
-\BOOKMARK [1][-]{section.7.2}{Parallel Compression}{chapter.7}
-\BOOKMARK [1][-]{section.7.3}{Notes about Caching}{chapter.7}
-\BOOKMARK [1][-]{section.7.4}{Automatic Mounting}{chapter.7}
+\BOOKMARK [1][-]{section.7.2}{Notes about Caching}{chapter.7}
+\BOOKMARK [1][-]{section.7.3}{Automatic Mounting}{chapter.7}
\BOOKMARK [0][-]{chapter.8}{Advanced S3QL Features}{}
\BOOKMARK [1][-]{section.8.1}{Snapshotting and Copy-on-Write}{chapter.8}
\BOOKMARK [1][-]{section.8.2}{Getting Statistics}{chapter.8}
@@ -39,7 +40,7 @@
\BOOKMARK [1][-]{section.11.3}{pcp.py}{chapter.11}
\BOOKMARK [1][-]{section.11.4}{s3\137backup.sh}{chapter.11}
\BOOKMARK [1][-]{section.11.5}{expire\137backups.py}{chapter.11}
-\BOOKMARK [1][-]{section.11.6}{s3ql.conf}{chapter.11}
+\BOOKMARK [1][-]{section.11.6}{s3ql\137upstart.conf}{chapter.11}
\BOOKMARK [0][-]{chapter.12}{Tips \046 Tricks}{}
\BOOKMARK [1][-]{section.12.1}{SSH Backend}{chapter.12}
\BOOKMARK [1][-]{section.12.2}{Permanently mounted backup file system}{chapter.12}
diff --git a/doc/latex/manual.tex b/doc/latex/manual.tex
index 8509c74..fdb46f7 100644
--- a/doc/latex/manual.tex
+++ b/doc/latex/manual.tex
@@ -12,8 +12,8 @@
\title{S3QL Documentation}
-\date{December 06, 2011}
-\release{1.8.1}
+\date{January 21, 2012}
+\release{1.9}
\author{Nikolaus Rath}
\newcommand{\sphinxlogo}{}
\renewcommand{\releasename}{Release}
@@ -237,20 +237,14 @@ so under Linux you should actually use \emph{2.6.26 or newer whenever
possible}.
\item {}
-\href{http://www.python.org/}{Python}, version 2.6.6 or newer, but not
-Python 3.x. Make sure to also install the development headers.
+\href{http://www.python.org/}{Python} 2.7 (but not Python 3.x). Make
+sure to also install the development headers.
\item {}
The \href{http://pypi.python.org/pypi/pycryptopp}{PyCrypto++ Python Module}. To check if this module
is installed, try to execute \code{python -c 'import pycryptopp'}.
\item {}
-The \href{http://pypi.python.org/pypi/argparse}{argparse Python Module}. To check if this module is
-installed, try to execute \code{python -c 'import argparse; print
-argparse.\_\_version\_\_'}. If argparse is installed, this will print
-the version number. You need version 1.1 or later.
-
-\item {}
\href{http://www.sqlite.org/}{SQLite} version 3.7.0 or newer. SQLite
has to be installed as a \emph{shared library} with development headers.
@@ -430,8 +424,7 @@ On the plus side, if a backend looses or corrupts some of the stored
data, S3QL \emph{will} detect the problem. Missing data will be detected
when running \code{fsck.s3ql} or when attempting to access the data in the
mounted file system. In the later case you will get an IO Error, and
-on unmounting S3QL will warn you that the file system is damaged and
-you need to run \code{fsck.s3ql}.
+the S3QL mount point will become inaccessible.
\code{fsck.s3ql} will report all the affected files and move them into the
\code{/lost+found} directory of the file system.
@@ -482,7 +475,8 @@ will ever be a concern.
\chapter{Storage Backends}
\label{backends:id1}\label{backends::doc}\label{backends:storage-backends}
-The following backends are currently available in S3QL:
+All storage backends respect the \code{http\_proxy} and \code{https\_proxy}
+environment variables.
\section{Google Storage}
@@ -624,13 +618,57 @@ consistency guarantees that completely eliminate any of the described
problems.
+\section{OpenStack/Swift}
+\label{backends:openstack-swift}
+\href{http://www.openstack.org/}{OpenStack} is an open-source cloud server application suite. \href{http://openstack.org/projects/storage/}{Swift} is
+the cloud storage module of OpenStack. Swift/OpenStack storage is
+offered by many different companies.
+
+The storage URL for the OpenStack backend has the form
+
+\begin{Verbatim}[commandchars=\\\{\}]
+\PYG{l}{swift://}\PYG{n+nv}{\textless{}hostname\textgreater{}}\PYG{g+ge}{[:\textless{}port\textgreater{}]}\PYG{l}{/}\PYG{n+nv}{\textless{}container\textgreater{}}\PYG{g+ge}{[/\textless{}prefix\textgreater{}]}
+\end{Verbatim}
+
+Note that the storage container must already exist. Most OpenStack
+providers offer a web frontend that you can use to create storage
+containers. \emph{prefix} can be an arbitrary prefix that will be prepended
+to all object names used by S3QL. This allows you to store several
+S3QL file systems in the same container.
+
+The OpenStack backend always uses HTTPS connections. Note, however,
+that at this point S3QL does not verify the server certificate (cf.
+\href{http://code.google.com/p/s3ql/issues/detail?id=267}{issue 267}).
+
+
+\section{RackSpace CloudFiles}
+\label{backends:rackspace-cloudfiles}\label{backends:swift}
+\href{http://www.rackspace.com/}{RackSpace} CloudFiles uses OpenStack internally, so you can use the
+OpenStack/Swift backend (see above). The hostname for CloudFiles
+containers is \code{auth.api.rackspacecloud.com}. Use your normal
+RackSpace user name for the backend login, and your RackSpace API key
+as the backend passphrase. You can create a storage container for S3QL
+using the \href{https://manage.rackspacecloud.com/}{Control Panel} (go to
+\emph{Cloud Files} under \emph{Hosting}).
+
+You should note that opinions about RackSpace differ widely among S3QL
+users and developers. On the one hand, people praise RackSpace for
+their backing of the (open source) OpenStack project. On the other
+hand, their heavily advertised ``fanatical support'' is in practice
+often not only \href{http://code.google.com/p/s3ql/issues/detail?id=243\#c5}{less than helpful}, but their
+support agents also seem to be \href{http://code.google.com/p/s3ql/issues/detail?id=243\#c11}{downright incompetent}. However,
+there are reports that the support quality increases dramatically once
+you are a customer and use the ``Live Chat'' link when you are logged
+into the control panel.
+
+
\section{S3 compatible}
-\label{backends:s3-compatible}
-S3QL is also able to access other, S3 compatible storage services like
-\href{http://www.openstack.org/}{OpenStack} for which no specific backend exists. Note that when
-accessing such services, only the lowest common denominator of
-available features can be used, so it is generally recommended to use
-a service specific backend instead.
+\label{backends:s3-compatible}\label{backends:rackspace}
+S3QL is also able to access other, S3 compatible storage services for
+which no specific backend exists. Note that when accessing such
+services, only the lowest common denominator of available features can
+be used, so it is generally recommended to use a service specific
+backend instead.
The storage URL for accessing an arbitrary S3 compatible storage
service is
@@ -650,7 +688,7 @@ not verify the server certificate (cf. \href{http://code.google.com/p/s3ql/issue
\section{Local}
-\label{backends:openstack}\label{backends:local}
+\label{backends:local}
S3QL is also able to store its data on the local file system. This can
be used to backup data on external media, or to access external
services that S3QL can not talk to directly (e.g., it is possible to
@@ -943,36 +981,20 @@ For maximum file system performance, the best algorithm therefore
depends on your network connection speed: the compression algorithm
should be fast enough to saturate your network connection.
-To find the optimal algorithm for your system, S3QL ships with a
-program called \code{benchmark.py} in the \code{contrib} directory. You should
-run this program on a file that has a size that is roughly equal to
-the block size of your file system and has similar contents. It will
-then determine the compression speeds for the different algorithms and
-the upload speeds for the specified backend and recommend the best
-algorithm that is fast enough to saturate your network connection.
+To find the optimal algorithm and number of parallel compression
+threads for your system, S3QL ships with a program called
+\code{benchmark.py} in the \code{contrib} directory. You should run this program
+on a file that has a size that is roughly equal to the block size of
+your file system and has similar contents. It will then determine the
+compression speeds for the different algorithms and the upload speeds
+for the specified backend and recommend the best algorithm that is
+fast enough to saturate your network connection.
Obviously you should make sure that there is little other system load
when you run \code{benchmark.py} (i.e., don't compile software or encode
videos at the same time).
-\section{Parallel Compression}
-\label{mount:parallel-compression}
-If you are running S3QL on a system with multiple cores, you might
-want to set the \code{-{-}threads} value larger than one. This will
-instruct S3QL to compress and encrypt several blocks at the same time.
-
-If you want to do this in combination with using the LZMA compression
-algorithm, you should keep an eye on memory usage though. Every
-LZMA compression threads requires about 200 MB of RAM.
-
-\begin{notice}{note}{Note:}
-To determine the optimal compression algorithm for your network
-connection when using multiple threads, you can pass the
-\code{-{-}compression-threads} option to \code{contrib/benchmark.py}.
-\end{notice}
-
-
\section{Notes about Caching}
\label{mount:notes-about-caching}
S3QL maintains a local cache of the file system data to speed up
@@ -1029,6 +1051,9 @@ as follows (and should be placed in \code{/etc/init/}):
\PYG{l}{env BUCKET="s3://my-backup-bla"}
\PYG{l}{env MOUNTPOINT="/mnt/backup"}
+\PYG{l}{env USER="myusername"}
+\PYG{l}{env AUTHFILE="/path/to/authinfo2"}
+
\PYG{l}{expect stop}
\PYG{l}{script}
@@ -1041,12 +1066,14 @@ as follows (and should be placed in \code{/etc/init/}):
\PYG{l}{ rm -rf "\PYGZdl{}DIR"}
\PYG{l}{ \PYGZsh{} Check and mount file system}
-\PYG{l}{ fsck.s3ql --batch "\PYGZdl{}BUCKET"}
-\PYG{l}{ exec mount.s3ql --upstart "\PYGZdl{}BUCKET" "\PYGZdl{}MOUNTPOINT"}
+\PYG{l}{ su -s /bin/sh -c 'exec "\PYGZdl{}0" "\PYGZdl{}@"' "\PYGZdl{}USER" -- \PYGZbs{}}
+\PYG{l}{ fsck.s3ql --batch --authfile "\PYGZdl{}AUTHFILE" "\PYGZdl{}BUCKET"}
+\PYG{l}{ exec su -s /bin/sh -c 'exec "\PYGZdl{}0" "\PYGZdl{}@"' "\PYGZdl{}USER" -- \PYGZbs{}}
+\PYG{l}{ mount.s3ql --upstart --authfile "\PYGZdl{}AUTHFILE" "\PYGZdl{}BUCKET" "\PYGZdl{}MOUNTPOINT"}
\PYG{l}{end script}
\PYG{l}{pre-stop script}
-\PYG{l}{ umount.s3ql "\PYGZdl{}MOUNTPOINT"}
+\PYG{l}{ su -s /bin/sh -c 'exec "\PYGZdl{}0" "\PYGZdl{}@"' "\PYGZdl{}USER" -- umount.s3ql "\PYGZdl{}MOUNTPOINT"}
\PYG{l}{end script}
\end{Verbatim}
@@ -1502,11 +1529,11 @@ For a full list of available options, run \textbf{expire\_backups.py
--help}.
-\section{s3ql.conf}
-\label{contrib:s3ql-conf}
-\code{s3ql.conf} is an example upstart job definition file. It defines a
-job that automatically mounts an S3QL file system on system start, and
-properly unmounts it when the system is shut down.
+\section{s3ql\_upstart.conf}
+\label{contrib:s3ql-upstart-conf}
+\code{s3ql\_upstart.conf} is an example upstart job definition file. It
+defines a job that automatically mounts an S3QL file system on system
+start, and properly unmounts it when the system is shut down.
\chapter{Tips \& Tricks}
diff --git a/doc/latex/manual.toc b/doc/latex/manual.toc
index d52b4fc..772a0fb 100644
--- a/doc/latex/manual.toc
+++ b/doc/latex/manual.toc
@@ -14,9 +14,11 @@
\contentsline {section}{\numberline {4.2}Amazon S3}{9}{section.4.2}
\contentsline {subsection}{\numberline {4.2.1}Reduced Redundancy Storage (RRS)}{10}{subsection.4.2.1}
\contentsline {subsection}{\numberline {4.2.2}Potential issues when using the US Standard storage region}{10}{subsection.4.2.2}
-\contentsline {section}{\numberline {4.3}S3 compatible}{10}{section.4.3}
-\contentsline {section}{\numberline {4.4}Local}{11}{section.4.4}
-\contentsline {section}{\numberline {4.5}SSH/SFTP}{11}{section.4.5}
+\contentsline {section}{\numberline {4.3}OpenStack/Swift}{10}{section.4.3}
+\contentsline {section}{\numberline {4.4}RackSpace CloudFiles}{11}{section.4.4}
+\contentsline {section}{\numberline {4.5}S3 compatible}{11}{section.4.5}
+\contentsline {section}{\numberline {4.6}Local}{11}{section.4.6}
+\contentsline {section}{\numberline {4.7}SSH/SFTP}{12}{section.4.7}
\contentsline {chapter}{\numberline {5}File System Creation}{13}{chapter.5}
\contentsline {chapter}{\numberline {6}Managing Buckets}{15}{chapter.6}
\contentsline {section}{\numberline {6.1}Changing the Passphrase}{15}{section.6.1}
@@ -25,11 +27,10 @@
\contentsline {section}{\numberline {6.4}Restoring Metadata Backups}{16}{section.6.4}
\contentsline {chapter}{\numberline {7}Mounting}{17}{chapter.7}
\contentsline {section}{\numberline {7.1}Compression Algorithms}{18}{section.7.1}
-\contentsline {section}{\numberline {7.2}Parallel Compression}{18}{section.7.2}
-\contentsline {section}{\numberline {7.3}Notes about Caching}{19}{section.7.3}
-\contentsline {subsection}{\numberline {7.3.1}Maximum Number of Cache Entries}{19}{subsection.7.3.1}
-\contentsline {subsection}{\numberline {7.3.2}Cache Flushing and Expiration}{19}{subsection.7.3.2}
-\contentsline {section}{\numberline {7.4}Automatic Mounting}{19}{section.7.4}
+\contentsline {section}{\numberline {7.2}Notes about Caching}{18}{section.7.2}
+\contentsline {subsection}{\numberline {7.2.1}Maximum Number of Cache Entries}{19}{subsection.7.2.1}
+\contentsline {subsection}{\numberline {7.2.2}Cache Flushing and Expiration}{19}{subsection.7.2.2}
+\contentsline {section}{\numberline {7.3}Automatic Mounting}{19}{section.7.3}
\contentsline {chapter}{\numberline {8}Advanced S3QL Features}{21}{chapter.8}
\contentsline {section}{\numberline {8.1}Snapshotting and Copy-on-Write}{21}{section.8.1}
\contentsline {subsection}{\numberline {8.1.1}Snapshotting vs Hardlinking}{21}{subsection.8.1.1}
@@ -45,7 +46,7 @@
\contentsline {section}{\numberline {11.3}pcp.py}{29}{section.11.3}
\contentsline {section}{\numberline {11.4}s3\_backup.sh}{29}{section.11.4}
\contentsline {section}{\numberline {11.5}expire\_backups.py}{30}{section.11.5}
-\contentsline {section}{\numberline {11.6}s3ql.conf}{31}{section.11.6}
+\contentsline {section}{\numberline {11.6}s3ql\_upstart.conf}{31}{section.11.6}
\contentsline {chapter}{\numberline {12}Tips \& Tricks}{33}{chapter.12}
\contentsline {section}{\numberline {12.1}SSH Backend}{33}{section.12.1}
\contentsline {section}{\numberline {12.2}Permanently mounted backup file system}{33}{section.12.2}
diff --git a/doc/man/fsck.s3ql.1 b/doc/man/fsck.s3ql.1
index 2ca7ee4..97e41d1 100644
--- a/doc/man/fsck.s3ql.1
+++ b/doc/man/fsck.s3ql.1
@@ -1,4 +1,4 @@
-.TH "FSCK.S3QL" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "FSCK.S3QL" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
fsck.s3ql \- Check an S3QL file system for errors
.
diff --git a/doc/man/mkfs.s3ql.1 b/doc/man/mkfs.s3ql.1
index 46e5666..dbff146 100644
--- a/doc/man/mkfs.s3ql.1
+++ b/doc/man/mkfs.s3ql.1
@@ -1,4 +1,4 @@
-.TH "MKFS.S3QL" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "MKFS.S3QL" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
mkfs.s3ql \- Create an S3QL file system
.
diff --git a/doc/man/mount.s3ql.1 b/doc/man/mount.s3ql.1
index ac1ab59..651d04e 100644
--- a/doc/man/mount.s3ql.1
+++ b/doc/man/mount.s3ql.1
@@ -1,4 +1,4 @@
-.TH "MOUNT.S3QL" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "MOUNT.S3QL" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
mount.s3ql \- Mount an S3QL file system
.
diff --git a/doc/man/s3qladm.1 b/doc/man/s3qladm.1
index ccfc30b..2c11f86 100644
--- a/doc/man/s3qladm.1
+++ b/doc/man/s3qladm.1
@@ -1,4 +1,4 @@
-.TH "S3QLADM" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLADM" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qladm \- Manage S3QL buckets
.
diff --git a/doc/man/s3qlcp.1 b/doc/man/s3qlcp.1
index db3dad7..3fe61a4 100644
--- a/doc/man/s3qlcp.1
+++ b/doc/man/s3qlcp.1
@@ -1,4 +1,4 @@
-.TH "S3QLCP" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLCP" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qlcp \- Copy-on-write replication on S3QL file systems
.
diff --git a/doc/man/s3qlctrl.1 b/doc/man/s3qlctrl.1
index dfbd966..4592b60 100644
--- a/doc/man/s3qlctrl.1
+++ b/doc/man/s3qlctrl.1
@@ -1,4 +1,4 @@
-.TH "S3QLCTRL" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLCTRL" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qlctrl \- Control a mounted S3QL file system
.
diff --git a/doc/man/s3qllock.1 b/doc/man/s3qllock.1
index 292b305..bae3e72 100644
--- a/doc/man/s3qllock.1
+++ b/doc/man/s3qllock.1
@@ -1,4 +1,4 @@
-.TH "S3QLLOCK" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLLOCK" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qllock \- Make trees on an S3QL file system immutable
.
diff --git a/doc/man/s3qlrm.1 b/doc/man/s3qlrm.1
index d5968d0..5a66944 100644
--- a/doc/man/s3qlrm.1
+++ b/doc/man/s3qlrm.1
@@ -1,4 +1,4 @@
-.TH "S3QLRM" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLRM" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qlrm \- Fast tree removal on S3QL file systems
.
diff --git a/doc/man/s3qlstat.1 b/doc/man/s3qlstat.1
index 9cdfe4d..a7cfe46 100644
--- a/doc/man/s3qlstat.1
+++ b/doc/man/s3qlstat.1
@@ -1,4 +1,4 @@
-.TH "S3QLSTAT" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "S3QLSTAT" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
s3qlstat \- Gather S3QL file system statistics
.
diff --git a/doc/man/umount.s3ql.1 b/doc/man/umount.s3ql.1
index c9a4401..02b17f7 100644
--- a/doc/man/umount.s3ql.1
+++ b/doc/man/umount.s3ql.1
@@ -1,4 +1,4 @@
-.TH "UMOUNT.S3QL" "1" "December 06, 2011" "1.8.1" "S3QL"
+.TH "UMOUNT.S3QL" "1" "January 21, 2012" "1.9" "S3QL"
.SH NAME
umount.s3ql \- Unmount an S3QL file system
.
diff --git a/doc/manual.pdf b/doc/manual.pdf
index c3c0842..cdf4bca 100644
--- a/doc/manual.pdf
+++ b/doc/manual.pdf
Binary files differ