diff options
Diffstat (limited to 'doc/doc_index/0.2')
23 files changed, 3315 insertions, 0 deletions
diff --git a/doc/doc_index/0.2/_sources/index.txt b/doc/doc_index/0.2/_sources/index.txt new file mode 100644 index 00000000..d05a8c98 --- /dev/null +++ b/doc/doc_index/0.2/_sources/index.txt @@ -0,0 +1,22 @@ +.. GitPython documentation master file, created by sphinx-quickstart on Sat Jan 24 11:51:01 2009. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +GitPython Documentation +======================= + +.. toctree:: + :maxdepth: 3 + + intro + tutorial + reference + roadmap + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/doc_index/0.2/_sources/intro.txt b/doc/doc_index/0.2/_sources/intro.txt new file mode 100644 index 00000000..476ab4ec --- /dev/null +++ b/doc/doc_index/0.2/_sources/intro.txt @@ -0,0 +1,93 @@ +.. _intro_toplevel: + +================== +Overview / Install +================== + +GitPython is a python library used to interact with Git repositories. + +GitPython was a port of the grit_ library in Ruby created by +Tom Preston-Werner and Chris Wanstrath, but grew beyond its heritage through its improved design and performance. + +.. _grit: http://grit.rubyforge.org + +Requirements +============ + +* Git_ tested with 1.5.3.7 +* Requires Git_ 1.6.5.4 or newer if index.add function is to be used +* `Python Nose`_ - used for running the tests +* `Mock by Michael Foord`_ used for tests. Requires 0.5 + +.. _Git: http://git-scm.com/ +.. _Python Nose: http://code.google.com/p/python-nose/ +.. _Mock by Michael Foord: http://www.voidspace.org.uk/python/mock.html + +Installing GitPython +==================== + +Installing GitPython is easily done using +`setuptools`_. Assuming it is +installed, just run the following from the command-line: + +.. sourcecode:: none + + # easy_install GitPython + +This command will download the latest version of GitPython from the +`Python Package Index <http://pypi.python.org/pypi/GitPython>`_ and install it +to your system. More information about ``easy_install`` and pypi can be found +here: + +* `setuptools`_ +* `install setuptools <http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions>`_ +* `pypi <http://pypi.python.org/pypi/SQLAlchemy>`_ + +.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools + +Alternatively, you can install from the distribution using the ``setup.py`` +script: + +.. sourcecode:: none + + # python setup.py install + +Getting Started +=============== + +* :ref:`tutorial-label` - This tutorial provides a walk-through of some of + the basic functionality and concepts used in GitPython. It, however, is not + exhaustive so you are encouraged to spend some time in the + :ref:`api_reference_toplevel`. + +API Reference +============= + +An organized section of the GitPthon API is at :ref:`api_reference_toplevel`. + +Source Code +=========== + +GitPython's git repo is available on Gitorious and GitHub, which can be browsed at: + + * http://gitorious.org/projects/git-python/ + * http://github.com/Byron/GitPython + +and cloned using:: + + $ git clone git://gitorious.org/git-python/mainline.git git-python + $ git clone git://github.com/Byron/GitPython.git git-python + +Mailing List +============ +http://groups.google.com/group/git-python + +Issue Tracker +============= +http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones + +License Information +=================== +GitPython is licensed under the New BSD License. See the LICENSE file for +more information. + diff --git a/doc/doc_index/0.2/_sources/reference.txt b/doc/doc_index/0.2/_sources/reference.txt new file mode 100644 index 00000000..9cc32b71 --- /dev/null +++ b/doc/doc_index/0.2/_sources/reference.txt @@ -0,0 +1,125 @@ +.. _api_reference_toplevel: + +API Reference +============= + +Actor +----- + +.. automodule:: git.actor + :members: + :undoc-members: + +Objects.Base +------------ + +.. automodule:: git.objects.base + :members: + :undoc-members: + +Objects.Blob +------------ + +.. automodule:: git.objects.blob + :members: + :undoc-members: + +Objects.Commit +-------------- + +.. automodule:: git.objects.commit + :members: + :undoc-members: + +Objects.Tag +----------- + +.. automodule:: git.objects.tag + :members: + :undoc-members: + +Objects.Tree +------------ + +.. automodule:: git.objects.tree + :members: + :undoc-members: + +Objects.Utils +------------- + +.. automodule:: git.objects.utils + :members: + :undoc-members: + +GitCmd +------ + +.. automodule:: git.cmd + :members: + :undoc-members: + + +Config +------ + +.. automodule:: git.config + :members: + :undoc-members: + +Diff +---- + +.. automodule:: git.diff + :members: + :undoc-members: + +Errors +------ + +.. automodule:: git.errors + :members: + :undoc-members: + +Index +------ + +.. automodule:: git.index + :members: + :undoc-members: + + +Refs +---- + +.. automodule:: git.refs + :members: + :undoc-members: + +Remote +------ + +.. automodule:: git.remote + :members: + :undoc-members: + +Repo +---- + +.. automodule:: git.repo + :members: + :undoc-members: + +Stats +----- + +.. automodule:: git.stats + :members: + :undoc-members: + +Utils +----- + +.. automodule:: git.utils + :members: + :undoc-members: diff --git a/doc/doc_index/0.2/_sources/roadmap.txt b/doc/doc_index/0.2/_sources/roadmap.txt new file mode 100644 index 00000000..a6bdc3a0 --- /dev/null +++ b/doc/doc_index/0.2/_sources/roadmap.txt @@ -0,0 +1,6 @@ + +####### +Roadmap +####### +The full list of milestones including associated tasks can be found on lighthouse: http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones + diff --git a/doc/doc_index/0.2/_sources/tutorial.txt b/doc/doc_index/0.2/_sources/tutorial.txt new file mode 100644 index 00000000..37dd8d32 --- /dev/null +++ b/doc/doc_index/0.2/_sources/tutorial.txt @@ -0,0 +1,357 @@ +.. _tutorial_toplevel: + +.. highlight:: python + +.. _tutorial-label: + +================== +GitPython Tutorial +================== + +GitPython provides object model access to your git repository. This tutorial is composed of multiple sections, each of which explain a real-life usecase. + +Initialize a Repo object +************************ + +The first step is to create a ``Repo`` object to represent your repository:: + + from git import * + repo = Repo("/Users/mtrier/Development/git-python") + +In the above example, the directory ``/Users/mtrier/Development/git-python`` is my working repository and contains the ``.git`` directory. You can also initialize GitPython with a bare repository:: + + repo = Repo.create("/var/git/git-python.git") + +A repo object provides high-level access to your data, it allows you to create and delete heads, tags and remotes and access the configuration of the repository:: + + repo.config_reader() # get a config reader for read-only access + repo.config_writer() # get a config writer to change configuration + +Query the active branch, query untracked files or whether the repository data has been modified:: + + repo.is_dirty() + False + repo.untracked_files() + ['my_untracked_file'] + +Clone from existing repositories or initialize new empty ones:: + + cloned_repo = repo.clone("to/this/path") + new_repo = repo.init("path/for/new/repo") + +Archive the repository contents to a tar file:: + + repo.archive(open("repo.tar",'w')) + +Examining References +******************** + +References are the tips of your commit graph from which you can easily examine the history of your project:: + + heads = repo.heads + master = heads.master # lists can be accessed by name for convenience + master.commit # the commit pointed to by head called master + master.rename("new_name") # rename heads + +Tags are (usually immutable) references to a commit and/or a tag object:: + + tags = repo.tags + tagref = tags[0] + tagref.tag # tags may have tag objects carrying additional information + tagref.commit # but they always point to commits + repo.delete_tag(tagref) # delete or + repo.create_tag("my_tag") # create tags using the repo for convenience + +A symbolic reference is a special case of a reference as it points to another reference instead of a commit:: + + head = repo.head # the head points to the active branch/ref + master = head.reference # retrieve the reference the head points to + master.commit # from here you use it as any other reference + +Modifying References +******************** +You can easily create and delete reference types or modify where they point to:: + + repo.delete_head('master') # delete an existing head + master = repo.create_head('master') # create a new one + master.commit = 'HEAD~10' # set branch to another commit without changing index or working tree + +Create or delete tags the same way except you may not change them afterwards:: + + new_tag = repo.create_tag('my_tag', 'my message') + repo.delete_tag(new_tag) + +Change the symbolic reference to switch branches cheaply ( without adjusting the index or the working copy ):: + + new_branch = repo.create_head('new_branch') + repo.head.reference = new_branch + +Understanding Objects +********************* +An Object is anything storable in git's object database. Objects contain information about their type, their uncompressed size as well as the actual data. Each object is uniquely identified by a SHA1 hash, being 40 hexadecimal characters in size or 20 bytes in size. + +Git only knows 4 distinct object types being Blobs, Trees, Commits and Tags. + +In Git-Pyhton, all objects can be accessed through their common base, compared and hashed, as shown in the following example:: + + hc = repo.head.commit + hct = hc.tree + hc != hct + hc != repo.tags[0] + hc == repo.head.reference.commit + +Basic fields are:: + + hct.type + 'tree' + hct.size + 166 + hct.sha + 'a95eeb2a7082212c197cabbf2539185ec74ed0e8' + hct.data # returns string with pure uncompressed data + '...' + len(hct.data) == hct.size + +Index Objects are objects that can be put into git's index. These objects are trees and blobs which additionally know about their path in the filesystem as well as their mode:: + + hct.path # root tree has no path + '' + hct.trees[0].path # the first subdirectory has one though + 'dir' + htc.mode # trees have mode 0 + 0 + '%o' % htc.blobs[0].mode # blobs have a specific mode though comparable to a standard linux fs + 100644 + +Access blob data (or any object data) directly or using streams:: + + htc.data # binary tree data as string ( inefficient ) + htc.blobs[0].data_stream # stream object to read data from + htc.blobs[0].stream_data(my_stream) # write data to given stream + + +The Commit object +***************** + +Commit objects contain information about a specific commit. Obtain commits using references as done in `Examining References`_ or as follows. + +Obtain commits at the specified revision:: + + repo.commit('master') + repo.commit('v0.1') + repo.commit('HEAD~10') + +Iterate 100 commits:: + + repo.iter_commits('master', max_count=100) + +If you need paging, you can specify a number of commits to skip:: + + repo.iter_commits('master', max_count=10, skip=20) + +The above will return commits 21-30 from the commit list.:: + + headcommit = repo.head.commit + + headcommit.sha + '207c0c4418115df0d30820ab1a9acd2ea4bf4431' + + headcommit.parents + [<git.Commit "a91c45eee0b41bf3cdaad3418ca3850664c4a4b4">] + + headcommit.tree + <git.Tree "563413aedbeda425d8d9dcbb744247d0c3e8a0ac"> + + headcommit.author + <git.Actor "Michael Trier <mtrier@gmail.com>"> + + headcommit.authored_date # seconds since epoch + 1256291446 + + headcommit.committer + <git.Actor "Michael Trier <mtrier@gmail.com>"> + + headcommit.committed_date + 1256291446 + + headcommit.message + 'cleaned up a lot of test information. Fixed escaping so it works with + subprocess.' + +Note: date time is represented in a ``seconds since epock`` format. Conversion to human readable form can be accomplished with the various time module methods:: + + import time + time.asctime(time.gmtime(headcommit.committed_date)) + 'Wed May 7 05:56:02 2008' + + time.strftime("%a, %d %b %Y %H:%M", time.gmtime(headcommit.committed_date)) + 'Wed, 7 May 2008 05:56' + +.. _struct_time: http://docs.python.org/library/time.html + +You can traverse a commit's ancestry by chaining calls to ``parents``:: + + headcommit.parents[0].parents[0].parents[0] + +The above corresponds to ``master^^^`` or ``master~3`` in git parlance. + +The Tree object +*************** + +A tree records pointers to the contents of a directory. Let's say you want the root tree of the latest commit on the master branch:: + + tree = repo.heads.master.commit.tree + <git.Tree "a006b5b1a8115185a228b7514cdcd46fed90dc92"> + + tree.sha + 'a006b5b1a8115185a228b7514cdcd46fed90dc92' + +Once you have a tree, you can get the contents:: + + tree.trees # trees are subdirectories + [<git.Tree "f7eb5df2e465ab621b1db3f5714850d6732cfed2">] + + tree.blobs # blobs are files + [<git.Blob "a871e79d59cf8488cac4af0c8f990b7a989e2b53">, + <git.Blob "3594e94c04db171e2767224db355f514b13715c5">, + <git.Blob "e79b05161e4836e5fbf197aeb52515753e8d6ab6">, + <git.Blob "94954abda49de8615a048f8d2e64b5de848e27a1">] + +Its useful to know that a tree behaves like a list with the ability to query entries by name:: + + tree[0] == tree['dir'] # access by index and by sub-path + <git.Tree "f7eb5df2e465ab621b1db3f5714850d6732cfed2"> + for entry in tree: do_something_with(entry) + + blob = tree[0][0] + blob.name + 'file' + blob.path + 'dir/file' + blob.abspath + '/Users/mtrier/Development/git-python/dir/file' + >>>tree['dir/file'].sha == blob.sha + +There is a convenience method that allows you to get a named sub-object from a tree with a syntax similar to how paths are written in an unix system:: + + tree/"lib" + <git.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30"> + tree/"dir/file" == blob.sha + +You can also get a tree directly from the repository if you know its name:: + + repo.tree() + <git.Tree "master"> + + repo.tree("c1c7214dde86f76bc3e18806ac1f47c38b2b7a30") + <git.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30"> + repo.tree('0.1.6') + <git.Tree "6825a94104164d9f0f5632607bebd2a32a3579e5"> + +As trees only allow direct access to their direct entries, use the traverse method to obtain an iterator to traverse entries recursively:: + + tree.traverse() + <generator object at 0x7f6598bd65a8> + for entry in traverse(): do_something_with(entry) + + +The Index Object +**************** +The git index is the stage containing changes to be written with the next commit or where merges finally have to take place. You may freely access and manipulate this information using the IndexFile Object:: + + index = repo.index + +Access objects and add/remove entries. Commit the changes:: + + for stage,blob in index.iter_blobs(): do_something(...) + Access blob objects + for (path,stage),entry in index.entries.iteritems: pass + Access the entries directly + index.add(['my_new_file']) # add a new file to the index + index.remove(['dir/existing_file']) + new_commit = index.commit("my commit message") + +Create new indices from other trees or as result of a merge. Write that result to a new index:: + + tmp_index = Index.from_tree(repo, 'HEAD~1') # load a tree into a temporary index + merge_index = Index.from_tree(repo, 'base', 'HEAD', 'some_branch') # merge two trees three-way + merge_index.write("merged_index") + +Handling Remotes +**************** + +Remotes are used as alias for a foreign repository to ease pushing to and fetching from them:: + + test_remote = repo.create_remote('test', 'git@server:repo.git') + repo.delete_remote(test_remote) # create and delete remotes + origin = repo.remotes.origin # get default remote by name + origin.refs # local remote references + o = origin.rename('new_origin') # rename remotes + o.fetch() # fetch, pull and push from and to the remote + o.pull() + o.push() + +You can easily access configuration information for a remote by accessing options as if they where attributes:: + + o.url + 'git@server:dummy_repo.git' + +Change configuration for a specific remote only:: + + o.config_writer.set("pushurl", "other_url") + +Obtaining Diff Information +************************** + +Diffs can generally be obtained by Subclasses of ``Diffable`` as they provide the ``diff`` method. This operation yields a DiffIndex allowing you to easily access diff information about paths. + +Diffs can be made between the Index and Trees, Index and the working tree, trees and trees as well as trees and the working copy. If commits are involved, their tree will be used implicitly:: + + hcommit = repo.head.commit + idiff = hcommit.diff() # diff tree against index + tdiff = hcommit.diff('HEAD~1') # diff tree against previous tree + wdiff = hcommit.diff(None) # diff tree against working tree + + index = repo.index + index.diff() # diff index against itself yielding empty diff + index.diff(None) # diff index against working copy + index.diff('HEAD') # diff index against current HEAD tree + +The item returned is a DiffIndex which is essentially a list of Diff objects. It provides additional filtering to ease finding what you might be looking for:: + + for diff_added in wdiff.iter_change_type('A'): do_something_with(diff_added) + +Switching Branches +****************** +To switch between branches, you effectively need to point your HEAD to the new branch head and reset your index and working copy to match. A simple manual way to do it is the following one:: + + repo.head.reference = repo.heads.other_branch + repo.head.reset(index=True, working_tree=True) + +The previous approach would brutally overwrite the user's changes in the working copy and index though and is less sophisticated than a git-checkout for instance which generally prevents you from destroying your work. Use the safer approach as follows:: + + repo.heads.master.checkout() # checkout the branch using git-checkout + repo.heads.other_branch.checkout() + +Using git directly +****************** +In case you are missing functionality as it has not been wrapped, you may conveniently use the git command directly. It is owned by each repository instance:: + + git = repo.git + git.checkout('head', b="my_new_branch") # default command + git.for_each_ref() # '-' becomes '_' when calling it + +The return value will by default be a string of the standard output channel produced by the command. + +Keyword arguments translate to short and long keyword arguments on the commandline. +The special notion ``git.command(flag=True)`` will create a flag without value like ``command --flag``. + +If ``None`` is found in the arguments, it will be dropped silently. Lists and tuples passed as arguments will be unpacked to individual arguments. Objects are converted to strings using the str(...) function. + +And even more ... +***************** + +There is more functionality in there, like the ability to archive repositories, get stats and logs, blame, and probably a few other things that were not mentioned here. + +Check the unit tests for an in-depth introduction on how each function is supposed to be used. + diff --git a/doc/doc_index/0.2/_static/basic.css b/doc/doc_index/0.2/_static/basic.css new file mode 100644 index 00000000..a04d6545 --- /dev/null +++ b/doc/doc_index/0.2/_static/basic.css @@ -0,0 +1,417 @@ +/** + * Sphinx stylesheet -- basic theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +img { + border: 0; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 0; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +/* -- other body styles ----------------------------------------------------- */ + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlight { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.refcount { + color: #060; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} diff --git a/doc/doc_index/0.2/_static/default.css b/doc/doc_index/0.2/_static/default.css new file mode 100644 index 00000000..37257440 --- /dev/null +++ b/doc/doc_index/0.2/_static/default.css @@ -0,0 +1,230 @@ +/** + * Sphinx stylesheet -- default theme + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: sans-serif; + font-size: 100%; + background-color: #11303d; + color: #000; + margin: 0; + padding: 0; +} + +div.document { + background-color: #1c4e63; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 230px; +} + +div.body { + background-color: #ffffff; + color: #000000; + padding: 0 20px 30px 20px; +} + +div.footer { + color: #ffffff; + width: 100%; + padding: 9px 0 9px 0; + text-align: center; + font-size: 75%; +} + +div.footer a { + color: #ffffff; + text-decoration: underline; +} + +div.related { + background-color: #133f52; + line-height: 30px; + color: #ffffff; +} + +div.related a { + color: #ffffff; +} + +div.sphinxsidebar { +} + +div.sphinxsidebar h3 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.4em; + font-weight: normal; + margin: 0; + padding: 0; +} + +div.sphinxsidebar h3 a { + color: #ffffff; +} + +div.sphinxsidebar h4 { + font-family: 'Trebuchet MS', sans-serif; + color: #ffffff; + font-size: 1.3em; + font-weight: normal; + margin: 5px 0 0 0; + padding: 0; +} + +div.sphinxsidebar p { + color: #ffffff; +} + +div.sphinxsidebar p.topless { + margin: 5px 10px 10px 10px; +} + +div.sphinxsidebar ul { + margin: 10px; + padding: 0; + color: #ffffff; +} + +div.sphinxsidebar a { + color: #98dbcc; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #355f7c; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Trebuchet MS', sans-serif; + background-color: #f2f2f2; + font-weight: normal; + color: #20435c; + border-bottom: 1px solid #ccc; + margin: 20px -20px 10px -20px; + padding: 3px 0 3px 10px; +} + +div.body h1 { margin-top: 0; font-size: 200%; } +div.body h2 { font-size: 160%; } +div.body h3 { font-size: 140%; } +div.body h4 { font-size: 120%; } +div.body h5 { font-size: 110%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #c60f0f; + font-size: 0.8em; + padding: 0 4px 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + background-color: #c60f0f; + color: white; +} + +div.body p, div.body dd, div.body li { + text-align: justify; + line-height: 130%; +} + +div.admonition p.admonition-title + p { + display: inline; +} + +div.admonition p { + margin-bottom: 5px; +} + +div.admonition pre { + margin-bottom: 5px; +} + +div.admonition ul, div.admonition ol { + margin-bottom: 5px; +} + +div.note { + background-color: #eee; + border: 1px solid #ccc; +} + +div.seealso { + background-color: #ffc; + border: 1px solid #ff6; +} + +div.topic { + background-color: #eee; +} + +div.warning { + background-color: #ffe4e4; + border: 1px solid #f66; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre { + padding: 5px; + background-color: #eeffcc; + color: #333333; + line-height: 120%; + border: 1px solid #ac9; + border-left: none; + border-right: none; +} + +tt { + background-color: #ecf0f3; + padding: 0 1px 0 1px; + font-size: 0.95em; +} + +.warning tt { + background: #efc2c2; +} + +.note tt { + background: #d6d6d6; +}
\ No newline at end of file diff --git a/doc/doc_index/0.2/_static/doctools.js b/doc/doc_index/0.2/_static/doctools.js new file mode 100644 index 00000000..9447678c --- /dev/null +++ b/doc/doc_index/0.2/_static/doctools.js @@ -0,0 +1,232 @@ +/// XXX: make it cross browser + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger + */ +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", + "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {} +} + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +} + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s == 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +} + +/** + * small function to check if an array contains + * a given item. + */ +jQuery.contains = function(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == item) + return true; + } + return false; +} + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node) { + if (node.nodeType == 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this) + }); + } + } + return this.each(function() { + highlight(this); + }); +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initModIndex(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can savely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('<a class="headerlink">\u00B6</a>'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('<a class="headerlink">\u00B6</a>'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlight'); + }); + }, 10); + $('<li class="highlight-link"><a href="javascript:Documentation.' + + 'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>') + .appendTo($('.sidebar .this-page-menu')); + } + }, + + /** + * init the modindex toggle buttons + */ + initModIndex : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + console.log($('tr.cg-' + idnum).toggle()); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('.sidebar .this-page-menu li.highlight-link').fadeOut(300); + $('span.highlight').removeClass('highlight'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/doc/doc_index/0.2/_static/file.png b/doc/doc_index/0.2/_static/file.png Binary files differnew file mode 100644 index 00000000..d18082e3 --- /dev/null +++ b/doc/doc_index/0.2/_static/file.png diff --git a/doc/doc_index/0.2/_static/jquery.js b/doc/doc_index/0.2/_static/jquery.js new file mode 100644 index 00000000..82b98e1d --- /dev/null +++ b/doc/doc_index/0.2/_static/jquery.js @@ -0,0 +1,32 @@ +/* + * jQuery 1.2.6 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ + * $Rev: 5685 $ + */ +(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else +return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else +return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else +selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else +return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else +this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else +return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&©&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else +script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else +for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else +for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else +jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else +ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else +while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else +while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else +jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else +xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else +jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else +s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file diff --git a/doc/doc_index/0.2/_static/minus.png b/doc/doc_index/0.2/_static/minus.png Binary files differnew file mode 100644 index 00000000..da1c5620 --- /dev/null +++ b/doc/doc_index/0.2/_static/minus.png diff --git a/doc/doc_index/0.2/_static/plus.png b/doc/doc_index/0.2/_static/plus.png Binary files differnew file mode 100644 index 00000000..b3cb3742 --- /dev/null +++ b/doc/doc_index/0.2/_static/plus.png diff --git a/doc/doc_index/0.2/_static/pygments.css b/doc/doc_index/0.2/_static/pygments.css new file mode 100644 index 00000000..1f2d2b61 --- /dev/null +++ b/doc/doc_index/0.2/_static/pygments.css @@ -0,0 +1,61 @@ +.hll { background-color: #ffffcc } +.c { color: #408090; font-style: italic } /* Comment */ +.err { border: 1px solid #FF0000 } /* Error */ +.k { color: #007020; font-weight: bold } /* Keyword */ +.o { color: #666666 } /* Operator */ +.cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.cp { color: #007020 } /* Comment.Preproc */ +.c1 { color: #408090; font-style: italic } /* Comment.Single */ +.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #303030 } /* Generic.Output */ +.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #007020 } /* Keyword.Pseudo */ +.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #902000 } /* Keyword.Type */ +.m { color: #208050 } /* Literal.Number */ +.s { color: #4070a0 } /* Literal.String */ +.na { color: #4070a0 } /* Name.Attribute */ +.nb { color: #007020 } /* Name.Builtin */ +.nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.no { color: #60add5 } /* Name.Constant */ +.nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.ne { color: #007020 } /* Name.Exception */ +.nf { color: #06287e } /* Name.Function */ +.nl { color: #002070; font-weight: bold } /* Name.Label */ +.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.nt { color: #062873; font-weight: bold } /* Name.Tag */ +.nv { color: #bb60d5 } /* Name.Variable */ +.ow { color: #007020; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #208050 } /* Literal.Number.Float */ +.mh { color: #208050 } /* Literal.Number.Hex */ +.mi { color: #208050 } /* Literal.Number.Integer */ +.mo { color: #208050 } /* Literal.Number.Oct */ +.sb { color: #4070a0 } /* Literal.String.Backtick */ +.sc { color: #4070a0 } /* Literal.String.Char */ +.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.s2 { color: #4070a0 } /* Literal.String.Double */ +.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.sh { color: #4070a0 } /* Literal.String.Heredoc */ +.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.sx { color: #c65d09 } /* Literal.String.Other */ +.sr { color: #235388 } /* Literal.String.Regex */ +.s1 { color: #4070a0 } /* Literal.String.Single */ +.ss { color: #517918 } /* Literal.String.Symbol */ +.bp { color: #007020 } /* Name.Builtin.Pseudo */ +.vc { color: #bb60d5 } /* Name.Variable.Class */ +.vg { color: #bb60d5 } /* Name.Variable.Global */ +.vi { color: #bb60d5 } /* Name.Variable.Instance */ +.il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file diff --git a/doc/doc_index/0.2/_static/searchtools.js b/doc/doc_index/0.2/_static/searchtools.js new file mode 100644 index 00000000..e0226258 --- /dev/null +++ b/doc/doc_index/0.2/_static/searchtools.js @@ -0,0 +1,467 @@ +/** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words, hlwords is the list of normal, unstemmed + * words. the first one is used to find the occurance, the + * latter for highlighting it. + */ + +jQuery.makeSearchSummary = function(text, keywords, hlwords) { + var textLower = text.toLowerCase(); + var start = 0; + $.each(keywords, function() { + var i = textLower.indexOf(this.toLowerCase()); + if (i > -1) + start = i; + }); + start = Math.max(start - 120, 0); + var excerpt = ((start > 0) ? '...' : '') + + $.trim(text.substr(start, 240)) + + ((start + 240 - text.length) ? '...' : ''); + var rv = $('<div class="context"></div>').text(excerpt); + $.each(hlwords, function() { + rv = rv.highlightText(this, 'highlight'); + }); + return rv; +} + +/** + * Porter Stemmer + */ +var PorterStemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + + +/** + * Search Module + */ +var Search = { + + _index : null, + _queued_query : null, + _pulse_status : -1, + + init : function() { + var params = $.getQueryParameters(); + if (params.q) { + var query = params.q[0]; + $('input[name="q"]')[0].value = query; + this.performSearch(query); + } + }, + + /** + * Sets the index + */ + setIndex : function(index) { + var q; + this._index = index; + if ((q = this._queued_query) !== null) { + this._queued_query = null; + Search.query(q); + } + }, + + hasIndex : function() { + return this._index !== null; + }, + + deferQuery : function(query) { + this._queued_query = query; + }, + + stopPulse : function() { + this._pulse_status = 0; + }, + + startPulse : function() { + if (this._pulse_status >= 0) + return; + function pulse() { + Search._pulse_status = (Search._pulse_status + 1) % 4; + var dotString = ''; + for (var i = 0; i < Search._pulse_status; i++) + dotString += '.'; + Search.dots.text(dotString); + if (Search._pulse_status > -1) + window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something + */ + performSearch : function(query) { + // create the required interface elements + this.out = $('#search-results'); + this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); + this.dots = $('<span></span>').appendTo(this.title); + this.status = $('<p style="display: none"></p>').appendTo(this.out); + this.output = $('<ul class="search"/>').appendTo(this.out); + + $('#search-progress').text(_('Preparing search...')); + this.startPulse(); + + // index already loaded, the browser was quick! + if (this.hasIndex()) + this.query(query); + else + this.deferQuery(query); + }, + + query : function(query) { + // stem the searchterms and add them to the + // correct list + var stemmer = new PorterStemmer(); + var searchterms = []; + var excluded = []; + var hlterms = []; + var tmp = query.split(/\s+/); + var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null; + for (var i = 0; i < tmp.length; i++) { + // stem the word + var word = stemmer.stemWord(tmp[i]).toLowerCase(); + // select the correct list + if (word[0] == '-') { + var toAppend = excluded; + word = word.substr(1); + } + else { + var toAppend = searchterms; + hlterms.push(tmp[i].toLowerCase()); + } + // only add if not already in the list + if (!$.contains(toAppend, word)) + toAppend.push(word); + }; + var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" ")); + + console.debug('SEARCH: searching for:'); + console.info('required: ', searchterms); + console.info('excluded: ', excluded); + + // prepare search + var filenames = this._index.filenames; + var titles = this._index.titles; + var terms = this._index.terms; + var descrefs = this._index.descrefs; + var modules = this._index.modules; + var desctypes = this._index.desctypes; + var fileMap = {}; + var files = null; + var objectResults = []; + var regularResults = []; + $('#search-progress').empty(); + + // lookup as object + if (object != null) { + for (var module in modules) { + if (module.indexOf(object) > -1) { + fn = modules[module]; + descr = _('module, in ') + titles[fn]; + objectResults.push([filenames[fn], module, '#module-'+module, descr]); + } + } + for (var prefix in descrefs) { + for (var name in descrefs[prefix]) { + var fullname = (prefix ? prefix + '.' : '') + name; + if (fullname.toLowerCase().indexOf(object) > -1) { + match = descrefs[prefix][name]; + descr = desctypes[match[1]] + _(', in ') + titles[match[0]]; + objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]); + } + } + } + } + + // sort results descending + objectResults.sort(function(a, b) { + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); + }); + + + // perform the search on the required terms + for (var i = 0; i < searchterms.length; i++) { + var word = searchterms[i]; + // no match but word was a required one + if ((files = terms[word]) == null) + break; + if (files.length == undefined) { + files = [files]; + } + // create the mapping + for (var j = 0; j < files.length; j++) { + var file = files[j]; + if (file in fileMap) + fileMap[file].push(word); + else + fileMap[file] = [word]; + } + } + + // now check if the files don't contain excluded terms + for (var file in fileMap) { + var valid = true; + + // check if all requirements are matched + if (fileMap[file].length != searchterms.length) + continue; + + // ensure that none of the excluded terms is in the + // search result. + for (var i = 0; i < excluded.length; i++) { + if (terms[excluded[i]] == file || + $.contains(terms[excluded[i]] || [], file)) { + valid = false; + break; + } + } + + // if we have still a valid result we can add it + // to the result list + if (valid) + regularResults.push([filenames[file], titles[file], '', null]); + } + + // delete unused variables in order to not waste + // memory until list is retrieved completely + delete filenames, titles, terms; + + // now sort the regular results descending by title + regularResults.sort(function(a, b) { + var left = a[1].toLowerCase(); + var right = b[1].toLowerCase(); + return (left > right) ? -1 : ((left < right) ? 1 : 0); + }); + + // combine both + var results = regularResults.concat(objectResults); + + // print the results + var resultCount = results.length; + function displayNextItem() { + // results left, load the summary and display it + if (results.length) { + var item = results.pop(); + var listItem = $('<li style="display:none"></li>'); + listItem.append($('<a/>').attr( + 'href', + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX + + highlightstring + item[2]).html(item[1])); + if (item[3]) { + listItem.append($('<span> (' + item[3] + ')</span>')); + Search.output.append(listItem); + listItem.slideDown(5, function() { + displayNextItem(); + }); + } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { + $.get('_sources/' + item[0] + '.txt', function(data) { + listItem.append($.makeSearchSummary(data, searchterms, hlterms)); + Search.output.append(listItem); + listItem.slideDown(5, function() { + displayNextItem(); + }); + }); + } else { + // no source available, just display title + Search.output.append(listItem); + listItem.slideDown(5, function() { + displayNextItem(); + }); + } + } + // search finished, update title and status message + else { + Search.stopPulse(); + Search.title.text(_('Search Results')); + if (!resultCount) + Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.')); + else + Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount)); + Search.status.fadeIn(500); + } + } + displayNextItem(); + } +} + +$(document).ready(function() { + Search.init(); +}); diff --git a/doc/doc_index/0.2/genindex.html b/doc/doc_index/0.2/genindex.html new file mode 100644 index 00000000..866800c3 --- /dev/null +++ b/doc/doc_index/0.2/genindex.html @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>Index — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="#" title="General Index" + accesskey="I">index</a></li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + + <h1 id="index">Index</h1> + + + + <hr /> + + + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + + + + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="#" title="General Index" + >index</a></li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/index.html b/doc/doc_index/0.2/index.html new file mode 100644 index 00000000..957b026d --- /dev/null +++ b/doc/doc_index/0.2/index.html @@ -0,0 +1,161 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>GitPython Documentation — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="#" /> + <link rel="next" title="Overview / Install" href="intro.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="intro.html" title="Overview / Install" + accesskey="N">next</a> |</li> + <li><a href="#">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="gitpython-documentation"> +<h1>GitPython Documentation<a class="headerlink" href="#gitpython-documentation" title="Permalink to this headline">¶</a></h1> +<ul> +<li class="toctree-l1"><a class="reference external" href="intro.html">Overview / Install</a><ul> +<li class="toctree-l2"><a class="reference external" href="intro.html#requirements">Requirements</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#installing-gitpython">Installing GitPython</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#getting-started">Getting Started</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#api-reference">API Reference</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#source-code">Source Code</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#mailing-list">Mailing List</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#issue-tracker">Issue Tracker</a></li> +<li class="toctree-l2"><a class="reference external" href="intro.html#license-information">License Information</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference external" href="tutorial.html">GitPython Tutorial</a><ul> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#initialize-a-repo-object">Initialize a Repo object</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#examining-references">Examining References</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#modifying-references">Modifying References</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#understanding-objects">Understanding Objects</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#the-commit-object">The Commit object</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#the-tree-object">The Tree object</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#the-index-object">The Index Object</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#handling-remotes">Handling Remotes</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#obtaining-diff-information">Obtaining Diff Information</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#switching-branches">Switching Branches</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#using-git-directly">Using git directly</a></li> +<li class="toctree-l2"><a class="reference external" href="tutorial.html#and-even-more">And even more ...</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference external" href="reference.html">API Reference</a><ul> +<li class="toctree-l2"><a class="reference external" href="reference.html#actor">Actor</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-base">Objects.Base</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-blob">Objects.Blob</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-commit">Objects.Commit</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-tag">Objects.Tag</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-tree">Objects.Tree</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#objects-utils">Objects.Utils</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#gitcmd">GitCmd</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#config">Config</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#diff">Diff</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#errors">Errors</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#index">Index</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#refs">Refs</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#remote">Remote</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#repo">Repo</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#stats">Stats</a></li> +<li class="toctree-l2"><a class="reference external" href="reference.html#utils">Utils</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference external" href="roadmap.html">Roadmap</a></li> +</ul> +</div> +<div class="section" id="indices-and-tables"> +<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1> +<ul class="simple"> +<li><a class="reference external" href="genindex.html"><em>Index</em></a></li> +<li><a class="reference external" href="modindex.html"><em>Module Index</em></a></li> +<li><a class="reference external" href="search.html"><em>Search Page</em></a></li> +</ul> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="#">Table Of Contents</a></h3> + <ul> +<li><a class="reference external" href="#">GitPython Documentation</a><ul> +</ul> +</li> +<li><a class="reference external" href="#indices-and-tables">Indices and tables</a></li> +</ul> + + <h4>Next topic</h4> + <p class="topless"><a href="intro.html" + title="next chapter">Overview / Install</a></p> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/index.txt" + rel="nofollow">Show Source</a></li> + </ul> + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="intro.html" title="Overview / Install" + >next</a> |</li> + <li><a href="#">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/intro.html b/doc/doc_index/0.2/intro.html new file mode 100644 index 00000000..2cb9d6dd --- /dev/null +++ b/doc/doc_index/0.2/intro.html @@ -0,0 +1,196 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>Overview / Install — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + <link rel="next" title="GitPython Tutorial" href="tutorial.html" /> + <link rel="prev" title="GitPython Documentation" href="index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="tutorial.html" title="GitPython Tutorial" + accesskey="N">next</a> |</li> + <li class="right" > + <a href="index.html" title="GitPython Documentation" + accesskey="P">previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="overview-install"> +<span id="intro-toplevel"></span><h1>Overview / Install<a class="headerlink" href="#overview-install" title="Permalink to this headline">¶</a></h1> +<p>GitPython is a python library used to interact with Git repositories.</p> +<p>GitPython was a port of the <a class="reference external" href="http://grit.rubyforge.org">grit</a> library in Ruby created by +Tom Preston-Werner and Chris Wanstrath, but grew beyond its heritage through its improved design and performance.</p> +<div class="section" id="requirements"> +<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li><a class="reference external" href="http://git-scm.com/">Git</a> tested with 1.5.3.7</li> +<li>Requires <a class="reference external" href="http://git-scm.com/">Git</a> 1.6.5.4 or newer if index.add function is to be used</li> +<li><a class="reference external" href="http://code.google.com/p/python-nose/">Python Nose</a> - used for running the tests</li> +<li><a class="reference external" href="http://www.voidspace.org.uk/python/mock.html">Mock by Michael Foord</a> used for tests. Requires 0.5</li> +</ul> +</div> +<div class="section" id="installing-gitpython"> +<h2>Installing GitPython<a class="headerlink" href="#installing-gitpython" title="Permalink to this headline">¶</a></h2> +<p>Installing GitPython is easily done using +<a class="reference external" href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a>. Assuming it is +installed, just run the following from the command-line:</p> +<div class="highlight-none"><div class="highlight"><pre># easy_install GitPython +</pre></div> +</div> +<p>This command will download the latest version of GitPython from the +<a class="reference external" href="http://pypi.python.org/pypi/GitPython">Python Package Index</a> and install it +to your system. More information about <tt class="docutils literal"><span class="pre">easy_install</span></tt> and pypi can be found +here:</p> +<ul class="simple"> +<li><a class="reference external" href="http://peak.telecommunity.com/DevCenter/setuptools">setuptools</a></li> +<li><a class="reference external" href="http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions">install setuptools</a></li> +<li><a class="reference external" href="http://pypi.python.org/pypi/SQLAlchemy">pypi</a></li> +</ul> +<p>Alternatively, you can install from the distribution using the <tt class="docutils literal"><span class="pre">setup.py</span></tt> +script:</p> +<div class="highlight-none"><div class="highlight"><pre># python setup.py install +</pre></div> +</div> +</div> +<div class="section" id="getting-started"> +<h2>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li><a class="reference external" href="tutorial.html#tutorial-label"><em>GitPython Tutorial</em></a> - This tutorial provides a walk-through of some of +the basic functionality and concepts used in GitPython. It, however, is not +exhaustive so you are encouraged to spend some time in the +<a class="reference external" href="reference.html#api-reference-toplevel"><em>API Reference</em></a>.</li> +</ul> +</div> +<div class="section" id="api-reference"> +<h2>API Reference<a class="headerlink" href="#api-reference" title="Permalink to this headline">¶</a></h2> +<p>An organized section of the GitPthon API is at <a class="reference external" href="reference.html#api-reference-toplevel"><em>API Reference</em></a>.</p> +</div> +<div class="section" id="source-code"> +<h2>Source Code<a class="headerlink" href="#source-code" title="Permalink to this headline">¶</a></h2> +<p>GitPython’s git repo is available on Gitorious and GitHub, which can be browsed at:</p> +<blockquote> +<ul class="simple"> +<li><a class="reference external" href="http://gitorious.org/projects/git-python/">http://gitorious.org/projects/git-python/</a></li> +<li><a class="reference external" href="http://github.com/Byron/GitPython">http://github.com/Byron/GitPython</a></li> +</ul> +</blockquote> +<p>and cloned using:</p> +<div class="highlight-python"><pre>$ git clone git://gitorious.org/git-python/mainline.git git-python +$ git clone git://github.com/Byron/GitPython.git git-python</pre> +</div> +</div> +<div class="section" id="mailing-list"> +<h2>Mailing List<a class="headerlink" href="#mailing-list" title="Permalink to this headline">¶</a></h2> +<p><a class="reference external" href="http://groups.google.com/group/git-python">http://groups.google.com/group/git-python</a></p> +</div> +<div class="section" id="issue-tracker"> +<h2>Issue Tracker<a class="headerlink" href="#issue-tracker" title="Permalink to this headline">¶</a></h2> +<p><a class="reference external" href="http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones">http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones</a></p> +</div> +<div class="section" id="license-information"> +<h2>License Information<a class="headerlink" href="#license-information" title="Permalink to this headline">¶</a></h2> +<p>GitPython is licensed under the New BSD License. See the LICENSE file for +more information.</p> +</div> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference external" href="#">Overview / Install</a><ul> +<li><a class="reference external" href="#requirements">Requirements</a></li> +<li><a class="reference external" href="#installing-gitpython">Installing GitPython</a></li> +<li><a class="reference external" href="#getting-started">Getting Started</a></li> +<li><a class="reference external" href="#api-reference">API Reference</a></li> +<li><a class="reference external" href="#source-code">Source Code</a></li> +<li><a class="reference external" href="#mailing-list">Mailing List</a></li> +<li><a class="reference external" href="#issue-tracker">Issue Tracker</a></li> +<li><a class="reference external" href="#license-information">License Information</a></li> +</ul> +</li> +</ul> + + <h4>Previous topic</h4> + <p class="topless"><a href="index.html" + title="previous chapter">GitPython Documentation</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="tutorial.html" + title="next chapter">GitPython Tutorial</a></p> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/intro.txt" + rel="nofollow">Show Source</a></li> + </ul> + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="tutorial.html" title="GitPython Tutorial" + >next</a> |</li> + <li class="right" > + <a href="index.html" title="GitPython Documentation" + >previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/objects.inv b/doc/doc_index/0.2/objects.inv new file mode 100644 index 00000000..7d252e3a --- /dev/null +++ b/doc/doc_index/0.2/objects.inv @@ -0,0 +1,3 @@ +# Sphinx inventory version 1 +# Project: GitPython +# Version: 0.2.0 diff --git a/doc/doc_index/0.2/reference.html b/doc/doc_index/0.2/reference.html new file mode 100644 index 00000000..41241318 --- /dev/null +++ b/doc/doc_index/0.2/reference.html @@ -0,0 +1,181 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>API Reference — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + <link rel="next" title="Roadmap" href="roadmap.html" /> + <link rel="prev" title="GitPython Tutorial" href="tutorial.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="roadmap.html" title="Roadmap" + accesskey="N">next</a> |</li> + <li class="right" > + <a href="tutorial.html" title="GitPython Tutorial" + accesskey="P">previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="api-reference"> +<span id="api-reference-toplevel"></span><h1>API Reference<a class="headerlink" href="#api-reference" title="Permalink to this headline">¶</a></h1> +<div class="section" id="actor"> +<h2>Actor<a class="headerlink" href="#actor" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-base"> +<h2>Objects.Base<a class="headerlink" href="#objects-base" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-blob"> +<h2>Objects.Blob<a class="headerlink" href="#objects-blob" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-commit"> +<h2>Objects.Commit<a class="headerlink" href="#objects-commit" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-tag"> +<h2>Objects.Tag<a class="headerlink" href="#objects-tag" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-tree"> +<h2>Objects.Tree<a class="headerlink" href="#objects-tree" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="objects-utils"> +<h2>Objects.Utils<a class="headerlink" href="#objects-utils" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="gitcmd"> +<h2>GitCmd<a class="headerlink" href="#gitcmd" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="config"> +<h2>Config<a class="headerlink" href="#config" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="diff"> +<h2>Diff<a class="headerlink" href="#diff" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="errors"> +<h2>Errors<a class="headerlink" href="#errors" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="index"> +<h2>Index<a class="headerlink" href="#index" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="refs"> +<h2>Refs<a class="headerlink" href="#refs" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="remote"> +<h2>Remote<a class="headerlink" href="#remote" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="repo"> +<h2>Repo<a class="headerlink" href="#repo" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="stats"> +<h2>Stats<a class="headerlink" href="#stats" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="utils"> +<h2>Utils<a class="headerlink" href="#utils" title="Permalink to this headline">¶</a></h2> +</div> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference external" href="#">API Reference</a><ul> +<li><a class="reference external" href="#actor">Actor</a></li> +<li><a class="reference external" href="#objects-base">Objects.Base</a></li> +<li><a class="reference external" href="#objects-blob">Objects.Blob</a></li> +<li><a class="reference external" href="#objects-commit">Objects.Commit</a></li> +<li><a class="reference external" href="#objects-tag">Objects.Tag</a></li> +<li><a class="reference external" href="#objects-tree">Objects.Tree</a></li> +<li><a class="reference external" href="#objects-utils">Objects.Utils</a></li> +<li><a class="reference external" href="#gitcmd">GitCmd</a></li> +<li><a class="reference external" href="#config">Config</a></li> +<li><a class="reference external" href="#diff">Diff</a></li> +<li><a class="reference external" href="#errors">Errors</a></li> +<li><a class="reference external" href="#index">Index</a></li> +<li><a class="reference external" href="#refs">Refs</a></li> +<li><a class="reference external" href="#remote">Remote</a></li> +<li><a class="reference external" href="#repo">Repo</a></li> +<li><a class="reference external" href="#stats">Stats</a></li> +<li><a class="reference external" href="#utils">Utils</a></li> +</ul> +</li> +</ul> + + <h4>Previous topic</h4> + <p class="topless"><a href="tutorial.html" + title="previous chapter">GitPython Tutorial</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="roadmap.html" + title="next chapter">Roadmap</a></p> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/reference.txt" + rel="nofollow">Show Source</a></li> + </ul> + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="roadmap.html" title="Roadmap" + >next</a> |</li> + <li class="right" > + <a href="tutorial.html" title="GitPython Tutorial" + >previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/roadmap.html b/doc/doc_index/0.2/roadmap.html new file mode 100644 index 00000000..c98de752 --- /dev/null +++ b/doc/doc_index/0.2/roadmap.html @@ -0,0 +1,97 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>Roadmap — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + <link rel="prev" title="API Reference" href="reference.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="reference.html" title="API Reference" + accesskey="P">previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="roadmap"> +<h1>Roadmap<a class="headerlink" href="#roadmap" title="Permalink to this headline">¶</a></h1> +<p>The full list of milestones including associated tasks can be found on lighthouse: <a class="reference external" href="http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones">http://byronimo.lighthouseapp.com/projects/51787-gitpython/milestones</a></p> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h4>Previous topic</h4> + <p class="topless"><a href="reference.html" + title="previous chapter">API Reference</a></p> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/roadmap.txt" + rel="nofollow">Show Source</a></li> + </ul> + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="reference.html" title="API Reference" + >previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/search.html b/doc/doc_index/0.2/search.html new file mode 100644 index 00000000..76a76483 --- /dev/null +++ b/doc/doc_index/0.2/search.html @@ -0,0 +1,91 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>Search — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="_static/searchtools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <h1 id="search-documentation">Search</h1> + <div id="fallback" class="admonition warning"> + <script type="text/javascript">$('#fallback').hide();</script> + <p> + Please activate JavaScript to enable the search + functionality. + </p> + </div> + <p> + From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. + </p> + <form action="" method="get"> + <input type="text" name="q" value="" /> + <input type="submit" value="search" /> + <span id="search-progress" style="padding-left: 10px"></span> + </form> + + <div id="search-results"> + + </div> + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + <script type="text/javascript" src="searchindex.js"></script> + + </body> +</html>
\ No newline at end of file diff --git a/doc/doc_index/0.2/searchindex.js b/doc/doc_index/0.2/searchindex.js new file mode 100644 index 00000000..29e22d67 --- /dev/null +++ b/doc/doc_index/0.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({desctypes:{},terms:{all:3,code:[0,1],chain:3,queri:3,concept:1,abil:3,follow:[1,3],content:3,graph:3,readabl:3,gitpthon:1,init:3,tracker:[0,1],skip:3,new_repo:3,sourc:[0,1],string:3,fals:3,util:[0,2],whether:3,implicitli:3,subprocess:3,brows:1,level:3,michael:[1,3],iter:3,item:3,adjust:3,dir:3,prevent:3,htc:3,direct:3,my_new_branch:3,second:3,design:1,iter_commit:3,pass:3,download:1,port:1,even:[0,3],index:[0,1,2,3],what:3,sub:3,compar:3,mainlin:1,section:[1,3],access:3,delet:3,version:1,"new":[1,3],method:3,"6825a94104164d9f0f5632607bebd2a32a3579e5":3,full:4,hash:3,iteritem:3,gener:3,lighthouseapp:[1,4],sophist:3,here:[1,3],let:3,path:3,safer:3,becom:3,modifi:[0,3],sinc:3,valu:3,search:0,convers:3,brutal:3,headcommit:3,dummy_repo:3,behav:3,other_url:3,chang:3,configur:3,modul:[0,3],unix:3,api:[0,1,2],instal:[0,1],unit:3,hexadecim:3,from:[1,3],stream:3,lighthous:4,distinct:3,two:3,next:3,few:3,call:3,handl:[0,3],type:3,more:[0,1,3],abspath:3,under:1,line:1,flag:3,gitcmd:[0,2],examin:[0,3],unpack:3,origin:3,none:3,retriev:3,gitpython:[0,1,3,4],alia:3,setup:1,work:3,uniqu:3,histori:3,new_nam:3,archiv:3,can:[1,3,4],root:3,fetch:3,tar:3,indic:[0,3],max_count:3,high:3,tag:[0,2,3],want:3,alwai:3,multipl:3,anoth:3,write:3,how:3,pure:3,subdirectori:3,instead:3,simpl:3,chri:1,clone:[1,3],a95eeb2a7082212c197cabbf2539185ec74ed0e8:3,trier:3,date:3,associ:4,"short":3,essenti:3,correspond:3,foord:1,issu:[0,1],inform:[0,1,3],"switch":[0,3],allow:3,"3594e94c04db171e2767224db355f514b13715c5":3,"94954abda49de8615a048f8d2e64b5de848e27a1":3,hcommit:3,through:[1,3],pointer:3,mtrier:3,group:1,binari:3,fix:3,delete_head:3,mail:[0,1],might:3,them:3,"return":3,thei:3,python:[1,3],initi:[0,3],mention:3,delete_remot:3,data_stream:3,introduct:3,name:3,anyth:3,config:[0,2,3],wdiff:3,easili:[1,3],a91c45eee0b41bf3cdaad3418ca3850664c4a4b4:3,mode:3,each:3,found:[1,3,4],list:[0,1,3,4],individu:3,beyond:1,special:3,shown:3,accomplish:3,hct:3,miss:3,pyhton:3,reader:3,ref:[0,2,3],ancestri:3,tagref:3,manipul:3,committ:3,ineffici:3,base:[0,2,3],put:3,org:1,"byte":3,afterward:3,my_stream:3,filter:3,thing:3,place:3,diffindex:3,licens:[0,1],first:3,oper:3,directli:[0,3],carri:3,onc:3,number:3,mai:3,done:[1,3],overwrit:3,open:3,size:3,given:3,silent:3,script:1,data:3,interact:1,system:[1,3],messag:3,master:3,tom:1,conveni:3,"final":3,option:3,copi:3,setuptool:1,specifi:3,"var":3,github:1,delete_tag:3,grew:1,create_remot:3,new_origin:3,keyword:3,provid:[1,3],remov:3,tree:[0,2,3],charact:3,project:[1,3,4],str:3,were:3,merged_index:3,sai:3,preston:1,ani:3,packag:1,have:3,tabl:0,need:3,f7eb5df2e465ab621b1db3f5714850d6732cfed2:3,lib:3,my_new_fil:3,destroi:3,note:3,also:3,without:3,take:3,which:[1,3],e79b05161e4836e5fbf197aeb52515753e8d6ab6:3,channel:3,config_read:3,though:3,object:[0,2,3],create_head:3,test_remot:3,stream_data:3,bsd:1,new_tag:3,renam:3,url:3,clean:3,usual:3,notion:3,cheapli:3,some_branch:3,syntax:3,find:3,involv:3,current:3,onli:3,existing_fil:3,explain:3,writer:3,activ:3,than:3,suppos:3,local:3,new_commit:3,variou:3,get:[0,1,3],pypi:1,repo:[0,1,2,3],requir:[0,1],organ:1,diffabl:3,yield:3,sha:3,common:3,contain:3,where:3,set:3,commandlin:3,diff_ad:3,byron:1,roadmap:[0,4],see:1,bare:3,result:3,gmail:3,mileston:[1,4],my_tag:3,databas:3,written:3,between:3,"import":3,approach:3,a006b5b1a8115185a228b7514cdcd46fed90dc92:3,attribut:3,altern:1,storabl:3,parent:3,blame:3,len:3,addit:3,howev:1,against:3,foreign:3,tutori:[0,1,3],improv:1,c1c7214dde86f76bc3e18806ac1f47c38b2b7a30:3,com:[1,3,4],strftime:3,load:3,asctim:3,point:3,overview:[0,1],iter_blob:3,walk:1,werner:1,linux:3,diff:[0,2,3],assum:1,do_someth:3,"0x7f6598bd65a8":3,addition:3,compos:3,empti:3,basic:[1,3],life:3,tmp_index:3,rubi:1,convert:3,argument:3,untrack:3,understand:[0,3],standard:3,"case":3,look:3,abov:3,error:[0,2],"207c0c4418115df0d30820ab1a9acd2ea4bf4431":3,itself:3,revis:3,develop:3,author:3,perform:1,untracked_fil:3,same:3,epock:3,epoch:3,instanc:3,document:0,exhaust:1,http:[1,4],effect:3,remot:[0,2,3],temporari:3,user:3,usecas:3,freeli:3,parlanc:3,travers:3,task:4,config_writ:3,entri:3,well:3,know:3,exampl:3,command:[1,3],thi:[1,3],filesystem:3,model:3,spend:1,latest:[1,3],identifi:3,just:1,less:3,when:3,obtain:[0,3],human:3,wed:3,except:3,add:[1,3],blob:[0,2,3],working_tre:3,match:3,real:3,grit:1,format:3,read:3,sha1:3,for_each_ref:3,recurs:3,like:3,specif:3,manual:3,server:3,nose:1,output:3,page:[0,3],drop:3,some:1,heritag:1,byronimo:[1,4],librari:1,distribut:1,subclass:3,new_branch:3,refer:[0,1,2,3],encourag:1,previou:3,run:1,uncompress:3,gmtime:3,step:3,repositori:[1,3],immut:3,stage:3,about:[1,3],actual:3,would:3,iter_change_typ:3,commit:[0,2,3],produc:3,is_dirti:3,own:3,easy_instal:1,three:3,been:3,wrap:3,your:[1,3],merg:3,other_branch:3,git:[0,1,3],log:3,wai:3,"long":3,avail:1,start:[0,1],"563413aedbeda425d8d9dcbb744247d0c3e8a0ac":3,includ:4,lot:3,a871e79d59cf8488cac4af0c8f990b7a989e2b53:3,pushurl:3,"function":[1,3],indexfil:3,head:3,form:3,tupl:3,translat:3,newer:1,eas:3,"true":3,reset:3,pull:3,made:3,"default":3,checkout:3,record:3,my_untracked_fil:3,similar:3,creat:[1,3],create_tag:3,tdiff:3,repres:3,exist:3,file:[1,3],check:3,merge_index:3,probabl:3,committed_d:3,cloned_repo:3,googl:1,tip:3,gitori:1,actor:[0,2,3],field:3,other:3,do_something_with:3,branch:[0,3],test:[1,3],you:[1,3],mock:1,stat:[0,2,3],symbol:3,idiff:3,from_tre:3,authored_d:3,directori:3,depth:3,time:[1,3],push:3,escap:3,wanstrath:1},titles:["GitPython Documentation","Overview / Install","API Reference","GitPython Tutorial","Roadmap"],modules:{},descrefs:{},filenames:["index","intro","reference","tutorial","roadmap"]})
\ No newline at end of file diff --git a/doc/doc_index/0.2/tutorial.html b/doc/doc_index/0.2/tutorial.html new file mode 100644 index 00000000..a2400578 --- /dev/null +++ b/doc/doc_index/0.2/tutorial.html @@ -0,0 +1,454 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>GitPython Tutorial — GitPython v0.2.0 Beta documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '#', + VERSION: '0.2.0 Beta', + COLLAPSE_MODINDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="GitPython v0.2.0 Beta documentation" href="index.html" /> + <link rel="next" title="API Reference" href="reference.html" /> + <link rel="prev" title="Overview / Install" href="intro.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="reference.html" title="API Reference" + accesskey="N">next</a> |</li> + <li class="right" > + <a href="intro.html" title="Overview / Install" + accesskey="P">previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="gitpython-tutorial"> +<span id="tutorial-label"></span><h1>GitPython Tutorial<a class="headerlink" href="#gitpython-tutorial" title="Permalink to this headline">¶</a></h1> +<p>GitPython provides object model access to your git repository. This tutorial is composed of multiple sections, each of which explain a real-life usecase.</p> +<div class="section" id="initialize-a-repo-object"> +<h2>Initialize a Repo object<a class="headerlink" href="#initialize-a-repo-object" title="Permalink to this headline">¶</a></h2> +<p>The first step is to create a <tt class="docutils literal"><span class="pre">Repo</span></tt> object to represent your repository:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">git</span> <span class="kn">import</span> <span class="o">*</span> +<span class="n">repo</span> <span class="o">=</span> <span class="n">Repo</span><span class="p">(</span><span class="s">"/Users/mtrier/Development/git-python"</span><span class="p">)</span> +</pre></div> +</div> +<p>In the above example, the directory <tt class="docutils literal"><span class="pre">/Users/mtrier/Development/git-python</span></tt> is my working repository and contains the <tt class="docutils literal"><span class="pre">.git</span></tt> directory. You can also initialize GitPython with a bare repository:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span> <span class="o">=</span> <span class="n">Repo</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="s">"/var/git/git-python.git"</span><span class="p">)</span> +</pre></div> +</div> +<p>A repo object provides high-level access to your data, it allows you to create and delete heads, tags and remotes and access the configuration of the repository:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">config_reader</span><span class="p">()</span> <span class="c"># get a config reader for read-only access</span> +<span class="n">repo</span><span class="o">.</span><span class="n">config_writer</span><span class="p">()</span> <span class="c"># get a config writer to change configuration</span> +</pre></div> +</div> +<p>Query the active branch, query untracked files or whether the repository data has been modified:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">is_dirty</span><span class="p">()</span> +<span class="bp">False</span> +<span class="n">repo</span><span class="o">.</span><span class="n">untracked_files</span><span class="p">()</span> +<span class="p">[</span><span class="s">'my_untracked_file'</span><span class="p">]</span> +</pre></div> +</div> +<p>Clone from existing repositories or initialize new empty ones:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">cloned_repo</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">clone</span><span class="p">(</span><span class="s">"to/this/path"</span><span class="p">)</span> +<span class="n">new_repo</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">init</span><span class="p">(</span><span class="s">"path/for/new/repo"</span><span class="p">)</span> +</pre></div> +</div> +<p>Archive the repository contents to a tar file:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">archive</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">"repo.tar"</span><span class="p">,</span><span class="s">'w'</span><span class="p">))</span> +</pre></div> +</div> +</div> +<div class="section" id="examining-references"> +<h2>Examining References<a class="headerlink" href="#examining-references" title="Permalink to this headline">¶</a></h2> +<p>References are the tips of your commit graph from which you can easily examine the history of your project:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">heads</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">heads</span> +<span class="n">master</span> <span class="o">=</span> <span class="n">heads</span><span class="o">.</span><span class="n">master</span> <span class="c"># lists can be accessed by name for convenience</span> +<span class="n">master</span><span class="o">.</span><span class="n">commit</span> <span class="c"># the commit pointed to by head called master</span> +<span class="n">master</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="s">"new_name"</span><span class="p">)</span> <span class="c"># rename heads</span> +</pre></div> +</div> +<p>Tags are (usually immutable) references to a commit and/or a tag object:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tags</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">tags</span> +<span class="n">tagref</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span> +<span class="n">tagref</span><span class="o">.</span><span class="n">tag</span> <span class="c"># tags may have tag objects carrying additional information</span> +<span class="n">tagref</span><span class="o">.</span><span class="n">commit</span> <span class="c"># but they always point to commits</span> +<span class="n">repo</span><span class="o">.</span><span class="n">delete_tag</span><span class="p">(</span><span class="n">tagref</span><span class="p">)</span> <span class="c"># delete or</span> +<span class="n">repo</span><span class="o">.</span><span class="n">create_tag</span><span class="p">(</span><span class="s">"my_tag"</span><span class="p">)</span> <span class="c"># create tags using the repo for convenience</span> +</pre></div> +</div> +<p>A symbolic reference is a special case of a reference as it points to another reference instead of a commit:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">head</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span> <span class="c"># the head points to the active branch/ref</span> +<span class="n">master</span> <span class="o">=</span> <span class="n">head</span><span class="o">.</span><span class="n">reference</span> <span class="c"># retrieve the reference the head points to</span> +<span class="n">master</span><span class="o">.</span><span class="n">commit</span> <span class="c"># from here you use it as any other reference</span> +</pre></div> +</div> +</div> +<div class="section" id="modifying-references"> +<h2>Modifying References<a class="headerlink" href="#modifying-references" title="Permalink to this headline">¶</a></h2> +<p>You can easily create and delete reference types or modify where they point to:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">delete_head</span><span class="p">(</span><span class="s">'master'</span><span class="p">)</span> <span class="c"># delete an existing head</span> +<span class="n">master</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">create_head</span><span class="p">(</span><span class="s">'master'</span><span class="p">)</span> <span class="c"># create a new one</span> +<span class="n">master</span><span class="o">.</span><span class="n">commit</span> <span class="o">=</span> <span class="s">'HEAD~10'</span> <span class="c"># set branch to another commit without changing index or working tree</span> +</pre></div> +</div> +<p>Create or delete tags the same way except you may not change them afterwards:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">new_tag</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">create_tag</span><span class="p">(</span><span class="s">'my_tag'</span><span class="p">,</span> <span class="s">'my message'</span><span class="p">)</span> +<span class="n">repo</span><span class="o">.</span><span class="n">delete_tag</span><span class="p">(</span><span class="n">new_tag</span><span class="p">)</span> +</pre></div> +</div> +<p>Change the symbolic reference to switch branches cheaply ( without adjusting the index or the working copy ):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">new_branch</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">create_head</span><span class="p">(</span><span class="s">'new_branch'</span><span class="p">)</span> +<span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">reference</span> <span class="o">=</span> <span class="n">new_branch</span> +</pre></div> +</div> +</div> +<div class="section" id="understanding-objects"> +<h2>Understanding Objects<a class="headerlink" href="#understanding-objects" title="Permalink to this headline">¶</a></h2> +<p>An Object is anything storable in git’s object database. Objects contain information about their type, their uncompressed size as well as the actual data. Each object is uniquely identified by a SHA1 hash, being 40 hexadecimal characters in size or 20 bytes in size.</p> +<p>Git only knows 4 distinct object types being Blobs, Trees, Commits and Tags.</p> +<p>In Git-Pyhton, all objects can be accessed through their common base, compared and hashed, as shown in the following example:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">hc</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">commit</span> +<span class="n">hct</span> <span class="o">=</span> <span class="n">hc</span><span class="o">.</span><span class="n">tree</span> +<span class="n">hc</span> <span class="o">!=</span> <span class="n">hct</span> +<span class="n">hc</span> <span class="o">!=</span> <span class="n">repo</span><span class="o">.</span><span class="n">tags</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span> +<span class="n">hc</span> <span class="o">==</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">reference</span><span class="o">.</span><span class="n">commit</span> +</pre></div> +</div> +<p>Basic fields are:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">hct</span><span class="o">.</span><span class="n">type</span> +<span class="s">'tree'</span> +<span class="n">hct</span><span class="o">.</span><span class="n">size</span> +<span class="mf">166</span> +<span class="n">hct</span><span class="o">.</span><span class="n">sha</span> +<span class="s">'a95eeb2a7082212c197cabbf2539185ec74ed0e8'</span> +<span class="n">hct</span><span class="o">.</span><span class="n">data</span> <span class="c"># returns string with pure uncompressed data</span> +<span class="s">'...'</span> +<span class="nb">len</span><span class="p">(</span><span class="n">hct</span><span class="o">.</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="n">hct</span><span class="o">.</span><span class="n">size</span> +</pre></div> +</div> +<p>Index Objects are objects that can be put into git’s index. These objects are trees and blobs which additionally know about their path in the filesystem as well as their mode:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">hct</span><span class="o">.</span><span class="n">path</span> <span class="c"># root tree has no path</span> +<span class="s">''</span> +<span class="n">hct</span><span class="o">.</span><span class="n">trees</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">path</span> <span class="c"># the first subdirectory has one though</span> +<span class="s">'dir'</span> +<span class="n">htc</span><span class="o">.</span><span class="n">mode</span> <span class="c"># trees have mode 0</span> +<span class="mf">0</span> +<span class="s">'</span><span class="si">%o</span><span class="s">'</span> <span class="o">%</span> <span class="n">htc</span><span class="o">.</span><span class="n">blobs</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">mode</span> <span class="c"># blobs have a specific mode though comparable to a standard linux fs</span> +<span class="mf">100644</span> +</pre></div> +</div> +<p>Access blob data (or any object data) directly or using streams:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">htc</span><span class="o">.</span><span class="n">data</span> <span class="c"># binary tree data as string ( inefficient )</span> +<span class="n">htc</span><span class="o">.</span><span class="n">blobs</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">data_stream</span> <span class="c"># stream object to read data from</span> +<span class="n">htc</span><span class="o">.</span><span class="n">blobs</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">stream_data</span><span class="p">(</span><span class="n">my_stream</span><span class="p">)</span> <span class="c"># write data to given stream</span> +</pre></div> +</div> +</div> +<div class="section" id="the-commit-object"> +<h2>The Commit object<a class="headerlink" href="#the-commit-object" title="Permalink to this headline">¶</a></h2> +<p>Commit objects contain information about a specific commit. Obtain commits using references as done in <a class="reference internal" href="#examining-references">Examining References</a> or as follows.</p> +<p>Obtain commits at the specified revision:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s">'master'</span><span class="p">)</span> +<span class="n">repo</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s">'v0.1'</span><span class="p">)</span> +<span class="n">repo</span><span class="o">.</span><span class="n">commit</span><span class="p">(</span><span class="s">'HEAD~10'</span><span class="p">)</span> +</pre></div> +</div> +<p>Iterate 100 commits:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">iter_commits</span><span class="p">(</span><span class="s">'master'</span><span class="p">,</span> <span class="n">max_count</span><span class="o">=</span><span class="mf">100</span><span class="p">)</span> +</pre></div> +</div> +<p>If you need paging, you can specify a number of commits to skip:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">iter_commits</span><span class="p">(</span><span class="s">'master'</span><span class="p">,</span> <span class="n">max_count</span><span class="o">=</span><span class="mf">10</span><span class="p">,</span> <span class="n">skip</span><span class="o">=</span><span class="mf">20</span><span class="p">)</span> +</pre></div> +</div> +<p>The above will return commits 21-30 from the commit list.:</p> +<div class="highlight-python"><pre>headcommit = repo.head.commit + +headcommit.sha +'207c0c4418115df0d30820ab1a9acd2ea4bf4431' + +headcommit.parents +[<git.Commit "a91c45eee0b41bf3cdaad3418ca3850664c4a4b4">] + +headcommit.tree +<git.Tree "563413aedbeda425d8d9dcbb744247d0c3e8a0ac"> + +headcommit.author +<git.Actor "Michael Trier <mtrier@gmail.com>"> + +headcommit.authored_date # seconds since epoch +1256291446 + +headcommit.committer +<git.Actor "Michael Trier <mtrier@gmail.com>"> + +headcommit.committed_date +1256291446 + +headcommit.message +'cleaned up a lot of test information. Fixed escaping so it works with +subprocess.'</pre> +</div> +<p>Note: date time is represented in a <tt class="docutils literal"><span class="pre">seconds</span> <span class="pre">since</span> <span class="pre">epock</span></tt> format. Conversion to human readable form can be accomplished with the various time module methods:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">time</span> +<span class="n">time</span><span class="o">.</span><span class="n">asctime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">headcommit</span><span class="o">.</span><span class="n">committed_date</span><span class="p">))</span> +<span class="s">'Wed May 7 05:56:02 2008'</span> + +<span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">"%a, </span><span class="si">%d</span><span class="s"> %b %Y %H:%M"</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">headcommit</span><span class="o">.</span><span class="n">committed_date</span><span class="p">))</span> +<span class="s">'Wed, 7 May 2008 05:56'</span> +</pre></div> +</div> +<p>You can traverse a commit’s ancestry by chaining calls to <tt class="docutils literal"><span class="pre">parents</span></tt>:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">headcommit</span><span class="o">.</span><span class="n">parents</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">parents</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span><span class="o">.</span><span class="n">parents</span><span class="p">[</span><span class="mf">0</span><span class="p">]</span> +</pre></div> +</div> +<p>The above corresponds to <tt class="docutils literal"><span class="pre">master^^^</span></tt> or <tt class="docutils literal"><span class="pre">master~3</span></tt> in git parlance.</p> +</div> +<div class="section" id="the-tree-object"> +<h2>The Tree object<a class="headerlink" href="#the-tree-object" title="Permalink to this headline">¶</a></h2> +<p>A tree records pointers to the contents of a directory. Let’s say you want the root tree of the latest commit on the master branch:</p> +<div class="highlight-python"><pre>tree = repo.heads.master.commit.tree +<git.Tree "a006b5b1a8115185a228b7514cdcd46fed90dc92"> + +tree.sha +'a006b5b1a8115185a228b7514cdcd46fed90dc92'</pre> +</div> +<p>Once you have a tree, you can get the contents:</p> +<div class="highlight-python"><pre>tree.trees # trees are subdirectories +[<git.Tree "f7eb5df2e465ab621b1db3f5714850d6732cfed2">] + +tree.blobs # blobs are files +[<git.Blob "a871e79d59cf8488cac4af0c8f990b7a989e2b53">, +<git.Blob "3594e94c04db171e2767224db355f514b13715c5">, +<git.Blob "e79b05161e4836e5fbf197aeb52515753e8d6ab6">, +<git.Blob "94954abda49de8615a048f8d2e64b5de848e27a1">]</pre> +</div> +<p>Its useful to know that a tree behaves like a list with the ability to query entries by name:</p> +<div class="highlight-python"><pre>tree[0] == tree['dir'] # access by index and by sub-path +<git.Tree "f7eb5df2e465ab621b1db3f5714850d6732cfed2"> +for entry in tree: do_something_with(entry) + +blob = tree[0][0] +blob.name +'file' +blob.path +'dir/file' +blob.abspath +'/Users/mtrier/Development/git-python/dir/file' +>>>tree['dir/file'].sha == blob.sha</pre> +</div> +<p>There is a convenience method that allows you to get a named sub-object from a tree with a syntax similar to how paths are written in an unix system:</p> +<div class="highlight-python"><pre>tree/"lib" +<git.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30"> +tree/"dir/file" == blob.sha</pre> +</div> +<p>You can also get a tree directly from the repository if you know its name:</p> +<div class="highlight-python"><pre>repo.tree() +<git.Tree "master"> + +repo.tree("c1c7214dde86f76bc3e18806ac1f47c38b2b7a30") +<git.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30"> +repo.tree('0.1.6') +<git.Tree "6825a94104164d9f0f5632607bebd2a32a3579e5"></pre> +</div> +<p>As trees only allow direct access to their direct entries, use the traverse method to obtain an iterator to traverse entries recursively:</p> +<div class="highlight-python"><pre>tree.traverse() +<generator object at 0x7f6598bd65a8> +for entry in traverse(): do_something_with(entry)</pre> +</div> +</div> +<div class="section" id="the-index-object"> +<h2>The Index Object<a class="headerlink" href="#the-index-object" title="Permalink to this headline">¶</a></h2> +<p>The git index is the stage containing changes to be written with the next commit or where merges finally have to take place. You may freely access and manipulate this information using the IndexFile Object:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">index</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">index</span> +</pre></div> +</div> +<p>Access objects and add/remove entries. Commit the changes:</p> +<div class="highlight-python"><pre>for stage,blob in index.iter_blobs(): do_something(...) +Access blob objects +for (path,stage),entry in index.entries.iteritems: pass +Access the entries directly +index.add(['my_new_file']) # add a new file to the index +index.remove(['dir/existing_file']) +new_commit = index.commit("my commit message")</pre> +</div> +<p>Create new indices from other trees or as result of a merge. Write that result to a new index:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tmp_index</span> <span class="o">=</span> <span class="n">Index</span><span class="o">.</span><span class="n">from_tree</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="s">'HEAD~1'</span><span class="p">)</span> <span class="c"># load a tree into a temporary index</span> +<span class="n">merge_index</span> <span class="o">=</span> <span class="n">Index</span><span class="o">.</span><span class="n">from_tree</span><span class="p">(</span><span class="n">repo</span><span class="p">,</span> <span class="s">'base'</span><span class="p">,</span> <span class="s">'HEAD'</span><span class="p">,</span> <span class="s">'some_branch'</span><span class="p">)</span> <span class="c"># merge two trees three-way</span> +<span class="n">merge_index</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"merged_index"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="section" id="handling-remotes"> +<h2>Handling Remotes<a class="headerlink" href="#handling-remotes" title="Permalink to this headline">¶</a></h2> +<p>Remotes are used as alias for a foreign repository to ease pushing to and fetching from them:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">test_remote</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">create_remote</span><span class="p">(</span><span class="s">'test'</span><span class="p">,</span> <span class="s">'git@server:repo.git'</span><span class="p">)</span> +<span class="n">repo</span><span class="o">.</span><span class="n">delete_remote</span><span class="p">(</span><span class="n">test_remote</span><span class="p">)</span> <span class="c"># create and delete remotes</span> +<span class="n">origin</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">remotes</span><span class="o">.</span><span class="n">origin</span> <span class="c"># get default remote by name</span> +<span class="n">origin</span><span class="o">.</span><span class="n">refs</span> <span class="c"># local remote references</span> +<span class="n">o</span> <span class="o">=</span> <span class="n">origin</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="s">'new_origin'</span><span class="p">)</span> <span class="c"># rename remotes</span> +<span class="n">o</span><span class="o">.</span><span class="n">fetch</span><span class="p">()</span> <span class="c"># fetch, pull and push from and to the remote</span> +<span class="n">o</span><span class="o">.</span><span class="n">pull</span><span class="p">()</span> +<span class="n">o</span><span class="o">.</span><span class="n">push</span><span class="p">()</span> +</pre></div> +</div> +<p>You can easily access configuration information for a remote by accessing options as if they where attributes:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">o</span><span class="o">.</span><span class="n">url</span> +<span class="s">'git@server:dummy_repo.git'</span> +</pre></div> +</div> +<p>Change configuration for a specific remote only:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">o</span><span class="o">.</span><span class="n">config_writer</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">"pushurl"</span><span class="p">,</span> <span class="s">"other_url"</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="section" id="obtaining-diff-information"> +<h2>Obtaining Diff Information<a class="headerlink" href="#obtaining-diff-information" title="Permalink to this headline">¶</a></h2> +<p>Diffs can generally be obtained by Subclasses of <tt class="docutils literal"><span class="pre">Diffable</span></tt> as they provide the <tt class="docutils literal"><span class="pre">diff</span></tt> method. This operation yields a DiffIndex allowing you to easily access diff information about paths.</p> +<p>Diffs can be made between the Index and Trees, Index and the working tree, trees and trees as well as trees and the working copy. If commits are involved, their tree will be used implicitly:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">hcommit</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">commit</span> +<span class="n">idiff</span> <span class="o">=</span> <span class="n">hcommit</span><span class="o">.</span><span class="n">diff</span><span class="p">()</span> <span class="c"># diff tree against index</span> +<span class="n">tdiff</span> <span class="o">=</span> <span class="n">hcommit</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="s">'HEAD~1'</span><span class="p">)</span> <span class="c"># diff tree against previous tree</span> +<span class="n">wdiff</span> <span class="o">=</span> <span class="n">hcommit</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span> <span class="c"># diff tree against working tree</span> + +<span class="n">index</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">index</span> +<span class="n">index</span><span class="o">.</span><span class="n">diff</span><span class="p">()</span> <span class="c"># diff index against itself yielding empty diff</span> +<span class="n">index</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span> <span class="c"># diff index against working copy</span> +<span class="n">index</span><span class="o">.</span><span class="n">diff</span><span class="p">(</span><span class="s">'HEAD'</span><span class="p">)</span> <span class="c"># diff index against current HEAD tree</span> +</pre></div> +</div> +<p>The item returned is a DiffIndex which is essentially a list of Diff objects. It provides additional filtering to ease finding what you might be looking for:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">diff_added</span> <span class="ow">in</span> <span class="n">wdiff</span><span class="o">.</span><span class="n">iter_change_type</span><span class="p">(</span><span class="s">'A'</span><span class="p">):</span> <span class="n">do_something_with</span><span class="p">(</span><span class="n">diff_added</span><span class="p">)</span> +</pre></div> +</div> +</div> +<div class="section" id="switching-branches"> +<h2>Switching Branches<a class="headerlink" href="#switching-branches" title="Permalink to this headline">¶</a></h2> +<p>To switch between branches, you effectively need to point your HEAD to the new branch head and reset your index and working copy to match. A simple manual way to do it is the following one:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">reference</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">other_branch</span> +<span class="n">repo</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">reset</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">working_tree</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> +</pre></div> +</div> +<p>The previous approach would brutally overwrite the user’s changes in the working copy and index though and is less sophisticated than a git-checkout for instance which generally prevents you from destroying your work. Use the safer approach as follows:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">repo</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">master</span><span class="o">.</span><span class="n">checkout</span><span class="p">()</span> <span class="c"># checkout the branch using git-checkout</span> +<span class="n">repo</span><span class="o">.</span><span class="n">heads</span><span class="o">.</span><span class="n">other_branch</span><span class="o">.</span><span class="n">checkout</span><span class="p">()</span> +</pre></div> +</div> +</div> +<div class="section" id="using-git-directly"> +<h2>Using git directly<a class="headerlink" href="#using-git-directly" title="Permalink to this headline">¶</a></h2> +<p>In case you are missing functionality as it has not been wrapped, you may conveniently use the git command directly. It is owned by each repository instance:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">git</span> <span class="o">=</span> <span class="n">repo</span><span class="o">.</span><span class="n">git</span> +<span class="n">git</span><span class="o">.</span><span class="n">checkout</span><span class="p">(</span><span class="s">'head'</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="s">"my_new_branch"</span><span class="p">)</span> <span class="c"># default command</span> +<span class="n">git</span><span class="o">.</span><span class="n">for_each_ref</span><span class="p">()</span> <span class="c"># '-' becomes '_' when calling it</span> +</pre></div> +</div> +<p>The return value will by default be a string of the standard output channel produced by the command.</p> +<p>Keyword arguments translate to short and long keyword arguments on the commandline. +The special notion <tt class="docutils literal"><span class="pre">git.command(flag=True)</span></tt> will create a flag without value like <tt class="docutils literal"><span class="pre">command</span> <span class="pre">--flag</span></tt>.</p> +<p>If <tt class="xref docutils literal"><span class="pre">None</span></tt> is found in the arguments, it will be dropped silently. Lists and tuples passed as arguments will be unpacked to individual arguments. Objects are converted to strings using the str(...) function.</p> +</div> +<div class="section" id="and-even-more"> +<h2>And even more ...<a class="headerlink" href="#and-even-more" title="Permalink to this headline">¶</a></h2> +<p>There is more functionality in there, like the ability to archive repositories, get stats and logs, blame, and probably a few other things that were not mentioned here.</p> +<p>Check the unit tests for an in-depth introduction on how each function is supposed to be used.</p> +</div> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference external" href="#">GitPython Tutorial</a><ul> +<li><a class="reference external" href="#initialize-a-repo-object">Initialize a Repo object</a></li> +<li><a class="reference external" href="#examining-references">Examining References</a></li> +<li><a class="reference external" href="#modifying-references">Modifying References</a></li> +<li><a class="reference external" href="#understanding-objects">Understanding Objects</a></li> +<li><a class="reference external" href="#the-commit-object">The Commit object</a></li> +<li><a class="reference external" href="#the-tree-object">The Tree object</a></li> +<li><a class="reference external" href="#the-index-object">The Index Object</a></li> +<li><a class="reference external" href="#handling-remotes">Handling Remotes</a></li> +<li><a class="reference external" href="#obtaining-diff-information">Obtaining Diff Information</a></li> +<li><a class="reference external" href="#switching-branches">Switching Branches</a></li> +<li><a class="reference external" href="#using-git-directly">Using git directly</a></li> +<li><a class="reference external" href="#and-even-more">And even more ...</a></li> +</ul> +</li> +</ul> + + <h4>Previous topic</h4> + <p class="topless"><a href="intro.html" + title="previous chapter">Overview / Install</a></p> + <h4>Next topic</h4> + <p class="topless"><a href="reference.html" + title="next chapter">API Reference</a></p> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/tutorial.txt" + rel="nofollow">Show Source</a></li> + </ul> + <div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> + </div> + <script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="reference.html" title="API Reference" + >next</a> |</li> + <li class="right" > + <a href="intro.html" title="Overview / Install" + >previous</a> |</li> + <li><a href="index.html">GitPython v0.2.0 Beta documentation</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright Copyright (C) 2008, 2009 Michael Trier and contributors. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 0.6.5. + </div> + </body> +</html>
\ No newline at end of file |