Merge lp:~jelmer/brz/bundle-webdav into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Merged at revision: 7678
Proposed branch: lp:~jelmer/brz/bundle-webdav
Merge into: lp:brz
Diff against target: 1957 lines (+1904/-0)
8 files modified
breezy/plugins/webdav/NOTES (+43/-0)
breezy/plugins/webdav/TODO (+48/-0)
breezy/plugins/webdav/__init__.py (+45/-0)
breezy/plugins/webdav/tests/__init__.py (+23/-0)
breezy/plugins/webdav/tests/dav_server.py (+468/-0)
breezy/plugins/webdav/tests/test_webdav.py (+421/-0)
breezy/plugins/webdav/webdav.py (+854/-0)
breezy/transport/http/urllib.py (+2/-0)
To merge this branch: bzr merge lp:~jelmer/brz/bundle-webdav
Reviewer Review Type Date Requested Status
Breezy developers Pending
Review via email: mp+329746@code.launchpad.net

Commit message

Add support for WebDAV.

Description of the change

Merge support for WebDAV.

To post a comment you must log in.
lp:~jelmer/brz/bundle-webdav updated
6772. By Martin Packman

Defer format registration in generate_docs.py by gz review by jelmer

6773. By Jelmer Vernooij

Merge lp:~jelmer/brz/initialization.

6774. By Jelmer Vernooij

Merge lp:~jelmer/brz/offline.

6775. By Jelmer Vernooij

Merge lp:~jelmer/brz/lock-context.

6776. By Jelmer Vernooij

Merge lp:~jelmer/brz/gpghome.

6777. By Jelmer Vernooij

Merge lp:~jelmer/brz/avoid-set-fileid.

6778. By Jelmer Vernooij

Merge lp:~jelmer/brz/warn-mtn-cvs.

6779. By Jelmer Vernooij

Merge lp:~gz/brz/py3_test_cleanup

6780. By Jelmer Vernooij

Merge lp:~jelmer/brz/bundle-darcs.

6781. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-get-loaded-plugin.

6782. By Jelmer Vernooij

Merge lp:~gz/brz/rm_deprecation_warning_gzip.

6783. By Jelmer Vernooij

Merge lp:~jelmer/brz/lock-context-2.

6784. By Jelmer Vernooij

Merge lp:~jelmer/brz/no-inv-deltas

6785. By Jelmer Vernooij

Merge lp:~jelmer/brz/supports-shelving.

6786. By Jelmer Vernooij

Merge lp:~jelmer/brz/bundle-repodebug.

6787. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-darcs.

6788. By Jelmer Vernooij

Merge lp:~jelmer/brz/supports-shelving.

6789. By Jelmer Vernooij

Merge lp:~jelmer/brz/rio_pyx.

6790. By Jelmer Vernooij

Merge lp:~gz/brz/ur_globbing_me.

6791. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-ssl-certs.

6792. By Jelmer Vernooij

Merge lp:~jelmer/brz/update-makefile; add 'update-python3-passing' target to Makefile.

6793. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-language.

6794. By Jelmer Vernooij

Merge lp:~jelmer/brz/install.

6795. By Jelmer Vernooij

Merge lp:~jelmer/brz/remove-other-languages.

6796. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-doctest

6797. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-imports.

6798. By Jelmer Vernooij

Merge lp:~jelmer/brz/set-root-id.

6799. By Jelmer Vernooij

Merge lp:~jelmer/brz/escaping.

6800. By Jelmer Vernooij

Merge lp:~jelmer/brz/fewer-hardcoded-file-ids.

6801. By Jelmer Vernooij

Merge lp:~jelmer/brz/mixed.

6802. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-lazy-imports.

6803. By Jelmer Vernooij

Merge lp:~jelmer/brz/pypi.

6804. By Jelmer Vernooij

Merge lp:~jelmer/brz/devdocs.

6805. By Jelmer Vernooij

Merge lp:~gz/brz/test-groupcompress.

6806. By Jelmer Vernooij

Merge https://code.launchpad.net/~gz/brz/module_feature_import.

6807. By Jelmer Vernooij

Merge lp:~gz/brz/py3_groupcompress.

6808. By Jelmer Vernooij

merge lp:~jelmer/brz/options-unicode/

6809. By Jelmer Vernooij

Merge lp:~jelmer/brz/auto-rename-fix

6810. By Jelmer Vernooij

Merge lp:~gz/brz/ws_comma

6811. By Jelmer Vernooij

Merge lp:~gz/brz/py3_ignores

6812. By Jelmer Vernooij

Merge lp:~jelmer/brz/escape-more

6813. By Jelmer Vernooij

python3.passing: Allow 6 tests to fail again while we fix up the string types used inside 2a repository implementations.

6814. By Jelmer Vernooij

Merge lp:~gz/brz/py3_small_bits

6815. By Jelmer Vernooij

Merge lp:~gz/brz/upload_plugin_no_sftp.

6816. By Jelmer Vernooij

Merge lp:~gz/brz/py3_hashcache

6817. By Jelmer Vernooij

Merge lp:~jelmer/brz/custom-file-ids

6818. By Jelmer Vernooij

Merge lp:~jelmer/brz/branch-builder-order

6819. By Jelmer Vernooij

Merge lp:~jelmer/brz/swap-arguments.

6820. By Jelmer Vernooij

Merge lp:~jelmer/brz/misc.

6821. By Jelmer Vernooij

Merge lp:~jelmer/brz/py3_lsprof.

6822. By Jelmer Vernooij

Merge lp:~jelmer/brz/ignore-warnings.

6823. By Jelmer Vernooij

Merge lp:~jelmer/brz/supports-storing-branch-nick.

6824. By Jelmer Vernooij

Merge lp:~jelmer/brz/supports-overriding-transport

6825. By Jelmer Vernooij

Merge lp:~jelmer/brz/misc-foreign.

6826. By Jelmer Vernooij

Merge lp:~jelmer/brz/move-acquisition.

6827. By Jelmer Vernooij

Merge lp:~jelmer/brz/misc-foreign2.

6828. By Jelmer Vernooij

Merge lp:~jelmer/brz/walkdirs

6829. By Jelmer Vernooij

Merge lp:~jelmer/brz/log-inventory.

6830. By Jelmer Vernooij

Merge lp:~jelmer/brz/no-branch-nick.

6831. By Jelmer Vernooij

Merge lp:~jelmer/brz/misc-foreign3.

6832. By Jelmer Vernooij

Merge lp:~jelmer/brz/iter-merged.

6833. By Jelmer Vernooij

Merge lp:~jelmer/brz/all-paths.

6834. By Jelmer Vernooij

Merge lp:~jelmer/brz/unused.

6835. By Jelmer Vernooij

Merge lp:~jelmer/brz/268573-outf

6836. By Jelmer Vernooij

Merge lp:~jelmer/brz/shelving-directory-with-ignored.

6837. By Jelmer Vernooij

Merge lp:~jelmer/brz/bug842575-rm-resolve.

6838. By Jelmer Vernooij

Merge lp:~jelmer/brz/bug842695-log-dir.

6839. By Jelmer Vernooij

Merge lp:~jelmer/brz/get-full.

6840. By Jelmer Vernooij

Merge lp:~jelmer/brz/commit-message-edit-encoding.

6841. By Jelmer Vernooij

Merge lp:~jelmer/brz/cp.

6842. By Jelmer Vernooij

Merge lp:~jelmer/brz/default-time.

6843. By Jelmer Vernooij

Merge lp:~jelmer/brz/move-add-reference.

6844. By Jelmer Vernooij

Merge lp:~jelmer/brz/unversion.

6845. By Jelmer Vernooij

merge lp:~jelmer/brz/support-backslash

6846. By Jelmer Vernooij

merge lp:~jelmer/brz/more-foreign-3.

6847. By Jelmer Vernooij

Merge lp:~cjwatson/brz/requires-six.

6848. By Jelmer Vernooij

Merge lp:~jelmer/brz/foreign-more.

6849. By Jelmer Vernooij

Merge lp:~jelmer/brz/mark-0

6850. By Jelmer Vernooij

Merge lp:~jelmer/brz/fastimport-colocated

6851. By Jelmer Vernooij

Merge lp:~jelmer/brz/user-agent

6852. By Jelmer Vernooij

Merge lp:~jelmer/brz/more-foreign-3

6853. By Jelmer Vernooij

Add MutableTree.copy_one.

6854. By Jelmer Vernooij

Merge lp:~jelmer/brz/lp-logout

6855. By Jelmer Vernooij

Merge lp:~jelmer/brz/custom-revprops.

6856. By Jelmer Vernooij

Merge lp:~jelmer/brz/is-versioned.

6857. By Jelmer Vernooij

Merge lp:~jelmer/brz/move-ie.

6858. By Jelmer Vernooij

Merge lp:~jelmer/brz/fix-import-stacked.

6859. By Jelmer Vernooij

merge lp:~jelmer/brz/todo

6860. By Jelmer Vernooij

Add magic to say that the 'fastimport' feature requires the 'fastimport' module.

Merged from https://code.launchpad.net/~jelmer/brz/req-fastimport/+merge/337918

6861. By Jelmer Vernooij

Allow proxying for lazy imports on Python 3 for now, and update list of passing tests.

Merged from https://code.launchpad.net/~jelmer/brz/python3/+merge/337894

6862. By Jelmer Vernooij

Some more foreign branch test fixes.

Also, fix some misisng spaces.

Notably, this changes the expectations with regard to directories reported by Tree.list_files():

If a tree does not support versioned empty directories, implicit directories will still be reported as
versioned, for consistency with Bazaar. Empty directories are of unknown (?) status.

Merged from https://code.launchpad.net/~jelmer/brz/even-more-foreign/+merge/338464

6863. By Jelmer Vernooij

Use unique messages for commits in diverged branches.

Merged from https://code.launchpad.net/~jelmer/brz/diverged-revids/+merge/340147

6864. By Jelmer Vernooij

Allow ControlDirFormat instances to be uninitializeable (like git remotes).

Merged from https://code.launchpad.net/~jelmer/brz/uninitialize-remote/+merge/340049

6865. By Jelmer Vernooij

Don't attempt to test tree description for control formats that don't support trees.

Merged from https://code.launchpad.net/~jelmer/brz/testr-tree-description/+merge/340027

6866. By Jelmer Vernooij

Allow InterBranch implementations to not provide support for limit= parameter.

Merged from https://code.launchpad.net/~jelmer/brz/fetch-limit-unsupported/+merge/340021

6867. By Jelmer Vernooij

Fix walkdirs tests for formats without versioned directories.

Merged from https://code.launchpad.net/~jelmer/brz/walkdirs/+merge/339726

6868. By Jelmer Vernooij

Move Tree.plan_file_merge to InventoryTree.plan_file_merge.

Merged from https://code.launchpad.net/~jelmer/brz/plan-merge/+merge/339452

6869. By Jelmer Vernooij

Remove unused NoSuchIdInRepository exception.

Merged from https://code.launchpad.net/~jelmer/brz/no-such-repo/+merge/339451

6870. By Jelmer Vernooij

Make progress bars context managers.

Merged from https://code.launchpad.net/~jelmer/brz/pb-context/+merge/339449

6871. By Jelmer Vernooij

Make progress bars context managers.

Merged from https://code.launchpad.net/~jelmer/brz/pb-context/+merge/339449

6872. By Jelmer Vernooij

Allow working trees to not implement set_merge_modified.

Merged from https://code.launchpad.net/~jelmer/brz/merge-modified/+merge/339727

6873. By Jelmer Vernooij

Allow working tree formats to specify that they don't support righthand ghost parents.

Merged from https://code.launchpad.net/~jelmer/brz/wt-righthand-ghost-parents/+merge/339496

6874. By Jelmer Vernooij

Fix some more tests when used against foreign branches.

Merged from https://code.launchpad.net/~jelmer/brz/even-even-more-foreign/+merge/340261

6875. By Jelmer Vernooij

Allow ControlDir.break_lock to not be implemented.

Merged from https://code.launchpad.net/~jelmer/brz/lock-breaking/+merge/340563

6876. By Jelmer Vernooij

Consistently use Branch.user_url when referring to branch location.

Merged from https://code.launchpad.net/~jelmer/brz/user-url/+merge/340567

6877. By Jelmer Vernooij

Allow InterBranch formats to raise NoRoundtrippingSupport to indicate
that they can't do lossless conversion between two branches.

Merged from https://code.launchpad.net/~jelmer/brz/lossless-fetch-optional/+merge/340769

6878. By Jelmer Vernooij

Compare user_url branch attribute in cmd_branches, when finding active branch.

Merged from https://code.launchpad.net/~jelmer/brz/branches-url/+merge/340765

6879. By Jelmer Vernooij

Fix some walkdir tests for workingtree formats without support for versioned directories.

Merged from https://code.launchpad.net/~jelmer/brz/walkdirs/+merge/340639

6880. By Jelmer Vernooij

Add a WorkingTreeFormat flag for the ignore pattern filename.

Merged from https://code.launchpad.net/~jelmer/brz/bzrignore/+merge/340633

6881. By Jelmer Vernooij

Skip over some more inventory-specific stuff in tests for foreign branches.

Merged from https://code.launchpad.net/~jelmer/brz/skip-inventory/+merge/340637

6882. By Jelmer Vernooij

Use sprout rather than clone when creating a copy of a branch in a controldir.

Merged from https://code.launchpad.net/~jelmer/brz/push-uses-sprout/+merge/340585

6883. By Jelmer Vernooij

Only check for specific behaviour over HPSS for VF repositories.

Merged from https://code.launchpad.net/~jelmer/brz/vfrepo-insert-stream/+merge/340583

6884. By Jelmer Vernooij

Avoid id2path calls in Tree.

Merged from https://code.launchpad.net/~jelmer/brz/changes-from-entries/+merge/341569

6885. By Jelmer Vernooij

Remove unused Tree._check_retrieved.

Merged from https://code.launchpad.net/~jelmer/brz/kill-check-retrieved/+merge/341568

6886. By Jelmer Vernooij

Remove TreeTransform.trans_id_tree_file_id().

Merged from https://code.launchpad.net/~jelmer/brz/transform-no-trans-id-tree-file-id/+merge/341698

6887. By Jelmer Vernooij

Add a WorkingTree.supports_merge_modified() method.

Merged from https://code.launchpad.net/~jelmer/brz/supports-merge-modified/+merge/341604

6888. By Jelmer Vernooij

Remove Tree.iter_children in favor of Tree.iter_child_entries.

Merged from https://code.launchpad.net/~jelmer/brz/iter-children/+merge/341576

6889. By Jelmer Vernooij

Avoid using inventory in FilterTreeContext, and remove unused functionality.

Merged from https://code.launchpad.net/~jelmer/brz/filter-no-inventory/+merge/342012

6890. By Jelmer Vernooij

Remove some reliance on file ids from TreeTransform.

Merged from https://code.launchpad.net/~jelmer/brz/transform-less-file-ids/+merge/341575

6891. By Jelmer Vernooij

Add a flag for Trees to indicate whether they support rename tracking.

Merged from https://code.launchpad.net/~jelmer/brz/supports-rename-tracking/+merge/341565

6892. By Jelmer Vernooij

Fix the stats command by not returning an empty iterator.

Merged from https://code.launchpad.net/~jelmer/brz/fix-stats/+merge/341559

6893. By Jelmer Vernooij

Avoid using file ids in a couple more places.

Merged from https://code.launchpad.net/~jelmer/brz/cleanups/+merge/341360

6894. By Jelmer Vernooij

Add Branch.create_memorytree.

Merged from https://code.launchpad.net/~jelmer/brz/memorytree/+merge/341358

6895. By Jelmer Vernooij

Avoid use of TreeTransform.trans_id_file_id.

Merged from https://code.launchpad.net/~jelmer/brz/transform-no-trans-id-file-id/+merge/341701

6896. By Jelmer Vernooij

Add a new Tree.find_related_paths_across_trees() method and pass files rather than file ids in various places.

Merged from https://code.launchpad.net/~jelmer/brz/extract-paths2ids/+merge/341923

6897. By Jelmer Vernooij

Simplify CommitBuilder tests, fix some tests for formats that don't support rename tracking.

Merged from https://code.launchpad.net/~jelmer/brz/fix-commit-builder/+merge/342018

6898. By Jelmer Vernooij

Remove uses of Tree.id2path in all important codepaths of merge.

Instead, pass around the actual paths in relevant trees.

Merged from https://code.launchpad.net/~jelmer/brz/merge-less-file-ids/+merge/341593

6899. By Jelmer Vernooij

Add support for passing mode argument to GPGSignature.sign.

Merged from https://code.launchpad.net/~jelmer/brz/gpg-detached-sign/+merge/341287

6900. By Jelmer Vernooij

Fix one of the rename tests for trees that don't support empty versioned directories.

Merged from https://code.launchpad.net/~jelmer/brz/rename-to-empty-dir/+merge/341281

6901. By Jelmer Vernooij

Rename the ``brz.transform.orphan_policy`` flag to ``transform.orphan_policy``.

Merged from https://code.launchpad.net/~jelmer/brz/rename-config-brz-transform/+merge/341279

6902. By Jelmer Vernooij

Some more foreign branch test fixes.

Merged from https://code.launchpad.net/~jelmer/brz/fetch-rich-root/+merge/341186

6903. By Jelmer Vernooij

Add some uniqueness to commit messages.

Merged from https://code.launchpad.net/~jelmer/brz/dupe-commits/+merge/341078

6904. By Jelmer Vernooij

Various foreign-branch related fixes to CommitBuilder tests.

Merged from https://code.launchpad.net/~jelmer/brz/avoid-inventory/+merge/341077

6905. By Jelmer Vernooij

Only set default HTTP headers if they weren't provided by the caller.

Merged from https://code.launchpad.net/~jelmer/brz/http-header-overrides/+merge/341185

6906. By Jelmer Vernooij

Fix remaining walkdirs tests for trees wthout versioned directories.

Merged from https://code.launchpad.net/~jelmer/brz/walkdirs-2/+merge/340931

6907. By Jelmer Vernooij

Allow the default branch to be a reference branch.

Merged from https://code.launchpad.net/~jelmer/brz/default-is-reference/+merge/340929

6908. By Jelmer Vernooij

Blacklist git and git-bare for checkout description tests.

Merged from https://code.launchpad.net/~jelmer/brz/format-description/+merge/340885

6909. By Jelmer Vernooij

Allow InterBranch formats to raise NoRoundtrippingSupport.

Merged from https://code.launchpad.net/~jelmer/brz/noroundtrippin/+merge/340877

6910. By Jelmer Vernooij

Move responsibility for dealing with tags bytes from Branch to BzrBranch.

Merged from https://code.launchpad.net/~jelmer/brz/move-bzrbranch/+merge/340777

6911. By Martin Packman

Fix SFTP monkey patch for Python 3

Merged from https://code.launchpad.net/~gz/brz/paramiko_code_hack/+merge/342028

6912. By Jelmer Vernooij

Add a 'check-ci' target that outputs subunit for the purpose of the CI.

At the moment, this just runs the command that byoci was running. Having it as
a target here allows us to e.g. add Python3 tests in the future easily.

Companion branch: lp:~jelmer/byoci/check-ci

Merged from https://code.launchpad.net/~jelmer/brz/check-ci/+merge/342027

6913. By Jelmer Vernooij

Change Tree.iter_files_bytes() to take a (path, identifier) list rather than a (file_id, identifier) list.

Merged from https://code.launchpad.net/~jelmer/brz/iter-files-bytes/+merge/340578

6914. By Jelmer Vernooij

Fix unicode tests for foreign trees.

Merged from https://code.launchpad.net/~jelmer/brz/fix-unicode-tests/+merge/342032

6915. By Jelmer Vernooij

Fail early in MemoryTree.unversion() when passing in paths that don't exist.

Merged from https://code.launchpad.net/~jelmer/brz/memorytree-fail-early/+merge/342036

6916. By Jelmer Vernooij

Allow empty branches that aren't actually present on disk.

Merged from https://code.launchpad.net/~jelmer/brz/nascent-branches/+merge/340568

6917. By Jelmer Vernooij

Allow overriding PYTHON to use in testr from the environment.

Merged from https://code.launchpad.net/~jelmer/brz/testr-python/+merge/342040

6918. By Jelmer Vernooij

Avoid use of file ids in a few more places.

Merged from https://code.launchpad.net/~jelmer/brz/avoid-file-ids/+merge/342033

6919. By Jelmer Vernooij

Fix several more foreign tests.

Merged from https://code.launchpad.net/~jelmer/brz/more-foreign-fixes/+merge/342035

6920. By Jelmer Vernooij

Don't require that entries returned from Tree have a .revision attribute set.

If callers care, they can use Tree.get_file_revision().

Git doesn't store file revisions, and getting at this attribute is costly.

(Nothing else in the non-bzr bit of the breezy codebase currently seems to require .revision)

Merged from https://code.launchpad.net/~jelmer/brz/no-more-ie-revision/+merge/342045

6921. By Martin Packman

Further work on sane ui factory interface and fix choose in char mode

Merged from https://code.launchpad.net/~gz/brz/ui_enter/+merge/342043

6922. By Jelmer Vernooij

Use HasPathRelations in a few more places.

Simplify the actual HasPathRelations implementation to always take tuples with
current and previous path. The mode in which only the current path is specified
is not useful; the HasLayout matcher can already be used for that.

Merged from https://code.launchpad.net/~jelmer/brz/has-path-relations/+merge/342034

6923. By Jelmer Vernooij

Some random Python3 fixes.

In particular:
 * Make format strings bytestrings
 * Allow a $PYTHON variable to be set when calling testr

This adds another ~400 tests to the "known passing" list.

Merged from https://code.launchpad.net/~jelmer/brz/python3-more/+merge/337904

6924. By Jelmer Vernooij

Some foreign branch fixes for the commit builder tests.

Merged from https://code.launchpad.net/~jelmer/brz/commit-builder-fixes/+merge/342050

6925. By Jelmer Vernooij

Fix regression dealing with LCA merges.

Merged from https://code.launchpad.net/~jelmer/brz/merge-lca-regression/+merge/342049

6926. By Jelmer Vernooij

Add more bees in places, get more tests to pass on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/bees/+merge/337908

6927. By Jelmer Vernooij

Remove the __getitem__, __iter__ and __delitem__ implementations from Inventory.

Instead, add .get_entry(), .all_file_ids() and .delete().

Merged from https://code.launchpad.net/~jelmer/brz/inv-not-dict/+merge/342053

6928. By Jelmer Vernooij

Add more bees. In particular:

* for file ids
* for revision ids
* for file contents in build_tree_contents()

Merged from https://code.launchpad.net/~jelmer/brz/more-bees/+merge/337919

6929. By Jelmer Vernooij

Change arguments for 'modify' and 'unversion' in BranchBuilder.build_snapshot from a file-id to path.

Merged from https://code.launchpad.net/~jelmer/brz/conflicts/+merge/341069

6930. By Jelmer Vernooij

Fix 'brz shell-complete' and add some really basic smoke tests.

Merged from https://code.launchpad.net/~jelmer/brz/shell-complete-fix/+merge/342458

6931. By Jelmer Vernooij

Fix typo in README, rename to .rst.

Merged from https://code.launchpad.net/~jelmer/brz/readme/+merge/342480

6932. By Jelmer Vernooij

Some miscellaneous changes (check for actual root, add Tree.versionable_kind).

Merged from https://code.launchpad.net/~jelmer/brz/skip-root-simpler/+merge/342451

6933. By Jelmer Vernooij

Allow breezy's selftest to run without tests installed.

Merged from https://code.launchpad.net/~jelmer/brz/no-tests/+merge/342440

6934. By Jelmer Vernooij

Don't explicitly specify repository format to fixed component bzrdirs (like weave).

Merged from https://code.launchpad.net/~jelmer/brz/init-repo-weave-fmt/+merge/342438

6935. By Jelmer Vernooij

Remove unused yield_parents argument from Tree.iter_entries_by_dir().

Merged from https://code.launchpad.net/~jelmer/brz/yield-parents/+merge/342257

6936. By Jelmer Vernooij

Remove the deprecated _multi commands in Transport.

Merged from https://code.launchpad.net/~jelmer/brz/kill-multi/+merge/342066

6937. By Jelmer Vernooij

Add a format alias 'bzr' for '2a'.

Merged from https://code.launchpad.net/~jelmer/brz/bzr-format-alias/+merge/342431

6938. By Jelmer Vernooij

In InventoryTree, always use path if specified.

Merged from https://code.launchpad.net/~jelmer/brz/path2id-path-only/+merge/342253

6939. By Jelmer Vernooij

Update the python3.passing file to reflect reality.

Merged from https://code.launchpad.net/~jelmer/brz/python3-passing-regressions/+merge/342060

6940. By Jelmer Vernooij

