mirror of https://github.com/zulip/zulip.git
docs: Update .html links to .md.
Sphinx/ReadTheDocs supports automatically translating links written as to `.md` files to point to the corresponding `.html` files, so this migration does not change the resulting HTML output in ReadTheDocs. But it does fix apparent broken links on GitHub. This doesn't prevent people from reading the documentation on GitHub (so doesn't mitigate the fact that some rtd-specific syntax does not render properly on GH), but it will prevent us from getting erroneous issues reported about the hyperlinks not working. Fixes: #11087.
This commit is contained in:
parent
6191b4d93a
commit
c87893feea
|
@ -32,7 +32,7 @@ minutes to a few hours, depending on the time of day.
|
|||
[gender-neutral language](https://en.wikipedia.org/wiki/Gender-neutral_language).
|
||||
For example, avoid using a pronoun like her or his in sentences like
|
||||
"Every developer should clean [their] keyboard at least once a week."
|
||||
* Follow the community [code of conduct](../code-of-conduct.html).
|
||||
* Follow the community [code of conduct](../code-of-conduct.md).
|
||||
* Participate! Zulip is a friendly and welcoming community, and we
|
||||
love meeting new people, hearing about what brought them to Zulip,
|
||||
and getting their feedback. If you're not sure where to start,
|
||||
|
|
|
@ -78,7 +78,7 @@ this?". Good choices include
|
|||
up a page in the CI that has more details on why the job failed.
|
||||
For example [this](https://circleci.com/gh/zulip/zulip/16617)
|
||||
is the page of the `bionic-python-3.6` job. See our docs on
|
||||
[continuous integration](../testing/continuous-integration.html)
|
||||
[continuous integration](../testing/continuous-integration.md)
|
||||
to learn more.
|
||||
|
||||
* *Technical design.* There are a lot of considerations here:
|
||||
|
@ -105,7 +105,7 @@ this?". Good choices include
|
|||
change being made. Tests that exclude whole classes of potential
|
||||
bugs are preferred when possible (e.g., the common test suite
|
||||
`test_bugdown.py` between the Zulip server's [frontend and backend
|
||||
Markdown processors](../subsystems/markdown.html), or the `GetEventsTest` test for
|
||||
Markdown processors](../subsystems/markdown.md), or the `GetEventsTest` test for
|
||||
buggy race condition handling).
|
||||
|
||||
* *Translation.* Make sure that the strings are marked for
|
||||
|
@ -194,11 +194,11 @@ We also strongly recommend reviewers to go through the following resources.
|
|||
* [Code Review - A consolidation of advice and stuff from the
|
||||
sinternet](https://gist.github.com/porterjamesj/002fb27dd70df003646df46f15e898de)
|
||||
article by James J. Porter
|
||||
* [Zulip Code of Conduct](../code-of-conduct.html)
|
||||
* [Zulip Code of Conduct](../code-of-conduct.md)
|
||||
|
||||
[code-style]: ../contributing/code-style.html
|
||||
[commit-messages]: ../contributing/version-control.html#commit-messages
|
||||
[test-writing]: ../testing/testing.html
|
||||
[mypy]: ../testing/mypy.html
|
||||
[git tool]: ../git/zulip-tools.html#fetch-a-pull-request-and-rebase
|
||||
[translation]: ../translating/translating.html
|
||||
[code-style]: ../contributing/code-style.md
|
||||
[commit-messages]: ../contributing/version-control.md#commit-messages
|
||||
[test-writing]: ../testing/testing.md
|
||||
[mypy]: ../testing/mypy.md
|
||||
[git tool]: ../git/zulip-tools.md#fetch-a-pull-request-and-rebase
|
||||
[translation]: ../translating/translating.md
|
||||
|
|
|
@ -163,7 +163,7 @@ Don't use it:
|
|||
### Translation tags
|
||||
|
||||
Remember to
|
||||
[tag all user-facing strings for translation](../translating/translating.html), whether
|
||||
[tag all user-facing strings for translation](../translating/translating.md), whether
|
||||
they are in HTML templates or JavaScript editing the HTML (e.g. error
|
||||
messages).
|
||||
|
||||
|
@ -292,5 +292,5 @@ All significant new features should come with tests. See testing.
|
|||
|
||||
### Third party code
|
||||
|
||||
See [our docs on dependencies](../subsystems/dependencies.html) for discussion of
|
||||
See [our docs on dependencies](../subsystems/dependencies.md) for discussion of
|
||||
rules about integrating third-party projects.
|
||||
|
|
|
@ -82,14 +82,14 @@ And if you've setup the Zulip development environment on a remote
|
|||
machine, take a look at our tips for
|
||||
[developing remotely][dev-remote].
|
||||
|
||||
[dev-remote]: remote.html
|
||||
[install-direct]: ../development/setup-advanced.html#installing-directly-on-ubuntu-debian-centos-or-fedora
|
||||
[install-docker]: ../development/setup-advanced.html#using-docker-experimental
|
||||
[install-generic]: ../development/setup-advanced.html#installing-manually-on-unix
|
||||
[install-vagrant]: ../development/setup-vagrant.html
|
||||
[dev-remote]: remote.md
|
||||
[install-direct]: ../development/setup-advanced.md#installing-directly-on-ubuntu-debian-centos-or-fedora
|
||||
[install-docker]: ../development/setup-advanced.md#using-docker-experimental
|
||||
[install-generic]: ../development/setup-advanced.md#installing-manually-on-linux
|
||||
[install-vagrant]: ../development/setup-vagrant.md
|
||||
[self-install-remote]: #installing-remotely
|
||||
[self-slow-internet]: #slow-internet-connections
|
||||
[configure-proxy]: ../development/setup-vagrant.html#specifying-a-proxy
|
||||
[using-dev-env]: using.html
|
||||
[testing]: ../testing/testing.html
|
||||
[ci]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[configure-proxy]: ../development/setup-vagrant.md#specifying-a-proxy
|
||||
[using-dev-env]: using.md
|
||||
[testing]: ../testing/testing.md
|
||||
[ci]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
|
|
|
@ -129,7 +129,7 @@ don't have a favorite, here are some suggestions:
|
|||
* [spacemacs](https://github.com/syl20bnr/spacemacs)
|
||||
* [sublime](https://www.sublimetext.com/)
|
||||
|
||||
Next, follow our [Git and GitHub Guide](../git/index.html) to clone and configure
|
||||
Next, follow our [Git and GitHub Guide](../git/index.md) to clone and configure
|
||||
your fork of zulip on your local computer.
|
||||
|
||||
Once you have cloned your code locally, you can get to work.
|
||||
|
@ -214,11 +214,12 @@ Next, read the following to learn more about developing for Zulip:
|
|||
* [Using the Development Environment][rtd-using-dev-env]
|
||||
* [Testing][rtd-testing]
|
||||
|
||||
[install-direct]: ../development/setup-advanced.html#installing-directly-on-ubuntu-debian-centos-or-fedora
|
||||
[install-vagrant]: ../development/setup-vagrant.html
|
||||
[rtd-git-guide]: ../git/index.html
|
||||
[rtd-using-dev-env]: using.html
|
||||
[rtd-testing]: ../testing/testing.html
|
||||
[install-direct]: ../development/setup-advanced.md#installing-directly-on-ubuntu-debian-centos-or-fedora
|
||||
[install-generic]: ../development/setup-advanced.md#installing-manually-on-linux
|
||||
[install-vagrant]: ../development/setup-vagrant.md
|
||||
[rtd-git-guide]: ../git/index.md
|
||||
[rtd-using-dev-env]: using.md
|
||||
[rtd-testing]: ../testing/testing.md
|
||||
[git-bash]: https://git-for-windows.github.io/
|
||||
[codeanywhere]: https://codeanywhere.com/
|
||||
[img-ca-settings]: ../images/codeanywhere-settings.png
|
||||
|
@ -236,7 +237,7 @@ that the user is `zulipdev`; edit accordingly if the situation is
|
|||
different.
|
||||
|
||||
1. First, get an SSL certificate; you can use
|
||||
[our certbot wrapper script used for production](../production/ssl-certificates.html#certbot-recommended)
|
||||
[our certbot wrapper script used for production](../production/ssl-certificates.md#certbot-recommended)
|
||||
by running the following commands as root:
|
||||
```
|
||||
# apt install -y crudini
|
||||
|
|
|
@ -67,14 +67,14 @@ Once your remote dev instance is ready:
|
|||
|
||||
Once you've confirmed you can connect to your remote server, take a look at:
|
||||
|
||||
* [developing remotely](../development/remote.html) for tips on using the remote dev
|
||||
* [developing remotely](../development/remote.md) for tips on using the remote dev
|
||||
instance, and
|
||||
* our [Git & GitHub Guide](../git/index.html) to learn how to use Git with Zulip.
|
||||
* our [Git & GitHub Guide](../git/index.md) to learn how to use Git with Zulip.
|
||||
|
||||
Next, read the following to learn more about developing for Zulip:
|
||||
|
||||
* [Using the Development Environment](../development/using.html)
|
||||
* [Testing](../testing/testing.html)
|
||||
* [Using the Development Environment](../development/using.md)
|
||||
* [Testing](../testing/testing.md)
|
||||
|
||||
[github-join]: https://github.com/join
|
||||
[github-help-add-ssh-key]: https://help.github.com/en/articles/adding-a-new-ssh-key-to-your-github-account
|
||||
|
|
|
@ -21,9 +21,9 @@ that's running one of:
|
|||
You can just run the Zulip provision script on your machine.
|
||||
|
||||
**Note**: you should not use the `root` user to run the installation.
|
||||
If you are using a [remote server](../development/remote.html), see
|
||||
If you are using a [remote server](../development/remote.md), see
|
||||
the
|
||||
[section on creating appropriate user accounts](../development/remote.html#setting-up-user-accounts).
|
||||
[section on creating appropriate user accounts](../development/remote.md#setting-up-user-accounts).
|
||||
|
||||
**Warning**: there is no supported uninstallation process with this
|
||||
method. If you want that, use the Vagrant environment, where you can
|
||||
|
@ -50,7 +50,7 @@ source /srv/zulip-py3-venv/bin/activate
|
|||
|
||||
Once you've done the above setup, you can pick up the [documentation
|
||||
on using the Zulip development
|
||||
environment](../development/setup-vagrant.html#step-4-developing),
|
||||
environment](../development/setup-vagrant.md#step-4-developing),
|
||||
ignoring the parts about `vagrant` (since you're not using it).
|
||||
|
||||
## Installing manually on Unix
|
||||
|
@ -310,7 +310,7 @@ docker run -itv $(pwd):/srv/zulip -p 9991:9991 user/zulipdev:v2 \
|
|||
```
|
||||
|
||||
You'll want to
|
||||
[read the guide for Zulip development](../development/setup-vagrant.html#step-4-developing)
|
||||
[read the guide for Zulip development](../development/setup-vagrant.md#step-4-developing)
|
||||
to understand how to use the Zulip development. Note that
|
||||
`start-dockers` automatically runs `tools/run-dev.py` inside the
|
||||
container; you can then visit http://localhost:9991 to connect to your
|
||||
|
@ -363,6 +363,6 @@ Currently, the Docker workflow is substantially less convenient than
|
|||
the Vagrant workflow and less documented; please contribute to this
|
||||
guide and the Docker tooling if you are using Docker to develop Zulip!
|
||||
|
||||
[zulip-rtd-git-cloning]: ../git/cloning.html#step-1b-clone-to-your-machine
|
||||
[zulip-rtd-git-connect]: ../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream
|
||||
[port-forward-setup]: ../development/remote.html#running-the-development-server
|
||||
[zulip-rtd-git-cloning]: ../git/cloning.md#step-1b-clone-to-your-machine
|
||||
[zulip-rtd-git-connect]: ../git/cloning.md#step-1c-connect-your-fork-to-zulip-upstream
|
||||
[port-forward-setup]: ../development/remote.md#running-the-development-server
|
||||
|
|
|
@ -24,7 +24,7 @@ environment,** check
|
|||
[Troubleshooting and Common Errors](#troubleshooting-and-common-errors). If
|
||||
that doesn't help, please visit
|
||||
[#provision help](https://chat.zulip.org/#narrow/stream/21-provision-help)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html) for
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md) for
|
||||
real-time help, send a note to the
|
||||
[Zulip-devel Google group](https://groups.google.com/forum/#!forum/zulip-devel)
|
||||
or [file an issue](https://github.com/zulip/zulip/issues).
|
||||
|
@ -285,8 +285,8 @@ projects and to instead follow these instructions exactly.)
|
|||
2. Open Terminal (macOS/Ubuntu) or Git BASH (Windows; must
|
||||
**run as an Administrator**).
|
||||
3. In Terminal/Git BASH,
|
||||
[clone your fork of the Zulip repository](../git/cloning.html#step-1b-clone-to-your-machine) and
|
||||
[connect the Zulip upstream repository](../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream):
|
||||
[clone your fork of the Zulip repository](../git/cloning.md#step-1b-clone-to-your-machine) and
|
||||
[connect the Zulip upstream repository](../git/cloning.md#step-1c-connect-your-fork-to-zulip-upstream):
|
||||
|
||||
```
|
||||
git clone --config pull.rebase git@github.com:YOURUSERNAME/zulip.git
|
||||
|
@ -340,7 +340,7 @@ does the following:
|
|||
downloads all required dependencies, sets up the python environment for
|
||||
the Zulip development server, and initializes a default test
|
||||
database. We call this process "provisioning", and it is documented
|
||||
in some detail in our [dependencies documentation](../subsystems/dependencies.html).
|
||||
in some detail in our [dependencies documentation](../subsystems/dependencies.md).
|
||||
|
||||
You will need an active internet connection during the entire
|
||||
process. (See [Specifying a proxy](#specifying-a-proxy) if you need a
|
||||
|
@ -352,7 +352,7 @@ documented in the
|
|||
[Troubleshooting and Common Errors](#troubleshooting-and-common-errors)
|
||||
section. If that doesn't help, please visit
|
||||
[#provision help](https://chat.zulip.org/#narrow/stream/21-provision-help)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html) for
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md) for
|
||||
real-time help.
|
||||
|
||||
On Windows, you will see `The system cannot find the path specified.` message
|
||||
|
@ -489,7 +489,7 @@ It's good to have the terminal running `run-dev.py` up as you work since error
|
|||
messages including tracebacks along with every backend request will be printed
|
||||
there.
|
||||
|
||||
See [Logging](../subsystems/logging.html) for further details on the run-dev.py console
|
||||
See [Logging](../subsystems/logging.md) for further details on the run-dev.py console
|
||||
output.
|
||||
|
||||
#### Committing and pushing changes with git
|
||||
|
@ -518,7 +518,7 @@ After provisioning, you'll want to
|
|||
|
||||
If you run into any trouble, the
|
||||
[#provision help](https://chat.zulip.org/#narrow/stream/21-provision-help)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html) for
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md) for
|
||||
is a great place to ask for help.
|
||||
|
||||
#### Rebuilding the development environment
|
||||
|
@ -615,7 +615,7 @@ If these solutions aren't working for you or you encounter an issue not
|
|||
documented below, there are a few ways to get further help:
|
||||
|
||||
* Ask in [#provision help](https://chat.zulip.org/#narrow/stream/21-provision-help)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html),
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md),
|
||||
* send a note to the [Zulip-devel Google
|
||||
group](https://groups.google.com/forum/#!forum/zulip-devel), or
|
||||
* [File an issue](https://github.com/zulip/zulip/issues).
|
||||
|
@ -883,7 +883,7 @@ Likely causes are:
|
|||
1. Networking issues
|
||||
2. Insufficient RAM. Check whether you've allotted at least two
|
||||
gigabytes of RAM, which is the minimum Zulip
|
||||
[requires](../development/setup-vagrant.html#requirements). If
|
||||
[requires](../development/setup-vagrant.md#requirements). If
|
||||
not, go to your VM settings and increase the RAM, then restart
|
||||
the VM.
|
||||
|
||||
|
@ -967,7 +967,7 @@ Users who are unable to do "vagrant up" due to a VT-X unavailability error need
|
|||
|
||||
#### Permissions errors when running the test suite in LXC
|
||||
|
||||
See ["Possible testing issues"](../testing/testing.html#possible-testing-issues).
|
||||
See ["Possible testing issues"](../testing/testing.md#possible-testing-issues).
|
||||
|
||||
#### Mounting NFS fails on macOS Mojave
|
||||
|
||||
|
@ -1099,13 +1099,13 @@ for the IP address that means any IP address can connect to your development ser
|
|||
[vmware-fusion-dl]: http://www.vmware.com/products/fusion.html
|
||||
[vagrant-vmware-fusion-dl]: https://www.vagrantup.com/vmware/
|
||||
[avoiding-sudo]: https://github.com/fgrehm/vagrant-lxc#avoiding-sudo-passwords
|
||||
[install-advanced]: ../development/setup-advanced.html
|
||||
[install-advanced]: ../development/setup-advanced.md
|
||||
[lxc-sf]: https://github.com/fgrehm/vagrant-lxc/wiki/FAQ#help-my-shared-folders-have-the-wrong-owner
|
||||
[rtd-git-guide]: ../git/index.html
|
||||
[rtd-testing]: ../testing/testing.html
|
||||
[rtd-using-dev-env]: using.html
|
||||
[rtd-dev-remote]: remote.html
|
||||
[rtd-git-guide]: ../git/index.md
|
||||
[rtd-testing]: ../testing/testing.md
|
||||
[rtd-using-dev-env]: using.md
|
||||
[rtd-dev-remote]: remote.md
|
||||
[git-bash]: https://git-for-windows.github.io/
|
||||
[bash-admin-setup]: https://superuser.com/questions/1002262/run-applications-as-administrator-by-default-in-windows-10
|
||||
[set-up-git]: ../git/setup.html
|
||||
[ci]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[set-up-git]: ../git/setup.md
|
||||
[ci]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
|
|
|
@ -51,5 +51,5 @@ restart if it crashes, and `upgrade-zulip` will take care of running
|
|||
migrations and then cleanly restaring the server for you).
|
||||
|
||||
[django-runserver]: https://docs.djangoproject.com/en/1.8/ref/django-admin/#runserver-port-or-address-port
|
||||
[new-feature-tutorial]: ../tutorials/new-feature-tutorial.html
|
||||
[testing-docs]: ../testing/testing.html
|
||||
[new-feature-tutorial]: ../tutorials/new-feature-tutorial.md
|
||||
[testing-docs]: ../testing/testing.md
|
||||
|
|
|
@ -111,6 +111,6 @@ See also [fixing commits][fix-commit]
|
|||
- status
|
||||
- `git status`: show the working tree status, unstaged and staged files
|
||||
|
||||
[fix-commit]: fixing-commits.html
|
||||
[git-config-clone]: cloning.html#step-1b-clone-to-your-machine
|
||||
[git-overview]: overview.html
|
||||
[fix-commit]: fixing-commits.md
|
||||
[git-config-clone]: cloning.md#step-1b-clone-to-your-machine
|
||||
[git-overview]: overview.md
|
||||
|
|
|
@ -152,6 +152,6 @@ Zulip.
|
|||
[travis-ci]: https://travis-ci.org/
|
||||
[circle-ci]:https://circleci.com/
|
||||
[travis-ci-profile]: https://travis-ci.org/profile
|
||||
[zulip-rtd-dev-first-time]: ../development/setup-vagrant.html
|
||||
[zulip-rtd-dev-overview]: ../development/overview.html
|
||||
[zulip-rtd-tools-setup]: ../git/zulip-tools.html#set-up-git-repo-script
|
||||
[zulip-rtd-dev-first-time]: ../development/setup-vagrant.md
|
||||
[zulip-rtd-dev-overview]: ../development/overview.md
|
||||
[zulip-rtd-tools-setup]: ../git/zulip-tools.md#set-up-git-repo-script
|
||||
|
|
|
@ -54,4 +54,4 @@ tools/fetch-pull-request <PR-number>
|
|||
```
|
||||
|
||||
[github-help-co-pr-locally]: https://help.github.com/en/articles/checking-out-pull-requests-locally
|
||||
[tools-PR]: ../git/zulip-tools.html#fetch-a-pull-request-and-rebase
|
||||
[tools-PR]: ../git/zulip-tools.md#fetch-a-pull-request-and-rebase
|
||||
|
|
|
@ -58,14 +58,14 @@ git workflow, or if you'd like a git refresher.
|
|||
[github-rebase-pr]: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request
|
||||
[github-zulip]: https://github.com/zulip/
|
||||
[github-zulip-zulip]: https://github.com/zulip/zulip/
|
||||
[continuous-integration]: ../testing/continuous-integration.html
|
||||
[zulip-git-guide-fork-ci]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[zulip-rtd-code-style]: ../contributing/code-style.html
|
||||
[zulip-rtd-commit-discipline]: ../contributing/version-control.html#commit-discipline
|
||||
[zulip-rtd-commit-messages]: ../contributing/version-control.html#commit-messages
|
||||
[zulip-rtd-dev-overview]: ../development/overview.html
|
||||
[zulip-rtd-lint-tools]: ../contributing/code-style.html#lint-tools
|
||||
[zulip-rtd-mypy]: ../testing/mypy.html
|
||||
[zulip-rtd-testing]: ../testing/testing.html
|
||||
[zulip-rtd-zulip-tools]: ../git/zulip-tools.html
|
||||
[zulip-rtd-zulipbot-usage]: ../contributing/zulipbot-usage.html
|
||||
[continuous-integration]: ../testing/continuous-integration.md
|
||||
[zulip-git-guide-fork-ci]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
[zulip-rtd-code-style]: ../contributing/code-style.md
|
||||
[zulip-rtd-commit-discipline]: ../contributing/version-control.md#commit-discipline
|
||||
[zulip-rtd-commit-messages]: ../contributing/version-control.md#commit-messages
|
||||
[zulip-rtd-dev-overview]: ../development/overview.md
|
||||
[zulip-rtd-lint-tools]: ../contributing/code-style.md#lint-tools
|
||||
[zulip-rtd-mypy]: ../testing/mypy.md
|
||||
[zulip-rtd-testing]: ../testing/testing.md
|
||||
[zulip-rtd-zulip-tools]: ../git/zulip-tools.md
|
||||
[zulip-rtd-zulipbot-usage]: ../contributing/zulipbot-usage.md
|
||||
|
|
|
@ -146,7 +146,7 @@ for another review.
|
|||
[github-help-about-pr]: https://help.github.com/en/articles/about-pull-requests
|
||||
[github-help-create-pr-fork]: https://help.github.com/en/articles/creating-a-pull-request-from-a-fork
|
||||
[images-create-pr]: ../images/zulip-open-pr.png
|
||||
[keep-up-to-date]: ../git/using.html#keep-your-fork-up-to-date
|
||||
[push-commits]: ../git/using.html#push-your-commits-to-github
|
||||
[screenshots-gifs]: ../tutorials/screenshot-and-gif-software.html
|
||||
[keep-up-to-date]: ../git/using.md#keep-your-fork-up-to-date
|
||||
[push-commits]: ../git/using.md#push-your-commits-to-github
|
||||
[screenshots-gifs]: ../tutorials/screenshot-and-gif-software.md
|
||||
[wip-prs]: #work-in-progress-pull-requests
|
||||
|
|
|
@ -61,4 +61,4 @@ Display changes you've committed so far since creating a branch from upstream/ma
|
|||
$ git diff upstream/master...HEAD
|
||||
```
|
||||
|
||||
[zulip-rtd-review]: ../contributing/code-reviewing.html
|
||||
[zulip-rtd-review]: ../contributing/code-reviewing.md
|
||||
|
|
|
@ -49,7 +49,7 @@ text-mode interface to Git.
|
|||
|
||||
And, if none of the above are to your liking, try [one of these][gitbook-guis].
|
||||
|
||||
[git-bash-admin]: ../development/setup-vagrant.html#running-git-bash-as-an-administrator
|
||||
[git-bash-admin]: ../development/setup-vagrant.md#running-git-bash-as-an-administrator
|
||||
[gitbook-aliases]: https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases
|
||||
[gitbook-config]: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
|
||||
[gitbook-guis]: https://git-scm.com/downloads/guis
|
||||
|
|
|
@ -271,8 +271,8 @@ keep,** you'll need to use `git log FETCH_HEAD` to identify that hashes of the
|
|||
commits you want to keep and then `git cherry-pick <commit>` those commits into
|
||||
whichever branch you need to update.
|
||||
|
||||
[clone-to-your-machine]: ../git/cloning.html#step-1b-clone-to-your-machine
|
||||
[connect-upstream]: ../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream
|
||||
[clone-to-your-machine]: ../git/cloning.md#step-1b-clone-to-your-machine
|
||||
[connect-upstream]: ../git/cloning.md#step-1c-connect-your-fork-to-zulip-upstream
|
||||
[gitbook-advanced-merging]: https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_advanced_merging
|
||||
[gitbook-basic-merge-conflicts]: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging#Basic-Merge-Conflicts
|
||||
[gitbook-git-cherry-pick]: https://git-scm.com/docs/git-cherry-pick
|
||||
|
|
|
@ -126,7 +126,7 @@ Now you're ready to work on the issue or feature.
|
|||
## Run linters and tests locally
|
||||
|
||||
In addition to having Travis run tests and linters each time you push a new
|
||||
commit, you can also run them locally. See [testing](../testing/testing.html) for details.
|
||||
commit, you can also run them locally. See [testing](../testing/testing.md) for details.
|
||||
|
||||
## Stage changes
|
||||
|
||||
|
@ -446,7 +446,7 @@ complicated rebase.
|
|||
[github-help-push]: https://help.github.com/en/articles/pushing-to-a-remote
|
||||
[github-help-rebase]: https://help.github.com/en/articles/using-git-rebase
|
||||
[github-help-sync-fork]: https://help.github.com/en/articles/syncing-a-fork
|
||||
[how-git-is-different]: ./the-git-difference.html
|
||||
[zulip-git-guide-up-to-date]: ../git/using.html#keep-your-fork-up-to-date
|
||||
[zulip-rtd-commit-discipline]: ../contributing/version-control.html#commit-discipline
|
||||
[zulip-rtd-commit-messages]: ../contributing/version-control.html#commit-messages
|
||||
[how-git-is-different]: ./the-git-difference.md
|
||||
[zulip-git-guide-up-to-date]: ../git/using.md#keep-your-fork-up-to-date
|
||||
[zulip-rtd-commit-discipline]: ../contributing/version-control.md#commit-discipline
|
||||
[zulip-rtd-commit-messages]: ../contributing/version-control.md#commit-messages
|
||||
|
|
|
@ -9,7 +9,7 @@ time when working with Git on the Zulip project.
|
|||
[zulip/zulip][github-zulip-zulip] you'll find a bash script
|
||||
`setup-git-repo`. This script installs a pre-commit hook, which will
|
||||
run each time you `git commit` to automatically run
|
||||
[Zulip's linter suite](../testing/linters.html) on just the files that
|
||||
[Zulip's linter suite](../testing/linters.md) on just the files that
|
||||
the commit modifies (which is really fast!). The hook passes no matter
|
||||
the result of the linter, but you should still pay attention to any
|
||||
notices or warnings it displays.
|
||||
|
@ -175,5 +175,5 @@ git rebase --continue
|
|||
```
|
||||
|
||||
[github-zulip-zulip]: https://github.com/zulip/zulip/
|
||||
[zulip-git-guide-fetch-pr]: ../git/collaborate.html#checkout-a-pull-request-locally
|
||||
[zulip-git-guide-ci]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[zulip-git-guide-fetch-pr]: ../git/collaborate.md#checkout-a-pull-request-locally
|
||||
[zulip-git-guide-ci]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
|
|
|
@ -9,7 +9,7 @@ The core Zulip application is at
|
|||
is a web application written in Python 3.x and using the Django framework. That
|
||||
codebase includes server-side code and the web client, as well as Python API
|
||||
bindings and most of our integrations with other services and applications (see
|
||||
[the directory structure guide](../overview/directory-structure.html)).
|
||||
[the directory structure guide](../overview/directory-structure.md)).
|
||||
|
||||
[Zulip Mobile](https://github.com/zulip/zulip-mobile) is the official
|
||||
mobile Zulip client supporting both iOS and Android, written in
|
||||
|
@ -56,12 +56,12 @@ choose whether to allow anyone to register an account and join, or
|
|||
only allow people who have been invited, or restrict registrations to
|
||||
members of particular groups (using email domain names or corporate
|
||||
single-sign-on login for verification). For more on security
|
||||
considerations, see [the security model section](../production/security-model.html).
|
||||
considerations, see [the security model section](../production/security-model.md).
|
||||
|
||||
The Zulip "All messages" screen is like a chronologically ordered inbox;
|
||||
it displays messages, starting at the oldest message that the user
|
||||
hasn't viewed yet (for more on that logic, see [the guide to the
|
||||
pointer and unread counts](../subsystems/pointer.html)). The "All messages" screen displays
|
||||
pointer and unread counts](../subsystems/pointer.md)). The "All messages" screen displays
|
||||
the most recent messages in all the streams a user has joined (except
|
||||
for the streams they've muted), as well as private messages from other
|
||||
users, in strict chronological order. A user can *narrow* to view only
|
||||
|
@ -116,7 +116,7 @@ exception to this is that Zulip uses websockets through Tornado to
|
|||
minimize latency on the code path for **sending** messages.
|
||||
|
||||
There is detailed documentation on the
|
||||
[real-time push and event queue system](../subsystems/events-system.html); most of
|
||||
[real-time push and event queue system](../subsystems/events-system.md); most of
|
||||
the code is in `zerver/tornado`.
|
||||
|
||||
#### HTML templates, JavaScript, etc.
|
||||
|
@ -129,10 +129,10 @@ live-rendering HTML from JavaScript for things like the main message
|
|||
feed.
|
||||
|
||||
For more details on the frontend, see our documentation on
|
||||
[translation](../translating/translating.html),
|
||||
[templates](../subsystems/html-templates.html),
|
||||
[directory structure](../overview/directory-structure.html), and
|
||||
[the static asset pipeline](../subsystems/front-end-build-process.html).
|
||||
[translation](../translating/translating.md),
|
||||
[templates](../subsystems/html-templates.md),
|
||||
[directory structure](../overview/directory-structure.md), and
|
||||
[the static asset pipeline](../subsystems/front-end-build-process.md).
|
||||
|
||||
[Jinja2]: http://jinja.pocoo.org/
|
||||
[Handlebars]: http://handlebarsjs.com/
|
||||
|
@ -183,7 +183,7 @@ processes that process event queues. We use event queues for the kinds
|
|||
of tasks that are best run in the background because they are
|
||||
expensive (in terms of performance) and don't have to be synchronous
|
||||
--- e.g., sending emails or updating analytics. Also see [the queuing
|
||||
guide](../subsystems/queuing.html).
|
||||
guide](../subsystems/queuing.md).
|
||||
|
||||
### memcached
|
||||
|
||||
|
@ -192,7 +192,7 @@ objects. `zerver/lib/cache.py` and `zerver/lib/cache_helpers.py`
|
|||
manage putting things into memcached, and invalidating the cache when
|
||||
values change. The memcached configuration is in
|
||||
`puppet/zulip/files/memcached.conf`. See our
|
||||
[caching guide](../subsystems/caching.html) to learn how this works in
|
||||
[caching guide](../subsystems/caching.md) to learn how this works in
|
||||
detail.
|
||||
|
||||
### Redis
|
||||
|
@ -250,7 +250,7 @@ processes started by Supervisor are queue processors that continually
|
|||
pull things out of a RabbitMQ queue and handle them; they are defined
|
||||
in `zerver/worker/queue_processors.py`.
|
||||
|
||||
Also see [the queuing guide](../subsystems/queuing.html).
|
||||
Also see [the queuing guide](../subsystems/queuing.md).
|
||||
|
||||
### PostgreSQL
|
||||
|
||||
|
@ -275,7 +275,7 @@ to create the actual database with its schema.
|
|||
|
||||
We use Thumbor, a popular open source thumbnailing server, to serve
|
||||
images (both for inline URL previews and serving uploaded image
|
||||
files). See [our thumbnailing docs](../subsystems/thumbnailing.html)
|
||||
files). See [our thumbnailing docs](../subsystems/thumbnailing.md)
|
||||
for more details on how this works.
|
||||
|
||||
### Nagios
|
||||
|
|
|
@ -59,7 +59,7 @@ is using the [Mobile Push Notification Service][mpns-statistics-docs],
|
|||
and is enabled by default in that case. To disable it, set
|
||||
`SUBMIT_USAGE_STATISTICS = False` in `/etc/zulip/settings.py`.
|
||||
|
||||
[mpns-statistics-docs]: ../production/mobile-push-notifications.html#submitting-statistics
|
||||
[mpns-statistics-docs]: ../production/mobile-push-notifications.md#submitting-statistics
|
||||
|
||||
**Full feature changelog:**
|
||||
- Added support for CentOS 7 in the development environment
|
||||
|
@ -202,9 +202,9 @@ Zulip installations; it has minimal changes for existing servers.
|
|||
disruption by running this migration first, before beginning the
|
||||
user-facing downtime. However, if you'd like to watch the downtime
|
||||
phase of the upgrade closely, we recommend
|
||||
[running them first manually](../production/expensive-migrations.html)
|
||||
[running them first manually](../production/expensive-migrations.md)
|
||||
and as well as the usual trick of
|
||||
[doing an apt upgrade first](../production/maintain-secure-upgrade.html#applying-system-updates).
|
||||
[doing an apt upgrade first](../production/maintain-secure-upgrade.md#applying-system-updates).
|
||||
|
||||
**Full feature changelog:**
|
||||
- Added an organization setting for message deletion time limits.
|
||||
|
@ -214,7 +214,7 @@ Zulip installations; it has minimal changes for existing servers.
|
|||
- Renamed the hotkey for starring a message to Ctrl+S.
|
||||
- Added the new `SOCIAL_AUTH_SUBDOMAIN` setting, which all servers using
|
||||
both GitHub authentication and hosting multiple Zulip organizations
|
||||
should set (see [the docs for details](../production/multiple-organizations.html#social-authentication)).
|
||||
should set (see [the docs for details](../production/multiple-organizations.md#social-authentication)).
|
||||
- Added automatic thumbnailing of images, powered by thumbor. The new
|
||||
THUMBOR_URL setting controls this feature; it is disabled by default
|
||||
in this release, because the mobile apps don't support it yet.
|
||||
|
@ -285,7 +285,7 @@ Zulip installations; it has minimal changes for existing servers.
|
|||
### 1.8.1 -- 2018-05-07
|
||||
|
||||
- Added an automated tool (`manage.py register_server`) to sign up for
|
||||
the [mobile push notifications service](../production/mobile-push-notifications.html).
|
||||
the [mobile push notifications service](../production/mobile-push-notifications.md).
|
||||
- Improved rendering of block quotes in mobile push notifications.
|
||||
- Improved some installer error messages.
|
||||
- Fixed several minor bugs with the new Slack import feature.
|
||||
|
@ -580,9 +580,9 @@ Backend and scaling
|
|||
minimizes disruption by running these first, before beginning the
|
||||
user-facing downtime. However, if you'd like to watch the downtime
|
||||
phase of the upgrade closely, we recommend
|
||||
[running them first manually](../production/expensive-migrations.html) and as well
|
||||
[running them first manually](../production/expensive-migrations.md) and as well
|
||||
as the usual trick of
|
||||
[doing an apt upgrade first](../production/maintain-secure-upgrade.html#applying-system-updates).
|
||||
[doing an apt upgrade first](../production/maintain-secure-upgrade.md#applying-system-updates).
|
||||
|
||||
* We've removed support for an uncommon legacy deployment model where
|
||||
a Zulip server served multiple organizations on the same domain.
|
||||
|
@ -592,7 +592,7 @@ Backend and scaling
|
|||
This change should have no effect for the vast majority of Zulip
|
||||
servers that only have one organization. If you manage a server
|
||||
that hosts multiple organizations, you'll want to read [our guide on
|
||||
multiple organizations](../production/multiple-organizations.html).
|
||||
multiple organizations](../production/multiple-organizations.md).
|
||||
|
||||
* We simplified the configuration for our password strength checker to
|
||||
be much more intuitive. If you were using the
|
||||
|
@ -740,7 +740,7 @@ Zulip apps.
|
|||
Hungarian, Polish, Dutch, Russian, Bulgarian, Portuguese,
|
||||
Serbian, Malayalam, Korean, and Italian).
|
||||
|
||||
[mobile-push]: ../production/mobile-push-notifications.html
|
||||
[mobile-push]: ../production/mobile-push-notifications.md
|
||||
[electron-app]: https://github.com/zulip/zulip-electron/releases
|
||||
[ios-app]: https://itunes.apple.com/us/app/zulip/id1203036395
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ This page documents the Zulip directory structure, where to find
|
|||
things, and how to decide where to put a file.
|
||||
|
||||
You may also find the [new application feature
|
||||
tutorial](../tutorials/new-feature-tutorial.html) helpful for understanding the
|
||||
tutorial](../tutorials/new-feature-tutorial.md) helpful for understanding the
|
||||
flow through these files.
|
||||
|
||||
### Core Python files
|
||||
|
@ -30,11 +30,11 @@ paths will be familiar to Django developers.
|
|||
|
||||
* `zerver/tornado/views.py` Tornado views.
|
||||
|
||||
* `zerver/worker/queue_processors.py` [Queue workers](../subsystems/queuing.html).
|
||||
* `zerver/worker/queue_processors.py` [Queue workers](../subsystems/queuing.md).
|
||||
|
||||
* `zerver/lib/*.py` Most library code.
|
||||
|
||||
* `zerver/lib/bugdown/` [Backend Markdown processor](../subsystems/markdown.html).
|
||||
* `zerver/lib/bugdown/` [Backend Markdown processor](../subsystems/markdown.md).
|
||||
|
||||
* `zproject/backends.py` [Authentication backends](https://docs.djangoproject.com/en/1.8/topics/auth/customizing/).
|
||||
|
||||
|
@ -42,7 +42,7 @@ paths will be familiar to Django developers.
|
|||
|
||||
### HTML Templates
|
||||
|
||||
See [our docs](../subsystems/html-templates.html) for details on Zulip's
|
||||
See [our docs](../subsystems/html-templates.md) for details on Zulip's
|
||||
templating systems.
|
||||
|
||||
* `templates/zerver/` For [Jinja2](http://jinja.pocoo.org/) templates
|
||||
|
@ -87,7 +87,7 @@ These are distinguished from scripts, below, by needing to run a
|
|||
Django context (i.e. with database access).
|
||||
|
||||
* `zerver/management/commands/`
|
||||
[Management commands](../subsystems/management-commands.html) one might run at a
|
||||
[Management commands](../subsystems/management-commands.md) one might run at a
|
||||
production deployment site (e.g. scripts to change a value or
|
||||
deactivate a user properly).
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ high-quality applications we receive. We have some of the highest
|
|||
standards of any GSoC organization; successful applications generally
|
||||
have dozens of commits integrated into Zulip or other open source
|
||||
projects by the time we review their application. See
|
||||
[our contributing guide](../overview/contributing.html) for details on
|
||||
[our contributing guide](../overview/contributing.md) for details on
|
||||
getting involved.
|
||||
|
||||
## About us
|
||||
|
@ -51,12 +51,12 @@ project today).
|
|||
|
||||
### Expectations for GSoC students
|
||||
|
||||
[Our guide for having a great summer with Zulip](../contributing/summer-with-zulip.html)
|
||||
[Our guide for having a great summer with Zulip](../contributing/summer-with-zulip.md)
|
||||
is focused on what one should know once doing a summer project with
|
||||
Zulip. But it has a lot of useful advice on how we expect students to
|
||||
interact, above and beyond what is discussed in Google's materials.
|
||||
|
||||
[What makes a great Zulip contributor](../overview/contributing.html#what-makes-a-great-zulip-contributor)
|
||||
[What makes a great Zulip contributor](../overview/contributing.md#what-makes-a-great-zulip-contributor)
|
||||
also has some helpful information on what we look for during the application
|
||||
process.
|
||||
|
||||
|
@ -73,11 +73,11 @@ student application deadline is April 9, 2019.
|
|||
|
||||
We have an easy-to-setup development environment, and a library of
|
||||
tasks that are great for first-time contributors. Use
|
||||
[our first-time Zulip developer guide](../overview/contributing.html#your-first-codebase-contribution)
|
||||
[our first-time Zulip developer guide](../overview/contributing.md#your-first-codebase-contribution)
|
||||
to get your Zulip development environment set up and to find your first issue. If you have any
|
||||
trouble, please speak up in
|
||||
[#GSoC](https://chat.zulip.org/#narrow/stream/14-GSoC) on
|
||||
[the Zulip development community server](../contributing/chat-zulip-org.html)
|
||||
[the Zulip development community server](../contributing/chat-zulip-org.md)
|
||||
(use your name as the topic).
|
||||
|
||||
## Application tips, and how to be a strong candidate
|
||||
|
@ -123,7 +123,7 @@ application deadline.
|
|||
We are more interested in candidates if we see them submitting good
|
||||
contributions to Zulip projects, helping other applicants on GitHub
|
||||
and on
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.html),
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.md),
|
||||
learning from our suggestions,
|
||||
[trying to solve their own obstacles and then asking well-formed
|
||||
questions](https://blogs.akamai.com/2013/10/you-must-try-and-then-you-must-ask.html),
|
||||
|
@ -166,7 +166,7 @@ mentoring projects. We usually decide which contributors are
|
|||
mentoring which projects based in part on who is a good fit for the
|
||||
needs of each student as well as technical expertise. You can reach
|
||||
us via [#GSoC](https://chat.zulip.org/#narrow/stream/14-GSoC) on
|
||||
[the Zulip development community server](../contributing/chat-zulip-org.html),
|
||||
[the Zulip development community server](../contributing/chat-zulip-org.md),
|
||||
(compose a new stream message with your name as the topic).
|
||||
|
||||
Zulip operates under group mentorship. That means you should
|
||||
|
@ -216,7 +216,7 @@ skills needed, and try to emphasize where strong skills with
|
|||
particular tools are likely to be important for a given project.
|
||||
|
||||
For all of our projects, an important skill to develop is a good
|
||||
command of Git; read [our Git Guide](../git/overview.html) in full to
|
||||
command of Git; read [our Git Guide](../git/overview.md) in full to
|
||||
learn how to use it well. Of particular importance is mastering using
|
||||
Git rebase so that you can construct commits that are clearly correct
|
||||
and explain why they are correct.
|
||||
|
@ -260,7 +260,7 @@ CSS](https://github.com/zulip/zulip/).
|
|||
|
||||
- Fill in the gaps in Zulip's
|
||||
[REST API documentation](https://zulipchat.com/api). Zulip has a
|
||||
[nice framework](../tutorials/documenting-api-endpoints.html) for
|
||||
[nice framework](../tutorials/documenting-api-endpoints.md) for
|
||||
writing API documentation built by a student last summer based on
|
||||
the OpenAPI standard with built-in automated tests, but there are a
|
||||
few dozen endpoints that are missing, several of which are quite
|
||||
|
@ -282,7 +282,7 @@ CSS](https://github.com/zulip/zulip/).
|
|||
e.g. having built a prototype with
|
||||
[the Django Oauth toolkit](https://django-oauth-toolkit.readthedocs.io/en/latest/)
|
||||
would be great to demonstrate as part of an application. The
|
||||
[Zulip integration writing guide](../subsystems/integration-docs.html)
|
||||
[Zulip integration writing guide](../subsystems/integration-docs.md)
|
||||
and
|
||||
[integration documentation](https://chat.zulip.org/integrations/)
|
||||
are useful materials for learning about how things currently work,
|
||||
|
@ -335,7 +335,7 @@ CSS](https://github.com/zulip/zulip/).
|
|||
at `contrib_bots/` in the main Zulip repository that can be used for
|
||||
testing; the design document for the deployment part of this vision
|
||||
(likely part 1) is
|
||||
[here](../subsystems/custom-apps.html).
|
||||
[here](../subsystems/custom-apps.md).
|
||||
**Skills recommended**: Python and JavaScript/CSS, plus devops
|
||||
skills (Linux deployment, Docker, puppet etc.) are all useful here.
|
||||
Experience writing tools using various popular APIs is helpful for
|
||||
|
@ -382,7 +382,7 @@ CSS](https://github.com/zulip/zulip/).
|
|||
semi-duplicate code for each feature. **Skills recommended**: A
|
||||
good mix of Python/Django and HTML/CSS/JavaScript skill is ideal.
|
||||
The system for adding new features is
|
||||
[well documented](../tutorials/new-feature-tutorial.html).
|
||||
[well documented](../tutorials/new-feature-tutorial.md).
|
||||
Expert: Shubham Dhama.
|
||||
|
||||
- Rebuild the Zulip web UI using a modern reactive layer like vue.js.
|
||||
|
@ -390,7 +390,7 @@ CSS](https://github.com/zulip/zulip/).
|
|||
presence layer), then move on to more complex pieces (like the
|
||||
subscriptions page), and finally attach the main UI. Definitely worth
|
||||
reading the vue.js documentation and reading
|
||||
[how Zulip's real-time sync works](../subsystems/events-system.html).
|
||||
[how Zulip's real-time sync works](../subsystems/events-system.md).
|
||||
**Skills recommended**: Strong JavaScript experience, good
|
||||
communication skills and an eye for detail. We think this would be an
|
||||
awesome project, but rewrite projects often introduce lots of bugs, so
|
||||
|
@ -398,7 +398,7 @@ we're interested in particularly careful candidates who have the
|
|||
discipline to redo a small component at a time and carefully test for
|
||||
regressions. Good ways to demonstrate qualification for this are
|
||||
finding and reporting bugs using
|
||||
[Zulip's manual UI testing guide](../testing/manual-testing.html)
|
||||
[Zulip's manual UI testing guide](../testing/manual-testing.md)
|
||||
and doing
|
||||
[refactoring projects](https://github.com/zulip/zulip/labels/area%3A%20refactoring).
|
||||
Expert: Tommy Ip, Tim Abbott.
|
||||
|
@ -436,7 +436,7 @@ Expert: Tommy Ip, Tim Abbott.
|
|||
single area).
|
||||
|
||||
A possible specific larger project in this space is working on
|
||||
adding [mypy](../testing/mypy.html) stubs
|
||||
adding [mypy](../testing/mypy.md) stubs
|
||||
for Django in mypy to make our type checking more powerful. Read
|
||||
[our mypy blog post](https://blog.zulip.org/2016/10/13/static-types-in-python-oh-mypy/)
|
||||
for details on how mypy works and is integrated into zulip. This
|
||||
|
|
|
@ -27,9 +27,9 @@ priority projects.
|
|||
We welcome participation from the community in influencing the Zulip
|
||||
roadmap. If a bug or missing feature is causing significant pain for your
|
||||
organization, we appreciate your commenting to that effect, either in
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.html) or on the
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.md) or on the
|
||||
relevant GitHub issue, with an explanation of how the issue impacts
|
||||
your use case. See [Reporting issues](contributing.html#reporting-issues)
|
||||
your use case. See [Reporting issues](contributing.md#reporting-issues)
|
||||
for more information.
|
||||
|
||||
[label-blocker]:
|
||||
|
|
|
@ -118,7 +118,7 @@ email address, if it isn't the same as the "Zulip username").
|
|||
**If you are using LDAP for authentication**: you will need to enable
|
||||
the `zproject.backends.ZulipLDAPAuthBackend` auth backend, in
|
||||
`AUTHENTICATION_BACKENDS` in `/etc/zulip/settings.py`. After doing
|
||||
so (and as always [restarting the Zulip server](settings.html) to ensure
|
||||
so (and as always [restarting the Zulip server](settings.md) to ensure
|
||||
your settings changes take effect), you should be able to log into
|
||||
Zulip by entering your email address and LDAP password on the Zulip
|
||||
login form.
|
||||
|
@ -388,9 +388,9 @@ For example, the
|
|||
was about 30 lines of code, plus some documentation and an
|
||||
[automatically generated migration][schema-migrations]. We also have
|
||||
helpful developer documentation on
|
||||
[testing auth backends](../subsystems/auth.html).
|
||||
[testing auth backends](../subsystems/auth.md).
|
||||
|
||||
[schema-migrations]: ../subsystems/schema-migrations.html
|
||||
[schema-migrations]: ../subsystems/schema-migrations.md
|
||||
[python-social-auth]: https://python-social-auth.readthedocs.io/en/latest/
|
||||
|
||||
## Development only
|
||||
|
|
|
@ -18,14 +18,14 @@ git clone https://github.com/zulip/zulip.git zulip-server-git
|
|||
```
|
||||
|
||||
and then
|
||||
[continue the normal installation instructions](../production/install.html#step-2-install-zulip).
|
||||
You can also [upgrade Zulip from Git](../production/maintain-secure-upgrade.html#upgrading-from-a-git-repository).
|
||||
[continue the normal installation instructions](../production/install.md#step-2-install-zulip).
|
||||
You can also [upgrade Zulip from Git](../production/maintain-secure-upgrade.md#upgrading-from-a-git-repository).
|
||||
|
||||
## Zulip in Docker
|
||||
|
||||
Zulip has an officially supported, experimental
|
||||
[docker image](https://github.com/zulip/docker-zulip). Please note
|
||||
that Zulip's [normal installer](../production/install.html) has been
|
||||
that Zulip's [normal installer](../production/install.md) has been
|
||||
extremely reliable for years, whereas the Docker image is new and has
|
||||
rough edges, so we recommend the normal installer unless you have a
|
||||
specific reason to prefer Docker.
|
||||
|
@ -67,7 +67,7 @@ of managing chat.zulip.org and zulipchat.com.
|
|||
Unfortunately, you cannot use most third-party database-as-a-service
|
||||
provides like Amazon RDS as the database provider with Zulip without a
|
||||
degraded experience. Zulip let you choose one of two
|
||||
[full-text search postgres extensions](../subsystems/full-text-search.html).
|
||||
[full-text search postgres extensions](../subsystems/full-text-search.md).
|
||||
Neither is available in Amazon RDS. As a result, if you use one of
|
||||
those providers, Zulip's full-text search will be unavailable.
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ email addresses and send notifications.
|
|||
example: `email_password = abcd1234`.
|
||||
|
||||
Like any other change to the Zulip configuration, be sure to
|
||||
[restart the server](settings.html) to make your changes take
|
||||
[restart the server](settings.md) to make your changes take
|
||||
effect.
|
||||
|
||||
4. Test that your configuration is working. See the test command in
|
||||
|
|
|
@ -29,7 +29,7 @@ impossible or unlikely, the extra complexity required for renumbering
|
|||
makes them structurally more risky than the direct postgres backup
|
||||
process.
|
||||
|
||||
[backups]: ../production/maintain-secure-upgrade.html#backups
|
||||
[backups]: ../production/maintain-secure-upgrade.md#backups
|
||||
|
||||
## Preventing changes during the export
|
||||
|
||||
|
@ -83,7 +83,7 @@ formats are consistent. For exports from zulipchat.com, usually this
|
|||
means you need to upgrade your Zulip server to the latest `master`
|
||||
branch, using [upgrade-zulip-from-git][upgrade-zulip-from-git].
|
||||
|
||||
First [install a new Zulip server](../production/install.html),
|
||||
First [install a new Zulip server](../production/install.md),
|
||||
skipping "Step 3: Create a Zulip organization, and log in" (you'll
|
||||
create your Zulip organization via the data import tool instead).
|
||||
|
||||
|
@ -110,7 +110,7 @@ cd /home/zulip/deployments/current
|
|||
This could take several minutes to run, depending on how much data you're
|
||||
importing.
|
||||
|
||||
[upgrade-zulip-from-git]: ../production/maintain-secure-upgrade.html#upgrading-from-a-git-repository
|
||||
[upgrade-zulip-from-git]: ../production/maintain-secure-upgrade.md#upgrading-from-a-git-repository
|
||||
|
||||
**Import options**
|
||||
|
||||
|
|
|
@ -82,5 +82,5 @@ We don't provide a convenient way to uninstall a Zulip server.
|
|||
|
||||
Most of the limitations are things we'd accept a pull request to fix;
|
||||
we welcome contributions to shrink this list of gotchas. Chat with us
|
||||
in the [chat.zulip.org community](../contributing/chat-zulip-org.html) if you're
|
||||
in the [chat.zulip.org community](../contributing/chat-zulip-org.md) if you're
|
||||
interested in helping!
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
|
||||
Make sure you want to install a Zulip production server. If you'd
|
||||
instead like to test or develop a new feature, we recommend the
|
||||
[Zulip development server](../development/overview.html#requirements) instead.
|
||||
[Zulip development server](../development/overview.md#requirements) instead.
|
||||
If you just want to play around with Zulip and see what it looks like, you
|
||||
can create a test organization at <https://zulipchat.com>.
|
||||
|
||||
You'll need an Ubuntu or Debian system that satisfies
|
||||
[the installation requirements](../production/requirements.html), or
|
||||
you can use Zulip's [experimental Docker image](../production/deployment.html#zulip-in-docker).
|
||||
[the installation requirements](../production/requirements.md), or
|
||||
you can use Zulip's [experimental Docker image](../production/deployment.md#zulip-in-docker).
|
||||
|
||||
## Step 1: Download the latest release
|
||||
|
||||
|
@ -25,7 +25,7 @@ tar -xf zulip-server-latest.tar.gz
|
|||
* If you'd like to verify the download, we
|
||||
[publish the sha256sums of our release tarballs](https://www.zulip.org/dist/releases/SHA256SUMS.txt).
|
||||
* You can also
|
||||
[install a pre-release version of Zulip](../production/deployment.html#installing-zulip-from-git)
|
||||
[install a pre-release version of Zulip](../production/deployment.md#installing-zulip-from-git)
|
||||
using code from our [repository on GitHub](https://github.com/zulip/zulip/).
|
||||
|
||||
## Step 2: Install Zulip
|
||||
|
@ -76,9 +76,9 @@ If the script gives an error, consult [Troubleshooting](#troubleshooting) below.
|
|||
If you'd prefer to acquire an SSL certificate yourself in any other
|
||||
way, it's easy to [provide it to Zulip][doc-ssl-manual].
|
||||
|
||||
[doc-settings]: ../production/settings.html
|
||||
[doc-certbot]: ../production/ssl-certificates.html#certbot-recommended
|
||||
[doc-ssl-manual]: ../production/ssl-certificates.html#manual-install
|
||||
[doc-settings]: ../production/settings.md
|
||||
[doc-certbot]: ../production/ssl-certificates.md#certbot-recommended
|
||||
[doc-ssl-manual]: ../production/ssl-certificates.md#manual-install
|
||||
|
||||
## Step 3: Create a Zulip organization, and log in
|
||||
|
||||
|
@ -89,7 +89,7 @@ and return to the the import instructions.
|
|||
|
||||
[hipchat-import]: https://zulipchat.com/help/import-from-hipchat
|
||||
[slack-import]: https://zulipchat.com/help/import-from-slack
|
||||
[zulip-backups]: ../production/maintain-secure-upgrade.html#backups
|
||||
[zulip-backups]: ../production/maintain-secure-upgrade.md#backups
|
||||
|
||||
Otherwise, open the link in a browser. Follow the prompts to set up
|
||||
your organization, and your own user account as an administrator.
|
||||
|
@ -98,14 +98,14 @@ Then, log in!
|
|||
The link is a secure one-time-use link. If you need another
|
||||
later, you can generate a new one by running `manage.py
|
||||
generate_realm_creation_link` on the server. See also our doc on
|
||||
running [multiple organizations on the same server](multiple-organizations.html)
|
||||
running [multiple organizations on the same server](multiple-organizations.md)
|
||||
if that's what you're planning to do.
|
||||
|
||||
## Step 4: Configure and use
|
||||
|
||||
To really see Zulip in action, you'll need to get the people you work
|
||||
together with using it with you.
|
||||
* [Set up outgoing email](email.html) so Zulip can confirm new users'
|
||||
* [Set up outgoing email](email.md) so Zulip can confirm new users'
|
||||
email addresses and send notifications.
|
||||
* Learn how to [get your organization started][realm-admin-docs] using
|
||||
Zulip at its best.
|
||||
|
@ -117,8 +117,8 @@ Learning more:
|
|||
for server administrators. This extremely low-traffic list is for
|
||||
important announcements, including new releases and security issues.
|
||||
* Follow [Zulip on Twitter](https://twitter.com/zulip).
|
||||
* Learn how to [configure your Zulip server settings](settings.html).
|
||||
* Learn about [maintaining a production Zulip server](maintain-secure-upgrade.html).
|
||||
* Learn how to [configure your Zulip server settings](settings.md).
|
||||
* Learn about [maintaining a production Zulip server](maintain-secure-upgrade.md).
|
||||
|
||||
[realm-admin-docs]: https://zulipchat.com/help/getting-your-organization-started-with-zulip
|
||||
|
||||
|
@ -141,7 +141,7 @@ Postgres, RabbitMQ, Memcached and Redis.
|
|||
* Initializes Zulip's database.
|
||||
|
||||
If you'd like to deploy Zulip with these services on different
|
||||
machines, check out our [deployment options documentation](deployment.html).
|
||||
machines, check out our [deployment options documentation](deployment.md).
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
|
@ -167,13 +167,13 @@ and can just skip that step.
|
|||
**After the install script.**
|
||||
If you get an error after `scripts/setup/install` completes, check
|
||||
the bottom of `/var/log/zulip/errors.log` for a traceback, and consult
|
||||
the [troubleshooting section](troubleshooting.html) for advice on
|
||||
the [troubleshooting section](troubleshooting.md) for advice on
|
||||
how to debug.
|
||||
|
||||
**Community.**
|
||||
If the tips above don't help, please visit
|
||||
[#production help](https://chat.zulip.org/#narrow/stream/31-production-help)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html) for
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md) for
|
||||
realtime help or email zulip-help@googlegroups.com with the full
|
||||
traceback, and we'll try to help you out! Please provide details like
|
||||
the full traceback from the bottom of `/var/log/zulip/errors.log` in
|
||||
|
|
|
@ -12,7 +12,7 @@ secure Zulip installation, including:
|
|||
|
||||
You may also want to read this related content:
|
||||
|
||||
- [Security Model](../production/security-model.html)
|
||||
- [Security Model](../production/security-model.md)
|
||||
|
||||
## Upgrading
|
||||
|
||||
|
@ -275,7 +275,7 @@ extracting the entire archive.
|
|||
tar -Oaxf /path/to/archive/zulip-backup-rest.tar.gz zulip-backup/zulip-version
|
||||
```
|
||||
|
||||
[install-server]: ../production/install.html
|
||||
[install-server]: ../production/install.md
|
||||
|
||||
### What is included
|
||||
|
||||
|
@ -302,7 +302,7 @@ backup archives, and you may want to backup separately:
|
|||
compared to the rest of the data for a Zulip server.
|
||||
|
||||
* Files uploaded with the Zulip
|
||||
[S3 file upload backend](../production/upload-backends.html). We
|
||||
[S3 file upload backend](../production/upload-backends.md). We
|
||||
don't include these for two reasons. First, the uploaded file data
|
||||
in S3 can easily be many times larger than the rest of the backup,
|
||||
and downloading it all to a server doing a backup could easily
|
||||
|
@ -358,7 +358,7 @@ more human-readable and easier to parse, and doesn't have the
|
|||
requirement that the same set of Zulip organizations exist on the two
|
||||
servers (which is critical for migrations to and from Zulip Cloud).
|
||||
|
||||
[export-import]: ../production/export-and-import.html
|
||||
[export-import]: ../production/export-and-import.md
|
||||
|
||||
### Restore from manual backups
|
||||
|
||||
|
@ -473,16 +473,16 @@ running Zulip with larger teams (especially >1000 users).
|
|||
* For an organization with 100+ users, it's important to have more
|
||||
than 4GB of RAM on the system. Zulip will install on a system with
|
||||
2GB of RAM, but with less than 3.5GB of RAM, it will run its
|
||||
[queue processors](../subsystems/queuing.html) multithreaded to conserve memory;
|
||||
[queue processors](../subsystems/queuing.md) multithreaded to conserve memory;
|
||||
this creates a significant performance bottleneck.
|
||||
|
||||
* [chat.zulip.org](../contributing/chat-zulip-org.html), with thousands of user
|
||||
* [chat.zulip.org](../contributing/chat-zulip-org.md), with thousands of user
|
||||
accounts and thousands of messages sent every week, has 8GB of RAM,
|
||||
4 cores, and 80GB of disk. The CPUs are essentially always idle,
|
||||
but the 8GB of RAM is important.
|
||||
|
||||
* We recommend using a [remote postgres
|
||||
database](postgres.html) for isolation, though it is
|
||||
database](postgres.md) for isolation, though it is
|
||||
not required. In the following, we discuss a relatively simple
|
||||
configuration with two types of servers: application servers
|
||||
(running Django, Tornado, RabbitMQ, Redis, Memcached, etc.) and
|
||||
|
@ -541,7 +541,7 @@ welcome! This is an area we are hoping to improve.
|
|||
## Securing your Zulip server
|
||||
|
||||
Zulip's security model is discussed in
|
||||
[a separate document](../production/security-model.html).
|
||||
[a separate document](../production/security-model.md).
|
||||
|
||||
## Management commands
|
||||
|
||||
|
@ -579,7 +579,7 @@ system-internal bots like `welcome-bot`; you are unlikely to need to
|
|||
interact with that realm.)
|
||||
|
||||
Unless you are
|
||||
[hosting multiple organizations on your Zulip server](../production/multiple-organizations.html),
|
||||
[hosting multiple organizations on your Zulip server](../production/multiple-organizations.md),
|
||||
your single Zulip organization on the root domain will have the empty
|
||||
string (`''`) as its `string_id`. So you can run e.g.:
|
||||
```
|
||||
|
@ -653,4 +653,4 @@ There are a large number of useful management commands under
|
|||
|
||||
## Hosting multiple Zulip organizations
|
||||
|
||||
This is explained in detail on [its own page](../production/multiple-organizations.html).
|
||||
This is explained in detail on [its own page](../production/multiple-organizations.md).
|
||||
|
|
|
@ -21,7 +21,7 @@ follows:
|
|||
1. Uncomment the `PUSH_NOTIFICATION_BOUNCER_URL =
|
||||
'https://push.zulipchat.com'` line in your `/etc/zulip/settings.py`
|
||||
file (i.e. remove the `#` at the start of the line), and
|
||||
[restart your Zulip server](../production/maintain-secure-upgrade.html#updating-settings).
|
||||
[restart your Zulip server](../production/maintain-secure-upgrade.md#updating-settings).
|
||||
If you installed your Zulip server with a version older than 1.6,
|
||||
you'll need to add the line (it won't be there to uncomment).
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ single server.
|
|||
|
||||
Throughout this article, we'll assume you're working on a zulip server
|
||||
with hostname `zulip.example.com`. You may also find the more
|
||||
[technically focused article on realms](../subsystems/realms.html) to be useful
|
||||
[technically focused article on realms](../subsystems/realms.md) to be useful
|
||||
reading.
|
||||
|
||||
## Subdomains
|
||||
|
@ -33,13 +33,13 @@ things:
|
|||
file. That setting is the default in 1.7 and later.
|
||||
* Make sure you have SSL certificates for all of the subdomains you're
|
||||
going to use. If you're using
|
||||
[our LetsEncrypt instructions](ssl-certificates.html), it's easy to
|
||||
[our LetsEncrypt instructions](ssl-certificates.md), it's easy to
|
||||
just specify multiple subdomains in your certificate request.
|
||||
* If necessary, modify your `nginx` configuration to use your new
|
||||
certificates.
|
||||
* Use `./manage.py generate_realm_creation_link` again to create your
|
||||
new organization. Review
|
||||
[the install instructions](install.html) if you need a
|
||||
[the install instructions](install.md) if you need a
|
||||
refresher on how this works.
|
||||
* If you're planning on using GitHub auth or another social
|
||||
authentication method, review
|
||||
|
@ -55,7 +55,7 @@ the homepage for the server is a copy of the Zulip homepage.
|
|||
You'll need to install an SSL certificate valid for all the
|
||||
(sub)domains you're using your Zulip server with. You can get an SSL
|
||||
certificate covering several domains for free by using
|
||||
[our Certbot wrapper tool](../production/ssl-certificates.html#after-zulip-is-already-installed),
|
||||
[our Certbot wrapper tool](../production/ssl-certificates.md#after-zulip-is-already-installed),
|
||||
though if you're going to host a large number of organizations, you
|
||||
may want to get a wildcard certificate. You can also get a wildcard
|
||||
certificate for
|
||||
|
|
|
@ -8,7 +8,7 @@ When a user tries to set a password, we use [zxcvbn][zxcvbn] to check
|
|||
that it isn't a weak one.
|
||||
|
||||
See discussion in [our main docs for server
|
||||
admins](../production/security-model.html#passwords). This doc explains in more
|
||||
admins](../production/security-model.md#passwords). This doc explains in more
|
||||
detail how we set the default threshold (`PASSWORD_MIN_GUESSES`) we use.
|
||||
|
||||
First, read the doc section there. (It's short.)
|
||||
|
|
|
@ -25,7 +25,7 @@ strongly recommend using either a fresh machine instance in a cloud
|
|||
provider, a fresh VM, or a dedicated machine. If you decide to
|
||||
disregard our advice and use a server that hosts other services, we
|
||||
can't support you, but
|
||||
[we do have some notes on issues you'll encounter](install-existing-server.html).
|
||||
[we do have some notes on issues you'll encounter](install-existing-server.md).
|
||||
|
||||
#### Operating System
|
||||
|
||||
|
@ -61,7 +61,7 @@ https://help.ubuntu.com/community/Repositories/Ubuntu
|
|||
for organizations with a hundreds of users (active or no).
|
||||
|
||||
See our
|
||||
[documentation on scalability](../production/maintain-secure-upgrade.html#scalability)
|
||||
[documentation on scalability](../production/maintain-secure-upgrade.md#scalability)
|
||||
for advice on hardware requirements for larger organizations.
|
||||
|
||||
* Disk space: You'll need at least 10GB of free disk space for a
|
||||
|
@ -72,7 +72,7 @@ https://help.ubuntu.com/community/Repositories/Ubuntu
|
|||
messages sent. We recommend using an SSD and avoiding cloud storage
|
||||
backends that limit the IOPS per second, since the disk is primarily
|
||||
used for the database (assuming you're using the
|
||||
[S3 file uploads backend](../production/upload-backends.html)).
|
||||
[S3 file uploads backend](../production/upload-backends.md)).
|
||||
|
||||
#### Network and Security Specifications
|
||||
|
||||
|
@ -114,10 +114,10 @@ available: [the `--self-signed-cert` option][doc-self-signed] in the
|
|||
installer.
|
||||
|
||||
If you'd rather acquire an SSL certificate another way, see our [SSL
|
||||
certificate documentation](ssl-certificates.html).
|
||||
certificate documentation](ssl-certificates.md).
|
||||
|
||||
[doc-certbot]: ssl-certificates.html#certbot-recommended
|
||||
[doc-self-signed]: ssl-certificates.html#self-signed-certificate
|
||||
[doc-certbot]: ssl-certificates.md#certbot-recommended
|
||||
[doc-self-signed]: ssl-certificates.md#self-signed-certificate
|
||||
|
||||
#### Outgoing email
|
||||
|
||||
|
@ -126,9 +126,9 @@ certificate documentation](ssl-certificates.html).
|
|||
during the signup process, missed message notifications, password
|
||||
reset, etc.). If you don't have an existing outgoing SMTP solution,
|
||||
read about
|
||||
[free outgoing SMTP options and options for prototyping](email.html#free-outgoing-email-services).
|
||||
[free outgoing SMTP options and options for prototyping](email.md#free-outgoing-email-services).
|
||||
|
||||
Once you have met these requirements, see [full instructions for installing
|
||||
Zulip in production](../production/install.html).
|
||||
Zulip in production](../production/install.md).
|
||||
|
||||
[trusty-eol]: https://wiki.ubuntu.com/Releases
|
||||
|
|
|
@ -4,7 +4,7 @@ This section attempts to document the Zulip security model.
|
|||
It likely does not cover every issue; if
|
||||
there are details you're curious about, please feel free to ask
|
||||
questions in [#production help](https://chat.zulip.org/#narrow/stream/31-production-help)
|
||||
on the [Zulip community server](../contributing/chat-zulip-org.html)
|
||||
on the [Zulip community server](../contributing/chat-zulip-org.md)
|
||||
(or if you think
|
||||
you've found a security bug, please report it to
|
||||
zulip-security@googlegroups.com so we can do a responsible security
|
||||
|
@ -39,7 +39,7 @@ announcement).
|
|||
* The preferred way to login to Zulip is using an SSO solution like
|
||||
Google Auth, LDAP, or similar, but Zulip also supports password
|
||||
authentication. See
|
||||
[the authentication methods documentation](../production/authentication-methods.html)
|
||||
[the authentication methods documentation](../production/authentication-methods.md)
|
||||
for details on Zulip's available authentication methods.
|
||||
|
||||
### Passwords
|
||||
|
@ -65,7 +65,7 @@ strength allowed is controlled by two settings in
|
|||
By default, `PASSWORD_MIN_GUESSES` is 10000. This provides
|
||||
significant protection against online attacks, while limiting the
|
||||
burden imposed on users choosing a password. See
|
||||
[password strength](../production/password-strength.html) for an extended
|
||||
[password strength](../production/password-strength.md) for an extended
|
||||
discussion on how we chose this value.
|
||||
|
||||
Estimating the guessability of a password is a complex problem and
|
||||
|
|
|
@ -46,7 +46,7 @@ If you want an additional or different authentication backend, you
|
|||
will need to uncomment one or more and then do any additional
|
||||
configuration required for that backend as documented in the
|
||||
`settings.py` file. See the
|
||||
[section on Authentication](../production/authentication-methods.html) for more
|
||||
[section on Authentication](../production/authentication-methods.md) for more
|
||||
detail on the available authentication backends and how to configure
|
||||
them.
|
||||
|
||||
|
@ -63,7 +63,7 @@ their push notification protocols, the Zulip mobile apps for
|
|||
[Android](https://play.google.com/store/apps/details?id=com.zulipmobile)
|
||||
can only receive push notifications from a single Zulip server. We
|
||||
have configured that server to be `push.zulipchat.com`, and offer a
|
||||
[push notification forwarding service](mobile-push-notifications.html) that
|
||||
[push notification forwarding service](mobile-push-notifications.md) that
|
||||
forwards push notifications through our servers to mobile devices.
|
||||
Read the linked documentation for instructions on how to register for
|
||||
and configure this service.
|
||||
|
@ -92,7 +92,7 @@ been added in more recent versions of Zulip.
|
|||
|
||||
Since Zulip's settings file is a Python script, there are a number of
|
||||
other things that one can configure that are not documented; ask on
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.html)
|
||||
[chat.zulip.org](../contributing/chat-zulip-org.md)
|
||||
if there's something you'd like to do but can't figure out how to.
|
||||
|
||||
[settings-py-template]: https://github.com/zulip/zulip/blob/master/zproject/prod_settings_template.py
|
||||
|
@ -120,4 +120,4 @@ Zulip documentation cover everything anyone might want to know about
|
|||
running Zulip in production.
|
||||
|
||||
Next: [Maintaining and upgrading Zulip in
|
||||
production](../production/maintain-secure-upgrade.html).
|
||||
production](../production/maintain-secure-upgrade.md).
|
||||
|
|
|
@ -75,7 +75,7 @@ Internet.
|
|||
If you need to configure a multiple domain certificate, you can generate
|
||||
one as described in the section below after installing Zulip.
|
||||
|
||||
[doc-install-script]: ../production/install.html#step-2-install-zulip
|
||||
[doc-install-script]: ../production/install.md#step-2-install-zulip
|
||||
|
||||
### After Zulip is already installed
|
||||
|
||||
|
|
|
@ -6,8 +6,8 @@ supervisorctl](#using-supervisorctl), to learn how to use the
|
|||
Supervisor client to monitor and manage services.
|
||||
|
||||
If you haven't already, now might be a good time to read Zulip's [architectural
|
||||
overview](../overview/architecture-overview.html), particularly the
|
||||
[Components](../overview/architecture-overview.html#components) section. This will help you
|
||||
overview](../overview/architecture-overview.md), particularly the
|
||||
[Components](../overview/architecture-overview.md#components) section. This will help you
|
||||
understand the many services Zulip uses.
|
||||
|
||||
If you encounter issues while running Zulip, take a look at Zulip's logs, which
|
||||
|
|
|
@ -138,7 +138,7 @@ need a block like this:
|
|||
```
|
||||
|
||||
The file-uploads bucket should not be world-readable. See the
|
||||
[documentation on the Zulip security model](security-model.html) for
|
||||
[documentation on the Zulip security model](security-model.md) for
|
||||
details on the security model for uploaded files.
|
||||
|
||||
## Migrating from local uploads to Amazon S3 backend
|
||||
|
|
|
@ -6,7 +6,7 @@ environment.
|
|||
|
||||
## Testing OAuth in development
|
||||
|
||||
Among the many [authentication methods](../production/authentication-methods.html)
|
||||
Among the many [authentication methods](../production/authentication-methods.md)
|
||||
we support, a server can be configured to allow users to sign in with
|
||||
their Google accounts or GitHub accounts, using the OAuth protocol.
|
||||
|
||||
|
@ -56,9 +56,9 @@ The steps to do this are a variation of the steps documented in
|
|||
Some OAuth providers (such as Facebook) require HTTPS on the callback
|
||||
URL they post back to, which isn't supported directly by the Zulip
|
||||
development environment. If you run a
|
||||
[remote Zulip development server](../development/remote.html), we have
|
||||
[remote Zulip development server](../development/remote.md), we have
|
||||
instructions for
|
||||
[an nginx reverse proxy with SSL](../development/remote.html#using-an-nginx-reverse-proxy)
|
||||
[an nginx reverse proxy with SSL](../development/remote.md#using-an-nginx-reverse-proxy)
|
||||
that you can use for your development efforts.
|
||||
|
||||
## Testing LDAP in development
|
||||
|
@ -77,7 +77,7 @@ actual flows for LDAP configuration.
|
|||
- To enable fakeldap, set `FAKE_LDAP_MODE` in
|
||||
`zproject/dev_settings.py` to one of the following options. For more
|
||||
information on these modes, refer to
|
||||
[our production docs](../production/authentication-methods.html#ldap-including-active-directory):
|
||||
[our production docs](../production/authentication-methods.md#ldap-including-active-directory):
|
||||
- `a`: If users' email addresses are in LDAP and used as username.
|
||||
- `b`: If LDAP only has usernames but email addresses are of the form
|
||||
username@example.com
|
||||
|
|
|
@ -247,7 +247,7 @@ avatars, similar details for streams, recent message history, etc.
|
|||
These days are fetched in the `/register` endpoint (or `page_params`
|
||||
for the webapp), and kept correct over time. The key to keeping these
|
||||
state up to date is Zulip's
|
||||
[real-time events system](../subsystems/events-system.html), which
|
||||
[real-time events system](../subsystems/events-system.md), which
|
||||
allows the server to notify clients whenever state that might be
|
||||
cached by clients is changed. Clients are responsible for handling
|
||||
the events, updating their state, and rerendering any UI components
|
||||
|
|
|
@ -14,7 +14,7 @@ of Zulip; it's primarily intended to assist debugging.
|
|||
A `Client` is used to sort messages into client categories such as
|
||||
`ZulipElectron` on the `/stats`
|
||||
[page](https://chat.zulip.org/stats). For more information see,
|
||||
[Analytics](analytics.html).
|
||||
[Analytics](analytics.md).
|
||||
|
||||
## Integrations
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ document:
|
|||
|
||||
This document focuses almost entirely on the **export** piece. Issues
|
||||
with getting Zulip itself running are out of scope here; see [the
|
||||
production installation instructions](../index.html#zulip-in-production).
|
||||
production installation instructions](../index.md#zulip-in-production).
|
||||
As for the import side of things, we only touch on it implicitly. (My
|
||||
reasoning was that we *had* to get the export piece right in a timely
|
||||
fashion, even if it meant we would have to sort out some straggling
|
||||
|
|
|
@ -92,12 +92,12 @@ the backend, but does in JavaScript.
|
|||
|
||||
For the third-party services like Postgres, Redis, Nginx, and RabbitMQ
|
||||
that are documented in the
|
||||
[architecture overview](../overview/architecture-overview.html), we rely on the
|
||||
[architecture overview](../overview/architecture-overview.md), we rely on the
|
||||
versions of those packages provided alongside the Linux distribution
|
||||
on which Zulip is deployed. Because Zulip
|
||||
[only supports Ubuntu in production](../production/requirements.html), this
|
||||
[only supports Ubuntu in production](../production/requirements.md), this
|
||||
usually means `apt`, though we do support
|
||||
[other platforms in development](../development/setup-advanced.html). Since
|
||||
[other platforms in development](../development/setup-advanced.md). Since
|
||||
we don't control the versions of these dependencies, we avoid relying
|
||||
on specific versions of these packages wherever possible.
|
||||
|
||||
|
@ -120,7 +120,7 @@ backported versions of other dependencies (e.g. `camo`, to fix a buggy
|
|||
possible by getting issues addressed in the upstream distributions.
|
||||
|
||||
We also rely on the `pgroonga` PPA for the `pgroonga` postgres
|
||||
extension, used by our [full-text search](full-text-search.html).
|
||||
extension, used by our [full-text search](full-text-search.md).
|
||||
|
||||
## Python packages
|
||||
|
||||
|
@ -230,7 +230,7 @@ super fast internet. You can use tmux or screen to make sure that the
|
|||
[script keeps running even if you get disconnected][stack-overflow]
|
||||
from the SSH session.
|
||||
|
||||
[mypy-docs]: ../testing/mypy.html
|
||||
[mypy-docs]: ../testing/mypy.md
|
||||
[requirements-readme]: https://github.com/zulip/zulip/blob/master/requirements/README.md
|
||||
[stack-overflow]: https://askubuntu.com/questions/8653/how-to-keep-processes-running-after-ending-ssh-session
|
||||
[caching]: https://help.github.com/en/articles/caching-your-github-password-in-git
|
||||
|
@ -254,7 +254,7 @@ reasoning here.
|
|||
dependencies in the `yarn.lock` file; `yarn install` updates the
|
||||
`yarn.lock` files.
|
||||
* `tools/update-prod-static`. This process is discussed in detail in
|
||||
the [static asset pipeline](../subsystems/front-end-build-process.html) article,
|
||||
the [static asset pipeline](../subsystems/front-end-build-process.md) article,
|
||||
but we don't use the `node_modules` directories directly in
|
||||
production. Instead, static assets are compiled using our static
|
||||
asset pipeline and it is the compiled assets that are served
|
||||
|
@ -298,7 +298,7 @@ Zulip uses the [iamcal emoji data package][iamcal] for its emoji data
|
|||
and sprite sheets. We download this dependency using `npm`, and then
|
||||
have a tool, `tools/setup/build_emoji`, which reformats the emoji data
|
||||
into the files under `static/generated/emoji`. Those files are in
|
||||
turn used by our [markdown processor](../subsystems/markdown.html) and
|
||||
turn used by our [markdown processor](../subsystems/markdown.md) and
|
||||
`tools/update-prod-static` to make Zulip's emoji work in the various
|
||||
environments where they need to be displayed.
|
||||
|
||||
|
@ -309,11 +309,11 @@ directories, with `scripts/lib/clean_emoji_cache.py` responsible for
|
|||
garbage-collection. This caching and garbage-collection is required
|
||||
because a correct emoji implementation involves over 1000 small image
|
||||
files and a few large ones. There is a more extended article on our
|
||||
[emoji infrastructure](emoji.html).
|
||||
[emoji infrastructure](emoji.md).
|
||||
|
||||
### Translations data
|
||||
|
||||
Zulip's [translations infrastructure](../translating/translating.html) generates
|
||||
Zulip's [translations infrastructure](../translating/translating.md) generates
|
||||
several files from the source data, which we manage similar to our
|
||||
emoji, but without the caching (and thus without the
|
||||
garbage-collection). New translations data is downloaded from
|
||||
|
|
|
@ -90,19 +90,19 @@ to do the things one does a lot in each type of documentation.
|
|||
|
||||
To learn more about Zulip's general user documentation,
|
||||
[visit it on zulipchat.com](https://zulipchat.com/help/) or
|
||||
[read our guide on writing user documentation](user-docs.html).
|
||||
[read our guide on writing user documentation](user-docs.md).
|
||||
|
||||
### Integrations documentation
|
||||
|
||||
To learn more about Zulip's integrations documentation,
|
||||
[visit it on zulipchat.com](https://zulipchat.com/integrations/) or
|
||||
[read our guide on writing user documentation](integration-docs.html).
|
||||
[read our guide on writing user documentation](integration-docs.md).
|
||||
|
||||
### API documentation
|
||||
|
||||
To learn more about Zulip's API documentation,
|
||||
[visit it on zulipchat.com](https://zulipchat.com/api/) or
|
||||
[read our tutorial on writing user documentation](../tutorials/documenting-api-endpoints.html).
|
||||
[read our tutorial on writing user documentation](../tutorials/documenting-api-endpoints.md).
|
||||
|
||||
## Automated testing
|
||||
|
||||
|
@ -111,8 +111,8 @@ recommend running locally when making significant edits:
|
|||
|
||||
* `tools/lint` catches a number of common mistakes, and we highly
|
||||
recommend
|
||||
[using our linter pre-commit hook](../git/zulip-tools.html#set-up-git-repo-script).
|
||||
See the [main linter doc](../testing/linters.html) for more details.
|
||||
[using our linter pre-commit hook](../git/zulip-tools.md#set-up-git-repo-script).
|
||||
See the [main linter doc](../testing/linters.md) for more details.
|
||||
|
||||
* The ReadTheDocs docs are built and the links tested by
|
||||
`tools/test-documentation`, which runs `build-docs` and then checks
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
This page has developer documentation on the Zulip email system. If you're
|
||||
trying to configure your server to send email, you might be looking for our
|
||||
guide to [sending outgoing email](../production/email.html). If you're trying to
|
||||
guide to [sending outgoing email](../production/email.md). If you're trying to
|
||||
configure an email integration to receive incoming email (e.g. so that users
|
||||
can reply to missed message emails via email), you might be interested in
|
||||
our instructions for
|
||||
|
@ -43,7 +43,7 @@ Email takes about a quarter second per email to process and send. Generally
|
|||
speaking, if you're sending just one email, doing it in the current process
|
||||
is fine. If you're sending emails in a loop, you probably want to send it
|
||||
from a queue. Documentation on our queueing system is available
|
||||
[here](../subsystems/queuing.html).
|
||||
[here](../subsystems/queuing.md).
|
||||
|
||||
## Development and testing
|
||||
|
||||
|
@ -69,7 +69,7 @@ you have to first configure the following SMTP settings.
|
|||
* The username `EMAIL_HOST_USER` in `zproject/dev_settings.py`.
|
||||
* The password `email_password` in `zproject/dev-secrets.conf`.
|
||||
|
||||
See [this](../production/email.html#free-outgoing-email-services)
|
||||
See [this](../production/email.md#free-outgoing-email-services)
|
||||
section for instructions on obtaining SMTP details.
|
||||
|
||||
**Note: The base_image_uri of the images in forwarded emails would be replaced
|
||||
|
@ -117,7 +117,7 @@ behavior, or other developers will get test failures until they
|
|||
provision.
|
||||
|
||||
While this model is great for the markup side, it isn't ideal for
|
||||
[translations](../translating/translating.html). The Django
|
||||
[translations](../translating/translating.md). The Django
|
||||
translation system works with exact strings, and having different new
|
||||
markup can require translators to re-translate strings, which can
|
||||
result in problems like needing 2 copies of each string (one for
|
||||
|
|
|
@ -61,7 +61,7 @@ The `build_emoji` tool generates the set of files under
|
|||
`static/generated/emoji` is a symlink to that tree; we do this in
|
||||
order to cache old versions to make provisioning and production
|
||||
deployments super fast in the common case that we haven't changed the
|
||||
emoji tooling). See [our dependencies document](../subsystems/dependencies.html)
|
||||
emoji tooling). See [our dependencies document](../subsystems/dependencies.md)
|
||||
for more details on this strategy.
|
||||
|
||||
The emoji tree generated by this process contains several import elements:
|
||||
|
@ -76,7 +76,7 @@ The emoji tree generated by this process contains several import elements:
|
|||
* `images/emoji/*.png`: A farm of symlinks from emoji names to the
|
||||
`images/emoji/unicode/` tree. This is used to serve individual emoji
|
||||
images, as well as for the
|
||||
[backend markdown processor](../subsystems/markdown.html) to know which emoji
|
||||
[backend markdown processor](../subsystems/markdown.md) to know which emoji
|
||||
names exist and what unicode emoji / images they map to. In this
|
||||
tree, we currently include all of the emoji in `emoji-map.json`;
|
||||
this means that if you send `:angry_face:`, it won't autocomplete,
|
||||
|
|
|
@ -4,7 +4,7 @@ Zulip's "events system" is the server-to-client push system that
|
|||
powers our real-time sync. This document explains how it works; to
|
||||
read an example of how a complete feature using this system works,
|
||||
check out the
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.html).
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.md).
|
||||
|
||||
Any single-page web application like Zulip needs a story for how
|
||||
changes made by one client are synced to other clients, though having
|
||||
|
@ -86,7 +86,7 @@ wide range of possible clients, and make it easy for developers.
|
|||
Zulip's event delivery (real-time push) system is based on Tornado,
|
||||
which is ideal for handling a large number of open requests. Details
|
||||
on Tornado are available in the
|
||||
[architecture overview](../overview/architecture-overview.html), but in short it
|
||||
[architecture overview](../overview/architecture-overview.md), but in short it
|
||||
is good at holding open a large number of connections for a long time.
|
||||
The complete system is about 1500 lines of code in `zerver/tornado/`,
|
||||
primarily `zerver/tornado/event_queue.py`.
|
||||
|
@ -262,4 +262,4 @@ correctly, clients are responsible for discarding events related to
|
|||
messages that the client has not yet fetched.
|
||||
|
||||
Additionally, see
|
||||
[the master documentation on sending messages](../subsystems/sending-messages.html)
|
||||
[the master documentation on sending messages](../subsystems/sending-messages.md)
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
This page documents additional information that may be useful when
|
||||
developing new features for Zulip that require front-end changes,
|
||||
especially those that involve adding new files. For a more general
|
||||
overview, see the [new feature tutorial](../tutorials/new-feature-tutorial.html).
|
||||
overview, see the [new feature tutorial](../tutorials/new-feature-tutorial.md).
|
||||
|
||||
Our [dependencies documentation](../subsystems/dependencies.html) has useful
|
||||
Our [dependencies documentation](../subsystems/dependencies.md) has useful
|
||||
relevant background as well.
|
||||
|
||||
## Primary build process
|
||||
|
|
|
@ -118,6 +118,6 @@ browser, Zulip also does a few bookkeeping things on page reload (like
|
|||
cleaning up its event queue, and saving any text in an open compose
|
||||
box as a draft).
|
||||
|
||||
[testing-with-casper]: ../testing/testing-with-casper.html
|
||||
[testing-with-casper]: ../testing/testing-with-casper.md
|
||||
[self-server-reloads]: #server-initiated-reloads
|
||||
[events-system]: ../subsystems/events-system.html
|
||||
[events-system]: ../subsystems/events-system.md
|
||||
|
|
|
@ -96,4 +96,4 @@ developers) should be tagged for [translation][].
|
|||
[helpers]: http://handlebarsjs.com/block_helpers.html
|
||||
[jconditionals]: http://jinja.pocoo.org/docs/2.9/templates/#list-of-control-structures
|
||||
[hconditionals]: http://handlebarsjs.com/block_helpers.html
|
||||
[translation]: ../translating/translating.html
|
||||
[translation]: ../translating/translating.md
|
||||
|
|
|
@ -8,7 +8,7 @@ main third-party CSS library.
|
|||
|
||||
Zulip currently does not use any CSS preprocessors, and is organized
|
||||
into several files. For most pages, the CSS is combined into a single
|
||||
CSS file by the [static asset pipeline](../subsystems/front-end-build-process.html),
|
||||
CSS file by the [static asset pipeline](../subsystems/front-end-build-process.md),
|
||||
controlled by the `PIPELINE_CSS` code in `zproject/settings.py`.
|
||||
|
||||
The CSS files are:
|
||||
|
|
|
@ -167,7 +167,7 @@ and report to the server the following whenever a message is sent:
|
|||
* Whether the message was locally echoed.
|
||||
* If so, whether there was a disparity between the echoed content and
|
||||
the server-rendered content, which can be used for statistics on how
|
||||
effective our [local echo system](../subsystems/markdown.html) is.
|
||||
effective our [local echo system](../subsystems/markdown.md) is.
|
||||
|
||||
The code is all in `zerver/lib/report.py` and `static/js/sent_messages.js`.
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ browser), Zulip will preserve the state -- what (if any) narrow the
|
|||
user was in, the selected message, and even exact scroll position!
|
||||
|
||||
For more on the user experience philosophy guiding these decisions,
|
||||
see [the architectural overview](../overview/architecture-overview.html).
|
||||
see [the architectural overview](../overview/architecture-overview.md).
|
||||
|
||||
## Unread count logic
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ user documentation as an organization (the name "realm" comes from
|
|||
[Kerberos](https://web.mit.edu/kerberos/)).
|
||||
|
||||
The
|
||||
[production docs on multiple realms](../production/multiple-organizations.html)
|
||||
[production docs on multiple realms](../production/multiple-organizations.md)
|
||||
are likely also relevant reading.
|
||||
|
||||
## Creating Realms
|
||||
|
@ -52,7 +52,7 @@ job.
|
|||
|
||||
We also recommend upgrading to at least Zulip 1.7, since older Zulip
|
||||
releases had much less nice handling for subdomains. See our
|
||||
[docs on using subdomains](../production/multiple-organizations.html) for
|
||||
[docs on using subdomains](../production/multiple-organizations.md) for
|
||||
user-facing documentation on this.
|
||||
|
||||
### Working With Subdomains In Development Environment
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Zulip uses the [standard Django system for doing schema
|
||||
migrations](https://docs.djangoproject.com/en/1.10/topics/migrations/).
|
||||
There is some example usage in the [new feature
|
||||
tutorial](../tutorials/new-feature-tutorial.html).
|
||||
tutorial](../tutorials/new-feature-tutorial.md).
|
||||
|
||||
This page documents some important issues related to writing schema
|
||||
migrations.
|
||||
|
@ -30,7 +30,7 @@ migrations.
|
|||
fix this, you can either run `./tools/renumber-migrations` which
|
||||
renumbers your migration(s) and fixes up the "dependencies" entries in your
|
||||
migration(s), and then rewrite your git history as needed, or you can do it
|
||||
manually. There is a tutorial [here](migration-renumbering.html) that
|
||||
manually. There is a tutorial [here](migration-renumbering.md) that
|
||||
walks you though that process.
|
||||
|
||||
* **Atomicity**. By default, each Django migration is run atomically
|
||||
|
|
|
@ -7,9 +7,9 @@ experience.
|
|||
This document aims to explain conceptually what happens when a message
|
||||
is sent in Zulip, and why that is correct behavior. It assumes the
|
||||
reader is familiar with our
|
||||
[real-time sync system](../subsystems/events-system.html) for
|
||||
[real-time sync system](../subsystems/events-system.md) for
|
||||
server-to-client communication and
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.html),
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.md),
|
||||
and we generally don't repeat the content discussed there.
|
||||
|
||||
## Message lists
|
||||
|
@ -45,7 +45,7 @@ stream, etc.).
|
|||
|
||||
The backend flow for sending messages is similar in many ways to the
|
||||
process described in our
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.html).
|
||||
[new application feature tutorial](../tutorials/new-feature-tutorial.md).
|
||||
This section details the ways in which it is different:
|
||||
|
||||
* There is significant custom code inside the `process_message_event`
|
||||
|
@ -57,7 +57,7 @@ number of purposes:
|
|||
computational work inside the Tornado codebase, this logic aims
|
||||
to just do the check for whether a notification should be
|
||||
generated, and then put an event into an appropriate
|
||||
[queue](../subsystems/queuing.html) to actually send the
|
||||
[queue](../subsystems/queuing.md) to actually send the
|
||||
message. See `maybe_enqueue_notifications` and related code for
|
||||
this part of the logic.
|
||||
* Splicing user-dependent data (E.g. `flags` such as when the user
|
||||
|
@ -73,7 +73,7 @@ number of purposes:
|
|||
* Following our standard naming convention, input validation is done
|
||||
inside the `check_message` function, which is responsible for
|
||||
validating the user can send to the recipient (etc.),
|
||||
[rendering the markdown](../subsystems/markdown.html), etc. --
|
||||
[rendering the markdown](../subsystems/markdown.md), etc. --
|
||||
basically everything that can fail due to bad user input.
|
||||
* The core `do_send_messages` function (which handles actually sending
|
||||
the message) is one of the most optimized and thus complex parts of
|
||||
|
@ -89,7 +89,7 @@ number of purposes:
|
|||
open organizations.
|
||||
* Do all the database queries to fetch relevant data for and then
|
||||
send a `message` event to the
|
||||
[events system](../subsystems/events-system.html) containing the
|
||||
[events system](../subsystems/events-system.md) containing the
|
||||
data it will need for the calculations described above. This
|
||||
step adds a lot of complexity, because the events system cannot
|
||||
make queries to the database directly.
|
||||
|
@ -114,7 +114,7 @@ library (on the frontend) and `sockjs-tornado` (on the backend). This
|
|||
ends up calling a handler in our Tornado codebase
|
||||
(`zerver/tornado/socket.py`), which immediately puts the request into
|
||||
the `message_sender` queue.
|
||||
* The `message_sender` [queue processor](../subsystems/queuing.html)
|
||||
* The `message_sender` [queue processor](../subsystems/queuing.md)
|
||||
reformats the request into a Django `HttpRequest` object with a fake
|
||||
`SOCKET` HTTP method (which is why these requests appear as `SOCKET`
|
||||
in our server logs), calls the Django `get_response` method on that
|
||||
|
@ -141,7 +141,7 @@ browser, and then replace it with data from the server when it
|
|||
changes.
|
||||
|
||||
Zulip aims for a near-perfect local echo experience, which requires is
|
||||
why our [markdown system](../subsystems/markdown.html) requires both
|
||||
why our [markdown system](../subsystems/markdown.md) requires both
|
||||
an authoritative (backend) markdown implementation and a secondary
|
||||
(frontend) markdown implementation, the latter used only for the local
|
||||
echo feature. Read our markdown documentation for all the tricky
|
||||
|
@ -177,7 +177,7 @@ messages.
|
|||
unique value within that namespace identifying the message.
|
||||
* The `do_send_messages` backend code path includes the `queue_id` and
|
||||
`local_id` in the data it passes to the
|
||||
[events system](../subsystems/events-system.html). The events
|
||||
[events system](../subsystems/events-system.md). The events
|
||||
system will extend the `message` event dictionary it delivers to
|
||||
the client containing the `queue_id` with `local_message_id` field,
|
||||
containing the `local_id` that the relevant client used when sending
|
||||
|
@ -273,7 +273,7 @@ users.
|
|||
message without including the URL embeds/previews, but it will add a
|
||||
deferred work item into the `embed_links` queue.
|
||||
|
||||
* The [queue processor](../subsystems/queuing.html) for the
|
||||
* The [queue processor](../subsystems/queuing.md) for the
|
||||
`embed_links` queue will fetch the URLs, and then if they return
|
||||
results, rerun the markdown processor and notify clients of the
|
||||
updated message `rendered_content`.
|
||||
|
@ -321,7 +321,7 @@ latency was unacceptable: The server backend was introducing a latency
|
|||
of about 1 second per 2000 users subscribed to receive the message.
|
||||
While these delays may not be immediately obvious to users (Zulip,
|
||||
like many other chat applications,
|
||||
[local echoes](../subsystems/markdown.html) messages that a user sends
|
||||
[local echoes](../subsystems/markdown.md) messages that a user sends
|
||||
as soon as the user hits “send”), latency beyond a second or two
|
||||
significantly impacts the feeling of interactivity in a chat
|
||||
experience (i.e. it feels like everyone takes a long time to reply to
|
||||
|
|
|
@ -143,4 +143,4 @@ replaced with realm settings:
|
|||
server, and in the realm settings indicating which methods the realm
|
||||
administrator wants to allow users to login with.
|
||||
|
||||
[doc-newfeat]: ../tutorials/new-feature-tutorial.html
|
||||
[doc-newfeat]: ../tutorials/new-feature-tutorial.md
|
||||
|
|
|
@ -69,7 +69,7 @@ The raw Thumbor URLs are ugly, and regardless, have the property that
|
|||
we might want to change them over time (a classic case is if one moves
|
||||
the thumbor installation to be hosted by a different server). In
|
||||
order to avoid encoding these into Zulip messages, we encode in the
|
||||
[HTML rendered message content](../subsystems/markdown.html) URLs of
|
||||
[HTML rendered message content](../subsystems/markdown.md) URLs of
|
||||
the form
|
||||
`/thumbnail/?url=https://example.com/image.png&size=thumbnail` as the
|
||||
`src` in our image tags, and that URL serves a
|
||||
|
|
|
@ -69,7 +69,7 @@ how long they pause to think, and how frequently they get interrupted.
|
|||
|
||||
The server piece of typing notificiations is currently pretty
|
||||
straightforward, since we take advantage of Zulip's
|
||||
[events system](../subsystems/events-system.html).
|
||||
[events system](../subsystems/events-system.md).
|
||||
|
||||
We deliberately designed the server piece to be stateless,
|
||||
which minimizes the possibility of backend bugs and gives clients
|
||||
|
|
|
@ -45,7 +45,7 @@ CI. Make sure that you have uploaded your SSH keys to GitHub: CircleCI
|
|||
uses those SSH keys for authentication.
|
||||
|
||||
[docker-hub]: https://hub.docker.com/
|
||||
[circleci-setup]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[circleci-setup]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
[circleci-ssh]: https://circleci.com/docs/2.0/ssh-access-jobs/
|
||||
|
||||
### Suites
|
||||
|
@ -177,7 +177,7 @@ our configuration, you'll want to look at these closely.
|
|||
that every remote branch you push will be tested, which can be
|
||||
helpful when debugging something complicated.
|
||||
|
||||
[travis-fork]: ../git/cloning.html#step-3-configure-continuous-integration-for-your-fork
|
||||
[travis-fork]: ../git/cloning.md#step-3-configure-continuous-integration-for-your-fork
|
||||
|
||||
### Performance optimizations
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ but for other files, we are quite thorough about checking semantic
|
|||
correctness.
|
||||
|
||||
Obviously, a large reason for linting code is to enforce the [Zulip
|
||||
coding standards](../contributing/code-style.html). But we also use the linters to
|
||||
coding standards](../contributing/code-style.md). But we also use the linters to
|
||||
prevent common coding errors.
|
||||
|
||||
We borrow some open source tools for much of our linting, and the links
|
||||
|
@ -63,7 +63,7 @@ the other lint checks.
|
|||
|
||||
## General considerations
|
||||
|
||||
Once you have read the [Zulip coding guidelines](../contributing/code-style.html), you can
|
||||
Once you have read the [Zulip coding guidelines](../contributing/code-style.md), you can
|
||||
be pretty confident that 99% of the code that you write will pass through
|
||||
the linters fine, as long as you are thorough about keeping your code clean.
|
||||
And, of course, for minor oversights, `lint` is your friend, not your foe.
|
||||
|
@ -75,7 +75,7 @@ extreme cases, but often it can be a simple matter of writing your code
|
|||
in a slightly different style to appease the linter. If you have
|
||||
problems getting something to lint, you can submit an unfinished PR
|
||||
and ask the reviewer to help you work through the lint problem, or you
|
||||
can find other people in the [Zulip Community](../contributing/chat-zulip-org.html)
|
||||
can find other people in the [Zulip Community](../contributing/chat-zulip-org.md)
|
||||
to help you.
|
||||
|
||||
Also, bear in mind that 100% of the lint code is open source, so if you
|
||||
|
@ -83,7 +83,7 @@ find limitations in either the Zulip home-grown stuff or our third party
|
|||
tools, feedback will be highly appreciated.
|
||||
|
||||
Finally, one way to clean up your code is to thoroughly exercise it
|
||||
with tests. The [Zulip test documentation](../testing/testing.html)
|
||||
with tests. The [Zulip test documentation](../testing/testing.md)
|
||||
describes our test system in detail.
|
||||
|
||||
## Lint checks
|
||||
|
@ -100,7 +100,7 @@ following checks:
|
|||
- Check CSS for parsability and formatting.
|
||||
- Check JavaScript code for addClass calls.
|
||||
- Running `mypy` to check static types in Python code. Our
|
||||
[documentation on using mypy](../testing/mypy.html) covers mypy in
|
||||
[documentation on using mypy](../testing/mypy.md) covers mypy in
|
||||
more detail.
|
||||
|
||||
The rest of this document pertains to the checks that occur in `./tools/lint`.
|
||||
|
|
|
@ -262,7 +262,7 @@ from Django as well as our own custom helpers. Here is an example:
|
|||
|
||||
self.assertTrue(rate_limit_mock.called)
|
||||
|
||||
Follow [this link](../subsystems/settings.html#testing-non-default-settings) for more
|
||||
Follow [this link](../subsystems/settings.md#testing-non-default-settings) for more
|
||||
information on the "settings" context manager.
|
||||
|
||||
A common use is to prevent a call to a third-party service from using
|
||||
|
@ -337,7 +337,7 @@ We use mocks and stubs for all the typical reasons:
|
|||
- to stub out calls to third-party services
|
||||
- to make it so that you can [run the Zulip tests on the airplane without wifi][no-internet]
|
||||
|
||||
[no-internet]: testing.html#internet-access-inside-test-suites
|
||||
[no-internet]: testing.md#internet-access-inside-test-suites
|
||||
|
||||
A detailed description of mocks, along with useful coded snippets, can be found in the section
|
||||
[Testing with mocks](#testing-with-mocks).
|
||||
|
@ -375,7 +375,7 @@ the same data structure as performing an action that generates said event.
|
|||
|
||||
This is a bit esoteric, but if you read the tests, you will see some of
|
||||
the patterns. You can also learn more about our event system in the
|
||||
[new feature tutorial](../tutorials/new-feature-tutorial.html#handle-database-interactions).
|
||||
[new feature tutorial](../tutorials/new-feature-tutorial.md#handle-database-interactions).
|
||||
|
||||
### Negative tests
|
||||
|
||||
|
|
|
@ -5,18 +5,18 @@
|
|||
Zulip has a full test suite that includes many components. The most
|
||||
important components are documented in depth in their own sections:
|
||||
|
||||
- [Django](../testing/testing-with-django.html): backend Python tests
|
||||
- [Casper](../testing/testing-with-casper.html): end-to-end UI tests
|
||||
- [Node](../testing/testing-with-node.html): unit tests for JS front end code
|
||||
- [Linters](../testing/linters.html): Our parallel linter suite
|
||||
- [CI details](continuous-integration.html): How all of these run in CI
|
||||
- [Django](../testing/testing-with-django.md): backend Python tests
|
||||
- [Casper](../testing/testing-with-casper.md): end-to-end UI tests
|
||||
- [Node](../testing/testing-with-node.md): unit tests for JS front end code
|
||||
- [Linters](../testing/linters.md): Our parallel linter suite
|
||||
- [CI details](continuous-integration.md): How all of these run in CI
|
||||
- [Other test suites](#other-test-suites): Our various smaller test suites.
|
||||
|
||||
This document covers more general testing issues, such as how to run the
|
||||
entire test suite, how to troubleshoot database issues, how to manually
|
||||
test the front end, etc.
|
||||
|
||||
We also document [how to manually test the app](manual-testing.html).
|
||||
We also document [how to manually test the app](manual-testing.md).
|
||||
|
||||
## Running tests
|
||||
|
||||
|
@ -60,7 +60,7 @@ Zulip also has about a dozen smaller tests suites:
|
|||
|
||||
- `tools/test-migrations`: Checks whether the `zerver/migrations`
|
||||
migration content the models defined in `zerver/models.py`. See our
|
||||
[schema migration documentation](../subsystems/schema-migrations.html)
|
||||
[schema migration documentation](../subsystems/schema-migrations.md)
|
||||
for details on how to do database migrations correctly.
|
||||
- `tools/test-documentation`: Checks for broken links in this
|
||||
ReadTheDocs documentation site.
|
||||
|
@ -72,7 +72,7 @@ Zulip also has about a dozen smaller tests suites:
|
|||
- `test-locked-requirements`: Verifies that developers didn't forget
|
||||
to run `tools/update-locked-requirements` after modifying
|
||||
`requirements/*.in`. See
|
||||
[our dependency documentation](../subsystems/dependencies.html) for
|
||||
[our dependency documentation](../subsystems/dependencies.md) for
|
||||
details on the system this is verifying.
|
||||
- `tools/check-capitalization`: Checks whether translated strings (aka
|
||||
user-facing strings) correctly follow Zulip's capitalization
|
||||
|
@ -181,7 +181,7 @@ This is easy to do using test fixtures (a fancy word for fixed data
|
|||
used in tests) and the `mock.patch` function to specify what HTTP
|
||||
response should be used by the tests for every outgoing HTTP (or other
|
||||
network) request. Consult
|
||||
[our guide on mocking](../testing/testing-with-django.html#zulip-mocking-practices) to
|
||||
[our guide on mocking](../testing/testing-with-django.md#zulip-mocking-practices) to
|
||||
learn how to mock network requests easily; there are also a number of
|
||||
examples throughout the codebase.
|
||||
|
||||
|
@ -246,7 +246,7 @@ it. On Ubuntu:
|
|||
|
||||
This section is about troubleshooting your local development environment.
|
||||
|
||||
There is a [separate manual testing doc](manual-testing.html) that
|
||||
There is a [separate manual testing doc](manual-testing.md) that
|
||||
enumerates things you can test as part of manual QA.
|
||||
|
||||
### Clearing the development database
|
||||
|
|
|
@ -8,7 +8,7 @@ translating Zulip would be greatly appreciated!
|
|||
|
||||
If you're interested in contributing translations to Zulip, please
|
||||
join [#translation](https://chat.zulip.org/#narrow/stream/58-translation)
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.html), and
|
||||
in the [Zulip development community server](../contributing/chat-zulip-org.md), and
|
||||
say hello. And please join the
|
||||
[Zulip project on Transifex](https://www.transifex.com/zulip/zulip/)
|
||||
and ask to join any languages you'd like to contribute to (or add new
|
||||
|
@ -27,13 +27,13 @@ We are building a collection of translation style guides for Zulip,
|
|||
giving guidance on how Zulip should be translated into specific
|
||||
languages (e.g. what word to translate words like "home" to):
|
||||
|
||||
* [Chinese](chinese.html)
|
||||
* [French](french.html)
|
||||
* [German](german.html)
|
||||
* [Hindi](hindi.html)
|
||||
* [Polish](polish.html)
|
||||
* [Russian](russian.html)
|
||||
* [Spanish](spanish.html)
|
||||
* [Chinese](chinese.md)
|
||||
* [French](french.md)
|
||||
* [German](german.md)
|
||||
* [Hindi](hindi.md)
|
||||
* [Polish](polish.md)
|
||||
* [Russian](russian.md)
|
||||
* [Spanish](spanish.md)
|
||||
|
||||
A great first step when getting started translating Zulip into a new
|
||||
language is to write a style guide, since it greatly increases the
|
||||
|
@ -133,7 +133,7 @@ Some useful tips for your translating journey:
|
|||
|
||||
- When in doubt, ask for context in
|
||||
[#translation](https://chat.zulip.org/#narrow/stream/58-translation) in
|
||||
the [Zulip development community server](../contributing/chat-zulip-org.html).
|
||||
the [Zulip development community server](../contributing/chat-zulip-org.md).
|
||||
|
||||
- If there are multiple possible translations for a term, search for it in
|
||||
the *Concordance* tool (the button with a magnet in the top right corner).
|
||||
|
@ -150,7 +150,7 @@ Some useful tips for your translating journey:
|
|||
## Testing translations
|
||||
|
||||
This section assumes you have a
|
||||
[Zulip development environment](../development/overview.html) set up.
|
||||
[Zulip development environment](../development/overview.md) set up.
|
||||
|
||||
First of all, download the updated resource files from Transifex using the
|
||||
`tx pull -a --mode=developer` command (it will require some
|
||||
|
@ -394,4 +394,4 @@ organizations from the command line.
|
|||
[resource]: https://www.i18next.com/add-or-load-translations.html
|
||||
[Transifex]: https://transifex.com
|
||||
[transifexrc]: https://docs.transifex.com/client/client-configuration#transifexrc
|
||||
[html-templates]: ../subsystems/html-templates.html
|
||||
[html-templates]: ../subsystems/html-templates.md
|
||||
|
|
|
@ -10,7 +10,7 @@ file in `templates/zerver/help/include/rest-endpoints.md` , so that it appears
|
|||
in the index in the left sidebar on the `/api` page.
|
||||
|
||||
The markdown framework is the same one used by the
|
||||
[user docs](../subsystems/user-docs.html), which supports macros and
|
||||
[user docs](../subsystems/user-docs.md), which supports macros and
|
||||
various other features, though we don't use them heavily here.
|
||||
|
||||
If you look at the documentation for existing endpoints (see a live
|
||||
|
|
|
@ -39,7 +39,7 @@ location /static/ {
|
|||
|
||||
## Nginx routes other requests [between django and tornado][tornado-django]
|
||||
|
||||
[tornado-django]: ../overview/architecture-overview.html?highlight=tornado#django-and-tornado
|
||||
[tornado-django]: ../overview/architecture-overview.md?highlight=tornado#django-and-tornado
|
||||
|
||||
All our connected clients hold open long-polling connections so that
|
||||
they can receive events (messages, presence notifications, and so on) in
|
||||
|
@ -58,7 +58,7 @@ There are various
|
|||
[urls.py](https://docs.djangoproject.com/en/1.8/topics/http/urls/)
|
||||
files throughout the server codebase, which are covered in more detail
|
||||
in
|
||||
[the directory structure doc](../overview/directory-structure.html).
|
||||
[the directory structure doc](../overview/directory-structure.md).
|
||||
|
||||
The main Zulip Django app is `zerver`. The routes are found in
|
||||
```
|
||||
|
@ -188,7 +188,7 @@ find the correct view to show:
|
|||
|
||||
## The view will authorize the user, extract request variables, and validate them
|
||||
|
||||
This is covered in good detail in the [writing views doc](writing-views.html).
|
||||
This is covered in good detail in the [writing views doc](writing-views.md).
|
||||
|
||||
## Results are given as JSON
|
||||
|
||||
|
|
|
@ -8,22 +8,22 @@ data system in real-time to all browsers the user may have open.
|
|||
|
||||
As you read this, you may find you need to learn about Zulip's
|
||||
real-time push system; the
|
||||
[real-time push and events](../subsystems/events-system.html)
|
||||
[real-time push and events](../subsystems/events-system.md)
|
||||
documentation has a detailed explanation of how everything works. You
|
||||
may also find it beneficial to read Zulip's
|
||||
[architectural overview](../overview/architecture-overview.html).
|
||||
[architectural overview](../overview/architecture-overview.md).
|
||||
Zulip is a web application built using the
|
||||
[Django framework](https://www.djangoproject.com/), and some of the
|
||||
processes listed in this tutorial, such as database migrations and
|
||||
tests, use Django's tooling.
|
||||
|
||||
Zulip's [directory structure](../overview/directory-structure.html)
|
||||
Zulip's [directory structure](../overview/directory-structure.md)
|
||||
will also be helpful to review when creating a new feature. Many
|
||||
aspects of the structure will be familiar to Django developers. Visit
|
||||
[Django's documentation](https://docs.djangoproject.com/en/1.11/#index-first-steps)
|
||||
for more information about how Django projects are typically
|
||||
organized. And finally, the
|
||||
[message sending](../subsystems/sending-messages.html) documentation on
|
||||
[message sending](../subsystems/sending-messages.md) documentation on
|
||||
the additional complexity involved in sending messages.
|
||||
|
||||
## General Process
|
||||
|
@ -74,13 +74,13 @@ following commands:
|
|||
```
|
||||
|
||||
You can read our
|
||||
[database migration documentation](../subsystems/schema-migrations.html)
|
||||
[database migration documentation](../subsystems/schema-migrations.md)
|
||||
to learn more about creating and applying database migrations.
|
||||
|
||||
**Test your changes:** Once you've run the migration, flush memcached
|
||||
on your development server (`./scripts/setup/flush-memcached`) and then
|
||||
[restart the development server](
|
||||
../development/remote.html?highlight=tools%2Frun-dev.py#running-the-development-server)
|
||||
../development/remote.md?highlight=tools%2Frun-dev.py#running-the-development-server)
|
||||
to avoid interacting with cached objects.
|
||||
|
||||
### Backend changes
|
||||
|
@ -130,7 +130,7 @@ precompiled as part of the build/deploy process.
|
|||
|
||||
Zulip is fully internationalized, so when writing both HTML templates
|
||||
or JavaScript code that generates user-facing strings, be sure to
|
||||
[tag those strings for translation](../translating/translating.html).
|
||||
[tag those strings for translation](../translating/translating.md).
|
||||
|
||||
**Testing:** There are two types of frontend tests: node-based unit
|
||||
tests and blackbox end-to-end tests. The blackbox tests are run in a
|
||||
|
@ -138,14 +138,14 @@ headless browser using Casper.js and are located in
|
|||
`frontend_tests/casper_tests/`. The unit tests use Node's `assert`
|
||||
module are located in `frontend_tests/node_tests/`. For more
|
||||
information on writing and running tests, see the
|
||||
[testing documentation](../testing/testing.html).
|
||||
[testing documentation](../testing/testing.md).
|
||||
|
||||
### Documentation changes
|
||||
|
||||
After implementing the new feature, you should
|
||||
document it and update any existing documentation that might be
|
||||
relevant to the new feature. For more information on the kinds of
|
||||
documentation Zulip has, see [Documentation](../subsystems/documentation.html).
|
||||
documentation Zulip has, see [Documentation](../subsystems/documentation.md).
|
||||
|
||||
## Example Feature
|
||||
|
||||
|
@ -247,7 +247,7 @@ Running migrations:
|
|||
|
||||
Once you've run the migration, restart memcached on your development
|
||||
server (`/etc/init.d/memcached restart`) and then [restart the development server](
|
||||
../development/remote.html?highlight=tools%2Frun-dev.py#running-the-development-server)
|
||||
../development/remote.md?highlight=tools%2Frun-dev.py#running-the-development-server)
|
||||
to avoid interacting with cached objects.
|
||||
|
||||
### Handle database interactions
|
||||
|
@ -266,7 +266,7 @@ initial state. Subsequently, clients subscribe to "events," which can
|
|||
For the backend piece, we will need our action to make a call to `send_event`
|
||||
to send the event to clients that are active. We will also need to
|
||||
modify `fetch_initial_state_data` so that the new field is passed to
|
||||
clients. See [our event system docs](../subsystems/events-system.html) for all the
|
||||
clients. See [our event system docs](../subsystems/events-system.md) for all the
|
||||
gory details.
|
||||
|
||||
Anyway, getting back to implementation details...
|
||||
|
@ -475,7 +475,7 @@ controls the feature it is supposed to control, however (e.g. for this
|
|||
example feature, whether sending a message without a topic fails with
|
||||
the setting enabled).
|
||||
|
||||
Visit Zulip's [Django testing](../testing/testing-with-django.html)
|
||||
Visit Zulip's [Django testing](../testing/testing-with-django.md)
|
||||
documentation to learn more about the backend testing framework.
|
||||
|
||||
### Update the front end
|
||||
|
@ -636,8 +636,8 @@ Here are few important cases you should consider when testing your changes:
|
|||
### Front End Tests
|
||||
|
||||
A great next step is to write front end tests. There are two types of
|
||||
frontend tests: [node-based unit tests](../testing/testing-with-node.html) and
|
||||
[Casper end-to-end tests](../testing/testing-with-casper.html).
|
||||
frontend tests: [node-based unit tests](../testing/testing-with-node.md) and
|
||||
[Casper end-to-end tests](../testing/testing-with-casper.md).
|
||||
|
||||
At the minimum, if you created a new function to update UI in
|
||||
`settings_org.js`, you will need to mock that function in
|
||||
|
@ -667,4 +667,4 @@ At the very least, this will involve adding (or modifying) a Markdown file
|
|||
documenting the feature to `templates/zerver/help/` in the main Zulip
|
||||
server repository, where the source for Zulip's user documentation is
|
||||
stored. For information on writing user documentation, see
|
||||
[Zulip's general user guide documentation](../subsystems/user-docs.html).
|
||||
[Zulip's general user guide documentation](../subsystems/user-docs.md).
|
||||
|
|
|
@ -144,7 +144,7 @@ Some titles have been shortened for organizational purposes.
|
|||
|
||||
You may want to take a look first at our [Git and GitHub guide][].
|
||||
|
||||
[Git and GitHub guide]: ../git/index.html
|
||||
[Git and GitHub guide]: ../git/index.md
|
||||
|
||||
## Computer Science/Algorithms
|
||||
|
||||
|
|
|
@ -339,7 +339,7 @@ At first it seems like magic, but once you get the basic concepts you find it
|
|||
extremely useful and even easy to use (at least the 99% of the time).
|
||||
|
||||
To learn more about how to use it, read
|
||||
[our docs](../git/index.html) on Git and
|
||||
[our docs](../git/index.md) on Git and
|
||||
Github.
|
||||
|
||||
[This cheatsheet][git-cheat-detailed]
|
||||
|
@ -347,4 +347,4 @@ will be useful in your journey, as well.
|
|||
|
||||
![Git - XKCD 1597](https://imgs.xkcd.com/comics/git.png)
|
||||
|
||||
[git-cheat-detailed]: ../git/cheat-sheet.html#detailed-cheat-sheet
|
||||
[git-cheat-detailed]: ../git/cheat-sheet.md#detailed-cheat-sheet
|
||||
|
|
|
@ -3,15 +3,15 @@
|
|||
## What this covers
|
||||
|
||||
This page documents how views work in Zulip. You may want to read the
|
||||
[new feature tutorial](../tutorials/new-feature-tutorial.html)
|
||||
[new feature tutorial](../tutorials/new-feature-tutorial.md)
|
||||
and treat this as a reference.
|
||||
|
||||
If you have experience with Django, much of this will be familiar, but
|
||||
you may want to read about how REST requests are dispatched, and how
|
||||
request authentication works.
|
||||
|
||||
This document supplements the [new feature tutorial](../tutorials/new-feature-tutorial.html)
|
||||
and the [testing](../testing/testing.html)
|
||||
This document supplements the [new feature tutorial](../tutorials/new-feature-tutorial.md)
|
||||
and the [testing](../testing/testing.md)
|
||||
documentation.
|
||||
|
||||
## What is a view?
|
||||
|
@ -37,7 +37,7 @@ integrations).
|
|||
The format of the URL patterns in Django is [documented
|
||||
here](https://docs.djangoproject.com/en/1.8/topics/http/urls/), and
|
||||
the Zulip specific details for these are discussed in detail in the
|
||||
[life of a request doc](life-of-a-request.html#options).
|
||||
[life of a request doc](life-of-a-request.md#options).
|
||||
|
||||
We have two Zulip-specific conventions we use for internationalization and for
|
||||
our REST API, respectively.
|
||||
|
@ -366,4 +366,4 @@ def api_pagerduty_webhook(request, user_profile,
|
|||
```
|
||||
`request.client` will be the result of `get_client("ZulipPagerDutyWebhook")`
|
||||
in this example and it will be passed to `check_send_stream_message`. For
|
||||
more information, see [Clients in Zulip](../subsystems/client.html).
|
||||
more information, see [Clients in Zulip](../subsystems/client.md).
|
||||
|
|
Loading…
Reference in New Issue