Two switch fixes (relative paths in lightweight checkout URLs of colocated branches (#919169), print error when attempting to create a branch reference loop (#1018628))

Merged from https://code.launchpad.net/~jelmer/brz/switch-self/+merge/342486

6941. By Jelmer Vernooij

Several changes to help foreign branch use of tree references.

Merged from https://code.launchpad.net/~jelmer/brz/tree-reference-fixes/+merge/342059

6942. By Jelmer Vernooij

Fix the remaining tests for brz-git!

Merged from https://code.launchpad.net/~jelmer/brz/remaining/+merge/342161

6943. By Jelmer Vernooij

Add Inventory.get_entry_by_path, refactor InventoryTree.

Merged from https://code.launchpad.net/~jelmer/brz/inv-get-entry-by-path/+merge/342501

6944. By Jelmer Vernooij

Move the dump-btree command to breezy.bzr.debug_commands.

Merged from https://code.launchpad.net/~jelmer/brz/move-debug-commands/+merge/342492

6945. By Jelmer Vernooij

Improve short options for formats.

Merged from https://code.launchpad.net/~jelmer/brz/short-options/+merge/342436

6946. By Jelmer Vernooij

Move vf-specific check code to breezy.bzr.check.

Merged from https://code.launchpad.net/~jelmer/brz/check/+merge/342839

6947. By Jelmer Vernooij

Run python3 tests in 'make check-ci'.

Merged from https://code.launchpad.net/~jelmer/brz/python3-ci/+merge/342039

6948. By Jelmer Vernooij

Integrate the urllib-specific bits into the main HttpTransport.

Merged from https://code.launchpad.net/~jelmer/brz/urllib-integration/+merge/342487

6949. By Jelmer Vernooij

Update python3.passing.

Merged from https://code.launchpad.net/~jelmer/brz/update-python3.passing/+merge/345127

6950. By Jelmer Vernooij

Don't expect unmodified files to be removed when a merge is reverted on working trees that don't support merge_modified.

Merged from https://code.launchpad.net/~jelmer/brz/merge-modified/+merge/345133

6951. By Jelmer Vernooij

Add a travis configuration file, for those pushing Breezy to GitHub.

Merged from https://code.launchpad.net/~jelmer/brz/travis/+merge/343119

6952. By Jelmer Vernooij

Remove the dpush command, in favor of 'brz push --lossy'.

Merged from https://code.launchpad.net/~jelmer/brz/remove-dpush/+merge/342553

6953. By Jelmer Vernooij

Remove the fast-import-{query,info,filter} commands.

Merged from https://code.launchpad.net/~jelmer/brz/fast-import-cmds/+merge/342461

6954. By Jelmer Vernooij

Remove grep tests from python3.passing; they fail on travis.

Merged from https://code.launchpad.net/~jelmer/brz/travis-fixes/+merge/345175

6955. By Jelmer Vernooij

Add a --lossy option to push.

Merged from https://code.launchpad.net/~jelmer/brz/lossy-push/+merge/345125

6956. By Jelmer Vernooij

Enable coverage reporting in travis.

Merged from https://code.launchpad.net/~jelmer/brz/coverage/+merge/345182

6957. By Jelmer Vernooij

Always run testsuite with Python2 and Python3, even if one fails.

Merged from https://code.launchpad.net/~jelmer/brz/run-both/+merge/345183

6958. By Jelmer Vernooij

Switch --coverage to use coverage module.

Merged from https://code.launchpad.net/~jelmer/brz/coverage-coverage/+merge/345192

6959. By Jelmer Vernooij

Opt into apt update in the travis build.

Merged from https://code.launchpad.net/~jelmer/brz/travis-apt/+merge/345327

6960. By Jelmer Vernooij

Bundle the git plugin with Breezy.

Merged from https://code.launchpad.net/~jelmer/brz/bundle-git/+merge/345138

6961. By Jelmer Vernooij

Drop two broken dpush tests (dpush has been removed).

Merged from https://code.launchpad.net/~jelmer/brz/no-dpush/+merge/345331

6962. By Jelmer Vernooij

Drop support for FTP.

Merged from https://code.launchpad.net/~jelmer/brz/no-more-ftp/+merge/342526

6963. By Jelmer Vernooij

Fix an AttributeError when writing to Git cache files.

Merged from https://code.launchpad.net/~jelmer/brz/git-cache-fixes/+merge/345459

6964. By Jelmer Vernooij

Add some more bees, especially for the smart server/client.

This fixes another ~1000 tests with Python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-a/+merge/345466

6965. By Jelmer Vernooij

Add a GitHub bug tracker.

E.g. brz commit --fixes github:breezy-team/breezy/1

Merged from https://code.launchpad.net/~jelmer/brz/github-tracker/+merge/345458

6966. By Jelmer Vernooij

Support nested trees in 'brz export'.

Merged from https://code.launchpad.net/~jelmer/brz/export-nested-tree/+merge/345553

6967. By Jelmer Vernooij

Support running 'bzr log' in a shallow git branch.

Revision numbers are not displayed in this case, since they are not known.

Merged from https://code.launchpad.net/~jelmer/brz/horizon-log/+merge/345552

6968. By Jelmer Vernooij

Port some of brz-git to python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-git/+merge/345479

6969. By Jelmer Vernooij

Support 'brz version-info' in branches without a known revno.

Merged from https://code.launchpad.net/~jelmer/brz/version-info-horizon/+merge/345625

6970. By Jelmer Vernooij

Handle GhostRevisionsHaveNoRevno in hpss.

Merged from https://code.launchpad.net/~jelmer/brz/hpss-ghost-rev-error/+merge/346342

6971. By Jelmer Vernooij

Re-enable "git clone --depth".

Merged from https://code.launchpad.net/~jelmer/brz/enable-depth/+merge/346237

6972. By Jelmer Vernooij

Refactor the export API.

Merged from https://code.launchpad.net/~jelmer/brz/archive/+merge/346369

6973. By Jelmer Vernooij

Implement GitRevisionTree.archive for remote git trees.

Merged from https://code.launchpad.net/~jelmer/brz/git-archive/+merge/345969

6974. By Jelmer Vernooij

Make InterIndexGitTree suitable for use with MemoryGitTree.

Merged from https://code.launchpad.net/~jelmer/brz/inter-memorygittree/+merge/346426

6975. By Jelmer Vernooij

Implement GitRevisionTree.annotate_iter.

Merged from https://code.launchpad.net/~jelmer/brz/revtree-annotate/+merge/346658

6976. By Vincent Ladeuil

Define containers and commands for ci.breezy-vcs.org

Merged from https://code.launchpad.net/~vila/brz/byoci/+merge/346807

6977. By Jelmer Vernooij

Provide a sensible default implementaton of Tree.filter_unversioned_files.

Merged from https://code.launchpad.net/~jelmer/brz/revtree-filter-unversioned/+merge/346659

6978. By Jelmer Vernooij

Deal with missing files correctly in 'bzr status' in git trees.

Merged from https://code.launchpad.net/~jelmer/brz/remove-dir/+merge/347631

6979. By Jelmer Vernooij

merge lp:~jelmer/brz/unlock-1

6980. By Jelmer Vernooij

Merge lp:~jelmer/brz/less-file-id

6981. By Jelmer Vernooij

merge lp:~jelmer/brz/python3-graph

6982. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-xml

6983. By Jelmer Vernooij

Merge lp:~jelmer/brz/transform-fixes.

6984. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-weave

6985. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-weave-fmt.

6986. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-pack.

6987. By Jelmer Vernooij

Merge lp:~jelmer/brz/fixes-python3-b

6988. By Jelmer Vernooij

Merge lp:~jelmer/brz/git-fixes.

6989. By Jelmer Vernooij

Merge lp:~jelmer/brz/git-no-full-file.

6990. By Jelmer Vernooij

Merge lp:~jelmer/brz/bundle-registry

6991. By Jelmer Vernooij

Merge lp:~jelmer/brz/inter-git-tests

6992. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-c

6993. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-d

6994. By Jelmer Vernooij

Merge lp:~jelmer/brz/hpss-archive.

6995. By Jelmer Vernooij

Merge lp:~jelmer/brz/hpss-archive.

6996. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-e

6997. By Jelmer Vernooij

Merge lp:~jelmer/brz/python3-f

6998. By Jelmer Vernooij

Fix tests on Python3.5.

* brz-git get_branches() return value ordering
* Implement BTreeBuilder.__lt__

Merged from https://code.launchpad.net/~jelmer/brz/fix-python3.5-tests/+merge/348499

6999. By Jelmer Vernooij

Fix 'brz serve --git' for native git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/git-server/+merge/348447

7000. By Jelmer Vernooij

Simplify root handling in CommitBuilder.

Merged from https://code.launchpad.net/~jelmer/brz/commit-builder-simplify/+merge/348440

7001. By Jelmer Vernooij

Support running tests with python2 and python3 prefixes in testr.

Merged from https://code.launchpad.net/~jelmer/brz/testr-run/+merge/348443

7002. By Jelmer Vernooij

Add HPSS call for Tree.annotate_iter.

Merged from https://code.launchpad.net/~jelmer/brz/hpss-annotate/+merge/348438

7003. By Jelmer Vernooij

Fix more tests.

Merged from https://code.launchpad.net/~jelmer/brz/python3-g/+merge/348134

7004. By Jelmer Vernooij

Fix some more tests on python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-h/+merge/348245

7005. By Jelmer Vernooij

Add more bees.

Merged from https://code.launchpad.net/~jelmer/brz/python3-i/+merge/348244

7006. By Martin Packman

Load bt.test_inv without dulwich

Merged from https://code.launchpad.net/~gz/brz/test_inv_no_dulwich/+merge/348787

7007. By Martin Packman

Load bp.git tests without dulwich

Merged from https://code.launchpad.net/~gz/brz/bp_git_no_dulwich/+merge/348786

7008. By Jelmer Vernooij

Add HPSS call for Repository.get_stream_for_missing_keys.

Merged from https://code.launchpad.net/~jelmer/brz/hpss-get-missing-keys/+merge/348448

7009. By Vincent Ladeuil

Fix breezy.tests.per_transport.TransportTests.test_rename_dir_nonempty(MemoryTransport,MemoryServer) for python3.

The implementation wasn't atomic and depended on dict order.

Merged from https://code.launchpad.net/~vila/brz/memory-transport-rename/+merge/348790

7010. By Jelmer Vernooij

Fix another 1.5k tests on python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-j/+merge/348346

7011. By Jelmer Vernooij

Fix some more tests on python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-k/+merge/348646

7012. By Martin Packman

Make mutter format with unicode

Merged from https://code.launchpad.net/~gz/brz/mutter_unicode/+merge/348789

7013. By Martin Packman

Make lazy import tests that replace __import__ work

Merged from https://code.launchpad.net/~gz/brz/test_lazy_import_flakey/+merge/348792

7014. By Jelmer Vernooij

Remove grep tests from python3.passing.

These don't work on Python3 yet, but were skipped when we were running tests with output piped to e.g. subunit2pyunit.

Unconditionally run the color tests, even if there is no terminal. The tests don't need the terminal anyway.

Merged from https://code.launchpad.net/~jelmer/brz/no-python3-grep-yet/+merge/348793

7015. By Jelmer Vernooij

Make sure that strings passed into utextwrap are always unicode.

Merged from https://code.launchpad.net/~jelmer/brz/the-u-in-utextwrap-is-for-unicode/+merge/348794

7016. By Martin Packman

Make plugins tests pass on Python 3 again

Merged from https://code.launchpad.net/~gz/brz/test_plugins_repass/+merge/348797

7017. By Jelmer Vernooij

Ignore ResourceWarning on travis and in check-ci.

We're currently running over their 4Mb output limit.

Merged from https://code.launchpad.net/~jelmer/brz/no-warnings/+merge/348798

7018. By Jelmer Vernooij

Port dirstate to python3, a bit.

Merged from https://code.launchpad.net/~jelmer/brz/python3-dirstate/+merge/348791

7019. By Jelmer Vernooij

Fix some more dirstate tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-dirstate-more/+merge/348801

7020. By Martin Packman

Update _known_graph_pyx and expect to pass on Python 3

Merged from https://code.launchpad.net/~gz/brz/known_graph_pyx/+merge/348806

7021. By Jelmer Vernooij

Fix breezy.tests.test_diff.TestDiffFromTool.test_execute when default python is python3.

Merged from https://code.launchpad.net/~jelmer/brz/fix-difftool/+merge/348807

7022. By Martin Packman

Make _annotator work on Python 3

Merged from https://code.launchpad.net/~gz/brz/anno_pyx_py3/+merge/348805

7023. By Martin Packman

Make _chunks_to_lines_pyx work on Python 3

Merged from https://code.launchpad.net/~gz/brz/chunks_pyx_py3/+merge/348804

7024. By Jelmer Vernooij

Fix remaining dirstate tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/all-the-dirstates/+merge/348802

7025. By Jelmer Vernooij

Fix more tests on Python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-l/+merge/348782

7026. By Jelmer Vernooij

Fix more tests on Python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-m/+merge/348800

7027. By Jelmer Vernooij

Port a few more bits of the git plugin to python 3.

Merged from https://code.launchpad.net/~jelmer/brz/git-fixes2/+merge/348803

7028. By Martin Packman

Fix knit loading code on Python 3

Merged from https://code.launchpad.net/~gz/brz/knit_load_py3/+merge/348904

7029. By Jelmer Vernooij

Fix eol handling in knits on Python 3, port fastimport plugin to Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/fastimport-fixes/+merge/348924

7030. By Jelmer Vernooij

Port breezy.patches to Python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-patches/+merge/349085

7031. By Jelmer Vernooij

Don't make assumptions about the order of revisions returned by BundleWrite.write_bundle().

Merged from https://code.launchpad.net/~jelmer/brz/write-bundle-return-order/+merge/349070

7032. By Jelmer Vernooij

Add __hash__ and __lt__ implementations for Pack.

Merged from https://code.launchpad.net/~jelmer/brz/python3-existing-pack/+merge/349089

7033. By Jelmer Vernooij

Port diff and merge_directive to Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-diff/+merge/349216

7034. By Jelmer Vernooij

Fix some chk_map tests on Python3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-chk-map/+merge/349330

7035. By Martin Packman

Make _chk_map_pyx module work on Python 3

Merged from https://code.launchpad.net/~gz/brz/chk_map_pyx_py3/+merge/349385

7036. By Jelmer Vernooij

Fix some merge tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-merge/+merge/349097

7037. By Jelmer Vernooij

 Port patiencediff C extensions to python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-patiencediff/+merge/349379

7038. By Jelmer Vernooij

Add some more bees; support writing both bytes and unicode strings in build_tree_contents.

Merged from https://code.launchpad.net/~jelmer/brz/python3-n/+merge/349091

7039. By Jelmer Vernooij

Change run_bzr to use StringIOWithEncoding for stderr and stdout on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-blackbox/+merge/349090

7040. By Martin Packman

Make _btree_serializer_pyx module work on Python 3

Merged from https://code.launchpad.net/~gz/brz/btree_serializer_pyx_py3/+merge/349624

7041. By Jelmer Vernooij

Fix some more git-specific tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-git-more/+merge/349623

7042. By Jelmer Vernooij

Fix bash completion plugin tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-bashcompletion/+merge/349621

7043. By Jelmer Vernooij

Fix all but 3 launchpad tests on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-launchpad/+merge/349620

7044. By Jelmer Vernooij

Fix commitfromnews tests on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-commitfromnews/+merge/349619

7045. By Jelmer Vernooij

Fix all but one of the grep plugin tests on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-grep-all/+merge/349618

7046. By Jelmer Vernooij

Fix some more blackbox tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-blackbox-more/+merge/349622

7047. By Jelmer Vernooij

Fix another ~500 tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-o/+merge/349632

7048. By Jelmer Vernooij

Add a 'python3.flapping' file with flappy tests on Python 3.

'make update-python3-passing' doesn't attempt to edit these to python3.passing.

Merged from https://code.launchpad.net/~jelmer/brz/flappy/+merge/349774

7049. By Jelmer Vernooij

Defer sorting paths until utf8 encoding has happened.

This fixes the testsuite when run without extensions built. The only tests that
fail without this change are under
breezy.tests.per_workingtree.test_workingtree.TestIllegalPaths

Merged from https://code.launchpad.net/~jelmer/brz/encoding-no-extensions/+merge/349776

7050. By Jelmer Vernooij

Fix some more tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-p/+merge/349784

7051. By Jelmer Vernooij

Fix a few more tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-q/+merge/349833

7052. By Jelmer Vernooij

Fix another ~500 tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-r/+merge/350430

7053. By Jelmer Vernooij

Fix another couple of hundred tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-s/+merge/350749

7054. By Jelmer Vernooij

Fix another ~400 tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-t/+merge/350753

7055. By Jelmer Vernooij

Install fastimport from git rather than from the Ubuntu package.

This allows installing the python3 version.

Merged from https://code.launchpad.net/~jelmer/brz/install-fastimport/+merge/351376

7056. By Jelmer Vernooij

Don't run doctests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/doctests/+merge/351438

7057. By Jelmer Vernooij

Fix some more tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-u/+merge/351386

7058. By Jelmer Vernooij

Fix another ~400 tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-w/+merge/352048

7059. By Jelmer Vernooij

Fix instructions for upload plugin; no longer point at original upstream branch/bugtracker.

Merged from https://code.launchpad.net/~jelmer/brz/upload-instructions/+merge/352337

7060. By Jelmer Vernooij

Support symlink creation in SFTP Stub.

Merged from https://code.launchpad.net/~jelmer/brz/paramiko-symlinks/+merge/352338

7061. By Martin Packman

Ensure only strictly passing tests are in python3.passing

Merged from https://code.launchpad.net/~gz/brz/prune_passing_py3/+merge/352525

7062. By Jelmer Vernooij

Fix a couple of flappy tests.

Merged from https://code.launchpad.net/~jelmer/brz/random/+merge/352328

7063. By Jelmer Vernooij

Fix another round of tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-x/+merge/352226

7064. By Jelmer Vernooij

Fix a racy TCP server test.

Merged from https://code.launchpad.net/~jelmer/brz/flaky-server/+merge/352724

7065. By Jelmer Vernooij

Move git support to breezy.git.

Merged from https://code.launchpad.net/~jelmer/brz/git-graduate/+merge/348051

7066. By Jelmer Vernooij

Properly handled ignored directories in Git trees.

Merged from https://code.launchpad.net/~jelmer/brz/ignored-directory/+merge/352937

7067. By Jelmer Vernooij

Read README file for long description in setup as text.

Merged from https://code.launchpad.net/~jelmer/brz/fix-setup/+merge/352932

7068. By Jelmer Vernooij

Fix handling of BranchReferences remotely.

Merged from https://code.launchpad.net/~jelmer/brz/python3-remote-reference/+merge/353130

7069. By Jelmer Vernooij

Fix most selftest tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-selftest/+merge/353202

7070. By Jelmer Vernooij

Fix a spuriously failing test.

Merged from https://code.launchpad.net/~jelmer/brz/fix-spurious/+merge/353457

7071. By Jelmer Vernooij

Fix the last few failing index tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-fix-index/+merge/353379

7072. By Jelmer Vernooij

Properly guard against non-ascii bytes in URLs during unescaping on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/unicode-urls/+merge/353372

7073. By Jelmer Vernooij

Fix sorting of changes in some tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/sort-changes/+merge/353368

7074. By Martin Packman

Fix recursion handling in bencode extension

Merged from https://code.launchpad.net/~gz/brz/bencode_recursion/+merge/353451

7075. By Jelmer Vernooij

Fix some unversion tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-unversion/+merge/353131

7076. By Jelmer Vernooij

Fix another 28 HTTP tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-httpish/+merge/353132

7077. By Jelmer Vernooij

Fix some log tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-log-more/+merge/353126

7078. By Jelmer Vernooij

Fix some bundle-related tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python-bundle/+merge/353123

7079. By Jelmer Vernooij

Ignore ResourceWarning on Python 3, too.

Merged from https://code.launchpad.net/~jelmer/brz/python3-ignore-resourcewarning/+merge/353528

7080. By Jelmer Vernooij

Avoid use of find_related_paths_across_trees.

Merged from https://code.launchpad.net/~jelmer/brz/brz-git-fetch/+merge/353527

7081. By Jelmer Vernooij

Accept both bytes and unicode arguments to osutils.is_inside.

Merged from https://code.launchpad.net/~jelmer/brz/python3-bytes-or-unicode/+merge/353445

7082. By Jelmer Vernooij

Fix Git interrepository operations on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/brz-git-pull/+merge/353197

7083. By Jelmer Vernooij

Fix an ignore test on Python 3.

Make AtomicFile a context manager.

Merged from https://code.launchpad.net/~jelmer/brz/python3-atomic/+merge/353125

7084. By Jelmer Vernooij

Fix byte counting for HTTP readv operations.

Merged from https://code.launchpad.net/~jelmer/brz/readv-stats/+merge/353605

7085. By Jelmer Vernooij

Simplify Python version info tests.

Merged from https://code.launchpad.net/~jelmer/brz/simplify-version-info/+merge/353729

7086. By Jelmer Vernooij

Skip undecodable argv test on Python 3.

sys.getfilesystemencodeerrors() behaviour now determines
what happens to undecodable characters in argv.

Merged from https://code.launchpad.net/~jelmer/brz/skip-undecodable-argv/+merge/353753

7087. By Jelmer Vernooij

Fix remaining warnings when running testsuite on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-remaining-warnings/+merge/353750

7088. By Jelmer Vernooij

Properly decode method name on Python 3.

This fixes another ~dozen tests.

Merged from https://code.launchpad.net/~jelmer/brz/corrupt-knit/+merge/353613

7089. By Jelmer Vernooij

Consistently use proper strings for pack names.

Merged from https://code.launchpad.net/~jelmer/brz/pack-fixes/+merge/353610

7090. By Jelmer Vernooij

Fix changelog merge tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/fix-changelog-merge/+merge/353609

7091. By Jelmer Vernooij

Fix some iteration warnings on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/fix-iteration-warnings/+merge/353602

7092. By Jelmer Vernooij

Fix all but a few remaining HTTP tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/httpy/+merge/353543

7093. By Jelmer Vernooij

Various fixes for tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-y/+merge/353193

7094. By Jelmer Vernooij

Fix e-mail tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/fix-email-tests/+merge/353743

7095. By Jelmer Vernooij

Fix Launchpad registration test on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/launchpad-test-fix/+merge/353687

7096. By Jelmer Vernooij

Fix names of deprecated symbols on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/symbol-versioning/+merge/353373

7097. By Jelmer Vernooij

Set 'tests_require' to testtools and add configobj to 'install_require'.

Merged from https://code.launchpad.net/~jelmer/brz/update-setup/+merge/354353

7098. By Jelmer Vernooij

On Python 3, fix testing of passthrough output when selftest fork child fails.

Merged from https://code.launchpad.net/~jelmer/brz/fix-child-fork-test/+merge/353754

7099. By Jelmer Vernooij

Don't rely on self._traceback_from_test as it gets set too late on Python 3 unittest.TestCase.

Merged from https://code.launchpad.net/~jelmer/brz/selftest-traceback/+merge/353737

7100. By Jelmer Vernooij

Fix remaining chk_map tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-chk-map-more/+merge/353374

7101. By Jelmer Vernooij

Fix remaining Cython extensions on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/fix-c-extensions/+merge/353369

7102. By Jelmer Vernooij

Fix a couple more tests on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/some-more/+merge/353541

7103. By Jelmer Vernooij

Fix bad fs encoding tests on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/bad-fs-python3/+merge/353749

7104. By Jelmer Vernooij

Improve error parsing for git repositories a bit.

Merged from https://code.launchpad.net/~jelmer/brz/parse-git-error/+merge/354724

7105. By Jelmer Vernooij

Don't try to fetch peeled tags.

Merged from https://code.launchpad.net/~jelmer/brz/check-wants/+merge/354737

7106. By Jelmer Vernooij

Fix HTTP redirects for Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-reidrecits/+merge/354534

7107. By Jelmer Vernooij

Fix remaining deprecated function name test.

Merged from https://code.launchpad.net/~jelmer/brz/remaining-test/+merge/354803

7108. By Jelmer Vernooij

Handle the Launchpad way of saying "Repository not found".

Merged from https://code.launchpad.net/~jelmer/brz/more-git-errors/+merge/354801

7109. By Jelmer Vernooij

Allow port to be empty when parsing URLs.

Merged from https://code.launchpad.net/~jelmer/brz/empty-port/+merge/354640

7110. By Jelmer Vernooij

Drop python3.flapping.

Merged from https://code.launchpad.net/~jelmer/brz/drop-flapping/+merge/353460

7111. By Jelmer Vernooij

Drop the whitelist for Python 3 now that all tests are passing.

Merged from https://code.launchpad.net/~jelmer/brz/python3-drop-whitelist/+merge/353755

7112. By Vincent Ladeuil

Start preparing brz releases.

Merged from https://code.launchpad.net/~vila/brz/prepare-3.0.0/+merge/354935

7113. By Jelmer Vernooij

Don't use colocated branch names for derived branch directory names.

Merged from https://code.launchpad.net/~jelmer/brz/no-colo-name/+merge/354946

7114. By Jelmer Vernooij

Some refactoring around get_canonical_inventory_paths.

* Drop the 'inventory' bit since it doesn't apply to non-inventory trees
* Move to working trees; canonicalization currently only matters there, where
  files can be stored on case-insensitive (VFAT) or normalizing filesystems
  (i.e. Mac OS X)
* Run tests against all working tree formats, including Git, not just InventoryTree ones

This fixes 'bzr mv' and 'bzr rename' for Git.

Merged from https://code.launchpad.net/~jelmer/brz/brz-git-renames/+merge/354952

7115. By Jelmer Vernooij

Support max_lines parameter in UTextWrapper.

The test_textwrap tests from Python upstream that we invoke test this parameter.

(Note that we don't see this test on Debian/Ubuntu, because they don't ship test_textwrap.py as part of Python)

Merged from https://code.launchpad.net/~jelmer/brz/fix-utextwrap/+merge/354948

7116. By Jelmer Vernooij

Run per_tree tests against GitRevisionTree.

Merged from https://code.launchpad.net/~jelmer/brz/per-tree-git-revtree/+merge/354530

7117. By Jelmer Vernooij

Fix sort order for walkdir items.

Merged from https://code.launchpad.net/~jelmer/brz/fix-walkdirs-thingy/+merge/354990

7118. By Vincent Ladeuil

A simplified process for alpha releases

Merged from https://code.launchpad.net/~vila/brz/prepare-3.0.0/+merge/354985

7119. By Jelmer Vernooij

Fix displaying of diff chunks in shelf.

Merged from https://code.launchpad.net/~jelmer/brz/fix-shelve/+merge/354982

7120. By Vincent Ladeuil

Release 3.0a1

Merged from https://code.launchpad.net/~vila/brz/prepare-3.0.0/+merge/355003

7121. By Vincent Ladeuil

Post 3.0a1 release tweaks.

Merged from https://code.launchpad.net/~vila/brz/prepare-3.0.0/+merge/355010

7122. By Jelmer Vernooij

Cope with very early disconnects during TCP Server tests.

Merged from https://code.launchpad.net/~jelmer/brz/fix-flaky/+merge/355057

7123. By Jelmer Vernooij

Allow /dev/null to be a symlink.

Merged from https://code.launchpad.net/~jelmer/brz/symlink-dev-null/+merge/355166

7124. By Jelmer Vernooij

Guard against time_t overflowing in test_timestamp.

Merged from https://code.launchpad.net/~jelmer/brz/time-t-max/+merge/355509

7125. By Jelmer Vernooij

Improve error message if line endings in format file were corrupted.

Merged from https://code.launchpad.net/~jelmer/brz/line-endings/+merge/355463

7126. By Jelmer Vernooij

Fix byteness when we happen to write a xFF in the wrong place..

Merged from https://code.launchpad.net/~jelmer/brz/fix-broken-pack-test/+merge/355457

7127. By Jelmer Vernooij

Use WorkingTree._supports_executable method rather than making assumptions based on platform.

Merged from https://code.launchpad.net/~jelmer/brz/wt-executable/+merge/355460

7128. By Jelmer Vernooij

Use _path2ie in a couple more places.

Merged from https://code.launchpad.net/~jelmer/brz/path2ie-more/+merge/355138

7129. By Jelmer Vernooij

Some refactoring; check for features rather than a specific implementation (InventoryTree).

Merged from https://code.launchpad.net/~jelmer/brz/nomore-invtree/+merge/355137

7130. By Jelmer Vernooij

Support symlinks in MemoryTransport, and add tests for Transport.readlink.

Merged from https://code.launchpad.net/~jelmer/brz/memorytransport-links/+merge/355006

7131. By Jelmer Vernooij

Add symlink support to 'brz upload'.

Merged from https://code.launchpad.net/~jelmer/brz/upload-symlinks/+merge/355061

7132. By Jelmer Vernooij

Install dulwich by default, so git support works out of the box when installing from pip.

Merged from https://code.launchpad.net/~jelmer/brz/default-dulwich/+merge/356199

7133. By Jelmer Vernooij

Only read the .git/objects/info/packs file if the packs file isn't listable.

Merged from https://code.launchpad.net/~jelmer/brz/packs-file/+merge/356198

7134. By Jelmer Vernooij

When opening working trees with .git files, open the right control transport.

Merged from https://code.launchpad.net/~jelmer/brz/git-git-file/+merge/355880

7135. By Jelmer Vernooij

Fix get_canonical_path and add some basic tests for it.

Merged from https://code.launchpad.net/~jelmer/brz/get-canonical-path/+merge/355879

7136. By Jelmer Vernooij

Remove unnecessary redirect handling for git.

Merged from https://code.launchpad.net/~jelmer/brz/python3-git-fix-http/+merge/356238

7137. By Jelmer Vernooij

Fix reading of packed refs on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/alpha-fix-git-python3/+merge/356037

7138. By Jelmer Vernooij

Add progress indication for local git->git fetches.

Merged from https://code.launchpad.net/~jelmer/brz/local-fetch-progress/+merge/355878

7139. By Jelmer Vernooij

Handle some more Git error strings and convert them to specific exceptions.

Merged from https://code.launchpad.net/~jelmer/brz/more-git-errors/+merge/355811

7140. By Jelmer Vernooij

Remove unused call to get basis tree.

Merged from https://code.launchpad.net/~jelmer/brz/remove-unused-basis/+merge/355753

7141. By Jelmer Vernooij

Rollback https://code.launchpad.net/~jelmer/brz/python3-git-fix-http/+merge/356238

Merged from https://code.launchpad.net/~jelmer/brz/revert-http-redirect/+merge/356684

7142. By Jelmer Vernooij

Use sys.executable rather than 'python' for ad-hoc tests.

Merged from https://code.launchpad.net/~jelmer/brz/diff-without-python/+merge/357913

7143. By Jelmer Vernooij

Support forcing the setting of a reference.

Useful for testing.

Merged from https://code.launchpad.net/~jelmer/brz/reference-force/+merge/355876

7144. By Jelmer Vernooij

Add a tool that monkey patches pyflakes to support lazy imports.

Merged from https://code.launchpad.net/~jelmer/brz/flake8/+merge/358593

7145. By Jelmer Vernooij

Don't hardcode the list of supported archive formats.

Merged from https://code.launchpad.net/~jelmer/brz/git-archive-tgz/+merge/358746

7146. By Jelmer Vernooij

Fix flakyness of test_missing_chk_leaf_for_inventory.

Merged from https://code.launchpad.net/~jelmer/brz/chk-leaf-tests/+merge/358618

7147. By Jelmer Vernooij

Fix switching to older revisions when creating a new branch.

Merged from https://code.launchpad.net/~jelmer/brz/colo-switch-jml/+merge/358607

7148. By Jelmer Vernooij

Fix some lint, and fix a FutureWarning.

Merged from https://code.launchpad.net/~jelmer/brz/xml-compat/+merge/358598

7149. By Jelmer Vernooij

Support the 'authors' revprop when creating Git commits.

Merged from https://code.launchpad.net/~jelmer/brz/authors-revprop/+merge/358537

7150. By Jelmer Vernooij

Remove some unused bzr-specific imports in breezy.git.

Merged from https://code.launchpad.net/~jelmer/brz/unused-import/+merge/358359

7151. By Jelmer Vernooij

Move breezy.fetch with mostly vf-specific code to breezy.bzr.fetch.

Merged from https://code.launchpad.net/~jelmer/brz/move-fetch/+merge/358358

7152. By Jelmer Vernooij

Allow revno() to return None to indicate that the revision number is not known.

Merged from https://code.launchpad.net/~jelmer/brz/no-revno/+merge/358346

7153. By Jelmer Vernooij

Drop support for ubuntu:X/package shortcuts, where X is a single letter representing a Ubuntu release.

Merged from https://code.launchpad.net/~jelmer/brz/shortcuts/+merge/358291

7154. By Jelmer Vernooij

Fix interactivity on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/python3-interaction/+merge/358288

7155. By Jelmer Vernooij

Fix docstring for BranchBuilder - it now takes filenames rather than file ids.

Merged from https://code.launchpad.net/~jelmer/brz/branchbuilder-doc/+merge/358282

7156. By Jelmer Vernooij

Fix two HTTP issues on Python 3 without tests.

Merged from https://code.launchpad.net/~jelmer/brz/python3-http-fixes/+merge/358281

7157. By Jelmer Vernooij

Implement TreeReference.kind_character.

Merged from https://code.launchpad.net/~jelmer/brz/tree-reference-kind-character/+merge/358280

7158. By Jelmer Vernooij

Report correct paths when running "brz add" in git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/fix1799482/+merge/357734

7159. By Jelmer Vernooij

Drop information about old bundle formats.

Merged from https://code.launchpad.net/~jelmer/brz/old-bundle-formats/+merge/357478

7160. By Jelmer Vernooij

Fix fetching between non-default colocated git branches.

Merged from https://code.launchpad.net/~jelmer/brz/cross-branch-fetch/+merge/356759

7161. By Jelmer Vernooij

Encode revision ids before passing into graph functions.

Merged from https://code.launchpad.net/~jelmer/brz/python3-encode/+merge/356755

7162. By Jelmer Vernooij

Support --bugs= argument to commit to link related bugs (not necessarily ones that were fixed).

Merged from https://code.launchpad.net/~jelmer/brz/related-bugs/+merge/355893

7163. By Jelmer Vernooij

Use BranchFormat8 (which supports storing references) in development-subtree.

Merged from https://code.launchpad.net/~jelmer/brz/devsubtree8/+merge/355877

7164. By Jelmer Vernooij

Support uncommit on remote git branches.

Merged from https://code.launchpad.net/~jelmer/brz/git-remote-uncommit/+merge/355576

7165. By Jelmer Vernooij

Remove some unused imports.

Merged from https://code.launchpad.net/~jelmer/brz/unused-imports/+merge/358595

7166. By Jelmer Vernooij

Fix fetching of revisions that are referenced by annotated tags.

Merged from https://code.launchpad.net/~jelmer/brz/annotated-tags/+merge/358536

7167. By Jelmer Vernooij

Drop dpush_strict configuration option.

Merged from https://code.launchpad.net/~jelmer/brz/dpush-strict/+merge/358475

7168. By Jelmer Vernooij

Fix parsing of foreign revision ids.

Merged from https://code.launchpad.net/~jelmer/brz/fix-foreign-commits/+merge/358675

7169. By Jelmer Vernooij

Several improvements for remote Git branches (nick handling, branch references, overwrite behaviour).

Merged from https://code.launchpad.net/~jelmer/brz/remote-props/+merge/358283

7170. By Jelmer Vernooij

Drop file_id argument from read functions in Tree.

Merged from https://code.launchpad.net/~jelmer/brz/no-file-ids/+merge/357984

7171. By Martin Packman

Tidy up _groupcompress_pyx

Merged from https://code.launchpad.net/~gz/brz/groupscompress_pyx_tidy/+merge/358903

7172. By Martin Packman

Make --profile-imports work on Python 3

Merged from https://code.launchpad.net/~gz/brz/profile_imports_py3/+merge/358920

7173. By Jelmer Vernooij

Drop python3-specific target; the regular build is already testing python 3.

Merged from https://code.launchpad.net/~jelmer/brz/drop-py3-specific/+merge/358922

7174. By Jelmer Vernooij

Add a flake8 test.

Merged from https://code.launchpad.net/~jelmer/brz/run-flake8/+merge/358902

7175. By Jelmer Vernooij

Sprinkle some PEP8iness.

Merged from https://code.launchpad.net/~jelmer/brz/more-cleanups/+merge/358611

7176. By Jelmer Vernooij

Build extensions on travis for Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/improve-coverage/+merge/358609

7177. By Martin Packman

Remove replacement of re.compile for lazy_regexp

Merged from https://code.launchpad.net/~gz/brz/unlazy_reg/+merge/358919

7178. By Jelmer Vernooij

Fix another dozen flake8 errors.

Merged from https://code.launchpad.net/~jelmer/brz/even-more-cleanups/+merge/358931

7179. By Jelmer Vernooij

Fix 'bzr grep' in git working trees.

Merged from https://code.launchpad.net/~jelmer/brz/git-grep/+merge/358605

7180. By Jelmer Vernooij

Don't show a delta for unchanged submodules.

Merged from https://code.launchpad.net/~jelmer/brz/keep-submodule/+merge/355820

7181. By Jelmer Vernooij

Make implementing Tree.all_file_ids() optional.

Merged from https://code.launchpad.net/~jelmer/brz/optional-all-file-ids/+merge/358932

7182. By Jelmer Vernooij

Fix 'brz switch' in git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/git-switch/+merge/358603

7183. By Jelmer Vernooij

Support committing to a bzr branch bound to a git branch.

Merged from https://code.launchpad.net/~jelmer/brz/bzr-bound-to-git/+merge/355573

7184. By Jelmer Vernooij

Add missing feature for 'git' in recently added test.

Merged from https://code.launchpad.net/~jelmer/brz/missing-feature/+merge/358943

7185. By Martin Packman

Fix E999 lint error for Python 2 flake8.

Merged from https://code.launchpad.net/~gz/brz/lint_E999/+merge/358945

7186. By Martin Packman

Fix E71* lint errors

Mostly moving nots around and a few equality to idenity check changes.

Merged from https://code.launchpad.net/~gz/brz/lint_E71/+merge/358946

7187. By Jelmer Vernooij

Improve handling of bad bug urls:

* Raise an exception when invalid bug URLs are specified to 'brz commit'
* Print exceptions when customer log handlers raise an exception
  rather than aborting altogether.

Merged from https://code.launchpad.net/~jelmer/brz/bad-bug-url/+merge/358942

7188. By Martin Packman

Fix E27* lint errors

Merged from https://code.launchpad.net/~gz/brz/lint_E27/+merge/358947

7189. By Martin Packman

Possible fix for OverflowError in _search_key_255

Merged from https://code.launchpad.net/~gz/brz/crc_asul/+merge/358941

7190. By Jelmer Vernooij

Support adding files with filenames that are just a backslash on
platforms where it is not the path separator.

Merged from https://code.launchpad.net/~jelmer/brz/backslash-support/+merge/355135

7191. By Jelmer Vernooij

Don't create ghost tags when testing overwrite behaviour.

Merged from https://code.launchpad.net/~jelmer/brz/ghost-tags/+merge/358949

7192. By Jelmer Vernooij

Release 3.0.0 alpha 2.

Merged from https://code.launchpad.net/~jelmer/brz/alpha2/+merge/358948

7193. By Jelmer Vernooij

Some improvements to the documentation.

Merged from https://code.launchpad.net/~jelmer/brz/docs-on-homepage/+merge/358952

7194. By Jelmer Vernooij

Avoid using file ids in cat; use find_previous_path instead.

Merged from https://code.launchpad.net/~jelmer/brz/cat-no-file-id/+merge/358951

7195. By Jelmer Vernooij

Update more links, add API documentation.

Merged from https://code.launchpad.net/~jelmer/brz/more-doc-improvements/+merge/358955

7196. By Martin Packman

Fix whitespace lint E241 and E251

Merged from https://code.launchpad.net/~gz/brz/lint_E241_E251/+merge/358966

7197. By Jelmer Vernooij

Fix more documentation issues: API index, Bazaar=>Breezy.

Merged from https://code.launchpad.net/~jelmer/brz/even-more-documentation-fixes/+merge/358965

7198. By Martin Packman

Remove use of dict.has_key() in fastimport plugin

Merged from https://code.launchpad.net/~gz/brz/lint_W601/+merge/358967

7199. By Jelmer Vernooij

Require sphinx for docs building, remove docutils.

Merged from https://code.launchpad.net/~jelmer/brz/sphinx-only/+merge/358957

7200. By Jelmer Vernooij

Add a basic glossary, and fix some links.

Merged from https://code.launchpad.net/~jelmer/brz/glossary/+merge/359019

7201. By Jelmer Vernooij

Use 10 minute (rather than 5 second) window when checking mtime behaviour.

Merged from https://code.launchpad.net/~jelmer/brz/increase-time-window/+merge/359026

7202. By Jelmer Vernooij

Don't report empty directories in git repositories as pending changes.

Merged from https://code.launchpad.net/~jelmer/brz/empty-dir-changed/+merge/359025

7203. By Jelmer Vernooij

Fix 'brz ignore' in git working trees.

Merged from https://code.launchpad.net/~jelmer/brz/git-ignore/+merge/359009

7204. By Jelmer Vernooij

Give a clearer warning when the gpg module is not available.

Merged from https://code.launchpad.net/~jelmer/brz/gpg-warning/+merge/358971

7205. By Martin Packman

Fix remaining whitespace lint in codebase

Merged from https://code.launchpad.net/~gz/brz/lint_W1_W2_W3/+merge/358968

7206. By Jelmer Vernooij

Don't create temporary branches in fastexport.

Merged from https://code.launchpad.net/~jelmer/brz/fastexport-empty-parents/+merge/358959

7207. By Jelmer Vernooij

Simplify the iterator for Tree.list_files() to exclude file kind and file_id.

Merged from https://code.launchpad.net/~jelmer/brz/namedtuple-list-files/+merge/358354

7208. By Jelmer Vernooij

Handle overflow errors from Python 2 as well.

Merged from https://code.launchpad.net/~jelmer/brz/timestamp-range/+merge/359158

7209. By Jelmer Vernooij

Some more minor improvements to the docs.

Merged from https://code.launchpad.net/~jelmer/brz/yet-more-docs/+merge/359087

7210. By Jelmer Vernooij

Stop actually accepting optional file_id in many Tree methods.

Merged from https://code.launchpad.net/~jelmer/brz/remove-more-file-ids/+merge/358950

7211. By Jelmer Vernooij

Add support for --fixes in Git repositories and document using Breezy with GitHub.

Merged from https://code.launchpad.net/~jelmer/brz/working-with-github/+merge/359156

7212. By Jelmer Vernooij

Remove the lp-branch-mirror command.

Merged from https://code.launchpad.net/~jelmer/brz/kill-branch-mirror/+merge/360097

7213. By Jelmer Vernooij

Fix timestamp bound checking in test_timestamp.

Merged from https://code.launchpad.net/~jelmer/brz/timestamp-limit/+merge/359388

7214. By Jelmer Vernooij

Remove references to bzrtools in the docs.

Merged from https://code.launchpad.net/~jelmer/brz/doc-bzrtools/+merge/359386

7215. By Jelmer Vernooij

Fix python 3.7 compatibility.

Merged from https://code.launchpad.net/~jelmer/brz/python3.7/+merge/359220

7216. By Jelmer Vernooij

Prevent UnicodeDecodeError on Python 2 with LANG=fr_FR.ISO-8859-1.

Merged from https://code.launchpad.net/~jelmer/brz/non-utf8-locale/+merge/360088

7217. By Jelmer Vernooij

Batch up requests for Tree.iter_files_bytes() in fastexport.

Merged from https://code.launchpad.net/~jelmer/brz/faster-fastexport/+merge/359560

7218. By Jelmer Vernooij

s/bzr/brz in the contributing quickstart guide.

Merged from https://code.launchpad.net/~jelmer/brz/contributing-quickstart/+merge/359486

7219. By Jelmer Vernooij

Move location_to_url to its own module.

Merged from https://code.launchpad.net/~jelmer/brz/location/+merge/359384

7220. By Jelmer Vernooij

Fix move when file was in different location, rather than removed.

Merged from https://code.launchpad.net/~jelmer/brz/mv-bug/+merge/359342

7221. By Jelmer Vernooij

Fix 'bzr stats' in git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-stats/+merge/359385

7222. By Jelmer Vernooij

Show colocated branch name in 'brz info'.

Merged from https://code.launchpad.net/~jelmer/brz/info-colocated/+merge/359663

7223. By Jelmer Vernooij

Don't list directories without versioned files as 'added'.

Merged from https://code.launchpad.net/~jelmer/brz/git-empty-dirs/+merge/359479

7224. By Jelmer Vernooij

Fix an occasionally failing test.

Merged from https://code.launchpad.net/~jelmer/brz/fix-spurious-343/+merge/360971

7225. By Jelmer Vernooij

Display colocated branch name when switching between branches.

Merged from https://code.launchpad.net/~jelmer/brz/switch-colocated/+merge/361258

7226. By Jelmer Vernooij

Fix lp-mirror tests.

Merged from https://code.launchpad.net/~jelmer/brz/drop-lp-mirror/+merge/361111

7227. By Jelmer Vernooij

Don't throw an incomprehensible traceback when a warning filter has already been removed.

Merged from https://code.launchpad.net/~jelmer/brz/ignorefilterwarning/+merge/360969

7228. By Jelmer Vernooij

Move the testament module to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/move-testament/+merge/359939

7229. By Jelmer Vernooij

Move file-id and file-path commands (specific to file ids) to breezy.bzr.debug_commands.

Merged from https://code.launchpad.net/~jelmer/brz/bzr-debug-commands/+merge/359781

7230. By Jelmer Vernooij

Hide the ancestor-growth command.

Merged from https://code.launchpad.net/~jelmer/brz/hide-ancestor-growth/+merge/359664

7231. By Jelmer Vernooij

Move bzr-specific reconcile bits to breezy.bzr.reconcile.

Merged from https://code.launchpad.net/~jelmer/brz/move-reconcile-1/+merge/359941

7232. By Jelmer Vernooij

Properly unwrap sys.stdout when writing a fast-export stream.

Merged from https://code.launchpad.net/~jelmer/brz/fast-export-default-out/+merge/359558

7233. By Jelmer Vernooij

Bundle the propose plugin.

Merged from https://code.launchpad.net/~jelmer/brz/bundle-propose/+merge/359484

7234. By Jelmer Vernooij

travis: Install launchpadlib from pip, since it's not available for python 3 on trusty.

Merged from https://code.launchpad.net/~jelmer/brz/travis-1/+merge/361364

7235. By Jelmer Vernooij

Fix 'brz git-objects', and add a test.

Merged from https://code.launchpad.net/~jelmer/brz/git-objects/+merge/361362

7236. By Jelmer Vernooij

Fix autodoc_rstx generation on python 3.

Merged from https://code.launchpad.net/~jelmer/brz/autodoc-python3/+merge/361367

7237. By Jelmer Vernooij

Use absolute URLs in branch reference locations.

Merged from https://code.launchpad.net/~jelmer/brz/reference-absolute/+merge/361390

7238. By Jelmer Vernooij

Fix spurious failures in test_list_tags_dotted_revnos_unsupported.

Merged from https://code.launchpad.net/~jelmer/brz/spurious-544/+merge/361407

7239. By Jelmer Vernooij

Add 'bzr my-proposals' command.

Merged from https://code.launchpad.net/~jelmer/brz/my-proposals/+merge/361363

7240. By Jelmer Vernooij

Fix signature handling when repacking.

Merged from https://code.launchpad.net/~jelmer/brz/pack-signature/+merge/361530

7241. By Jelmer Vernooij

Require a newer version of launchpadlib, set correct consumer name.

Merged from https://code.launchpad.net/~jelmer/brz/user-agent/+merge/361859

7242. By Jelmer Vernooij

Don't copy tags that don't point to valid objects.

Merged from https://code.launchpad.net/~jelmer/brz/git-tag-fixes/+merge/362001

7243. By Jelmer Vernooij

git: When sending refs to a remote server, don't send a copy of the old refs.

Merged from https://code.launchpad.net/~jelmer/brz/only-changed-refs/+merge/361999

7244. By Jelmer Vernooij

propose: Some fixes for handling of Git repositories on Launchpad.

Merged from https://code.launchpad.net/~jelmer/brz/propose-launchpad-git/+merge/361995

7245. By Jelmer Vernooij

Some refactoring of the Launchpad module, ahead of removing xmlrpc support.

Merged from https://code.launchpad.net/~jelmer/brz/lp-refactoring/+merge/361934

7246. By Jelmer Vernooij

Add some release notes ahead of beta1.

Merged from https://code.launchpad.net/~jelmer/brz/release-notes/+merge/361717

7247. By Jelmer Vernooij

Implement description getting/setting for existing Launchpad merge proposals.

Merged from https://code.launchpad.net/~jelmer/brz/lp-mp-description/+merge/361760

7248. By Jelmer Vernooij

Use tree timestamp when exporting.

Merged from https://code.launchpad.net/~jelmer/brz/archive-tree-timestamp/+merge/361709

7249. By Jelmer Vernooij

Fix GPG signature validation on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/verify-signatures-py3/+merge/361707

7250. By Jelmer Vernooij

Properly handle exceptions about hg extra fields.

Merged from https://code.launchpad.net/~jelmer/brz/hg-field/+merge/361706

7251. By Jelmer Vernooij

Require .gz as extension for gzipped files.

Merged from https://code.launchpad.net/~jelmer/brz/ends-gz/+merge/361693

7252. By Jelmer Vernooij

Make 'default' actually return the default PGP key, as determined by PGP.

Merged from https://code.launchpad.net/~jelmer/brz/gpg-default/+merge/361531

7253. By Jelmer Vernooij

Fix default launchpadlib API URL.

7254. By Jelmer Vernooij

Support loading breezy plugins from setuptools entrypoints.

Merged from https://code.launchpad.net/~jelmer/brz/entrypoints/+merge/361986

7255. By Jelmer Vernooij

Delay importing launchpadlib, so brz works for users without it.

Merged from https://code.launchpad.net/~jelmer/brz/lp-imports/+merge/362354

7256. By Jelmer Vernooij

Drop support for launchpad packaging branch up-to-date checking.

Merged from https://code.launchpad.net/~jelmer/brz/drop-up-to-date-check/+merge/362286

7257. By Jelmer Vernooij

Fix two typos in command help.

Merged from https://code.launchpad.net/~jelmer/brz/doc-typos/+merge/362285

7258. By Jelmer Vernooij

Fix python 3.7 tests on Travis.

Merged from https://code.launchpad.net/~jelmer/brz/travis-xenial/+merge/362284

7259. By Jelmer Vernooij

Ignore UserWarning on travis.

Merged from https://code.launchpad.net/~jelmer/brz/skip-crypto-deprecation/+merge/362227

7260. By Jelmer Vernooij

Support interactive login for GitLab sites.

Merged from https://code.launchpad.net/~jelmer/brz/gitlab-interactive/+merge/362154

7261. By Jelmer Vernooij

Add .base_url property to Hoster.

Merged from https://code.launchpad.net/~jelmer/brz/propose-base-url/+merge/362565

7262. By Jelmer Vernooij

Implement .close on merge proposals for {launchpad,github,gitlab}.

Merged from https://code.launchpad.net/~jelmer/brz/propose-close/+merge/362564

7263. By Jelmer Vernooij

Add a supports_random_access attribute to repository.

Merged from https://code.launchpad.net/~jelmer/brz/supports-random-access/+merge/362619

7264. By Jelmer Vernooij

Add a MemoryTags object that provides the Tags implementation but stores tags in a dict.

Merged from https://code.launchpad.net/~jelmer/brz/memorytags/+merge/362620

7265. By Jelmer Vernooij

Add a lp+bzr URL scheme for looking up Bazaar-only branches.

Merged from https://code.launchpad.net/~jelmer/brz/lpbzr/+merge/361858

7266. By Jelmer Vernooij

Fix setting of merge proposal descriptions on gitlab.

Merged from https://code.launchpad.net/~jelmer/brz/propose-gitlab-set-description/+merge/362644

7267. By Jelmer Vernooij

Don't require that short git shas have an even number of characters.

Merged from https://code.launchpad.net/~jelmer/brz/git-short/+merge/362643

7268. By Jelmer Vernooij

Move grep into core.

Merged from https://code.launchpad.net/~jelmer/brz/promote-grep/+merge/359487

7269. By Jelmer Vernooij

Fix compatibility with newer versions of Dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/dulwich-compat/+merge/362765

7270. By Jelmer Vernooij

Allow unknown HG fields in Git commit metadata when accessing native Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/tolerate-unknown-fields/+merge/363176

7271. By Jelmer Vernooij

Don't include open unmerged pull requests in 'closed'.

Merged from https://code.launchpad.net/~jelmer/brz/github-open-closed/+merge/363175

7272. By Jelmer Vernooij

Drop support for getting gitlab authentication from authentication.conf.

Merged from https://code.launchpad.net/~jelmer/brz/gitlab-auth-fix/+merge/363101

7273. By Jelmer Vernooij

Don't attempt to resolve None when repo has gone away.

Merged from https://code.launchpad.net/~jelmer/brz/github-disappeared-repo/+merge/363097

7274. By Jelmer Vernooij

Fix a commonly typoed word: compatibility.

Merged from https://code.launchpad.net/~jelmer/brz/compatibility-typos/+merge/363008

7275. By Jelmer Vernooij

Add a mention of Python 3 support in README.rst.

Merged from https://code.launchpad.net/~jelmer/brz/update-readme/+merge/363005

7276. By Jelmer Vernooij

Drop dependency on non-longer-existant grep plugin.

Merged from https://code.launchpad.net/~jelmer/brz/git-grep-tests/+merge/363003

7277. By Jelmer Vernooij

Fix git-apply and add a test.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-apply/+merge/362955

7278. By Jelmer Vernooij

Raise a clearer error when not logged into e.g. GitHub.

Merged from https://code.launchpad.net/~jelmer/brz/credentials-error/+merge/362950

7279. By Jelmer Vernooij

Fix lp-find-merge-proposal.

Merged from https://code.launchpad.net/~jelmer/brz/fix-lp-find-merge-proposal/+merge/362949

7280. By Jelmer Vernooij

Properly format UnexpectedInventoryFormat errors.

Merged from https://code.launchpad.net/~jelmer/brz/xml-serializer-fix/+merge/362713

7281. By Jelmer Vernooij

Don't report .git files as unknown.

Merged from https://code.launchpad.net/~jelmer/brz/git-wt-reference/+merge/362710

7282. By Jelmer Vernooij

fastexport: Stop specifying file_id and use tree rather than inventory function.

Merged from https://code.launchpad.net/~jelmer/brz/fix-fastexport/+merge/362709

7283. By Jelmer Vernooij

Strip username from URLs before passing them to httplib.

This fixes access to Git HTTP repositories with authentication, such as bitbucket.

Merged from https://code.launchpad.net/~jelmer/brz/git-http-username/+merge/363182

7284. By Jelmer Vernooij

Add a hook for URL dereferencing.

Merged from https://code.launchpad.net/~jelmer/brz/rewrite-url/+merge/362941

7285. By Jelmer Vernooij

Move .generate_ids to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/move-generate-ids/+merge/362711

7286. By Jelmer Vernooij

Add a purpose argument to location dereference functions.

Merged from https://code.launchpad.net/~jelmer/brz/location-purpose/+merge/362940

7287. By Jelmer Vernooij

Bump minimum dulwich version to 0.19.11.

Merged from https://code.launchpad.net/~jelmer/brz/dulwich-version/+merge/363226

7288. By Jelmer Vernooij

Add clearer error when launchpadlib is missing.

Merged from https://code.launchpad.net/~jelmer/brz/launchpadlib-error/+merge/363218

7289. By Jelmer Vernooij

Don't buffer more than a line when reading from standard input.

Merged from https://code.launchpad.net/~jelmer/brz/fix-stream-buffering/+merge/363233

7290. By Jelmer Vernooij

Fix pushing of tags as part of nascent git branches.

Merged from https://code.launchpad.net/~jelmer/brz/push-branch-tags/+merge/363234

7291. By Jelmer Vernooij

Split out a 'probe_from_url' method on Hoster.

Merged from https://code.launchpad.net/~jelmer/brz/probe-url/+merge/362951

7292. By Jelmer Vernooij

Use time.perf_counter, which is replacing time.clock.

time.clock is going away in Python 3.8.

Also, rename osutils.timer_func to perf_counter for consistency.

Merged from https://code.launchpad.net/~jelmer/brz/no-time-clock/+merge/363892

7293. By Jelmer Vernooij

Add support for rcp-style location string for SSH operations.

Merged from https://code.launchpad.net/~jelmer/brz/rcp-url/+merge/362712

7294. By Jelmer Vernooij

Support reading related branches from git configs.

Merged from https://code.launchpad.net/~jelmer/brz/git-config-branches/+merge/358140

7295. By Vincent Ladeuil

Open trunk again as 3.1.0dev1

Merged from https://code.launchpad.net/~vila/brz/trunk/+merge/364041

7296. By Matthew Fuller

Fix importing on python2.7 with future.

Merged from https://code.launchpad.net/~fullermd/brz/fix-2.7-with-future/+merge/365007

7297. By Jelmer Vernooij

Set PATH correctly so pip-installed sphinx is found; fix compatibility with newer versions of Dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/fix-sphinx/+merge/367949

7298. By Jelmer Vernooij

Fix some issues reported by lgtm.com.

Merged from https://code.launchpad.net/~jelmer/brz/lgtm/+merge/365991

7299. By Jelmer Vernooij

Add 'bgt' as alias for 'breezy.git.tests.

Merged from https://code.launchpad.net/~jelmer/brz/bgt/+merge/364295

7300. By Jelmer Vernooij

Add a 'brz resolve-location' command.

Merged from https://code.launchpad.net/~jelmer/brz/resolve-location/+merge/363581

7301. By Jelmer Vernooij

Integrate urllib2_wrappers into http/__init__.py.

Merged from https://code.launchpad.net/~jelmer/brz/integrate-urllib2-wrappers/+merge/367308

7302. By Jelmer Vernooij

Use a more urllib3-like API for HTTP requests.

Merged from https://code.launchpad.net/~jelmer/brz/urllib3-like/+merge/367618

7303. By Jelmer Vernooij

Use external patiencediff.

Merged from https://code.launchpad.net/~jelmer/brz/external-patiencediff/+merge/363891

7304. By Jelmer Vernooij

Add some help for the "git:" revision spec.

Merged from https://code.launchpad.net/~jelmer/brz/git-revspec-help/+merge/367317

7305. By Jelmer Vernooij

Split mergeable bits out of breezy.bundle.

Merged from https://code.launchpad.net/~jelmer/brz/move-mergeable/+merge/358676

7306. By Jelmer Vernooij

Add a WriteGroup() context manager.

Merged from https://code.launchpad.net/~jelmer/brz/write-group-context/+merge/358465

7307. By Colin Watson

Handle renaming of launchpad.dev to launchpad.test.

Merged from https://code.launchpad.net/~cjwatson/brz/launchpad-test-domain/+merge/368046

7308. By Jelmer Vernooij

Fix pushing non-mainline revisions from bzr to git.

Merged from https://code.launchpad.net/~jelmer/brz/push-non-mainline-to-git/+merge/368029

7309. By Jelmer Vernooij

Import the 'patch' command from bzrtools.

Merged from https://code.launchpad.net/~jelmer/brz/import-patch/+merge/365618

7310. By Jelmer Vernooij

Use standard patch functions in "bzr git-apply".

Merged from https://code.launchpad.net/~jelmer/brz/patch-silent/+merge/365620

7311. By Jelmer Vernooij

Merge the 3.0 branch.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.0/+merge/368233

7312. By Jelmer Vernooij

Install github, gitlab and patiencediff dependencies on appveyor.

Merged from https://code.launchpad.net/~jelmer/brz/appveyor/+merge/368236

7313. By Jelmer Vernooij

Fix github module name in appveyor config.

Merged from https://code.launchpad.net/~jelmer/brz/appveyor/+merge/368242

7314. By Jelmer Vernooij

Avoid using inventories in breezy.merge when encountering lcas.

Merged from https://code.launchpad.net/~jelmer/brz/lca-merge-git/+merge/367321

7315. By Jelmer Vernooij

Remove WorkingTree.find_trees, simplify detection of subtrees.

Merged from https://code.launchpad.net/~jelmer/brz/detect-local-wt/+merge/368240

7316. By Jelmer Vernooij

Add commit-message option to 'brz propose'.h

Merged from https://code.launchpad.net/~jelmer/brz/suggest-commit-message/+merge/366610

7317. By Jelmer Vernooij

Add a 'brz land' subcommand.

Merged from https://code.launchpad.net/~jelmer/brz/land/+merge/366609

7318. By Jelmer Vernooij

Allow symbolic links to exist when checking out trees on Windows.

Merged from https://code.launchpad.net/~jelmer/brz/win-symlink-warning/+merge/363900

7319. By Jelmer Vernooij

Use contexts for progress bars where possible.

Merged from https://code.launchpad.net/~jelmer/brz/progressbar-context/+merge/358460

7320. By Jelmer Vernooij

Remove unused argument specific_fileid from show_log.

Merged from https://code.launchpad.net/~jelmer/brz/log-unused-arg/+merge/368505

7321. By Jelmer Vernooij

Fix Git HTTP support.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-http/+merge/368582

7322. By Jelmer Vernooij

Fix DeprecationWarning in RemoteRepository.get_rev_id_for_revno.

7323. By Jelmer Vernooij

Automatically upgrade to branch format 8 when setting branch references.

Merged from https://code.launchpad.net/~jelmer/brz/auto-upgrade-reference/+merge/355883

7324. By Jelmer Vernooij

Add a TreeChange object that can serve as alternative to a tuple returned by Tree.iter_changes.

Merged from https://code.launchpad.net/~jelmer/brz/objects/+merge/368856

7325. By Martin Packman

Fix 'invalid escape sequence' warnings in regexps

Merged from https://code.launchpad.net/~gz/brz/fix_regexp_escape_deprec/+merge/368855

7326. By Jelmer Vernooij

Add a quilt plugin that can do smart things with quilt patches.

Merged from https://code.launchpad.net/~jelmer/brz/bundle-quilt/+merge/368585

7327. By Jelmer Vernooij

Use slots on Tree{File,Directory,Reference,Link}.

Merged from https://code.launchpad.net/~jelmer/brz/slots-1/+merge/368852

7328. By Jelmer Vernooij

Don't depend on the gitlab library for gitlab operations.

Instead, just use Breezy's built-in HTTP support.

Merged from https://code.launchpad.net/~jelmer/brz/custom-gitlab/+merge/367620

7329. By Jelmer Vernooij

Support running diff on tree references.

Merged from https://code.launchpad.net/~jelmer/brz/diff-tree-reference/+merge/355881

7330. By Jelmer Vernooij

Get rid of file ids in some more places.

Merged from https://code.launchpad.net/~jelmer/brz/drop-file-id/+merge/368862

7331. By Jelmer Vernooij

Use local REST implementation to access GitHub API.

Merged from https://code.launchpad.net/~jelmer/brz/custom-github/+merge/367669

7332. By Jelmer Vernooij

Fix compatibility with pre-0.19.12 versions of Dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/both-dulwich/+merge/368860

7333. By Martin Packman

Update breezy.__copyright__ field

Merged from https://code.launchpad.net/~gz/brz/update_copyright/+merge/368866

7334. By Jelmer Vernooij

Use the new attributes on TreeChange rather than indexing.

Merged from https://code.launchpad.net/~jelmer/brz/objects-1/+merge/368859

7335. By Jelmer Vernooij

Add osutils.cache_dir function and use it where we create Breezy-specific caches.

Merged from https://code.launchpad.net/~jelmer/brz/cachedir/+merge/362708

7336. By Martin Packman

Only check https hostname if none cert_reqs=none

Merged from https://code.launchpad.net/~gz/brz/cert_reqs_none/+merge/368867

7337. By Jelmer Vernooij

Add some tests that use big files.

Merged from https://code.launchpad.net/~jelmer/brz/big-file-test/+merge/368868

7338. By Jelmer Vernooij

Merge lp:brz/3.0.

Merged from https://code.launchpad.net/~brz/brz/3.0/+merge/368871

7339. By Jelmer Vernooij

Print sensible error message when an invalid argument is specified for an option.

Merged from https://code.launchpad.net/~jelmer/brz/patch-strip-non-int/+merge/368870

7340. By Martin Packman

Split non-ini config methods to bedding

Merged from https://code.launchpad.net/~gz/brz/split_config_env/+merge/368863

7341. By Martin Packman

Fix use of config_dir in propose plugin.

Merged from https://code.launchpad.net/~gz/brz/bp_propose_config_dir/+merge/368879

7342. By Jelmer Vernooij

Install quilt, so we actually run the tests on the CI.

Merged from https://code.launchpad.net/~jelmer/brz/install-quilt/+merge/368865

7343. By Jelmer Vernooij

Read filesystem metadata from mtab directly rather than going via psutil.

Merged from https://code.launchpad.net/~jelmer/brz/just-read-mtab/+merge/368878

7344. By Jelmer Vernooij

Set the submit branch after 'brz publish' / 'brz propose'

Merged from https://code.launchpad.net/~jelmer/brz/propose-sets-submit/+merge/368883

7345. By Jelmer Vernooij

Fix corner case pushing to git.

Merged from https://code.launchpad.net/~jelmer/brz/fix-bot/+merge/368884

7346. By Martin Packman

Fix tests that need whoami not to be set.

Merged from https://code.launchpad.net/~gz/brz/override_whoami_tests/+merge/368885

7347. By Jelmer Vernooij

Add a VersionedFiles.add_chunks method that takes a chunk_iter.

Merged from https://code.launchpad.net/~jelmer/brz/big-file-vf/+merge/368882

7348. By Martin Packman

Remove win32 code using pywin32 library

Merged from https://code.launchpad.net/~gz/brz/no_pywin32/+merge/368881

7349. By Martin Packman

Relocate the bzr log file out of $HOME.

Merged from https://code.launchpad.net/~gz/brz/relocate_brz_log/+merge/368886

7350. By Jelmer Vernooij

Use find_previous_path in InterTree.iter_changes.

Merged from https://code.launchpad.net/~jelmer/brz/use-find-previous-path/+merge/368861

7351. By Vincent Ladeuil

Merge 3.0 into trunk resolving conflicts

Merged from https://code.launchpad.net/~vila/brz/trunk/+merge/368964

7352. By Jelmer Vernooij

Pin sphinx 1.8.5 for python 2, as newer versions have dropped python 2 support.

Merged from https://code.launchpad.net/~jelmer/brz/sphinx-python2/+merge/369175

7353. By Jelmer Vernooij

Drop file_id return value from Tree.iter_references.

Merged from https://code.launchpad.net/~jelmer/brz/iter-references/+merge/368977

7354. By Jelmer Vernooij

Add a Tree.get_transform method.

Merged from https://code.launchpad.net/~jelmer/brz/get-transform/+merge/368948

7355. By Jelmer Vernooij

Use paths as keys in merge_modified dictionary.

Merged from https://code.launchpad.net/~jelmer/brz/objects-2a/+merge/368929

7356. By Jelmer Vernooij

Remove file_id from transform's create_from_tree, get filter tree paths by path.

Merged from https://code.launchpad.net/~jelmer/brz/objects-2b/+merge/368930

7357. By Jelmer Vernooij

Drop file_id attribute from MergeHookParams and Tree.plan_file_merge.

Merged from https://code.launchpad.net/~jelmer/brz/objects-2c/+merge/368932

7358. By Jelmer Vernooij

Add a ``calculate_revnos`` setting that determines when revision numbers are calculated.

Merged from https://code.launchpad.net/~jelmer/brz/stores-revno/+merge/368873

7359. By Jelmer Vernooij

Add a --include-root flag to 'brz inventory'.

Merged from https://code.launchpad.net/~jelmer/brz/show-root/+merge/369473

7360. By Jelmer Vernooij

Misc fixes for interacting with GitLab repositories.

Merged from https://code.launchpad.net/~jelmer/brz/propose-fixes/+merge/369487

7361. By Jelmer Vernooij

Ignore UnknownFormatError in ControlDir.find_controldirs

Merged from https://code.launchpad.net/~jelmer/brz/find-controldirs-ignore-unknownformat/+merge/369371

7362. By Jelmer Vernooij

Add new helper method Inventory.get_entry_by_path_partial.

Merged from https://code.launchpad.net/~jelmer/brz/path2inv-nested/+merge/369475

7363. By Jelmer Vernooij

Add ``Tree.get_nested_tree`` for retrieving a nested tree from another tree.

Merged from https://code.launchpad.net/~jelmer/brz/get-nested-tree/+merge/369476

7364. By Jelmer Vernooij

Make Repository.find_branches an iterator.

Merged from https://code.launchpad.net/~jelmer/brz/iter-branch/+merge/369369

7365. By Jelmer Vernooij

Use standard syntax for the ``change_editor`` configuration option.

Merged from https://code.launchpad.net/~jelmer/brz/change-editor-consistent/+merge/369364

7366. By Jelmer Vernooij

Enable locks.steal_dead by default.

Merged from https://code.launchpad.net/~jelmer/brz/steal-dead-default/+merge/369321

7367. By Jelmer Vernooij

Don't include datestamps in filenames when reporting on binary files.

Merged from https://code.launchpad.net/~jelmer/brz/diff-binary-weird/+merge/369474

7368. By Jelmer Vernooij

Allow the ssh vendor to be configured in the config, rather than just using the BRZ_SSH environment variable.

Merged from https://code.launchpad.net/~jelmer/brz/ssh-config/+merge/369320

7369. By Jelmer Vernooij

Avoid using id2path in breezy.git.

Merged from https://code.launchpad.net/~jelmer/brz/avoid-id2path-1/+merge/369272

7370. By Jelmer Vernooij

Drop unused file id argument from predicate in deltas.

Merged from https://code.launchpad.net/~jelmer/brz/predicate-file-id/+merge/369209

7371. By Jelmer Vernooij

Fix a couple more issues in the propose plugin.

Merged from https://code.launchpad.net/~jelmer/brz/more-propose-fixes/+merge/369793

7372. By Jelmer Vernooij

Don't write a log file if we can't create the cache directory.

Merged from https://code.launchpad.net/~jelmer/brz/fix-bedding/+merge/370160

7373. By Jelmer Vernooij

Move bundle code to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/move-bundle-stuff/+merge/369483

7374. By Jelmer Vernooij

Drop file id roundtripping support in Git.

Merged from https://code.launchpad.net/~jelmer/brz/git-drop-roundtrip/+merge/369478

7375. By Jelmer Vernooij

Fix importing from remote git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/remote-git-import/+merge/370029

7376. By Jelmer Vernooij

Remove Tree.get_root_id() in favour of Tree.path2id('').

Merged from https://code.launchpad.net/~jelmer/brz/get-root-id/+merge/369477

7377. By Jelmer Vernooij

Fix extraction of paths from URLs when operating on remote Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/git-http-branch-url/+merge/370161

7378. By Jelmer Vernooij

Use contextlib.ExitStack rather than our homegrown OperationWithCleanups.

Merged from https://code.launchpad.net/~jelmer/brz/exitstack/+merge/369203

7379. By Jelmer Vernooij

Fix iter_proposals for GitHub and GitLab.

Merged from https://code.launchpad.net/~jelmer/brz/github-proposals-fix/+merge/370033

7380. By Jelmer Vernooij

Properly interpret error message about subpath on github.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-subpath/+merge/371168

7381. By Jelmer Vernooij

Several more fixes for git merge proposals.

Merged from https://code.launchpad.net/~jelmer/brz/more-git-fixes/+merge/371172

7382. By Jelmer Vernooij

Add quilt_delete call.

Merged from https://code.launchpad.net/~jelmer/brz/quilt-more/+merge/371831

7383. By Jelmer Vernooij

Add support for detecting conflicts in Launchpad merge proposals.

Merged from https://code.launchpad.net/~jelmer/brz/lp-detect-conflict/+merge/371775

7384. By Jelmer Vernooij

Ignore __pycache__ directories.

Merged from https://code.launchpad.net/~jelmer/brz/gitignore/+merge/371769

7385. By Jelmer Vernooij

Bundle the flake8 plugin.

Merged from https://code.launchpad.net/~jelmer/brz/flake8-plugin/+merge/371690

7386. By Jelmer Vernooij

Fix syntax error in format expansion.

Merged from https://code.launchpad.net/~jelmer/brz/fix-str/+merge/372312

7387. By Jelmer Vernooij

Add functions for reopening merge proposals and checking if they are closed.

Merged from https://code.launchpad.net/~jelmer/brz/reopen-mp/+merge/371773

7388. By Jelmer Vernooij

Remove specific_fileids argument from Repository.get_revision_delta.

Merged from https://code.launchpad.net/~jelmer/brz/get-delta-no-file-ids/+merge/369482

7389. By Jelmer Vernooij

TreeDelta holds TreeChange objects rather than tuples of various sizes.

Merged from https://code.launchpad.net/~jelmer/brz/delta-no-file-ids/+merge/369480

7390. By Jelmer Vernooij

Don't make TreeChange tuple-like objects anymore, so we can add and remove attributes as necessary.

Merged from https://code.launchpad.net/~jelmer/brz/tree-change-without-file-id/+merge/369484

7391. By Jelmer Vernooij

Add TreeDelta.copied and TreeChange.copied fields.

Merged from https://code.launchpad.net/~jelmer/brz/delta-copied/+merge/369485

7392. By Jelmer Vernooij

Avoid use of id2path in the fastimport plugin.

Merged from https://code.launchpad.net/~jelmer/brz/fastimport-no-id2path/+merge/373062

7393. By Jelmer Vernooij

Fix Python3 compatibility in Cython files, and fix some warnings.

Merged from https://code.launchpad.net/~jelmer/brz/cython3/+merge/373059

7394. By Jelmer Vernooij

Port testr-run to Python3.

Merged from https://code.launchpad.net/~jelmer/brz/testr-fix/+merge/373054

7395. By Jelmer Vernooij

Raise an informational message when unable to interpret redirect.

Merged from https://code.launchpad.net/~jelmer/brz/fix-redirects/+merge/373052

7396. By Jelmer Vernooij

Use id2path in fewer places; instead use paths.

Merged from https://code.launchpad.net/~jelmer/brz/less-id2path-1/+merge/373061

7397. By Jelmer Vernooij

Remove the unused has_or_had_id call.

Merged from https://code.launchpad.net/~jelmer/brz/no-more-has-or-had-id/+merge/373227

7398. By Jelmer Vernooij

Ignore __pycache__ directories in git.

Merged from https://code.launchpad.net/~jelmer/brz/gitignore/+merge/373714

7399. By Jelmer Vernooij

Fix forking on GitHub/GitLab.

Merged from https://code.launchpad.net/~jelmer/brz/propose-fork/+merge/373703

7400. By Jelmer Vernooij

Add a new ``TreeEntry.is_unmodified`` method, which allows
merge to check for unmodified files without relying
on the .revision attribute that is not available for Git trees.

This fixes LCA merges for Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/ie-is-same/+merge/373715

7401. By Jelmer Vernooij

Add really basic zsh completion plugin.

Merged from https://code.launchpad.net/~jelmer/brz/zsh-completion/+merge/373701

7402. By Jelmer Vernooij

Remove Tree.has_id.

Merged from https://code.launchpad.net/~jelmer/brz/remove-unused/+merge/373320

7403. By Jelmer Vernooij

Support passing bytestring paths to osutils.splitpath.

Merged from https://code.launchpad.net/~jelmer/brz/python3.8-1/+merge/374051

7404. By Jelmer Vernooij

Rename init-repo to init-shared-repo.

Merged from https://code.launchpad.net/~jelmer/brz/init-shared-repo/+merge/372116

7405. By Jelmer Vernooij

Merge lp:brz/3.0.

Merged from https://code.launchpad.net/~jelmer/brz/3.0-merge/+merge/374062

7406. By Jelmer Vernooij

Cope with non-commit tags in remote Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/non-commit-tags/+merge/374398

7407. By Jelmer Vernooij

Fix "bzr send" on git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-send/+merge/374755

7408. By Jelmer Vernooij

Git: Don't attempt to fetch peeled tags.

Merged from https://code.launchpad.net/~jelmer/brz/no-peeled/+merge/374409

7409. By Jelmer Vernooij

Use paging to iterate over github and gitlab pull requests.

Merged from https://code.launchpad.net/~jelmer/brz/page-gitlab/+merge/374761

7410. By Jelmer Vernooij

Use standard functions for creating Git URLs.

Merged from https://code.launchpad.net/~jelmer/brz/git-branch-escaping/+merge/374756

7411. By Jelmer Vernooij

Remove last imports of the pygithub module.

Merged from https://code.launchpad.net/~jelmer/brz/no-more-pygithub/+merge/375000

7412. By Jelmer Vernooij

Allow unknown extras in git commits when just inspecting revisions, rather than importing.

Merged from https://code.launchpad.net/~jelmer/brz/extra-fields/+merge/374765

7413. By Jelmer Vernooij

Fix support for reading from a dumb git server.

Merged from https://code.launchpad.net/~jelmer/brz/git-dumb-server/+merge/375063

7414. By Vincent Ladeuil

Merge lp:brz/3.0 after 3.0.2 release.

Merged from https://code.launchpad.net/~vila/brz/trunk/+merge/375724

7415. By Jelmer Vernooij

Fix handling of no-change merges during push.

Merged from https://code.launchpad.net/~jelmer/brz/git-push/+merge/375931

7416. By Jelmer Vernooij

Add iter_patched_from_hunks implementation that calls out to the patch command.

Merged from https://code.launchpad.net/~jelmer/brz/patch-api/+merge/375876

7417. By Jelmer Vernooij

Don't strip directory name when determining unapplied patches.

Merged from https://code.launchpad.net/~jelmer/brz/quilt-fix/+merge/375653

7418. By Jelmer Vernooij

Various improvements for Git repository probing.

Merged from https://code.launchpad.net/~jelmer/brz/git-probing/+merge/375651

7419. By Jelmer Vernooij

CVS pserver URLs indicate that the pserver protocol is not supported.

Merged from https://code.launchpad.net/~jelmer/brz/pserver/+merge/375642

7420. By Jelmer Vernooij

Add an optional priority method for probers.

Merged from https://code.launchpad.net/~jelmer/brz/prober-features/+merge/375187

7421. By Jelmer Vernooij

Add a fossil plugin that warns users when they attempt to access a Fossil repository.

Merged from https://code.launchpad.net/~jelmer/brz/probe-fossil/+merge/375185

7422. By Jelmer Vernooij

Fix reopen behaviour for gitlab.

Merged from https://code.launchpad.net/~jelmer/brz/fix-reopen-gitlab/+merge/374393

7423. By Jelmer Vernooij

Support following redirects for github repositories.

Merged from https://code.launchpad.net/~jelmer/brz/github-follow-link/+merge/376287

7424. By Jelmer Vernooij

Fix the credits command, and add some blackbox tests for the stats plugin.

Merged from https://code.launchpad.net/~jelmer/brz/fix-stats/+merge/376099

7425. By Jelmer Vernooij

Fix 'bzr diff --using' when no variables are specified in the template.

Merged from https://code.launchpad.net/~jelmer/brz/diff-using-fix/+merge/377088

7426. By Jelmer Vernooij

Mark 2a format as supporting tree references.

Merged from https://code.launchpad.net/~jelmer/brz/2a-supports-tree-reference/+merge/374396

7427. By Jelmer Vernooij

Fix setting of attributes on GitHub pull requests.

Merged from https://code.launchpad.net/~jelmer/brz/github-attributes/+merge/374394

7428. By Jelmer Vernooij

Skip trace test when directory creation always succeeds.

Merged from https://code.launchpad.net/~jelmer/brz/trace-dir-exists/+merge/377115

7429. By Jelmer Vernooij

Merge lp:brz/3.0.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.0/+merge/377116

7430. By Jelmer Vernooij

github: Handle 403s for pull request creation.

Merged from https://code.launchpad.net/~jelmer/brz/github-perm-denied/+merge/377117

7431. By Jelmer Vernooij

Add a PatchesApplied context manager that provides a copy of a tree with patches applied.

Merged from https://code.launchpad.net/~jelmer/brz/transform-patches/+merge/375884

7432. By Jelmer Vernooij

Add a MergeProposal.get_merged_by method.

Merged from https://code.launchpad.net/~jelmer/brz/merged-by/+merge/377146

7433. By Jelmer Vernooij

Ignore ghost tags when interacting with remote Git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/git-present-only/+merge/377144

7434. By Jelmer Vernooij

Add MergeProposal.get_merged_at().

Merged from https://code.launchpad.net/~jelmer/brz/merged-at/+merge/377275

7435. By Jelmer Vernooij

Add functions for managing projects.

Merged from https://code.launchpad.net/~jelmer/brz/project-management/+merge/376820

7436. By Jelmer Vernooij

Add a recurse_nested argument to Tree.list_files.

Merged from https://code.launchpad.net/~jelmer/brz/follow-tree-references-list-files/+merge/374066

7437. By Jelmer Vernooij

Add recurse_nested argument to Tree.iter_entries_by_dir.

Merged from https://code.launchpad.net/~jelmer/brz/follow-tree-references-iter-entries-by-dir/+merge/374108

7438. By Jelmer Vernooij

Add support for tree references in id2path.

Merged from https://code.launchpad.net/~jelmer/brz/follow-tree-references-id2path/+merge/374163

7439. By Jelmer Vernooij

Move the propose module into core.

Merged from https://code.launchpad.net/~jelmer/brz/propose-core/+merge/374757

7440. By Jelmer Vernooij

Add a Mercurial prober that mentions that mercurial repositories are unsupported.

Merged from https://code.launchpad.net/~jelmer/brz/probe-hg/+merge/375181

7441. By Jelmer Vernooij

Port the rewrite plugin to breezy.

Merged from https://code.launchpad.net/~jelmer/brz/rebase/+merge/374758

7442. By Jelmer Vernooij

Support checking out nested trees in "bzr branch", including for git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/follow-tree-references-branch/+merge/374397

7443. By Jelmer Vernooij

Add strip_segment_parameters function.

Merged from https://code.launchpad.net/~jelmer/brz/strip-segment-parameters/+merge/377479

7444. By Jelmer Vernooij

Don't attempt to set the title when updating the commit message in GitHub.

Merged from https://code.launchpad.net/~jelmer/brz/github-title-not-commit-message/+merge/377480

7445. By Jelmer Vernooij

Add basic svn plugin that warns the user when they attempt to access a svn working tree.

Merged from https://code.launchpad.net/~jelmer/brz/probe-svn/+merge/375183

7446. By Jelmer Vernooij

Add Hoster.merge_proposal_description_format and common function for determining title.

Merged from https://code.launchpad.net/~jelmer/brz/merge-proposal-text/+merge/377672

7447. By Jelmer Vernooij

Fix working tree update of incremental lossy push.

Merged from https://code.launchpad.net/~jelmer/brz/lossy-incremental/+merge/377743

7448. By Jelmer Vernooij

Use find_previous_path rather than id2path in one more place in breezy.git.

Merged from https://code.launchpad.net/~jelmer/brz/previous-path/+merge/377794

7449. By Jelmer Vernooij

Fix WorkingTree.iter_references, and add test.

Merged from https://code.launchpad.net/~jelmer/brz/iter-tree-references-lock/+merge/377793

7450. By Jelmer Vernooij

Support importing tree reference info from Git.

Merged from https://code.launchpad.net/~jelmer/brz/interbranch-update-references/+merge/377797

7451. By Jelmer Vernooij

Move tree reference info functions to workingtree.

Merged from https://code.launchpad.net/~jelmer/brz/move-reference-functions/+merge/377800

7452. By Jelmer Vernooij

Store bzr reference information by file id rather than by path.

Merged from https://code.launchpad.net/~jelmer/brz/reference-info-file-id/+merge/377801

7453. By Jelmer Vernooij

Support fetching / pushing reference information to remote branches.

Merged from https://code.launchpad.net/~jelmer/brz/branch-reference-remote/+merge/377806

7454. By Jelmer Vernooij

Support recurse argument to id2path.

Merged from https://code.launchpad.net/~jelmer/brz/id2path-recurse/+merge/377805

7455. By Jelmer Vernooij

Don't show submodules that are not checked out as deltas.

Merged from https://code.launchpad.net/~jelmer/brz/git-submodule-not-checked-out/+merge/377807

7456. By Jelmer Vernooij

Attempt to fix spurious test failures by flushing file buffers.

Merged from https://code.launchpad.net/~jelmer/brz/big-file/+merge/377846

7457. By Jelmer Vernooij

Return a FetchResult object from Repository.fetch / Branch.fetch.

Merged from https://code.launchpad.net/~jelmer/brz/fetchresult/+merge/377811

7458. By Jelmer Vernooij

Fix invalid escape sequence errors in rebase plugin on Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/rewrite-escape/+merge/377972

7459. By Jelmer Vernooij

Support importing Git submodules as tree references.

Merged from https://code.launchpad.net/~jelmer/brz/fix-submodule-import/+merge/378021

7460. By Jelmer Vernooij

Make add_raw_records a chunked API.

Merged from https://code.launchpad.net/~jelmer/brz/add-raw-records/+merge/378070

7461. By Jelmer Vernooij

Pass chunks rather than full texts to compress().

Merged from https://code.launchpad.net/~jelmer/brz/compress/+merge/378071

7462. By Jelmer Vernooij

Add a 'lines' storage kind.

Merged from https://code.launchpad.net/~jelmer/brz/file-content-factory/+merge/378072

7463. By Jelmer Vernooij

Consistently provide bytes_length to make_delta.

Merged from https://code.launchpad.net/~jelmer/brz/require-bytes-length/+merge/378076

7464. By Jelmer Vernooij

Add a size attribute to ContentFactory.

Merged from https://code.launchpad.net/~jelmer/brz/cf-size/+merge/378080

7465. By Jelmer Vernooij

Attempt to batch operations when fastexporting a remote bzr repository.

Merged from https://code.launchpad.net/~jelmer/brz/fastexport-perf/+merge/378079

7466. By Jelmer Vernooij

Add DirectAccess.add_raw_record.

Merged from https://code.launchpad.net/~jelmer/brz/add-raw-record/+merge/378085

7467. By Jelmer Vernooij

Fix finding Launchpad merge proposals by URL.

Merged from https://code.launchpad.net/~jelmer/brz/fix-land/+merge/378081

7468. By Jelmer Vernooij

Add VersionedFile.iter_bytes_as.

Merged from https://code.launchpad.net/~jelmer/brz/iter-bytes-as/+merge/378338

7469. By Jelmer Vernooij

Properly use inheritance for InventoryTree._get_file_revision

Merged from https://code.launchpad.net/~jelmer/brz/split-plan/+merge/378337

7470. By Jelmer Vernooij

Use chunks rather than fulltexts for inventories where possible.

Merged from https://code.launchpad.net/~jelmer/brz/inventory-chunks/+merge/378341

7471. By Jelmer Vernooij

Drop more roundtripping support in Git.

Merged from https://code.launchpad.net/~jelmer/brz/drop-roundtripping/+merge/378336

7472. By Jelmer Vernooij

Add the ability to create work-in-progress merge requests.

Merged from https://code.launchpad.net/~jelmer/brz/wip-proposal/+merge/378212

7473. By Jelmer Vernooij

Add VersionedFiles.add_content.

Merged from https://code.launchpad.net/~jelmer/brz/add-content/+merge/378347

7474. By Jelmer Vernooij

In 'brz add', ignore --file-ids-from for trees that do not support file ids.

Merged from https://code.launchpad.net/~jelmer/brz/add-file-ids-from/+merge/378351

7475. By Jelmer Vernooij

Add support for a --color={auto,never,always} argument to 'brz diff'.

Merged from https://code.launchpad.net/~jelmer/brz/colordiff/+merge/374749

7476. By Jelmer Vernooij

Merge the 3.0 branch.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.0/+merge/378383

7477. By Jelmer Vernooij

Fix handling of empty files with C extensions.

Merged from https://code.launchpad.net/~jelmer/brz/fix-pyx-empty-file/+merge/378419

7478. By Jelmer Vernooij

Default to running with Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/default-python3/+merge/378411

7479. By Jelmer Vernooij

Fix compatibility with newer versions of paramiko, which break on noise before keys in pem files.

Merged from https://code.launchpad.net/~jelmer/brz/paramiko-compat/+merge/378480

7480. By Jelmer Vernooij

Actually run the python2 tests in 'check-ci', specify python to use in travis.

Merged from https://code.launchpad.net/~jelmer/brz/fix-travis/+merge/378632

7481. By Jelmer Vernooij

Disable file ids for content filter stack.

Merged from https://code.launchpad.net/~jelmer/brz/stack-no-file-id/+merge/378633

7482. By Jelmer Vernooij

Fix travis build: cope with newer versions of coverage module.

Merged from https://code.launchpad.net/~jelmer/brz/coverage-compat/+merge/378637

7483. By Jelmer Vernooij

Fix compatibility with newer versions of coverage module.

Merged from https://code.launchpad.net/~jelmer/brz/coverage-compat/+merge/378693

7484. By Jelmer Vernooij

More improvements to make tests success with Python 3.8.

Merged from https://code.launchpad.net/~jelmer/brz/3.8-compat/+merge/378692

7485. By Jelmer Vernooij

Follow symrefs when pushing to git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/git-follow-symref/+merge/378769

7486. By Jelmer Vernooij

Move the logic behind find_previous_path onto InterTree, so it can be overriden.

Merged from https://code.launchpad.net/~jelmer/brz/intertree-find-target-path/+merge/369202

7487. By Jelmer Vernooij

parse_text_bytes now takes a list of lines.

Merged from https://code.launchpad.net/~jelmer/brz/chk-inventory-iter/+merge/378772

7488. By Jelmer Vernooij

More chunkification of groupcompress APIs.

Merged from https://code.launchpad.net/~jelmer/brz/extract/+merge/378773

7489. By Jelmer Vernooij

Use InterTree object when looking for renames.

Merged from https://code.launchpad.net/~jelmer/brz/intertree-renames/+merge/378777

7490. By Jelmer Vernooij

Ignore ghost tags when pushing to a remote git repo.

Merged from https://code.launchpad.net/~jelmer/brz/ghost-tags/+merge/378930

7491. By Jelmer Vernooij

Start release notes/whatsnew for Breezy 3.2.

Merged from https://code.launchpad.net/~jelmer/brz/3.2-notes/+merge/379188

7492. By Jelmer Vernooij

Drop python2 support.

Merged from https://code.launchpad.net/~jelmer/brz/no-more-python2/+merge/378694

7493. By Jelmer Vernooij

Drop unnecessary imports from __future__.

Merged from https://code.launchpad.net/~jelmer/brz/drop-future/+merge/379372

7494. By Jelmer Vernooij

Drop the 'brz lp-propose' command in favour of 'brz propose'.

Merged from https://code.launchpad.net/~jelmer/brz/propose-more/+merge/379264

7495. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/trunk-3.1/+merge/379600

7496. By Jelmer Vernooij

Use os.scandir.

Merged from https://code.launchpad.net/~jelmer/brz/scandir2/+merge/379604

7497. By Jelmer Vernooij

Merge the lp:brz/3.1 branch.

Merged from https://code.launchpad.net/~jelmer/brz/trunk-merge-3.1/+merge/380392

7498. By Jelmer Vernooij

Fix typo: maintainerS_can_modify has an extra S, in GitHub pull requests.

Merged from https://code.launchpad.net/~jelmer/brz/github-extra-s/+merge/380394

7499. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/381004

7500. By Jelmer Vernooij

Move InvalidRevisionSpec to breezy.revisionspec.

Merged from https://code.launchpad.net/~jelmer/brz/revspec-errors/+merge/381196

7501. By Jelmer Vernooij

Merge the 3.1 branch.

Merged from https://code.launchpad.net/~jelmer/brz/trunk-merge-3.1/+merge/383481

7502. By Jelmer Vernooij

Drop support for python 3.4 in appveyor.

Merged from https://code.launchpad.net/~jelmer/brz/travis-3.5-pre/+merge/383536

7503. By Jelmer Vernooij

Drop python 2 dependencies in byoci.

Merged from https://code.launchpad.net/~jelmer/brz/byov-no-py3/+merge/384841

7504. By Jelmer Vernooij

Add a GitHub action.

Merged from https://code.launchpad.net/~jelmer/brz/github-actions/+merge/384477

7505. By Jelmer Vernooij

Fix and clean up Windows functions.

We no longer need special handling for os.environ, as it's unicode now.

Assume that ctypes.windll is available on Windows.

Merged from https://code.launchpad.net/~jelmer/brz/windows-cleanup/+merge/384478

7506. By Jelmer Vernooij

iter_files_bytes can return iterators.

Merged from https://code.launchpad.net/~jelmer/brz/iter-bytes/+merge/378776

7507. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/384927

7508. By Jelmer Vernooij

Move launchpad hoster support to the launchpad plugin.

Merged from https://code.launchpad.net/~jelmer/brz/move-launchpad/+merge/384931

7509. By Jelmer Vernooij

Parse stderr from remote git servers when they hang up.

Merged from https://code.launchpad.net/~jelmer/brz/git-stderr-lines/+merge/384935

7510. By Jelmer Vernooij

Set cython language level to Python 3.

Merged from https://code.launchpad.net/~jelmer/brz/cython-language-level/+merge/385312

7511. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/385542

7512. By Jelmer Vernooij

Avoid using fork when running the testsuite in github actions.

Merged from https://code.launchpad.net/~jelmer/brz/actions-no-fork/+merge/385565

7513. By Jelmer Vernooij

Drop appveyor + travis configuration.

Merged from https://code.launchpad.net/~jelmer/brz/drop-travis-appveyor/+merge/385578

7514. By Jelmer Vernooij

Avoid deprecated behaviour in ElementTree.

Merged from https://code.launchpad.net/~jelmer/brz/pypy3/+merge/385611

7515. By Jelmer Vernooij

Mark pypy3 build as experimental since it currently fails.

Merged from https://code.launchpad.net/~jelmer/brz/actions-disable-pypi/+merge/385653

7516. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/386125

7517. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/386223

7518. By Jelmer Vernooij

Update installation instructions, explaining need for Python 3.5+ and optional dependencies.

Merged from https://code.launchpad.net/~jelmer/brz/trunk-3.5/+merge/386230

7519. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/387628

7520. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/388173

7521. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/389690

7522. By Colin Watson

Remove breezy.git workaround for bazaar.launchpad.net.

Merged from https://code.launchpad.net/~cjwatson/brz/remove-lp-workaround/+merge/393710

7523. By Colin Watson

Fix handling of git.http option.

Merged from https://code.launchpad.net/~cjwatson/brz/fix-loggerhead-git-option/+merge/393708

7524. By Colin Watson

Define a Launchpad 'test' domain rather than 'dev'.

Merged from https://code.launchpad.net/~cjwatson/brz/lp-test-uris/+merge/393711

7525. By Jelmer Vernooij

Disable pypy3 build.

Merged from https://code.launchpad.net/~jelmer/brz/github-actions/+merge/394156

7526. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/394038

7527. By Jelmer Vernooij

Merge lp:brz/3.1

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/396037

7528. By Gustav Hartvigsson

Drop documentation for removed API API.

Merged from https://code.launchpad.net/~gustav-hartvigsson/brz/removed-api-doc/+merge/396033

7529. By Gustav Hartvigsson

Mention the need to load bzr or git modules in the docs.

Merged from https://code.launchpad.net/~gustav-hartvigsson/brz/fix-integration-docs/+merge/396094

7530. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1-fix-build/+merge/398324

7531. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/400002

7532. By Jelmer Vernooij

Merge lp:brz/3.1.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.1/+merge/400593

7533. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/407445

7534. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/407455

7535. By Jelmer Vernooij

Switch the Breezy entrypoint code to Rust!

Merged from https://code.launchpad.net/~brz/brz/brz.rs/+merge/407393

7536. By Martin Packman

Make flake8 source test behave

Merged from https://code.launchpad.net/~gz/brz/flake8_source_test/+merge/407491

7537. By Jelmer Vernooij

Add some more typing hints.

Merged from https://code.launchpad.net/~jelmer/brz/typing-fixes/+merge/407806

7538. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/409076

7539. By Jelmer Vernooij

Install setuptools-rust.

Merged from https://code.launchpad.net/~jelmer/brz/install-rust-setuptools/+merge/409276

7540. By Jelmer Vernooij

Invoke brz directly, not via Python.

Merged from https://code.launchpad.net/~jelmer/brz/invoke-brz/+merge/409289

7541. By Jelmer Vernooij

Set PYTHONPATH.

Merged from https://code.launchpad.net/~jelmer/brz/pythonpath/+merge/409294

7542. By Jelmer Vernooij

Prevent DeprecationWarnings from Dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/newer-dulwich/+merge/411819

7543. By Jelmer Vernooij

fix testr.conf after move to brz.rs.

Merged from https://code.launchpad.net/~jelmer/brz/fix-testr-rs/+merge/411818

7544. By Jelmer Vernooij

Remove Tree.id2path.

Merged from https://code.launchpad.net/~jelmer/brz/id2path/+merge/411822

7545. By Jelmer Vernooij

Add MatchesTreeChanges matcher.

Merged from https://code.launchpad.net/~jelmer/brz/matcher/+merge/411824

7546. By Jelmer Vernooij

Move tuned_gzip to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/tuned-gzip/+merge/411821

7547. By Jelmer Vernooij

Avoid path2id in some tests.

Merged from https://code.launchpad.net/~jelmer/brz/path2id-tests/+merge/411827

7548. By Jelmer Vernooij

Avoid path2id in more places in tests.

Merged from https://code.launchpad.net/~jelmer/brz/path2id-tests-2/+merge/411829

7549. By Jelmer Vernooij

Use absolute paths for plugin paths.

Merged from https://code.launchpad.net/~jelmer/brz/fix-plugins/+merge/411876

7550. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/411895

7551. By Jelmer Vernooij

Rely purely on Python's internal notion of filesystem encoding and use surrogate escapes in internal path strings.

Merged from https://code.launchpad.net/~jelmer/brz/allow-surrogates/+merge/411817

7552. By Jelmer Vernooij

Avoid path2id in some more cases.

Merged from https://code.launchpad.net/~jelmer/brz/path2id-1/+merge/411898

7553. By Jelmer Vernooij

Remove more references to the Bazaar site.

Merged from https://code.launchpad.net/~jelmer/brz/docs/+merge/412040

7554. By Jelmer Vernooij

Update PYTHONPATH to include local breezy package when running from source.

Merged from https://code.launchpad.net/~jelmer/brz/auto-path/+merge/412034

7555. By Jelmer Vernooij

Actually set filesystem encoding.

Merged from https://code.launchpad.net/~jelmer/brz/set-fs-enc/+merge/412026

7556. By Jelmer Vernooij

Points wiki links to Breezy wiki.

Merged from https://code.launchpad.net/~jelmer/brz/wiki/+merge/413434

7557. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/413480

7558. By Jelmer Vernooij

Some work supporting git as default format.

Merged from https://code.launchpad.net/~jelmer/brz/default-format-git/+merge/413481

7559. By Jelmer Vernooij

Avoid file and revision ids as much as possible in merge tests.

Merged from https://code.launchpad.net/~jelmer/brz/merge-builder/+merge/413490

7560. By Jelmer Vernooij

Some more improvements to handle git as default format.

Merged from https://code.launchpad.net/~jelmer/brz/default-format-git/+merge/413492

7561. By Jelmer Vernooij

Drop unnnecessary use of file ids.

Merged from https://code.launchpad.net/~jelmer/brz/unnecessary-file-id/+merge/413547

7562. By Jelmer Vernooij

Add support for --recurse-nested argument to 'brz export'.

Merged from https://code.launchpad.net/~jelmer/brz/export-nested/+merge/413552

7563. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/413643

7564. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~brz/brz/3.2/+merge/413826

7565. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/414470

7566. By Jelmer Vernooij

Document dependency on rust and other dependencies.

Merged from https://code.launchpad.net/~jelmer/brz/install-rust/+merge/414895

7567. By Jelmer Vernooij

Update gitignore list for new rust files.

Merged from https://code.launchpad.net/~jelmer/brz/gitignore/+merge/414987

7568. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/416554

7569. By Jelmer Vernooij

Remove unused import of the imp module.

Merged from https://code.launchpad.net/~jelmer/brz/move-imp/+merge/421148

7570. By Jelmer Vernooij

Fix some leaks.

Merged from https://code.launchpad.net/~jelmer/brz/leaks/+merge/421165

7571. By Jelmer Vernooij

Merge 3.2.2

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2.2/+merge/417131

7572. By Jelmer Vernooij

Fix more leaks.

Merged from https://code.launchpad.net/~jelmer/brz/leaks/+merge/421187

7573. By Jelmer Vernooij

Drop backwards compatibility code for python < 3.6.

Merged from https://code.launchpad.net/~jelmer/brz/version-info/+merge/422582

7574. By Jelmer Vernooij

git: Avoid reading entire files into memory.

Merged from https://code.launchpad.net/~jelmer/brz/http-chunked/+merge/422588

7575. By Jelmer Vernooij

Drop encoding support, consistent with dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/git-compress/+merge/424451

7576. By Jelmer Vernooij

Support insteadOf / pushInsteadOf in git config.

Merged from https://code.launchpad.net/~jelmer/brz/apply-instead-of/+merge/425871

7577. By Jelmer Vernooij

Remove more uses of lazy_imports, move ids in Tree.add() to end of argument list.

Merged from https://code.launchpad.net/~jelmer/brz/fix-datetime/+merge/426102

7578. By Jelmer Vernooij

Fix date: in git repositories.

Merged from https://code.launchpad.net/~jelmer/brz/fix-datetime/+merge/426105

7579. By Jelmer Vernooij

Some workspace improvements.

Merged from https://code.launchpad.net/~jelmer/brz/workspace-improvements/+merge/423531

7580. By Jelmer Vernooij

git: Improve handling of mercurial magic.

Merged from https://code.launchpad.net/~jelmer/brz/rebase-source/+merge/422589

7581. By Jelmer Vernooij

Drop test prefix "python3." since we no longer need it.

Merged from https://code.launchpad.net/~jelmer/brz/drop-test-prefix/+merge/426132

7582. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/426212

7583. By Jelmer Vernooij

Add rust-based rio module.

Merged from https://code.launchpad.net/~jelmer/brz/rio.rs/+merge/407412

7584. By Jelmer Vernooij

Fix handling of --diff-options.

Merged from https://code.launchpad.net/~jelmer/brz/fix-diff-using/+merge/426326

7585. By Jelmer Vernooij

Drop ids from MutableTree.add API.

Merged from https://code.launchpad.net/~jelmer/brz/add-no-id/+merge/426216

7586. By Jelmer Vernooij

Catch more specific exceptions.

Merged from https://code.launchpad.net/~jelmer/brz/version-info/+merge/422586

7587. By Jelmer Vernooij

Use system merge3 module.

Merged from https://code.launchpad.net/~jelmer/brz/system-merge3/+merge/396662

7588. By Jelmer Vernooij

Add 'brz version-info --format=yaml'.

Merged from https://code.launchpad.net/~jelmer/brz/rio-to-yaml/+merge/426494

7589. By Jelmer Vernooij

Move recordcounter to bzr

Merged from https://code.launchpad.net/~jelmer/brz/move-recordcounter/+merge/426499

7590. By Jelmer Vernooij

Use yaml rather than rio for lock directories.

Merged from https://code.launchpad.net/~jelmer/brz/lockdir-yaml/+merge/426495

7591. By Jelmer Vernooij

Remove deprecated WorkingTree.auto_resolve.

Merged from https://code.launchpad.net/~jelmer/brz/undeprecate-autoresolve/+merge/411826

7592. By Jelmer Vernooij

Fix news_merge imports.

Merged from https://code.launchpad.net/~jelmer/brz/fix-news-merge/+merge/426510

7593. By Jelmer Vernooij

Install yaml.

Merged from https://code.launchpad.net/~jelmer/brz/install-yaml/+merge/426594

7594. By Jelmer Vernooij

Install merge3 in CI.

Merged from https://code.launchpad.net/~jelmer/brz/install-merge3/+merge/426595

7595. By Jelmer Vernooij

Merge lp:brz/3.2.

Merged from https://code.launchpad.net/~jelmer/brz/merge-3.2/+merge/426593

7596. By Jelmer Vernooij

bashcomp: Preserve environment when invoking brz.

Merged from https://code.launchpad.net/~jelmer/brz/bashcomp-path/+merge/426596

7597. By Jelmer Vernooij

use google docstrings in some places, fixing errors from pydoctor in the process.

Merged from https://code.launchpad.net/~jelmer/brz/google-docstrings-1/+merge/426598

7598. By Jelmer Vernooij

Move rio to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/move-rio/+merge/426498

7599. By Jelmer Vernooij

s/Hoster/Forge/

Merged from https://code.launchpad.net/~jelmer/brz/forge/+merge/423445

7600. By Jelmer Vernooij

Rename breezy.propose to breezy.forge.

Merged from https://code.launchpad.net/~jelmer/brz/propose-forge/+merge/426697

7601. By Jelmer Vernooij

Fix consistency for nonce type in lockdir.

Merged from https://code.launchpad.net/~jelmer/brz/lock-fixes/+merge/426915

7602. By Jelmer Vernooij

Update path to rio Cython module in bzrignore.

Merged from https://code.launchpad.net/~jelmer/brz/update-ignore/+merge/426977

7603. By Jelmer Vernooij

Move metadata to setup.cfg where possible.

Merged from https://code.launchpad.net/~jelmer/brz/use-setup-cfg/+merge/426976

7604. By Jelmer Vernooij

Split out ProtectedBranchHookDeclined.

Merged from https://code.launchpad.net/~jelmer/brz/protected-branch-hook/+merge/426975

7605. By Jelmer Vernooij

Simplify setup.py.

Merged from https://code.launchpad.net/~jelmer/brz/simplify-setup/+merge/426987

7606. By Jelmer Vernooij

Disable known failing test_build_and_install on GitHub.

Merged from https://code.launchpad.net/~jelmer/brz/skip-test-on-github/+merge/426991

7607. By Jelmer Vernooij

Fix syntax of maintainer in setup.py.

Merged from https://code.launchpad.net/~jelmer/brz/fix-setup-maintainer/+merge/426992

7608. By Jelmer Vernooij

Fix handling of chunked HTTP requests.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-push-chunked/+merge/426994

7609. By Jelmer Vernooij

Fix casing in header check for chunked encoding.

Merged from https://code.launchpad.net/~jelmer/brz/fix-git-push-chunked/+merge/426995

7610. By Jelmer Vernooij

Move some more errors.

Merged from https://code.launchpad.net/~jelmer/brz/move-errors/+merge/426962

7611. By Jelmer Vernooij

Move hashcache.

Merged from https://code.launchpad.net/~jelmer/brz/move-hashcache/+merge/426996

7612. By Jelmer Vernooij

Move static_tuple to breezy.bzr.

Merged from https://code.launchpad.net/~jelmer/brz/move-static-tuple/+merge/426993

7613. By Jelmer Vernooij

Convert SymrefLoop to BranchReferenceLoop.

Merged from https://code.launchpad.net/~jelmer/brz/branch-reference-loop/+merge/426997

7614. By Jelmer Vernooij

Add MergeProposal.set_target_branch().

Merged from https://code.launchpad.net/~jelmer/brz/set-target-branch/+merge/426999

7615. By Jelmer Vernooij

Raise custom error for unknown encodings in Git commits.

Merged from https://code.launchpad.net/~jelmer/brz/lookup-error/+merge/428975

7616. By Jelmer Vernooij

Improve handling of refs for remote git branches.

Merged from https://code.launchpad.net/~jelmer/brz/git-ref-fix/+merge/429012

7617. By Jelmer Vernooij

Move UnsupportedProtocol, FileExists and NoSuchFile from breezy.errors to breezy.transport.

Merged from https://code.launchpad.net/~jelmer/brz/move-errors/+merge/428740

7618. By Jelmer Vernooij

By default, don't push tags when proposing changes.

Merged from https://code.launchpad.net/~jelmer/brz/propose-no-tags/+merge/428739

7619. By Jelmer Vernooij

Handle remove symref loops.

Merged from https://code.launchpad.net/~jelmer/brz/symrefloop/+merge/429029

7620. By Jelmer Vernooij

Simplify remote git branch handling.

Merged from https://code.launchpad.net/~jelmer/brz/simplify-remote-git/+merge/426998

7621. By Jelmer Vernooij

Fix remote branch reference handling for git.

Merged from https://code.launchpad.net/~jelmer/brz/git-remote-branch-reference/+merge/429089

7622. By Jelmer Vernooij

Use authentication.conf for storing forge credentials.

Merged from https://code.launchpad.net/~jelmer/brz/lp-creds/+merge/429101

7623. By Jelmer Vernooij

Launchpad: Fix instance iteration.

Merged from https://code.launchpad.net/~jelmer/brz/lp-fix-iter/+merge/429146

7624. By Jelmer Vernooij

Improve handling of remote git trees.

Merged from https://code.launchpad.net/~jelmer/brz/remote-git-trees/+merge/429168

7625. By Jelmer Vernooij

Fix gitlab API access; now seems to reject ';' as separator of url parameters.

Merged from https://code.launchpad.net/~jelmer/brz/gitlab-state-value/+merge/429228

7626. By Jelmer Vernooij

Avoid deprecated urllib.parse.{splittype,splitport,splithost}.

Merged from https://code.launchpad.net/~jelmer/brz/split-url/+merge/429225

7627. By Jelmer Vernooij

Add support for create_signatures=when-possible

Merged from https://code.launchpad.net/~jelmer/brz/create-signatures-when-possible/+merge/429316

7628. By Jelmer Vernooij

Support accessing git branch configuration.

Merged from https://code.launchpad.net/~jelmer/brz/git-config-section-options/+merge/429396

7629. By Jelmer Vernooij

Fix flake8 with newer versions of flake8.

Merged from https://code.launchpad.net/~jelmer/brz/fix-flake8/+merge/429645

7630. By Jelmer Vernooij

Allow newer versions of pyo3.

Merged from https://code.launchpad.net/~jelmer/brz/pyo3-version/+merge/419982

7631. By Jelmer Vernooij

Add link to Matrix room, point to new IRC channel.

Merged from https://code.launchpad.net/~jelmer/brz/matrix-room/+merge/429577

7632. By Jelmer Vernooij

Improve storage of Launchpad credentials in authentication.conf

Merged from https://code.launchpad.net/~jelmer/brz/lp-back-compat/+merge/429528

7633. By Jelmer Vernooij

Support name argument in ControlDir.push_branch.

Merged from https://code.launchpad.net/~jelmer/brz/push-to-named/+merge/429760

7634. By Jelmer Vernooij

Only update working tree when pushing to active branch.

Merged from https://code.launchpad.net/~jelmer/brz/only-if-active/+merge/429774

7635. By Jelmer Vernooij

gitlab: Fix syntax error dealing with merge proposal conflicts.

Merged from https://code.launchpad.net/~jelmer/brz/mp-reason/+merge/429898

7636. By Jelmer Vernooij

Fix compatibility with modern dulwich.

Merged from https://code.launchpad.net/~jelmer/brz/pack-changes/+merge/429890

7637. By Jelmer Vernooij

Fix exception initialization for unsupported formats

Merged from https://code.launchpad.net/~jelmer/brz/cvsdir/+merge/429907

7638. By Jelmer Vernooij

Add a docker file.

Merged from https://code.launchpad.net/~jelmer/brz/container/+merge/429830

7639. By Jelmer Vernooij

Fix import of BranchReferenceLoop.

Merged from https://code.launchpad.net/~jelmer/brz/symref/+merge/429915

7640. By Alexander Grund <email address hidden>

fastimport: Open stdin in binary mode

Merged from https://code.launchpad.net/~jelmer/brz/patch-2/+merge/430055

7641. By Alexander Grund <email address hidden>

Add missing controldir import to branch_updater

Merged from https://code.launchpad.net/~jelmer/brz/patch-1/+merge/430054

7642. By Jelmer Vernooij

Avoid deprecated distutils.version.

Merged from https://code.launchpad.net/~jelmer/brz/avoid-deprecated/+merge/430255

7643. By Jelmer Vernooij

Remove obsolete __cmp__.

Merged from https://code.launchpad.net/~jelmer/brz/cmp/+merge/430343

7644. By Jelmer Vernooij

Avoid osutils.mkdtemp.

Merged from https://code.launchpad.net/~jelmer/brz/tempdir/+merge/430341

7645. By Jelmer Vernooij

Return canonical GitHub URLs.

Merged from https://code.launchpad.net/~jelmer/brz/canonical-url/+merge/430562

7646. By Jelmer Vernooij

Lazy load github mps

Merged from https://code.launchpad.net/~jelmer/brz/github-lazy/+merge/430713

7647. By Jelmer Vernooij

Convert multiple authors to the Co-authored-by field.

Merged from https://code.launchpad.net/~jelmer/brz/co-author/+merge/430849

7648. By Jelmer Vernooij

Fix handling of empty directories in iter_changes

Merged from https://code.launchpad.net/~jelmer/brz/find-related-paths-git-directories/+merge/430853

7649. By Jelmer Vernooij

Add dependencies on setup.py prerequisites in pyproject.toml.

Merged from https://code.launchpad.net/~jelmer/brz/packaging-version/+merge/430855

7650. By Jelmer Vernooij

Add extra for PGP.

Merged from https://code.launchpad.net/~jelmer/brz/gpg-dep/+merge/430854

7651. By Jelmer Vernooij

Add news

7652. By Jelmer Vernooij

Update release notes.

7653. By Jelmer Vernooij

Update series in releaser.conf.

7654. By Jelmer Vernooij

s/releaser/disperse/

7655. By Jelmer Vernooij

Include rust files.

7656. By Jelmer Vernooij

Include some more files.

7657. By Jelmer Vernooij

Release 3.3.0.

7658. By Jelmer Vernooij

Start on 3.3.1.

7659. By Jelmer Vernooij

Don't ship brz executable, as it is now binary.

7660. By Jelmer Vernooij

Also update versions in Cargo.toml.

7661. By Jelmer Vernooij

Only ship breezy/*

7662. By Jelmer Vernooij

Set build-backend in pyproject.toml.

7663. By Jelmer Vernooij

Set setup_requires.

7664. By Jelmer Vernooij

rely on setuptools-gettext for building mo files

7665. By Jelmer Vernooij

Install setuptools-gettext in github action.

7666. By Jelmer Vernooij

Depend on setuptools 0.60, which provides setuptools.command.build.

7667. By Jelmer Vernooij

Depend on wheel in pyproject.

7668. By Jelmer Vernooij

Drop Python < 3.7

7669. By Jelmer Vernooij

Use standard infrastructure for marking C extensions as optional

7670. By Jelmer Vernooij

Add tarmac configuration.

7671. By Jelmer Vernooij

Support editable wheels.

7672. By Jelmer Vernooij

tarmac: Enable --system-site-packages, pass in correct PYTHON.

7673. By Jelmer Vernooij

Import additional tarmac config.

7674. By Jelmer Vernooij

tarmac: Run with venv python.

7675. By Jelmer Vernooij

tarmac: Set setup_command.

7676. By Jelmer Vernooij

Drop use of pyinotify.

7677. By Jelmer Vernooij

Clear BRZ_SSH in tests. by jelmer review by jelmer

7678. By Jelmer Vernooij

Fix Tree.get_file_mtime in shallow trees. by jelmer review by jelmer

7679. By Jelmer Vernooij

Fix merge command for GitLab MRs by jelmer review by jelmer

7680. By Jelmer Vernooij

Support titles for merge proposals. by jelmer review by jelmer

7681. By Jelmer Vernooij

Add support for getting GitHub PRs by URL. by jelmer review by jelmer

7682. By Jelmer Vernooij

Build wheels with cibuildwheel. by jelmer review by jelmer

7683. By Jelmer Vernooij

Fix some typing issues. by jelmer review by jelmer

7684. By Jelmer Vernooij

Explicitly split out UnsupportedVcs error by jelmer review by jelmer

7685. By Jelmer Vernooij

Drop byov configuration by jelmer review by jelmer

7686. By Jelmer Vernooij

Drop use of absolute_import. by jelmer review by jelmer

7687. By Jelmer Vernooij

Drop use of iso8601, add extras for github/gitlab by jelmer review by jelmer

7688. By Jelmer Vernooij

Fix dulwich compatibility. by jelmer review by jelmer

7689. By Jelmer Vernooij

Raise specific exception when having to access remote git revision trees. by jelmer review by jelmer

7690. By Jelmer Vernooij

Add Tree.is_special_filename. by jelmer review by jelmer

7691. By Jelmer Vernooij

Use raise from by jelmer review by jelmer

7692. By Jelmer Vernooij

Add basic typing, make mypy pass by jelmer review by jelmer

7693. By Jelmer Vernooij

tarmac.conf: Set milestone, add whitespace to commit_message_template. by jelmer review by jelmer

7694. By Jelmer Vernooij

Fix extension building on pypy.

by jelmer review by jelmer

7695. By Jelmer Vernooij

Run mypy and flake8 in tarmac.

by jelmer review by jelmer

7696. By Jelmer Vernooij

tarmac: install flake8

7697. By Jelmer Vernooij

flake8: Ignore .eggs.

7698. By Jelmer Vernooij

Run flake8 on just breezy/

7699. By Jelmer Vernooij

Migrate from pkg_resources to importlib.metadata.

by jelmer review by jelmer

7700. By Jelmer Vernooij

Fix missing types for mypy.

by jelmer review by jelmer

7701. By Jelmer Vernooij

Add cargo metadata

by jelmer review by jelmer

7702. By Jelmer Vernooij

git: Properly decode tags when selecting.

by jelmer review by jelmer

7703. By Jelmer Vernooij

Run GitHub actions on Mac OS

by jelmer review by jelmer

7704. By Jelmer Vernooij

Try harder to find the quilt binary

by jelmer review by jelmer

7705. By Jelmer Vernooij

Use more google docstrings.

by jelmer review by jelmer

7706. By Jelmer Vernooij

Fix entry points compatibility with python < 3.10

by jelmer review by jelmer

7707. By Jelmer Vernooij

Fix time parsing for gitlab & github

by jelmer review by jelmer

7708. By Jelmer Vernooij

Avoid passing group= option to entry_points()

by jelmer review by jelmer

7709. By Jelmer Vernooij

Remove unused launchpad code.

by jelmer review by jelmer

7710. By Jelmer Vernooij

Add a web-open command.

by jelmer review by jelmer

7711. By Jelmer Vernooij

Use Launchpad API rather than XML/RPC.

by jelmer review by jelmer

7712. By Jelmer Vernooij

Add Forge.probe_from_hostname.

by jelmer review by jelmer

7713. By Jelmer Vernooij

Fix get_forge_by_hostname.

by jelmer review by jelmer

7714. By Jelmer Vernooij

Several inotify improvements

by jelmer review by jelmer

7715. By Jelmer Vernooij

dirty_tracker: Handle EMFILE

by jelmer review by jelmer

7716. By Jelmer Vernooij

Add a create_project function for use in silver_platter.

by jelmer review by jelmer

7717. By Ondřej Pohořelský

Remove pkg-version dependency

by jelmer review by jelmer

7718. By Jelmer Vernooij

Add --open argument to 'brz propose'.

by jelmer review by jelmer

7719. By Jelmer Vernooij

Disable ARM builds for wheels.

by jelmer review by jelmer

7720. By Jelmer Vernooij

Drop obsolete backwards compat code.

by jelmer review by jelmer

7721. By Jelmer Vernooij

Prevent ARM wheels from building on Mac OS as well.

by jelmer review by jelmer

7722. By Jelmer Vernooij

Install all rustup targets, fixing wheels.

by jelmer review by jelmer

7723. By Jelmer Vernooij

Disable ARM wheel builds on Linux for now, since they're failing

by jelmer review by jelmer

7724. By Jelmer Vernooij

Various improvements for tests on Mac OS X.

by jelmer review by jelmer

7725. By Jelmer Vernooij

github-action: Build on python 3.11.

by jelmer review by jelmer

7726. By Jelmer Vernooij

Remove use of PyUnicode_FromUnicode, gone in Python 3.11.

by jelmer review by jelmer

7727. By Jelmer Vernooij

Raise MissingNestedTree from get_nested_tree().

by jelmer review by jelmer

7728. By Jelmer Vernooij

Handle http unexpected errors from git

by jelmer review by jelmer

7729. By Jelmer Vernooij

Ship py.typed

by jelmer review by jelmer

7730. By Jelmer Vernooij

Fix 3.11 compatibility

by jelmer review by jelmer

7731. By Jelmer Vernooij

Kill ensure_null.

by jelmer review by jelmer

7732. By Jelmer Vernooij

Improve extras, add xfail lists for windows/mac.

by jelmer review by jelmer

7733. By Jelmer Vernooij

Fix merge proposal open after create.

by jelmer review by jelmer

7734. By Jelmer Vernooij

Bump timeout for no output to 30 minutes.

7735. By Jelmer Vernooij

selftest: Raise exception when hitting timeout rather than killing the process

by jelmer review by jelmer

7736. By Jelmer Vernooij

Skip tests that often hang.

by jelmer review by jelmer

7737. By Jelmer Vernooij

More portability fixes for Windows, Mac OS X.

by jelmer review by jelmer

7738. By Jelmer Vernooij

Drop references to brz-gtk.

by jelmer review by jelmer

7739. By Jelmer Vernooij

Improve brz-email docs.

by jelmer review by jelmer

7740. By Jelmer Vernooij

Drop reference to Bazaar in 'brz plugins'.

by jelmer review by jelmer

7741. By Jelmer Vernooij

Increase timeout for single test.

by jelmer review by jelmer

7742. By Jelmer Vernooij

Update release notes for 3.3.1.

by jelmer review by jelmer

7743. By Jelmer Vernooij

Support [] in email addresses.

by jelmer review by jelmer

7744. By Jelmer Vernooij

Release 3.3.1

by jelmer review by jelmer

7745. By Jelmer Vernooij

Fix wheel uploading.

by jelmer review by jelmer

7746. By Jelmer Vernooij

Bump version, update release instruction for pip.

by jelmer review by jelmer

7747. By Jelmer Vernooij

Add more typing

by jelmer review by jelmer

7748. By Jelmer Vernooij

propose: Move web open message.

by jelmer review by jelmer

7749. By Jelmer Vernooij

Import convenience functions for opening files from brz-debian.

by jelmer review by jelmer

7750. By Jelmer Vernooij

Update apt before installing.

by jelmer review by jelmer

7751. By Jelmer Vernooij

Add auto= argument to merge

by jelmer review by jelmer

7752. By Jelmer Vernooij

gitlab: Don't set titles implicitly.

by jelmer review by jelmer

7753. By Jelmer Vernooij

Add supports_auto_merge setting.

by jelmer review by jelmer

7754. By Jelmer Vernooij

Handle GitLab consistently returning 500 when updating description in some versions

by jelmer review by jelmer

7755. By Jelmer Vernooij

Bundle the webdav plugin

7756. By Jelmer Vernooij

Fix style.

7757. By Jelmer Vernooij

Fix tests.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'breezy/plugins/webdav'
2=== added file 'breezy/plugins/webdav/NOTES'
3--- breezy/plugins/webdav/NOTES 1970-01-01 00:00:00 +0000
4+++ breezy/plugins/webdav/NOTES 2022-12-13 16:21:38 +0000
5@@ -0,0 +1,43 @@
6+Performances:
7+
8+- Without any optimizations:
9+
10+time bzr push http+webdav://<user>:<pass>@<host>/pub/bzr.dev
11+
12+1948 revision(s) pushed.
13+
14+real 9m54.487s
15+user 1m15.280s
16+sys 0m20.060s
17+
18+The above measure is imprecise and certainly out-of-date.
19+
20+Tests:
21+
22+Installation example:
23+
24+<IfModule mod_dav.c>
25+Alias /bzr /srv/DAV
26+<Directory /srv/DAV>
27+ DAV On
28+ # DirectorySlash tells apache to reply with redirections if
29+ # directories miss their final '/'. It does not play well with
30+ # bzr (to they the least) and provide no benefits in our
31+ # case. So just turn it off.
32+ DirectorySlash Off
33+ # We need to activate the following which is off by
34+ # default. For good security reasons which don't apply to
35+ # bzr directories ;)
36+ DavDepthInfinity on
37+ # The simplest auth scheme is basic, just given as an
38+ # example, using https is recommanded with it, or at
39+ # least digest if https is not possible.
40+ AuthType Basic
41+ AuthName bzr
42+ AuthUserFile /etc/apache2/dav.users
43+ <LimitExcept GET OPTIONS>
44+ # Write access requires authentication
45+ Require valid-user
46+ </LimitExcept>
47+</Directory>
48+</IfModule>
49
50=== added file 'breezy/plugins/webdav/TODO'
51--- breezy/plugins/webdav/TODO 1970-01-01 00:00:00 +0000
52+++ breezy/plugins/webdav/TODO 2022-12-13 16:21:38 +0000
53@@ -0,0 +1,48 @@
54+* webdav.py
55+
56+** We can detect that the server do not accept "write" operations
57+ (it will return 501) and raise InvalidHttpRequest(to be
58+ defined as a daughter of InvalidHttpResponse) but what will
59+ the upper layers do ?
60+
61+** 20060908 All *_file functions are defined in terms of *_bytes
62+ because we have to read the file to create a proper PUT
63+ request. Is it possible to define PUT with a file-like
64+ object, so that we don't have to potentially read in and hold
65+ onto potentially 600MB of file contents?
66+
67+** Factor out the error handling. Try to use
68+ Transport.translate_error if it becomes an accessible
69+ function. Otherwise duplicate it here (bad)
70+
71+* tests
72+
73+** Implement the testing of the range header for PUT requests
74+ (GET request are already heavily tested in bzr). Test servers
75+ are available there too. This will also help for reporting
76+ bugs against lighttp.
77+
78+** Turning directory indexes off may make the server reports that
79+ an existing directory does not exist. Reportedly, using
80+ multiviews can provoke that too. Investigate and fix.
81+
82+** A DAV web server can't handle mode on files because:
83+
84+ - there is nothing in the protocol for that (bar some of them
85+ via PROPPATCH, but only for apache2 anyway),
86+
87+ - the server itself generally uses the mode for its own
88+ purposes, except if you make it run under suid which is really,
89+ really dangerous (Apache should be compiled with
90+ -DBIG_SECURITY_HOLE for those who didn't get the message).
91+
92+ That means this transport will do no better. May be the file
93+ mode should be a file property handled explicitely inside the
94+ repositories and applied by bzr in the working trees. That
95+ implies a mean to store file properties, apply them, detecting
96+ their changes, etc.
97+
98+ It may be possible to use PROPPATCH to handle mode bits, but
99+ bzr doesn't try to handle remote working trees. So until the
100+ neeed arises, this will remain as is.
101+
102
103=== added file 'breezy/plugins/webdav/__init__.py'
104--- breezy/plugins/webdav/__init__.py 1970-01-01 00:00:00 +0000
105+++ breezy/plugins/webdav/__init__.py 2022-12-13 16:21:38 +0000
106@@ -0,0 +1,45 @@
107+# Copyright (C) 2006-2009, 2011, 2012 Canonical Ltd
108+#
109+# This program is free software; you can redistribute it and/or modify
110+# it under the terms of the GNU General Public License as published by
111+# the Free Software Foundation; either version 2 of the License, or
112+# (at your option) any later version.
113+#
114+# This program is distributed in the hope that it will be useful,
115+# but WITHOUT ANY WARRANTY; without even the implied warranty of
116+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
117+# GNU General Public License for more details.
118+#
119+# You should have received a copy of the GNU General Public License
120+# along with this program; if not, write to the Free Software
121+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
122+
123+"""An http transport, using webdav to allow pushing.
124+
125+This defines the HttpWebDAV transport, which implement the necessary
126+handling of WebDAV to allow pushing on an http server.
127+"""
128+
129+import breezy
130+
131+from ... import version_info # noqa: F401
132+
133+from breezy import transport
134+
135+transport.register_urlparse_netloc_protocol('http+webdav')
136+transport.register_urlparse_netloc_protocol('https+webdav')
137+
138+transport.register_lazy_transport(
139+ 'https+webdav://', __name__ + '.webdav', 'HttpDavTransport')
140+transport.register_lazy_transport(
141+ 'http+webdav://', __name__ + '.webdav', 'HttpDavTransport')
142+
143+
144+def load_tests(loader, basic_tests, pattern):
145+ testmod_names = [
146+ 'tests',
147+ ]
148+ basic_tests.addTest(loader.loadTestsFromModuleNames(
149+ ["%s.%s" % (__name__, tmn) for tmn in testmod_names]))
150+ return basic_tests
151+
152
153=== added directory 'breezy/plugins/webdav/tests'
154=== added file 'breezy/plugins/webdav/tests/__init__.py'
155--- breezy/plugins/webdav/tests/__init__.py 1970-01-01 00:00:00 +0000
156+++ breezy/plugins/webdav/tests/__init__.py 2022-12-13 16:21:38 +0000
157@@ -0,0 +1,23 @@
158+# Copyright (C) 2008 by Canonical Ltd
159+#
160+# This program is free software; you can redistribute it and/or modify
161+# it under the terms of the GNU General Public License as published by
162+# the Free Software Foundation; either version 2 of the License, or
163+# (at your option) any later version.
164+#
165+# This program is distributed in the hope that it will be useful,
166+# but WITHOUT ANY WARRANTY; without even the implied warranty of
167+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
168+# GNU General Public License for more details.
169+#
170+# You should have received a copy of the GNU General Public License
171+# along with this program; if not, write to the Free Software
172+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
173+
174+def load_tests(loader, basic_tests, pattern):
175+ testmod_names = [
176+ 'test_webdav',
177+ ]
178+ basic_tests.addTest(loader.loadTestsFromModuleNames(
179+ ["%s.%s" % (__name__, tmn) for tmn in testmod_names]))
180+ return basic_tests
181
182=== added file 'breezy/plugins/webdav/tests/dav_server.py'
183--- breezy/plugins/webdav/tests/dav_server.py 1970-01-01 00:00:00 +0000
184+++ breezy/plugins/webdav/tests/dav_server.py 2022-12-13 16:21:38 +0000
185@@ -0,0 +1,468 @@
186+# Copyright (C) 2008, 2009, 2011, 2013 Canonical Ltd
187+#
188+# This program is free software; you can redistribute it and/or modify
189+# it under the terms of the GNU General Public License as published by
190+# the Free Software Foundation; either version 2 of the License, or
191+# (at your option) any later version.
192+#
193+# This program is distributed in the hope that it will be useful,
194+# but WITHOUT ANY WARRANTY; without even the implied warranty of
195+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
196+# GNU General Public License for more details.
197+#
198+# You should have received a copy of the GNU General Public License
199+# along with this program; if not, write to the Free Software
200+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
201+
202+"""DAV test server.
203+
204+This defines the TestingDAVRequestHandler and the DAVServer classes which
205+implements the DAV specification parts used by the webdav plugin.
206+"""
207+
208+
209+import errno
210+import os
211+import re
212+import shutil # FIXME: Can't we use breezy.osutils ?
213+import stat
214+import time
215+import urllib.parse # FIXME: Can't we use breezy.urlutils ?
216+
217+
218+from breezy import (
219+ trace,
220+ urlutils,
221+ )
222+from breezy.tests import http_server
223+
224+
225+class TestingDAVRequestHandler(http_server.TestingHTTPRequestHandler):
226+ """
227+ Subclass of TestingHTTPRequestHandler handling DAV requests.
228+
229+ This is not a full implementation of a DAV server, only the parts
230+ really used by the plugin are.
231+ """
232+
233+ _RANGE_HEADER_RE = re.compile(
234+ r'bytes (?P<begin>\d+)-(?P<end>\d+)/(?P<size>\d+|\*)')
235+
236+ delete_success_code = 204
237+ move_default_overwrite = True
238+
239+
240+ def date_time_string(self, timestamp=None):
241+ """Return the current date and time formatted for a message header."""
242+ if timestamp is None:
243+ timestamp = time.time()
244+ year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp)
245+ s = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
246+ self.weekdayname[wd],
247+ day, self.monthname[month], year,
248+ hh, mm, ss)
249+ return s
250+
251+ def _read(self, length):
252+ """Read the client socket"""
253+ return self.rfile.read(length)
254+
255+ def _readline(self):
256+ """Read a full line on the client socket"""
257+ return self.rfile.readline()
258+
259+ def read_body(self):
260+ """Read the body either by chunk or as a whole."""
261+ content_length = self.headers.get('Content-Length')
262+ encoding = self.headers.get('Transfer-Encoding')
263+ if encoding is not None:
264+ assert encoding == 'chunked'
265+ body = []
266+ # We receive the content by chunk
267+ while True:
268+ length, data = self.read_chunk()
269+ if length == 0:
270+ break
271+ body.append(data)
272+ body = ''.join(body)
273+
274+ else:
275+ if content_length is not None:
276+ body = self._read(int(content_length))
277+
278+ return body
279+
280+ def read_chunk(self):
281+ """Read a chunk of data.
282+
283+ A chunk consists of:
284+ - a line containing the length of the data in hexa,
285+ - the data.
286+ - a empty line.
287+
288+ An empty chunk specifies a length of zero
289+ """
290+ length = int(self._readline(), 16)
291+ data = None
292+ if length != 0:
293+ data = self._read(length)
294+ # Eats the newline following the chunk
295+ self._readline()
296+ return length, data
297+
298+ def send_head(self):
299+ """Specialized version of SimpleHttpServer.
300+
301+ We *don't* want the apache behavior of permanently redirecting
302+ directories without trailing slashes to directories with trailing
303+ slashes. That's a waste and a severe penalty for clients with high
304+ latency.
305+
306+ The installation documentation of the plugin should mention the
307+ DirectorySlash apache directive and insists on turning it *Off*.
308+ """
309+ path = self.translate_path(self.path)
310+ f = None
311+ if os.path.isdir(path):
312+ for index in "index.html", "index.htm":
313+ index = os.path.join(path, index)
314+ if os.path.exists(index):
315+ path = index
316+ break
317+ else:
318+ return self.list_directory(path)
319+ ctype = self.guess_type(path)
320+ if ctype.startswith('text/'):
321+ mode = 'r'
322+ else:
323+ mode = 'rb'
324+ try:
325+ f = open(path, mode)
326+ except IOError:
327+ self.send_error(404, "File not found")
328+ return None
329+ self.send_response(200)
330+ self.send_header("Content-type", ctype)
331+ fs = os.fstat(f.fileno())
332+ self.send_header("Content-Length", str(fs[6]))
333+ self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
334+ self.end_headers()
335+ return f
336+
337+ def do_PUT(self):
338+ """Serve a PUT request."""
339+ # FIXME: test_put_file_unicode makes us emit a traceback because a
340+ # UnicodeEncodeError occurs after the request headers have been sent
341+ # but before the body can be send. It's harmless and does not make the
342+ # test fails. Adressing that will mean protecting all reads from the
343+ # socket, which is too heavy for now -- vila 20070917
344+ path = self.translate_path(self.path)
345+ trace.mutter("do_PUT rel: [%s], abs: [%s]" % (self.path, path))
346+
347+ do_append = False
348+ # Check the Content-Range header
349+ range_header = self.headers.get('Content-Range')
350+ if range_header is not None:
351+ match = self._RANGE_HEADER_RE.match(range_header)
352+ if match is None:
353+ # FIXME: RFC2616 says to return a 501 if we don't
354+ # understand the Content-Range header, but Apache
355+ # just ignores them (bad Apache).
356+ self.send_error(501, 'Not Implemented')
357+ return
358+ begin = int(match.group('begin'))
359+ do_append = True
360+
361+ if self.headers.get('Expect') == '100-continue':
362+ # Tell the client to go ahead, we're ready to get the content
363+ self.send_response(100, "Continue")
364+ self.end_headers()
365+
366+ try:
367+ trace.mutter("do_PUT will try to open: [%s]" % path)
368+ # Always write in binary mode.
369+ if do_append:
370+ f = open(path, 'ab')
371+ f.seek(begin)
372+ else:
373+ f = open(path, 'wb')
374+ except (IOError, OSError) as e:
375+ trace.mutter("do_PUT got: [%r] while opening/seeking on [%s]"
376+ % (e, self.path))
377+ self.send_error(409, 'Conflict')
378+ return
379+
380+ try:
381+ data = self.read_body()
382+ f.write(data)
383+ except (IOError, OSError):
384+ # FIXME: We leave a partially written file here
385+ self.send_error(409, "Conflict")
386+ f.close()
387+ return
388+ f.close()
389+ trace.mutter("do_PUT done: [%s]" % self.path)
390+ self.send_response(201)
391+ self.end_headers()
392+
393+ def do_MKCOL(self):
394+ """
395+ Serve a MKCOL request.
396+
397+ MKCOL is an mkdir in DAV terminology for our part.
398+ """
399+ path = self.translate_path(self.path)
400+ trace.mutter("do_MKCOL rel: [%s], abs: [%s]" % (self.path, path))
401+ try:
402+ os.mkdir(path)
403+ except (IOError, OSError) as e:
404+ if e.errno in (errno.ENOENT, ):
405+ self.send_error(409, "Conflict")
406+ elif e.errno in (errno.EEXIST, errno.ENOTDIR):
407+ self.send_error(405, "Not allowed")
408+ else:
409+ # Ok we fail for an unnkown reason :-/
410+ raise
411+ else:
412+ self.send_response(201)
413+ self.end_headers()
414+
415+ def do_COPY(self):
416+ """Serve a COPY request."""
417+
418+ url_to = self.headers.get('Destination')
419+ if url_to is None:
420+ self.send_error(400, "Destination header missing")
421+ return
422+ (scheme, netloc, rel_to,
423+ params, query, fragment) = urllib.parse.urlparse(url_to)
424+ trace.mutter("urlparse: (%s) [%s]" % (url_to, rel_to))
425+ trace.mutter("do_COPY rel_from: [%s], rel_to: [%s]" % (self.path,
426+ rel_to))
427+ abs_from = self.translate_path(self.path)
428+ abs_to = self.translate_path(rel_to)
429+ try:
430+ # TODO: Check that rel_from exists and rel_to does
431+ # not. In the mean time, just go along and trap
432+ # exceptions
433+ shutil.copyfile(abs_from, abs_to)
434+ except (IOError, OSError) as e:
435+ if e.errno == errno.ENOENT:
436+ self.send_error(404, "File not found")
437+ else:
438+ self.send_error(409, "Conflict")
439+ else:
440+ # TODO: We may be able to return 204 "No content" if
441+ # rel_to was existing (even if the "No content" part
442+ # seems misleading, RFC2518 says so, stop arguing :)
443+ self.send_response(201)
444+ self.end_headers()
445+
446+ def do_DELETE(self):
447+ """Serve a DELETE request.
448+
449+ We don't implement a true DELETE as DAV defines it
450+ because we *should* fail to delete a non empty dir.
451+ """
452+ path = self.translate_path(self.path)
453+ trace.mutter("do_DELETE rel: [%s], abs: [%s]" % (self.path, path))
454+ try:
455+ # DAV makes no distinction between files and dirs
456+ # when required to nuke them, but we have to. And we
457+ # also watch out for symlinks.
458+ real_path = os.path.realpath(path)
459+ if os.path.isdir(real_path):
460+ os.rmdir(path)
461+ else:
462+ os.remove(path)
463+ except (IOError, OSError) as e:
464+ if e.errno in (errno.ENOENT, ):
465+ self.send_error(404, "File not found")
466+ else:
467+ # Ok we fail for an unnkown reason :-/
468+ raise
469+ else:
470+ self.send_response(self.delete_success_code)
471+ self.end_headers()
472+
473+ def do_MOVE(self):
474+ """Serve a MOVE request."""
475+
476+ url_to = self.headers.get('Destination')
477+ if url_to is None:
478+ self.send_error(400, "Destination header missing")
479+ return
480+ overwrite_header = self.headers.get('Overwrite')
481+ should_overwrite = self.move_default_overwrite
482+ if overwrite_header == 'F':
483+ should_overwrite = False
484+ elif overwrite_header == 'T':
485+ should_overwrite = True
486+ (scheme, netloc, rel_to,
487+ params, query, fragment) = urllib.parse.urlparse(url_to)
488+ trace.mutter("urlparse: (%s) [%s]" % (url_to, rel_to))
489+ trace.mutter("do_MOVE rel_from: [%s], rel_to: [%s]" % (self.path,
490+ rel_to))
491+ abs_from = self.translate_path(self.path)
492+ abs_to = self.translate_path(rel_to)
493+ if not should_overwrite and os.access(abs_to, os.F_OK):
494+ self.send_error(412, "Precondition Failed")
495+ return
496+ try:
497+ os.rename(abs_from, abs_to)
498+ except (IOError, OSError) as e:
499+ if e.errno == errno.ENOENT:
500+ self.send_error(404, "File not found")
501+ else:
502+ self.send_error(409, "Conflict")
503+ else:
504+ # TODO: We may be able to return 204 "No content" if
505+ # rel_to was existing (even if the "No content" part
506+ # seems misleading, RFC2518 says so, stop arguing :)
507+ self.send_response(201)
508+ self.end_headers()
509+
510+ def _generate_response(self, path):
511+ local_path = self.translate_path(path)
512+ st = os.stat(local_path)
513+ prop = dict()
514+
515+ def _prop(ns, name, value=None):
516+ if value is None:
517+ return '<%s:%s/>' % (ns, name)
518+ else:
519+ return '<%s:%s>%s</%s:%s>' % (ns, name, value, ns, name)
520+
521+ # For namespaces (and test purposes), where apache2 use:
522+ # - lp1, we use liveprop,
523+ # - lp2, we use bzr
524+ if stat.S_ISDIR(st.st_mode):
525+ dpath = path
526+ if not dpath.endswith('/'):
527+ dpath += '/'
528+ prop['href'] = _prop('D', 'href', dpath)
529+ prop['type'] = _prop('liveprop', 'resourcetype', '<D:collection/>')
530+ prop['length'] = ''
531+ prop['exec'] = ''
532+ else:
533+ # FIXME: assert S_ISREG ? Handle symlinks ?
534+ prop['href'] = _prop('D', 'href', path)
535+ prop['type'] = _prop('liveprop', 'resourcetype')
536+ prop['length'] = _prop('liveprop', 'getcontentlength',
537+ st.st_size)
538+ if st.st_mode & stat.S_IXUSR:
539+ is_exec = 'T'
540+ else:
541+ is_exec = 'F'
542+ prop['exec'] = _prop('bzr', 'executable', is_exec)
543+ prop['status'] = _prop('D', 'status', 'HTTP/1.1 200 OK')
544+
545+ response = """<D:response xmlns:liveprop="DAV:" xmlns:bzr="DAV:">
546+ %(href)s
547+ <D:propstat>
548+ <D:prop>
549+ %(type)s
550+ %(length)s
551+ %(exec)s
552+ </D:prop>
553+ %(status)s
554+ </D:propstat>
555+</D:response>
556+""" % prop
557+ return response, st
558+
559+ def _generate_dir_responses(self, path, depth):
560+ local_path = self.translate_path(path)
561+ entries = os.listdir(local_path)
562+
563+ for entry in entries:
564+ entry_path = urlutils.escape(entry)
565+ if path.endswith('/'):
566+ entry_path = path + entry_path
567+ else:
568+ entry_path = path + '/' + entry_path
569+ response, st = self._generate_response(entry_path)
570+ yield response
571+ if depth == 'Infinity' and stat.S_ISDIR(st.st_mode):
572+ yield from self._generate_dir_responses(entry_path, depth)
573+
574+ def do_PROPFIND(self):
575+ """Serve a PROPFIND request."""
576+ depth = self.headers.get('Depth')
577+ if depth is None:
578+ depth = 'Infinity'
579+ if depth not in ('0', '1', 'Infinity'):
580+ self.send_error(400, "Bad Depth")
581+ return
582+
583+ # Don't bother parsing the body, we handle only allprop anyway.
584+ # FIXME: Handle the body :)
585+ self.read_body()
586+
587+ try:
588+ response, st = self._generate_response(self.path)
589+ except OSError as e:
590+ if e.errno == errno.ENOENT:
591+ self.send_error(404)
592+ return
593+ else:
594+ raise
595+
596+ if depth in ('1', 'Infinity') and stat.S_ISDIR(st.st_mode):
597+ dir_responses = self._generate_dir_responses(self.path, depth)
598+ else:
599+ dir_responses = []
600+
601+ # Generate the response, we don't care about performance, so we just
602+ # expand everything into a big string.
603+ response = ("""<?xml version="1.0" encoding="utf-8"?>
604+<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
605+%s%s
606+</D:multistatus>""" % (response, ''.join(dir_responses))).encode('utf-8')
607+
608+ self.send_response(207)
609+ self.send_header('Content-length', len(response))
610+ self.end_headers()
611+ self.wfile.write(response)
612+
613+
614+class DAVServer(http_server.HttpServer):
615+ """Subclass of HttpServer that gives http+webdav urls.
616+
617+ This is for use in testing: connections to this server will always go
618+ through _urllib where possible.
619+ """
620+
621+ def __init__(self):
622+ # We have special requests to handle that
623+ # HttpServer_urllib doesn't know about
624+ super(DAVServer, self).__init__(TestingDAVRequestHandler)
625+
626+ # urls returned by this server should require the webdav client impl
627+ _url_protocol = 'http+webdav'
628+
629+
630+class QuirkyTestingDAVRequestHandler(TestingDAVRequestHandler):
631+ """Various quirky/slightly off-spec behaviors.
632+
633+ Used to test how gracefully we handle them.
634+ """
635+
636+ delete_success_code = 200
637+ move_default_overwrite = False
638+
639+
640+class QuirkyDAVServer(http_server.HttpServer):
641+ """DAVServer implementing various quirky/slightly off-spec behaviors.
642+
643+ Used to test how gracefully we handle them.
644+ """
645+
646+ def __init__(self):
647+ # We have special requests to handle that
648+ # HttpServer_urllib doesn't know about
649+ super(QuirkyDAVServer, self).__init__(QuirkyTestingDAVRequestHandler)
650+
651+ # urls returned by this server should require the webdav client impl
652+ _url_protocol = 'http+webdav'
653+
654
655=== added file 'breezy/plugins/webdav/tests/test_webdav.py'
656--- breezy/plugins/webdav/tests/test_webdav.py 1970-01-01 00:00:00 +0000
657+++ breezy/plugins/webdav/tests/test_webdav.py 2022-12-13 16:21:38 +0000
658@@ -0,0 +1,421 @@
659+# Copyright (C) 2006, 2007, 2008, 2013 Canonical Ltd
660+#
661+# This program is free software; you can redistribute it and/or modify
662+# it under the terms of the GNU General Public License as published by
663+# the Free Software Foundation; either version 2 of the License, or
664+# (at your option) any later version.
665+#
666+# This program is distributed in the hope that it will be useful,
667+# but WITHOUT ANY WARRANTY; without even the implied warranty of
668+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
669+# GNU General Public License for more details.
670+#
671+# You should have received a copy of the GNU General Public License
672+# along with this program; if not, write to the Free Software
673+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
674+
675+"""Tests for the wedav plugin."""
676+
677+from http.client import parse_headers
678+from io import StringIO
679+import stat
680+
681+
682+from breezy import (
683+ errors,
684+ tests,
685+ )
686+from breezy.plugins.webdav import webdav
687+from breezy.tests import http_server
688+
689+
690+def _get_list_dir_apache2_depth_1_prop():
691+ return """<?xml version="1.0" encoding="utf-8"?>
692+<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
693+ <D:response>
694+ <D:href>/19016477731212686926.835527/</D:href>
695+ <D:propstat>
696+ <D:prop>
697+ </D:prop>
698+ <D:status>HTTP/1.1 200 OK</D:status>
699+ </D:propstat>
700+ </D:response>
701+ <D:response>
702+ <D:href>/19016477731212686926.835527/a</D:href>
703+ <D:propstat>
704+ <D:prop>
705+ </D:prop>
706+ <D:status>HTTP/1.1 200 OK</D:status>
707+ </D:propstat>
708+ </D:response>
709+ <D:response>
710+ <D:href>/19016477731212686926.835527/b</D:href>
711+ <D:propstat>
712+ <D:prop>
713+ </D:prop>
714+ <D:status>HTTP/1.1 200 OK</D:status>
715+ </D:propstat>
716+ </D:response>
717+ <D:response>
718+ <D:href>/19016477731212686926.835527/c/</D:href>
719+ <D:propstat>
720+ <D:prop>
721+ </D:prop>
722+ <D:status>HTTP/1.1 200 OK</D:status>
723+ </D:propstat>
724+ </D:response>
725+</D:multistatus>"""
726+
727+
728+def _get_list_dir_apache2_depth_1_allprop():
729+ return """<?xml version="1.0" encoding="utf-8"?>
730+<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
731+ <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
732+ <D:href>/</D:href>
733+ <D:propstat>
734+ <D:prop>
735+ <lp1:resourcetype><D:collection/></lp1:resourcetype>
736+ <lp1:creationdate>2008-06-08T10:50:38Z</lp1:creationdate>
737+ <lp1:getlastmodified>Sun, 08 Jun 2008 10:50:38 GMT</lp1:getlastmodified>
738+ <lp1:getetag>"da7f5a-cc-7722db80"</lp1:getetag>
739+ <D:supportedlock>
740+ <D:lockentry>
741+ <D:lockscope><D:exclusive/></D:lockscope>
742+ <D:locktype><D:write/></D:locktype>
743+ </D:lockentry>
744+ <D:lockentry>
745+ <D:lockscope><D:shared/></D:lockscope>
746+ <D:locktype><D:write/></D:locktype>
747+ </D:lockentry>
748+ </D:supportedlock>
749+ <D:lockdiscovery/>
750+ </D:prop>
751+ <D:status>HTTP/1.1 200 OK</D:status>
752+ </D:propstat>
753+ </D:response>
754+ <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
755+ <D:href>/executable</D:href>
756+ <D:propstat>
757+ <D:prop>
758+ <lp1:resourcetype/>
759+ <lp1:creationdate>2008-06-08T09:50:15Z</lp1:creationdate>
760+ <lp1:getcontentlength>14</lp1:getcontentlength>
761+ <lp1:getlastmodified>Sun, 08 Jun 2008 09:50:11 GMT</lp1:getlastmodified>
762+ <lp1:getetag>"da9f81-0-9ef33ac0"</lp1:getetag>
763+ <lp2:executable>T</lp2:executable>
764+ <D:supportedlock>
765+ <D:lockentry>
766+ <D:lockscope><D:exclusive/></D:lockscope>
767+ <D:locktype><D:write/></D:locktype>
768+ </D:lockentry>
769+ <D:lockentry>
770+ <D:lockscope><D:shared/></D:lockscope>
771+ <D:locktype><D:write/></D:locktype>
772+ </D:lockentry>
773+ </D:supportedlock>
774+ <D:lockdiscovery/>
775+ </D:prop>
776+ <D:status>HTTP/1.1 200 OK</D:status>
777+ </D:propstat>
778+ </D:response>
779+ <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
780+ <D:href>/read-only</D:href>
781+ <D:propstat>
782+ <D:prop>
783+ <lp1:resourcetype/>
784+ <lp1:creationdate>2008-06-08T09:50:11Z</lp1:creationdate>
785+ <lp1:getcontentlength>42</lp1:getcontentlength>
786+ <lp1:getlastmodified>Sun, 08 Jun 2008 09:50:11 GMT</lp1:getlastmodified>
787+ <lp1:getetag>"da9f80-0-9ef33ac0"</lp1:getetag>
788+ <lp2:executable>F</lp2:executable>
789+ <D:supportedlock>
790+ <D:lockentry>
791+ <D:lockscope><D:exclusive/></D:lockscope>
792+ <D:locktype><D:write/></D:locktype>
793+ </D:lockentry>
794+ <D:lockentry>
795+ <D:lockscope><D:shared/></D:lockscope>
796+ <D:locktype><D:write/></D:locktype>
797+ </D:lockentry>
798+ </D:supportedlock>
799+ <D:lockdiscovery/>
800+ </D:prop>
801+ <D:status>HTTP/1.1 200 OK</D:status>
802+ </D:propstat>
803+ </D:response>
804+ <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
805+ <D:href>/titi</D:href>
806+ <D:propstat>
807+ <D:prop>
808+ <lp1:resourcetype/>
809+ <lp1:creationdate>2008-06-08T09:49:53Z</lp1:creationdate>
810+ <lp1:getcontentlength>6</lp1:getcontentlength>
811+ <lp1:getlastmodified>Sun, 08 Jun 2008 09:49:53 GMT</lp1:getlastmodified>
812+ <lp1:getetag>"da8cbc-6-9de09240"</lp1:getetag>
813+ <lp2:executable>F</lp2:executable>
814+ <D:supportedlock>
815+ <D:lockentry>
816+ <D:lockscope><D:exclusive/></D:lockscope>
817+ <D:locktype><D:write/></D:locktype>
818+ </D:lockentry>
819+ <D:lockentry>
820+ <D:lockscope><D:shared/></D:lockscope>
821+ <D:locktype><D:write/></D:locktype>
822+ </D:lockentry>
823+ </D:supportedlock>
824+ <D:lockdiscovery/>
825+ </D:prop>
826+ <D:status>HTTP/1.1 200 OK</D:status>
827+ </D:propstat>
828+ </D:response>
829+ <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
830+ <D:href>/toto/</D:href>
831+ <D:propstat>
832+ <D:prop>
833+ <lp1:resourcetype><D:collection/></lp1:resourcetype>
834+ <lp1:creationdate>2008-06-06T08:07:07Z</lp1:creationdate>
835+ <lp1:getlastmodified>Fri, 06 Jun 2008 08:07:07 GMT</lp1:getlastmodified>
836+ <lp1:getetag>"da8cb9-44-f2ac20c0"</lp1:getetag>
837+ <D:supportedlock>
838+ <D:lockentry>
839+ <D:lockscope><D:exclusive/></D:lockscope>
840+ <D:locktype><D:write/></D:locktype>
841+ </D:lockentry>
842+ <D:lockentry>
843+ <D:lockscope><D:shared/></D:lockscope>
844+ <D:locktype><D:write/></D:locktype>
845+ </D:lockentry>
846+ </D:supportedlock>
847+ <D:lockdiscovery/>
848+ </D:prop>
849+ <D:status>HTTP/1.1 200 OK</D:status>
850+ </D:propstat>
851+ </D:response>
852+</D:multistatus>
853+"""
854+
855+
856+class TestDavSaxParser(tests.TestCase):
857+
858+ def _extract_dir_content_from_str(self, str):
859+ return webdav._extract_dir_content(
860+ 'http://localhost/blah', StringIO(str))
861+
862+ def _extract_stat_from_str(self, str):
863+ return webdav._extract_stat_info(
864+ 'http://localhost/blah', StringIO(str))
865+
866+ def test_unkown_format_response(self):
867+ # Valid but unrelated xml
868+ example = """<document/>"""
869+ self.assertRaises(errors.InvalidHttpResponse,
870+ self._extract_dir_content_from_str, example)
871+
872+ def test_list_dir_malformed_response(self):
873+ # Invalid xml, neither multistatus nor response are properly closed
874+ example = """<?xml version="1.0" encoding="utf-8"?>
875+<D:multistatus xmlns:D="DAV:" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
876+<D:response>
877+<D:href>http://localhost/</D:href>"""
878+ self.assertRaises(errors.InvalidHttpResponse,
879+ self._extract_dir_content_from_str, example)
880+
881+ def test_list_dir_incomplete_format_response(self):
882+ # The information we need is not present
883+ example = """<?xml version="1.0" encoding="utf-8"?>
884+<D:multistatus xmlns:D="DAV:" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
885+<D:response>
886+<D:href>http://localhost/</D:href>
887+</D:response>
888+<D:response>
889+<D:href>http://localhost/titi</D:href>
890+</D:response>
891+<D:href>http://localhost/toto</D:href>
892+</D:multistatus>"""
893+ self.assertRaises(errors.NotADirectory,
894+ self._extract_dir_content_from_str, example)
895+
896+ def test_list_dir_apache2_example(self):
897+ example = _get_list_dir_apache2_depth_1_prop()
898+ self.assertRaises(errors.NotADirectory,
899+ self._extract_dir_content_from_str, example)
900+
901+ def test_list_dir_lighttpd_example(self):
902+ example = """<?xml version="1.0" encoding="utf-8"?>
903+<D:multistatus xmlns:D="DAV:" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
904+<D:response>
905+<D:href>http://localhost/</D:href>
906+</D:response>
907+<D:response>
908+<D:href>http://localhost/titi</D:href>
909+</D:response>
910+<D:response>
911+<D:href>http://localhost/toto</D:href>
912+</D:response>
913+</D:multistatus>"""
914+ self.assertRaises(errors.NotADirectory,
915+ self._extract_dir_content_from_str, example)
916+
917+ def test_list_dir_apache2_dir_depth_1_example(self):
918+ example = _get_list_dir_apache2_depth_1_allprop()
919+ self.assertEqual([('executable', False, 14, True),
920+ ('read-only', False, 42, False),
921+ ('titi', False, 6, False),
922+ ('toto', True, -1, False)],
923+ self._extract_dir_content_from_str(example))
924+
925+ def test_stat_malformed_response(self):
926+ # Invalid xml, neither multistatus nor response are properly closed
927+ example = """<?xml version="1.0" encoding="utf-8"?>
928+<D:multistatus xmlns:D="DAV:" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
929+<D:response>
930+<D:href>http://localhost/</D:href>"""
931+ self.assertRaises(errors.InvalidHttpResponse,
932+ self._extract_stat_from_str, example)
933+
934+ def test_stat_incomplete_format_response(self):
935+ # The minimal information is present but doesn't conform to RFC 2518
936+ # (well, as I understand it since the reference servers disagree on
937+ # more than details).
938+
939+ # The href below is not enclosed in a response element and is
940+ # therefore ignored.
941+ example = """<?xml version="1.0" encoding="utf-8"?>
942+<D:multistatus xmlns:D="DAV:" xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
943+<D:href>http://localhost/toto</D:href>
944+</D:multistatus>"""
945+ self.assertRaises(errors.InvalidHttpResponse,
946+ self._extract_stat_from_str, example)
947+
948+ def test_stat_apache2_file_example(self):
949+ example = """<?xml version="1.0" encoding="utf-8"?>
950+<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
951+<D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
952+<D:href>/executable</D:href>
953+<D:propstat>
954+<D:prop>
955+<lp1:resourcetype/>
956+<lp1:creationdate>2008-06-08T09:50:15Z</lp1:creationdate>
957+<lp1:getcontentlength>12</lp1:getcontentlength>
958+<lp1:getlastmodified>Sun, 08 Jun 2008 09:50:11 GMT</lp1:getlastmodified>
959+<lp1:getetag>"da9f81-0-9ef33ac0"</lp1:getetag>
960+<lp2:executable>T</lp2:executable>
961+<D:supportedlock>
962+<D:lockentry>
963+<D:lockscope><D:exclusive/></D:lockscope>
964+<D:locktype><D:write/></D:locktype>
965+</D:lockentry>
966+<D:lockentry>
967+<D:lockscope><D:shared/></D:lockscope>
968+<D:locktype><D:write/></D:locktype>
969+</D:lockentry>
970+</D:supportedlock>
971+<D:lockdiscovery/>
972+</D:prop>
973+<D:status>HTTP/1.1 200 OK</D:status>
974+</D:propstat>
975+</D:response>
976+</D:multistatus>"""
977+ st = self._extract_stat_from_str(example)
978+ self.assertEqual(12, st.st_size)
979+ self.assertFalse(stat.S_ISDIR(st.st_mode))
980+ self.assertTrue(stat.S_ISREG(st.st_mode))
981+ self.assertTrue(st.st_mode & stat.S_IXUSR)
982+
983+ def test_stat_apache2_dir_depth_1_example(self):
984+ example = _get_list_dir_apache2_depth_1_allprop()
985+ self.assertRaises(errors.InvalidHttpResponse,
986+ self._extract_stat_from_str, example)
987+
988+ def test_stat_apache2_dir_depth_0_example(self):
989+ example = """<?xml version="1.0" encoding="utf-8"?>
990+<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
991+<D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
992+<D:href>/</D:href>
993+<D:propstat>
994+<D:prop>
995+<lp1:resourcetype><D:collection/></lp1:resourcetype>
996+<lp1:creationdate>2008-06-08T10:50:38Z</lp1:creationdate>
997+<lp1:getlastmodified>Sun, 08 Jun 2008 10:50:38 GMT</lp1:getlastmodified>
998+<lp1:getetag>"da7f5a-cc-7722db80"</lp1:getetag>
999+<D:supportedlock>
1000+<D:lockentry>
1001+<D:lockscope><D:exclusive/></D:lockscope>
1002+<D:locktype><D:write/></D:locktype>
1003+</D:lockentry>
1004+<D:lockentry>
1005+<D:lockscope><D:shared/></D:lockscope>
1006+<D:locktype><D:write/></D:locktype>
1007+</D:lockentry>
1008+</D:supportedlock>
1009+<D:lockdiscovery/>
1010+</D:prop>
1011+<D:status>HTTP/1.1 200 OK</D:status>
1012+</D:propstat>
1013+</D:response>
1014+</D:multistatus>
1015+"""
1016+ st = self._extract_stat_from_str(example)
1017+ self.assertEqual(-1, st.st_size)
1018+ self.assertTrue(stat.S_ISDIR(st.st_mode))
1019+ self.assertTrue(st.st_mode & stat.S_IXUSR)
1020+
1021+
1022+class CannedRequestHandler(http_server.TestingHTTPRequestHandler):
1023+ """Request handler for a unique and pre-defined request.
1024+
1025+ The only thing we care about here is that a request is emitted by the
1026+ client and we send back a syntactically correct response.
1027+
1028+ We expect to receive a *single* request nothing more (and we won't even
1029+ check what request it is, we just read until an empty line).
1030+ """
1031+
1032+ def _handle_one_request(self):
1033+ # The communication between the client and the server is achieved
1034+ # through the server defined in the client test case.
1035+ tcs = self.server.test_case_server
1036+ requestline = self.rfile.readline()
1037+ # Read headers
1038+ parse_headers(self.rfile)
1039+ if requestline.startswith(b'POST'):
1040+ # The body should be a single line (or we don't know where it ends
1041+ # and we don't want to issue a blocking read)
1042+ self.rfile.readline()
1043+
1044+ self.wfile.write(tcs.canned_response)
1045+
1046+
1047+class HatterHttpServer(http_server.HttpServer):
1048+ """A server giving all sort of crazy responses (like Alice's Hatter).
1049+
1050+ This is used to test various error cases in the webdav client.
1051+ """
1052+
1053+ def __init__(self):
1054+ super(HatterHttpServer, self).__init__(CannedRequestHandler,
1055+ protocol_version='HTTP/1.1')
1056+ self.canned_response = None
1057+
1058+
1059+class TestDAVErrors(tests.TestCase):
1060+
1061+ def setUp(self):
1062+ super(TestDAVErrors, self).setUp()
1063+ self._transport = webdav.HttpDavTransport
1064+ self.server = HatterHttpServer()
1065+ self.server.start_server()
1066+ self.addCleanup(self.server.stop_server)
1067+
1068+ def get_transport(self):
1069+ t = self._transport(self.server.get_url())
1070+ return t
1071+
1072+ def test_delete_replies_202(self):
1073+ """A bogus return code for delete raises an error."""
1074+ self.server.canned_response = b'''HTTP/1.1 202 OK\r
1075+Date: Tue, 10 Aug 2013 14:38:56 GMT\r
1076+Server: Apache/42 (Wonderland)\r
1077+'''
1078+ t = self.get_transport()
1079+ self.assertRaises(errors.InvalidHttpResponse, t.delete, 'whatever')
1080
1081=== added file 'breezy/plugins/webdav/webdav.py'
1082--- breezy/plugins/webdav/webdav.py 1970-01-01 00:00:00 +0000
1083+++ breezy/plugins/webdav/webdav.py 2022-12-13 16:21:38 +0000
1084@@ -0,0 +1,854 @@
1085+# Copyright (C) 2006-2009, 2011, 2012, 2013 Canonical Ltd
1086+#
1087+# This program is free software; you can redistribute it and/or modify
1088+# it under the terms of the GNU General Public License as published by
1089+# the Free Software Foundation; either version 2 of the License, or
1090+# (at your option) any later version.
1091+#
1092+# This program is distributed in the hope that it will be useful,
1093+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1094+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1095+# GNU General Public License for more details.
1096+#
1097+# You should have received a copy of the GNU General Public License
1098+# along with this program; if not, write to the Free Software
1099+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1100+
1101+"""Implementation of WebDAV for http transports.
1102+
1103+A Transport which complement http transport by implementing
1104+partially the WebDAV protocol to push files.
1105+This should enable remote push operations.
1106+"""
1107+
1108+from io import StringIO
1109+import os
1110+import random
1111+import sys
1112+import time
1113+import xml.sax
1114+import xml.sax.handler
1115+
1116+
1117+from breezy import (
1118+ errors,
1119+ osutils,
1120+ trace,
1121+ transport,
1122+ )
1123+from breezy.transport.http import (
1124+ urllib,
1125+ )
1126+
1127+
1128+class DavResponseHandler(xml.sax.handler.ContentHandler):
1129+ """Handle a multi-status DAV response."""
1130+
1131+ def __init__(self):
1132+ self.url = None
1133+ self.elt_stack = None
1134+ self.chars = None
1135+ self.chars_wanted = False
1136+ self.expected_content_handled = False
1137+
1138+ def set_url(self, url):
1139+ """Set the url used for error reporting when handling a response."""
1140+ self.url = url
1141+
1142+ def startDocument(self):
1143+ self.elt_stack = []
1144+ self.chars = None
1145+ self.expected_content_handled = False
1146+
1147+ def endDocument(self):
1148+ self._validate_handling()
1149+ if not self.expected_content_handled:
1150+ raise errors.InvalidHttpResponse(self.url,
1151+ msg='Unknown xml response')
1152+
1153+ def startElement(self, name, attrs):
1154+ self.elt_stack.append(self._strip_ns(name))
1155+ # The following is incorrect in the general case where elements are
1156+ # intermixed with chars in a higher level element. That's not the case
1157+ # here (otherwise the chars_wanted will have to be stacked too).
1158+ if self.chars_wanted:
1159+ self.chars = ''
1160+ else:
1161+ self.chars = None
1162+
1163+ def endElement(self, name):
1164+ self.chars = None
1165+ self.chars_wanted = False
1166+ self.elt_stack.pop()
1167+
1168+ def characters(self, chrs):
1169+ if self.chars_wanted:
1170+ self.chars += chrs
1171+
1172+ def _current_element(self):
1173+ return self.elt_stack[-1]
1174+
1175+ def _strip_ns(self, name):
1176+ """Strip the leading namespace from name.
1177+
1178+ We don't have namespaces clashes in our context, stripping it makes the
1179+ code simpler.
1180+ """
1181+ where = name.find(':')
1182+ if where == -1:
1183+ return name
1184+ else:
1185+ return name[where + 1:]
1186+
1187+
1188+class DavStatHandler(DavResponseHandler):
1189+ """Handle a PROPPFIND DAV response for a file or directory.
1190+
1191+ The expected content is:
1192+ - a multi-status element containing
1193+ - a single response element containing
1194+ - a href element
1195+ - a propstat element containing
1196+ - a status element (ignored)
1197+ - a prop element containing at least (other are ignored)
1198+ - a getcontentlength element (for files only)
1199+ - an executable element (for files only)
1200+ - a resourcetype element containing
1201+ - a collection element (for directories only)
1202+ """
1203+
1204+ def __init__(self):
1205+ DavResponseHandler.__init__(self)
1206+ # Flags defining the context for the actions
1207+ self._response_seen = False
1208+ self._init_response_attrs()
1209+
1210+ def _init_response_attrs(self):
1211+ self.href = None
1212+ self.length = -1
1213+ self.executable = None
1214+ self.is_dir = False
1215+
1216+ def _validate_handling(self):
1217+ if self.href is not None:
1218+ self.expected_content_handled = True
1219+
1220+ def startElement(self, name, attrs):
1221+ sname = self._strip_ns(name)
1222+ self.chars_wanted = sname in ('href', 'getcontentlength', 'executable')
1223+ DavResponseHandler.startElement(self, name, attrs)
1224+
1225+ def endElement(self, name):
1226+ if self._response_seen:
1227+ self._additional_response_starting(name)
1228+
1229+ if self._href_end():
1230+ self.href = self.chars
1231+ elif self._getcontentlength_end():
1232+ self.length = int(self.chars)
1233+ elif self._executable_end():
1234+ self.executable = self.chars
1235+ elif self._collection_end():
1236+ self.is_dir = True
1237+
1238+ if self._strip_ns(name) == 'response':
1239+ self._response_seen = True
1240+ self._response_handled()
1241+ DavResponseHandler.endElement(self, name)
1242+
1243+
1244+ def _response_handled(self):
1245+ """A response element inside a multistatus have been parsed."""
1246+ pass
1247+
1248+ def _additional_response_starting(self, name):
1249+ """A additional response element inside a multistatus begins."""
1250+ sname = self._strip_ns(name)
1251+ if sname != 'multistatus':
1252+ raise errors.InvalidHttpResponse(
1253+ self.url, msg='Unexpected %s element' % name)
1254+
1255+ def _href_end(self):
1256+ stack = self.elt_stack
1257+ return (len(stack) == 3
1258+ and stack[0] == 'multistatus'
1259+ and stack[1] == 'response'
1260+ and stack[2] == 'href')
1261+
1262+ def _getcontentlength_end(self):
1263+ stack = self.elt_stack
1264+ return (len(stack) == 5
1265+ and stack[0] == 'multistatus'
1266+ and stack[1] == 'response'
1267+ and stack[2] == 'propstat'
1268+ and stack[3] == 'prop'
1269+ and stack[4] == 'getcontentlength')
1270+
1271+ def _executable_end(self):
1272+ stack = self.elt_stack
1273+ return (len(stack) == 5
1274+ and stack[0] == 'multistatus'
1275+ and stack[1] == 'response'
1276+ and stack[2] == 'propstat'
1277+ and stack[3] == 'prop'
1278+ and stack[4] == 'executable')
1279+
1280+ def _collection_end(self):
1281+ stack = self.elt_stack
1282+ return (len(stack) == 6
1283+ and stack[0] == 'multistatus'
1284+ and stack[1] == 'response'
1285+ and stack[2] == 'propstat'
1286+ and stack[3] == 'prop'
1287+ and stack[4] == 'resourcetype'
1288+ and stack[5] == 'collection')
1289+
1290+
1291+class _DAVStat(object):
1292+ """The stat info as it can be acquired with DAV."""
1293+
1294+ def __init__(self, size, is_dir, is_exec):
1295+ self.st_size = size
1296+ # We build a mode considering that:
1297+
1298+ # - we have no idea about group or other chmod bits so we use a sane
1299+ # default (bzr should not care anyway)
1300+
1301+ # - we suppose that the user can write
1302+ if is_dir:
1303+ self.st_mode = 0o040644
1304+ else:
1305+ self.st_mode = 0o100644
1306+ if is_exec:
1307+ self.st_mode = self.st_mode | 0o755
1308+
1309+
1310+def _extract_stat_info(url, infile):
1311+ """Extract the stat-like information from a DAV PROPFIND response.
1312+
1313+ :param url: The url used for the PROPFIND request.
1314+ :param infile: A file-like object pointing at the start of the response.
1315+ """
1316+ parser = xml.sax.make_parser()
1317+
1318+ handler = DavStatHandler()
1319+ handler.set_url(url)
1320+ parser.setContentHandler(handler)
1321+ infile.close = lambda: None
1322+ try:
1323+ parser.parse(infile)
1324+ except xml.sax.SAXParseException as e:
1325+ raise errors.InvalidHttpResponse(
1326+ url, msg='Malformed xml response: %s' % e)
1327+ if handler.is_dir:
1328+ size = -1 # directory sizes are meaningless for bzr
1329+ is_exec = True
1330+ else:
1331+ size = handler.length
1332+ is_exec = (handler.executable == 'T')
1333+ return _DAVStat(size, handler.is_dir, is_exec)
1334+
1335+
1336+class DavListDirHandler(DavStatHandler):
1337+ """Handle a PROPPFIND depth 1 DAV response for a directory."""
1338+ def __init__(self):
1339+ DavStatHandler.__init__(self)
1340+ self.dir_content = None
1341+
1342+ def _validate_handling(self):
1343+ if self.dir_content is not None:
1344+ self.expected_content_handled = True
1345+
1346+ def _make_response_tuple(self):
1347+ if self.executable == 'T':
1348+ is_exec = True
1349+ else:
1350+ is_exec = False
1351+ return (self.href, self.is_dir, self.length, is_exec)
1352+
1353+ def _response_handled(self):
1354+ """A response element inside a multistatus have been parsed."""
1355+ if self.dir_content is None:
1356+ self.dir_content = []
1357+ self.dir_content.append(self._make_response_tuple())
1358+ # Resest the attributes for the next response if any
1359+ self._init_response_attrs()
1360+
1361+ def _additional_response_starting(self, name):
1362+ """A additional response element inside a multistatus begins."""
1363+ pass
1364+
1365+
1366+def _extract_dir_content(url, infile):
1367+ """Extract the directory content from a DAV PROPFIND response.
1368+
1369+ :param url: The url used for the PROPFIND request.
1370+ :param infile: A file-like object pointing at the start of the response.
1371+ """
1372+ parser = xml.sax.make_parser()
1373+
1374+ handler = DavListDirHandler()
1375+ handler.set_url(url)
1376+ parser.setContentHandler(handler)
1377+ infile.close = lambda: None
1378+ try:
1379+ parser.parse(infile)
1380+ except xml.sax.SAXParseException as e:
1381+ raise errors.InvalidHttpResponse(
1382+ url, msg='Malformed xml response: %s' % e)
1383+ # Reformat for bzr needs
1384+ dir_content = handler.dir_content
1385+ (dir_name, is_dir) = dir_content[0][:2]
1386+ if not is_dir:
1387+ raise errors.NotADirectory(url)
1388+ dir_len = len(dir_name)
1389+ elements = []
1390+ for (href, is_dir, size, is_exec) in dir_content[1:]: # Ignore first element
1391+ if href.startswith(dir_name):
1392+ name = href[dir_len:]
1393+ if name.endswith('/'):
1394+ # Get rid of final '/'
1395+ name = name[0:-1]
1396+ # We receive already url-encoded strings so down-casting is
1397+ # safe. And bzr insists on getting strings not unicode strings.
1398+ elements.append((str(name), is_dir, size, is_exec))
1399+ return elements
1400+
1401+
1402+class DavResponse(urllib.Response):
1403+ """Custom HTTPResponse.
1404+
1405+ DAV have some reponses for which the body is of no interest.
1406+ """
1407+ _body_ignored_responses = (
1408+ urllib.Response._body_ignored_responses
1409+ + [201, 405, 409, 412]
1410+ )
1411+
1412+ def begin(self):
1413+ """Begin to read the response from the server.
1414+
1415+ httplib incorrectly close the connection far too easily. Let's try to
1416+ workaround that (as urllib does, but for more cases...).
1417+ """
1418+ urllib.Response.begin(self)
1419+ if self.status in (201, 204):
1420+ self.will_close = False
1421+
1422+
1423+# Takes DavResponse into account:
1424+class DavHTTPConnection(urllib.HTTPConnection):
1425+
1426+ response_class = DavResponse
1427+
1428+
1429+class DavHTTPSConnection(urllib.HTTPSConnection):
1430+
1431+ response_class = DavResponse
1432+
1433+
1434+class DavConnectionHandler(urllib.ConnectionHandler):
1435+ """Custom connection handler.
1436+
1437+ We need to use the DavConnectionHTTPxConnection class to take
1438+ into account our own DavResponse objects, to be able to
1439+ declare our own body ignored responses, sigh.
1440+ """
1441+
1442+ def http_request(self, request):
1443+ return self.capture_connection(request, DavHTTPConnection)
1444+
1445+ def https_request(self, request):
1446+ return self.capture_connection(request, DavHTTPSConnection)
1447+
1448+
1449+class DavOpener(urllib.Opener):
1450+ """Dav specific needs regarding HTTP(S)"""
1451+
1452+ def __init__(self, report_activity=None, ca_certs=None):
1453+ super(DavOpener, self).__init__(connection=DavConnectionHandler,
1454+ report_activity=report_activity,
1455+ ca_certs=ca_certs)
1456+
1457+
1458+class HttpDavTransport(urllib.HttpTransport):
1459+ """An transport able to put files using http[s] on a DAV server.
1460+
1461+ We don't try to implement the whole WebDAV protocol. Just the minimum
1462+ needed for bzr.
1463+ """
1464+
1465+ # Implementation note: most methods relies on _perform() to catch
1466+ # unexpected status codes (via the xxxRequest's accepted_errors parameter).
1467+ # These methods should only handle errors (by adding the respective codes
1468+ # into accepted_errors) to provide specific error messages. I.e. mkdir()
1469+ # ends with a 'code != 201' to mention 'mkdir failed'.
1470+
1471+ _debuglevel = 0
1472+ _opener_class = DavOpener
1473+
1474+ def is_readonly(self):
1475+ """See Transport.is_readonly."""
1476+ return False
1477+
1478+ def _raise_http_error(self, url, response, info=None):
1479+ if info is None:
1480+ msg = ''
1481+ else:
1482+ msg = ': ' + info
1483+ raise errors.InvalidHttpResponse(url, 'Unable to handle http code %d%s'
1484+ % (response.status, msg))
1485+
1486+ def open_write_stream(self, relpath, mode=None):
1487+ """See Transport.open_write_stream."""
1488+ # FIXME: this implementation sucks, we should really use chunk encoding
1489+ # and buffers.
1490+ self.put_bytes(relpath, b"", mode)
1491+ result = transport.AppendBasedFileStream(self, relpath)
1492+ transport._file_streams[self.abspath(relpath)] = result
1493+ return result
1494+
1495+ def put_file(self, relpath, f, mode=None):
1496+ """See Transport.put_file"""
1497+ # FIXME: We read the whole file in memory, using chunked encoding and
1498+ # counting bytes while sending them will be far better. Look at reusing
1499+ # osutils.pumpfile ?
1500+ #
1501+ bytes = f.read()
1502+ self.put_bytes(relpath, bytes, mode=None)
1503+ return len(bytes)
1504+
1505+ def put_bytes(self, relpath, bytes, mode=None):
1506+ """Copy the bytes object into the location.
1507+
1508+ Tests revealed that contrary to what is said in
1509+ http://www.rfc.net/rfc2068.html, the put is not
1510+ atomic. When putting a file, if the client died, a
1511+ partial file may still exists on the server.
1512+
1513+ So we first put a temp file and then move it.
1514+
1515+ :param relpath: Location to put the contents, relative to base.
1516+ :param f: File-like object.
1517+ :param mode: Not supported by DAV.
1518+ """
1519+ abspath = self._remote_path(relpath)
1520+
1521+ # We generate a sufficiently random name to *assume* that
1522+ # no collisions will occur and don't worry about it (nor
1523+ # handle it).
1524+ stamp = '.tmp.%.9f.%d.%d' % (time.time(),
1525+ os.getpid(),
1526+ random.randint(0, 0x7FFFFFFF))
1527+ # A temporary file to hold all the data to guard against
1528+ # client death
1529+ tmp_relpath = relpath + stamp
1530+
1531+ # Will raise if something gets wrong
1532+ self.put_bytes_non_atomic(tmp_relpath, bytes)
1533+
1534+ # Now move the temp file
1535+ try:
1536+ self.move(tmp_relpath, relpath)
1537+ except Exception as e:
1538+ # If we fail, try to clean up the temporary file
1539+ # before we throw the exception but don't let another
1540+ # exception mess things up.
1541+ exc_type, exc_val, exc_tb = sys.exc_info()
1542+ try:
1543+ self.delete(tmp_relpath)
1544+ except:
1545+ raise exc_type(exc_val).with_traceback(exc_tb)
1546+ raise # raise the original with its traceback if we can.
1547+
1548+ def put_file_non_atomic(self, relpath, f,
1549+ mode=None,
1550+ create_parent_dir=False,
1551+ dir_mode=False):
1552+ # Implementing put_bytes_non_atomic rather than put_file_non_atomic
1553+ # because to do a put request, we must read all of the file into
1554+ # RAM anyway. Better to do that than to have the contents, put
1555+ # into a StringIO() and then read them all out again later.
1556+ self.put_bytes_non_atomic(relpath, f.read(), mode=mode,
1557+ create_parent_dir=create_parent_dir,
1558+ dir_mode=dir_mode)
1559+
1560+ def put_bytes_non_atomic(self, relpath, bytes: bytes,
1561+ mode=None,
1562+ create_parent_dir=False,
1563+ dir_mode=False):
1564+ """See Transport.put_file_non_atomic"""
1565+
1566+ abspath = self._remote_path(relpath)
1567+
1568+ # FIXME: Accept */* ? Why ? *we* send, we do not receive :-/
1569+ headers = {'Accept': '*/*',
1570+ 'Content-type': 'application/octet-stream',
1571+ # FIXME: We should complete the
1572+ # implementation of
1573+ # htmllib.HTTPConnection, it's just a
1574+ # shame (at least a waste) that we
1575+ # can't use the following.
1576+
1577+ # 'Expect': '100-continue',
1578+ # 'Transfer-Encoding': 'chunked',
1579+ }
1580+
1581+ def bare_put_file_non_atomic():
1582+
1583+ response = self.request('PUT', abspath, body=bytes, headers=headers)
1584+ code = response.status
1585+
1586+ if code in (403, 404, 409):
1587+ # Intermediate directories missing
1588+ raise transport.NoSuchFile(abspath)
1589+ elif code not in (200, 201, 204):
1590+ raise self._raise_http_error(abspath, response, 'put file failed')
1591+
1592+ try:
1593+ bare_put_file_non_atomic()
1594+ except transport.NoSuchFile:
1595+ if not create_parent_dir:
1596+ raise
1597+ parent_dir = osutils.dirname(relpath)
1598+ if parent_dir:
1599+ self.mkdir(parent_dir, mode=dir_mode)
1600+ return bare_put_file_non_atomic()
1601+ else:
1602+ # Don't forget to re-raise if the parent dir doesn't exist
1603+ raise
1604+
1605+ def _put_bytes_ranged(self, relpath, bytes, at):
1606+ """Append the file-like object part to the end of the location.
1607+
1608+ :param relpath: Location to put the contents, relative to base.
1609+ :param bytes: A string of bytes to upload
1610+ :param at: The position in the file to add the bytes
1611+ """
1612+ # Acquire just the needed data
1613+ # TODO: jam 20060908 Why are we creating a StringIO to hold the
1614+ # data, and then using data.read() to send the data
1615+ # in the PUTRequest. Rather than just reading in and
1616+ # uploading the data.
1617+ # Also, if we have to read the whole file into memory anyway
1618+ # it would be better to implement put_bytes(), and redefine
1619+ # put_file as self.put_bytes(relpath, f.read())
1620+
1621+ # Once we teach httplib to do that, we will use file-like
1622+ # objects (see handling chunked data and 100-continue).
1623+ abspath = self._remote_path(relpath)
1624+
1625+ # FIXME: Accept */* ? Why ? *we* send, we do not receive :-/
1626+ headers = {'Accept': '*/*',
1627+ 'Content-type': 'application/octet-stream',
1628+ 'Content-Range': 'bytes %d-%d/*' % (at, at + len(bytes) - 1),
1629+ # FIXME: We should complete the
1630+ # implementation of
1631+ # htmllib.HTTPConnection, it's just a
1632+ # shame (at least a waste) that we
1633+ # can't use the following.
1634+
1635+ # 'Expect': '100-continue',
1636+ # 'Transfer-Encoding': 'chunked',
1637+ }
1638+
1639+
1640+ # Content-Range is start-end/size. 'size' is the file size, not the
1641+ # chunk size. We can't be sure about the size of the file so put '*' at
1642+ # the end of the range instead.
1643+ response = self.request('PUT', abspath, body=bytes, headers=headers)
1644+ code = response.status
1645+
1646+ if code in (403, 404, 409):
1647+ raise transport.NoSuchFile(abspath) # Intermediate directories missing
1648+
1649+ if code not in (200, 201, 204):
1650+ raise self._raise_http_error(abspath, response, 'put file failed')
1651+
1652+ def mkdir(self, relpath, mode=None):
1653+ """See Transport.mkdir"""
1654+ abspath = self._remote_path(relpath)
1655+
1656+ response = self.request('MKCOL', abspath)
1657+
1658+ code = response.status
1659+ # jam 20060908: The error handling seems to be repeated for
1660+ # each function. Is it possible to factor it out into
1661+ # a helper rather than repeat it for each one?
1662+ # (I realize there is some custom behavior)
1663+ # Yes it is and will be done.
1664+ if code == 403:
1665+ # Forbidden (generally server misconfigured or not
1666+ # configured for DAV)
1667+ raise self._raise_http_error(abspath, response, 'mkdir failed')
1668+ elif code == 405:
1669+ # Not allowed (generally already exists)
1670+ raise transport.FileExists(abspath)
1671+ elif code in (404, 409):
1672+ # Conflict (intermediate directories do not exist)
1673+ raise transport.NoSuchFile(abspath)
1674+ elif code != 201: # Created
1675+ raise self._raise_http_error(abspath, response, 'mkdir failed')
1676+
1677+ def rename(self, rel_from, rel_to):
1678+ """Rename without special overwriting"""
1679+ abs_from = self._remote_path(rel_from)
1680+ abs_to = self._remote_path(rel_to)
1681+
1682+ response = self.request(
1683+ 'MOVE', abs_from, headers={'Destination': abs_to, 'Overwrite': 'F'})
1684+
1685+ code = response.status
1686+ if code == 404:
1687+ raise transport.NoSuchFile(abs_from)
1688+ if code == 412:
1689+ raise transport.FileExists(abs_to)
1690+ if code == 409:
1691+ # More precisely some intermediate directories are missing
1692+ raise transport.NoSuchFile(abs_to)
1693+ if code != 201:
1694+ # As we don't want to accept overwriting abs_to, 204
1695+ # (meaning abs_to was existing (but empty, the
1696+ # non-empty case is 412)) will be an error, a server
1697+ # bug even, since we require explicitely to not
1698+ # overwrite.
1699+ self._raise_http_error(abs_from, response,
1700+ 'unable to rename to %r' % (abs_to))
1701+
1702+ def move(self, rel_from, rel_to):
1703+ """See Transport.move"""
1704+
1705+ abs_from = self._remote_path(rel_from)
1706+ abs_to = self._remote_path(rel_to)
1707+
1708+ response = self.request(
1709+ 'MOVE', abs_from, headers={'Destination': abs_to, 'Overwrite': 'T'})
1710+
1711+ code = response.status
1712+ if code == 404:
1713+ raise transport.NoSuchFile(abs_from)
1714+ if code == 409:
1715+ raise errors.DirectoryNotEmpty(abs_to)
1716+ # Overwriting allowed, 201 means abs_to did not exist,
1717+ # 204 means it did exist.
1718+ if code not in (201, 204):
1719+ self._raise_http_error(abs_from, response,
1720+ 'unable to move to %r' % (abs_to))
1721+
1722+ def delete(self, rel_path):
1723+ """
1724+ Delete the item at relpath.
1725+
1726+ Note that when a non-empty dir requires to be deleted, a conforming DAV
1727+ server will delete the dir and all its content. That does not normally
1728+ happen in bzr.
1729+ """
1730+ abs_path = self._remote_path(rel_path)
1731+
1732+ response = self.request('DELETE', abs_path)
1733+
1734+ code = response.status
1735+ if code == 404:
1736+ raise transport.NoSuchFile(abs_path)
1737+ if code not in (200, 204):
1738+ self._raise_http_error(abs_path, response, 'unable to delete')
1739+
1740+ def copy(self, rel_from, rel_to):
1741+ """See Transport.copy"""
1742+ abs_from = self._remote_path(rel_from)
1743+ abs_to = self._remote_path(rel_to)
1744+
1745+ response = self.request(
1746+ 'COPY', abs_from, headers={'Destination': abs_to})
1747+
1748+ code = response.status
1749+ if code in (404, 409):
1750+ raise transport.NoSuchFile(abs_from)
1751+ # XXX: our test server returns 201 but apache2 returns 204, needs
1752+ # investivation.
1753+ if code not in (201, 204):
1754+ self._raise_http_error(abs_from, response,
1755+ 'unable to copy from %r to %r'
1756+ % (abs_from, abs_to))
1757+
1758+ def copy_to(self, relpaths, other, mode=None, pb=None):
1759+ """Copy a set of entries from self into another Transport.
1760+
1761+ :param relpaths: A list/generator of entries to be copied.
1762+ """
1763+ # DavTransport can be a target. So our simple implementation
1764+ # just returns the Transport implementation. (Which just does
1765+ # a put(get())
1766+ # We only override, because the default HttpTransportBase, explicitly
1767+ # disabled it for HTTP
1768+ return transport.Transport.copy_to(self, relpaths, other,
1769+ mode=mode, pb=pb)
1770+
1771+ def listable(self):
1772+ """See Transport.listable."""
1773+ return True
1774+
1775+ def list_dir(self, relpath):
1776+ """
1777+ Return a list of all files at the given location.
1778+ """
1779+ return [elt[0] for elt in self._list_tree(relpath, 1)]
1780+
1781+ def _list_tree(self, relpath, depth):
1782+ abspath = self._remote_path(relpath)
1783+ propfind = b"""<?xml version="1.0" encoding="utf-8" ?>
1784+ <D:propfind xmlns:D="DAV:">
1785+ <D:allprop/>
1786+ </D:propfind>
1787+"""
1788+ response = self.request(
1789+ 'PROPFIND', abspath, body=propfind, headers={
1790+ 'Depth': '%s' % (depth,),
1791+ 'Content-Type': 'application/xml; charset="utf-8"'})
1792+
1793+ code = response.status
1794+ if code == 404:
1795+ raise transport.NoSuchFile(abspath)
1796+ if code == 409:
1797+ # More precisely some intermediate directories are missing
1798+ raise transport.NoSuchFile(abspath)
1799+ if code != 207:
1800+ self._raise_http_error(abspath, response,
1801+ 'unable to list %r directory' % (abspath))
1802+ return _extract_dir_content(abspath, response)
1803+
1804+ def lock_write(self, relpath):
1805+ """Lock the given file for exclusive access.
1806+ :return: A lock object, which should be passed to Transport.unlock()
1807+ """
1808+ # We follow the same path as FTP, which just returns a BogusLock
1809+ # object. We don't explicitly support locking a specific file.
1810+ # TODO: jam 2006-09-08 SFTP implements this by opening exclusive
1811+ # "relpath + '.lock_write'". Does DAV implement anything like
1812+ # O_EXCL?
1813+ # Alternatively, LocalTransport uses an OS lock to lock the file
1814+ # and WebDAV supports some sort of locking.
1815+ return self.lock_read(relpath)
1816+
1817+ def rmdir(self, relpath):
1818+ """See Transport.rmdir."""
1819+ content = self.list_dir(relpath)
1820+ if len(content) > 0:
1821+ raise errors.DirectoryNotEmpty(self._remote_path(relpath))
1822+ self.delete(relpath)
1823+
1824+ def stat(self, relpath):
1825+ """See Transport.stat.
1826+
1827+ We provide a limited implementation for bzr needs.
1828+ """
1829+ abspath = self._remote_path(relpath)
1830+ propfind = b"""<?xml version="1.0" encoding="utf-8" ?>
1831+ <D:propfind xmlns:D="DAV:">
1832+ <D:allprop/>
1833+ </D:propfind>
1834+"""
1835+ response = self.request(
1836+ 'PROPFIND', abspath, body=propfind,
1837+ headers={'Depth': '0', 'Content-Type': 'application/xml; charset="utf-8"'})
1838+
1839+ code = response.status
1840+ if code == 404:
1841+ raise transport.NoSuchFile(abspath)
1842+ if code == 409:
1843+ # FIXME: Could this really occur ?
1844+ # More precisely some intermediate directories are missing
1845+ raise transport.NoSuchFile(abspath)
1846+ if code != 207:
1847+ self._raise_http_error(abspath, response,
1848+ 'unable to list %r directory' % (abspath))
1849+ return _extract_stat_info(abspath, response)
1850+
1851+ def iter_files_recursive(self):
1852+ """Walk the relative paths of all files in this transport."""
1853+ # We get the whole tree with a single request
1854+ tree = self._list_tree('.', 'Infinity')
1855+ # Now filter out the directories
1856+ for (name, is_dir, size, is_exex) in tree:
1857+ if not is_dir:
1858+ yield name
1859+
1860+ def append_file(self, relpath, f, mode=None):
1861+ """See Transport.append_file"""
1862+ return self.append_bytes(relpath, f.read(), mode=mode)
1863+
1864+ def append_bytes(self, relpath, bytes, mode=None):
1865+ """See Transport.append_bytes"""
1866+ if self._range_hint is not None:
1867+ # TODO: We reuse the _range_hint handled by bzr core,
1868+ # unless someone can show me a server implementing
1869+ # range for write but not for read. But we may, on
1870+ # our own, try to handle a similar flag for write
1871+ # ranges supported by a given server. Or at least,
1872+ # detect that ranges are not correctly handled and
1873+ # fallback to no ranges.
1874+ before = self._append_by_head_put(relpath, bytes)
1875+ else:
1876+ before = self._append_by_get_put(relpath, bytes)
1877+ return before
1878+
1879+ def _append_by_head_put(self, relpath, bytes):
1880+ """Append without getting the whole file.
1881+
1882+ When the server allows it, a 'Content-Range' header can be specified.
1883+ """
1884+ response = self._head(relpath)
1885+ code = response.status
1886+ if code == 404:
1887+ relpath_size = 0
1888+ else:
1889+ # Consider the absence of Content-Length header as
1890+ # indicating an existing but empty file (Apache 2.0
1891+ # does this, and there is even a comment in
1892+ # modules/http/http_protocol.c calling that a *hack*,
1893+ # I agree, it's a hack. On the other hand if the file
1894+ # do not exist we get a 404, if the file does exist,
1895+ # is not empty and we get no Content-Length header,
1896+ # then the server is buggy :-/ )
1897+ relpath_size = int(response.getheader('Content-Length', 0))
1898+ if relpath_size == 0:
1899+ trace.mutter('if %s is not empty, the server is buggy'
1900+ % relpath)
1901+ if relpath_size:
1902+ self._put_bytes_ranged(relpath, bytes, relpath_size)
1903+ else:
1904+ self.put_bytes(relpath, bytes)
1905+
1906+ return relpath_size
1907+
1908+ def _append_by_get_put(self, relpath, bytes):
1909+ # So we need to GET the file first, append to it and finally PUT back
1910+ # the result.
1911+ full_data = StringIO()
1912+ try:
1913+ data = self.get(relpath)
1914+ full_data.write(data.read())
1915+ except transport.NoSuchFile:
1916+ # Good, just do the put then
1917+ pass
1918+
1919+ # Append the f content
1920+ before = full_data.tell()
1921+ full_data.write(bytes)
1922+ full_data.seek(0)
1923+
1924+ self.put_file(relpath, full_data)
1925+
1926+ return before
1927+
1928+ def get_smart_medium(self):
1929+ # smart server and webdav are exclusive. There is really no point to
1930+ # use webdav if a smart server is available
1931+ raise errors.NoSmartMedium(self)
1932+
1933+
1934+def get_test_permutations():
1935+ """Return the permutations to be used in testing."""
1936+ from .tests import dav_server
1937+ return [(HttpDavTransport, dav_server.DAVServer),
1938+ (HttpDavTransport, dav_server.QuirkyDAVServer)]
1939
1940=== modified file 'breezy/transport/http/urllib.py'
1941--- breezy/transport/http/urllib.py 2022-10-31 18:42:05 +0000
1942+++ breezy/transport/http/urllib.py 2022-12-13 16:21:38 +0000
1943@@ -1664,12 +1664,14 @@
1944 202,
1945 204,
1946 206, # Partial content
1947+ 207, # Multi-Status Response (for webdav)
1948 400,
1949 403,
1950 404, # Not found
1951 405, # Method not allowed
1952 406, # Not Acceptable
1953 409, # Conflict
1954+ 412, # Precondition failed (for webdav)
1955 416, # Range not satisfiable
1956 422, # Unprocessible entity
1957 501, # Not implemented

Subscribers

People subscribed via source and target branches