docs: Fix more capitalization issues.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2020-10-22 17:43:28 -07:00 committed by Tim Abbott
parent a7d1fd9ffb
commit 72d6ff3c3b
297 changed files with 1038 additions and 1039 deletions

View File

@ -1,10 +1,10 @@
<!-- What's this PR for? (Just a link to an issue is fine.) --> <!-- What's this PR for? (Just a link to an issue is fine.) -->
**Testing Plan:** <!-- How have you tested? --> **Testing plan:** <!-- How have you tested? -->
**GIFs or Screenshots:** <!-- If a UI change. See: **GIFs or screenshots:** <!-- If a UI change. See:
https://zulip.readthedocs.io/en/latest/tutorials/screenshot-and-gif-software.html https://zulip.readthedocs.io/en/latest/tutorials/screenshot-and-gif-software.html
--> -->

View File

@ -1,4 +1,4 @@
name: Cancel Previous Runs name: Cancel previous runs
on: [push, pull_request] on: [push, pull_request]
defaults: defaults:
@ -7,7 +7,7 @@ defaults:
jobs: jobs:
cancel: cancel:
name: Cancel Previous Runs name: Cancel previous runs
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 3 timeout-minutes: 3

View File

@ -1,4 +1,4 @@
name: "Code Scanning" name: "Code scanning"
on: [push, pull_request] on: [push, pull_request]

View File

@ -1,4 +1,4 @@
name: Zulip Production Suite name: Zulip production suite
on: on:
push: push:
@ -30,7 +30,7 @@ defaults:
jobs: jobs:
production_build: production_build:
name: Bionic Production Build name: Bionic production build
runs-on: ubuntu-latest runs-on: ubuntu-latest
# This docker image was created by a generated Dockerfile at: # This docker image was created by a generated Dockerfile at:
@ -104,12 +104,12 @@ jobs:
matrix: matrix:
include: include:
- docker_image: mepriyank/actions:bionic - docker_image: mepriyank/actions:bionic
name: Bionic Production Install name: Bionic production install
is_bionic: true is_bionic: true
os: bionic os: bionic
- docker_image: mepriyank/actions:focal - docker_image: mepriyank/actions:focal
name: Focal Production Install name: Focal production install
is_focal: true is_focal: true
os: focal os: focal

View File

@ -37,7 +37,7 @@ jobs:
# GitHub Actions sets HOME to /github/home which causes # GitHub Actions sets HOME to /github/home which causes
# problem later in provison and frontend test that runs # problem later in provison and frontend test that runs
# tools/setup/postgres-init-dev-db because of the .pgpass # tools/setup/postgres-init-dev-db because of the .pgpass
# location. Postgresql (psql) expects .pgpass to be at # location. PostgreSQL (psql) expects .pgpass to be at
# /home/github/.pgpass and setting home to `/home/github/` # /home/github/.pgpass and setting home to `/home/github/`
# ensures it written there because we write it to ~/.pgpass. # ensures it written there because we write it to ~/.pgpass.
HOME: /home/github/ HOME: /home/github/
@ -142,7 +142,7 @@ jobs:
# see https://community.codecov.io/t/http-400-while-uploading-to-s3-with-python-codecov-from-travis/1428/7 # see https://community.codecov.io/t/http-400-while-uploading-to-s3-with-python-codecov-from-travis/1428/7
pip install codecov && codecov || echo "Error in uploading coverage reports to codecov.io." pip install codecov && codecov || echo "Error in uploading coverage reports to codecov.io."
- name: Store puppeteer artifacts - name: Store Puppeteer artifacts
if: ${{ matrix.include_frontend_tests }} if: ${{ matrix.include_frontend_tests }}
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
@ -153,6 +153,6 @@ jobs:
if: ${{ matrix.is_focal }} if: ${{ matrix.is_focal }}
run: mispipe "tools/ci/setup-backend" ts run: mispipe "tools/ci/setup-backend" ts
# TODO: We need to port the notify_failure step from CircleCI # TODO: We need to port the notify_failure step from CircleCI
# config, however, it might be the case that GitHub Notifications # config, however, it might be the case that GitHub notifications
# make this unnesscary. More details on settings to configure it: # make this unnecessary. More details on settings to configure it:
# https://help.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#github-actions-notification-options # https://help.github.com/en/github/managing-subscriptions-and-notifications-on-github/configuring-notifications#github-actions-notification-options

View File

@ -5,7 +5,7 @@
# the on-disk data in volumes. So the base image can not currently be upgraded # the on-disk data in volumes. So the base image can not currently be upgraded
# without users needing a manual pgdump and restore. # without users needing a manual pgdump and restore.
# Install hunspell, zulip stop words, and run zulip database # Install hunspell, Zulip stop words, and run Zulip database
# init. # init.
FROM groonga/pgroonga:latest-alpine-10-slim FROM groonga/pgroonga:latest-alpine-10-slim
RUN apk add -U --no-cache hunspell-en RUN apk add -U --no-cache hunspell-en

View File

@ -9,7 +9,7 @@ over 500 contributors merging over 500 commits a month, Zulip is also the
largest and fastest growing open source group chat project. largest and fastest growing open source group chat project.
[![CircleCI branch](https://img.shields.io/circleci/project/github/zulip/zulip/master.svg)](https://circleci.com/gh/zulip/zulip/tree/master) [![CircleCI branch](https://img.shields.io/circleci/project/github/zulip/zulip/master.svg)](https://circleci.com/gh/zulip/zulip/tree/master)
[![Coverage Status](https://img.shields.io/codecov/c/github/zulip/zulip/master.svg)](https://codecov.io/gh/zulip/zulip/branch/master) [![coverage status](https://img.shields.io/codecov/c/github/zulip/zulip/master.svg)](https://codecov.io/gh/zulip/zulip/branch/master)
[![Mypy coverage](https://img.shields.io/badge/mypy-100%25-green.svg)][mypy-coverage] [![Mypy coverage](https://img.shields.io/badge/mypy-100%25-green.svg)][mypy-coverage]
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)
[![GitHub release](https://img.shields.io/github/release/zulip/zulip.svg)](https://github.com/zulip/zulip/releases/latest) [![GitHub release](https://img.shields.io/github/release/zulip/zulip.svg)](https://github.com/zulip/zulip/releases/latest)

View File

@ -1,9 +1,9 @@
# Security Policy # Security policy
Security announcements are sent to zulip-announce@googlegroups.com, Security announcements are sent to zulip-announce@googlegroups.com,
so you should subscribe if you are running Zulip in production. so you should subscribe if you are running Zulip in production.
## Reporting a Vulnerability ## Reporting a vulnerability
We love responsible reports of (potential) security issues in Zulip, We love responsible reports of (potential) security issues in Zulip,
whether in the latest release or our development branch. whether in the latest release or our development branch.
@ -18,7 +18,7 @@ Our [security
model](https://zulip.readthedocs.io/en/latest/production/security-model.html) model](https://zulip.readthedocs.io/en/latest/production/security-model.html)
document may be a helpful resource. document may be a helpful resource.
## Supported Versions ## Supported versions
Zulip provides security support for the latest major release, in the Zulip provides security support for the latest major release, in the
form of minor security/maintenance releases. form of minor security/maintenance releases.

View File

@ -598,7 +598,7 @@ def get_count_stats(realm: Optional[Realm]=None) -> Dict[str, CountStat]:
## CountStat declarations ## ## CountStat declarations ##
count_stats_ = [ count_stats_ = [
# Messages Sent stats # Messages sent stats
# Stats that count the number of messages sent in various ways. # Stats that count the number of messages sent in various ways.
# These are also the set of stats that read from the Message table. # These are also the set of stats that read from the Message table.
@ -617,7 +617,7 @@ def get_count_stats(realm: Optional[Realm]=None) -> Dict[str, CountStat]:
sql_data_collector(StreamCount, count_message_by_stream_query(realm), sql_data_collector(StreamCount, count_message_by_stream_query(realm),
(UserProfile, 'is_bot')), CountStat.DAY), (UserProfile, 'is_bot')), CountStat.DAY),
# Number of Users stats # Number of users stats
# Stats that count the number of active users in the UserProfile.is_active sense. # Stats that count the number of active users in the UserProfile.is_active sense.
# 'active_users_audit:is_bot:day' is the canonical record of which users were # 'active_users_audit:is_bot:day' is the canonical record of which users were
@ -658,7 +658,7 @@ def get_count_stats(realm: Optional[Realm]=None) -> Dict[str, CountStat]:
LoggingCountStat('messages_read::hour', UserCount, CountStat.HOUR), LoggingCountStat('messages_read::hour', UserCount, CountStat.HOUR),
LoggingCountStat('messages_read_interactions::hour', UserCount, CountStat.HOUR), LoggingCountStat('messages_read_interactions::hour', UserCount, CountStat.HOUR),
# User Activity stats # User activity stats
# Stats that measure user activity in the UserActivityInterval sense. # Stats that measure user activity in the UserActivityInterval sense.
CountStat('1day_actives::day', CountStat('1day_actives::day',

View File

@ -437,7 +437,7 @@ class TestSupportEndpoint(ZulipTestCase):
zulip_realm = get_realm("zulip") zulip_realm = get_realm("zulip")
self.assert_in_success_response([f'<input type="hidden" name="realm_id" value="{zulip_realm.id}"', self.assert_in_success_response([f'<input type="hidden" name="realm_id" value="{zulip_realm.id}"',
'Zulip Dev</h3>', 'Zulip Dev</h3>',
'<option value="1" selected>Self Hosted</option>', '<option value="1" selected>Self hosted</option>',
'<option value="2" >Limited</option>', '<option value="2" >Limited</option>',
'input type="number" name="discount" value="None"', 'input type="number" name="discount" value="None"',
'<option value="active" selected>Active</option>', '<option value="active" selected>Active</option>',
@ -449,7 +449,7 @@ class TestSupportEndpoint(ZulipTestCase):
lear_realm = get_realm("lear") lear_realm = get_realm("lear")
self.assert_in_success_response([f'<input type="hidden" name="realm_id" value="{lear_realm.id}"', self.assert_in_success_response([f'<input type="hidden" name="realm_id" value="{lear_realm.id}"',
'Lear &amp; Co.</h3>', 'Lear &amp; Co.</h3>',
'<option value="1" selected>Self Hosted</option>', '<option value="1" selected>Self hosted</option>',
'<option value="2" >Limited</option>', '<option value="2" >Limited</option>',
'input type="number" name="discount" value="None"', 'input type="number" name="discount" value="None"',
'<option value="active" selected>Active</option>', '<option value="active" selected>Active</option>',

View File

@ -172,14 +172,14 @@ def get_chart_data_for_remote_realm(
@require_server_admin @require_server_admin
def stats_for_installation(request: HttpRequest) -> HttpResponse: def stats_for_installation(request: HttpRequest) -> HttpResponse:
return render_stats(request, '/installation', 'Installation', True) return render_stats(request, '/installation', 'installation', True)
@require_server_admin @require_server_admin
def stats_for_remote_installation(request: HttpRequest, remote_server_id: int) -> HttpResponse: def stats_for_remote_installation(request: HttpRequest, remote_server_id: int) -> HttpResponse:
assert settings.ZILENCER_ENABLED assert settings.ZILENCER_ENABLED
server = RemoteZulipServer.objects.get(id=remote_server_id) server = RemoteZulipServer.objects.get(id=remote_server_id)
return render_stats(request, f'/remote/{server.id}/installation', return render_stats(request, f'/remote/{server.id}/installation',
f'remote Installation {server.hostname}', True, True) f'remote installation {server.hostname}', True, True)
@require_server_admin_api @require_server_admin_api
@has_request_variables @has_request_variables
@ -787,9 +787,9 @@ def user_activity_intervals() -> Tuple[mark_safe, Dict[str, float]]:
realm_minutes[string_id] = realm_duration.total_seconds() / 60 realm_minutes[string_id] = realm_duration.total_seconds() / 60
output += f"\nTotal Duration: {total_duration}\n" output += f"\nTotal duration: {total_duration}\n"
output += f"\nTotal Duration in minutes: {total_duration.total_seconds() / 60.}\n" output += f"\nTotal duration in minutes: {total_duration.total_seconds() / 60.}\n"
output += f"Total Duration amortized to a month: {total_duration.total_seconds() * 30. / 60.}" output += f"Total duration amortized to a month: {total_duration.total_seconds() * 30. / 60.}"
content = mark_safe('<pre>' + output + '</pre>') content = mark_safe('<pre>' + output + '</pre>')
return content, realm_minutes return content, realm_minutes
@ -1328,7 +1328,7 @@ def raw_user_activity_table(records: List[QuerySet]) -> str:
] ]
rows = list(map(row, records)) rows = list(map(row, records))
title = 'Raw Data' title = 'Raw data'
return make_table(title, cols, rows) return make_table(title, cols, rows)
def get_user_activity_summary(records: List[QuerySet]) -> Dict[str, Dict[str, Any]]: def get_user_activity_summary(records: List[QuerySet]) -> Dict[str, Dict[str, Any]]:
@ -1473,7 +1473,7 @@ def user_activity_summary_table(user_summary: Dict[str, Dict[str, Any]]) -> str:
'count', 'count',
] ]
title = 'User Activity' title = 'User activity'
return make_table(title, cols, rows) return make_table(title, cols, rows)
def realm_user_summary_table(all_records: List[QuerySet], def realm_user_summary_table(all_records: List[QuerySet],

View File

@ -39,7 +39,7 @@ method][install-vagrant].
If you have a very slow network connection, however, you may want to If you have a very slow network connection, however, you may want to
avoid using Vagrant (which involves downloading an Ubuntu virtual avoid using Vagrant (which involves downloading an Ubuntu virtual
machine or Linux Container) and either machine or Linux container) and either
[install directly][install-direct] (recommended), or use [install directly][install-direct] (recommended), or use
[the manual install process][install-generic] instead. These options [the manual install process][install-generic] instead. These options
only support Linux. only support Linux.
@ -71,7 +71,7 @@ need to.
Once you've installed the Zulip development environment, you'll want Once you've installed the Zulip development environment, you'll want
to read these documents to learn how to use it: to read these documents to learn how to use it:
* [Using the Development Environment][using-dev-env] * [Using the development environment][using-dev-env]
* [Testing][testing] (and [Configuring CI][ci]) * [Testing][testing] (and [Configuring CI][ci])
And if you've set up the Zulip development environment on a remote And if you've set up the Zulip development environment on a remote

View File

@ -254,7 +254,7 @@ Now your workspace should look similar this:
Next, read the following to learn more about developing for Zulip: Next, read the following to learn more about developing for Zulip:
* [Git & GitHub Guide][rtd-git-guide] * [Git & GitHub Guide][rtd-git-guide]
* [Using the Development Environment][rtd-using-dev-env] * [Using the development environment][rtd-using-dev-env]
* [Testing][rtd-testing] * [Testing][rtd-testing]
[install-direct]: ../development/setup-advanced.html#installing-directly-on-ubuntu-debian-centos-or-fedora [install-direct]: ../development/setup-advanced.html#installing-directly-on-ubuntu-debian-centos-or-fedora

View File

@ -73,7 +73,7 @@ Once you've confirmed you can connect to your remote server, take a look at:
Next, read the following to learn more about developing for Zulip: Next, read the following to learn more about developing for Zulip:
* [Using the Development Environment](../development/using.md) * [Using the development environment](../development/using.md)
* [Testing](../testing/testing.md) * [Testing](../testing/testing.md)
[github-join]: https://github.com/join [github-join]: https://github.com/join

View File

@ -2,19 +2,19 @@
Contents: Contents:
* [Installing directly on Ubuntu, Debian, Centos, or Fedora](#installing-directly-on-ubuntu-debian-centos-or-fedora) * [Installing directly on Ubuntu, Debian, CentOS, or Fedora](#installing-directly-on-ubuntu-debian-centos-or-fedora)
* [Installing directly on Windows 10](#installing-directly-on-windows-10-experimental) * [Installing directly on Windows 10](#installing-directly-on-windows-10-experimental)
* [Installing manually on other Linux/UNIX](#installing-manually-on-unix) * [Installing manually on other Linux/UNIX](#installing-manually-on-unix)
* [Installing directly on cloud9](#installing-on-cloud9) * [Installing directly on cloud9](#installing-on-cloud9)
## Installing directly on Ubuntu, Debian, Centos, or Fedora ## Installing directly on Ubuntu, Debian, CentOS, or Fedora
If you'd like to install a Zulip development environment on a computer If you'd like to install a Zulip development environment on a computer
that's running one of: that's running one of:
* Ubuntu 20.04 Focal, 18.04 Bionic * Ubuntu 20.04 Focal, 18.04 Bionic
* Debian 10 Buster * Debian 10 Buster
* Centos 7 (beta) * CentOS 7 (beta)
* Fedora 29 (beta) * Fedora 29 (beta)
* RHEL 7 (beta) * RHEL 7 (beta)
@ -279,14 +279,14 @@ proxy in the environment as follows:
yarn config set https-proxy http://proxy_host:port yarn config set https-proxy http://proxy_host:port
``` ```
## Installing on cloud9 ## Installing on Cloud9
AWS Cloud9 is a cloud-based integrated development environment (IDE) AWS Cloud9 is a cloud-based integrated development environment (IDE)
that lets you write, run, and debug your code with just a browser. It that lets you write, run, and debug your code with just a browser. It
includes a code editor, debugger, and terminal. includes a code editor, debugger, and terminal.
This section documents how to set up the Zulip development environment This section documents how to set up the Zulip development environment
in a cloud9 workspace. If you don't have an existing cloud9 account, in a Cloud9 workspace. If you don't have an existing Cloud9 account,
you can sign up [here](https://aws.amazon.com/cloud9/). you can sign up [here](https://aws.amazon.com/cloud9/).
* Create a Workspace, and select the blank template. * Create a Workspace, and select the blank template.
@ -295,10 +295,10 @@ you can sign up [here](https://aws.amazon.com/cloud9/).
Free Tier). Free Tier).
* Clone the zulip repo: `git clone --config pull.rebase * Clone the zulip repo: `git clone --config pull.rebase
https://github.com/<your-username>/zulip.git` https://github.com/<your-username>/zulip.git`
* Restart rabbitmq-server since its broken on cloud9: `sudo service * Restart rabbitmq-server since its broken on Cloud9: `sudo service
rabbitmq-server restart`. rabbitmq-server restart`.
* And run provision `cd zulip && ./tools/provision`, once this is done. * And run provision `cd zulip && ./tools/provision`, once this is done.
* Activate the zulip virtual environment by `source * Activate the Zulip virtual environment by `source
/srv/zulip-py3-venv/bin/activate` or by opening a new terminal. /srv/zulip-py3-venv/bin/activate` or by opening a new terminal.
#### Install zulip-cloud9 #### Install zulip-cloud9
@ -321,7 +321,7 @@ you need to start a new terminal.
Your development server would be running at Your development server would be running at
`https://<workspace-name>-<username>.c9users.io` on port 8080. You `https://<workspace-name>-<username>.c9users.io` on port 8080. You
dont need to add `:8080` to your url, since the cloud9 proxy should dont need to add `:8080` to your URL, since the Cloud9 proxy should
automatically forward the connection. You might want to visit automatically forward the connection. You might want to visit
[zulip-cloud9 repo](https://github.com/cPhost/zulip-cloud9) and it's [zulip-cloud9 repo](https://github.com/cPhost/zulip-cloud9) and it's
[wiki](https://github.com/cPhost/zulip-cloud9/wiki) for more info on [wiki](https://github.com/cPhost/zulip-cloud9/wiki) for more info on

View File

@ -65,7 +65,7 @@ to GitHub working on your machine.
Follow our [Git guide][set-up-git] in order to install Git, set up a Follow our [Git guide][set-up-git] in order to install Git, set up a
GitHub account, create an SSH key to access code on GitHub GitHub account, create an SSH key to access code on GitHub
efficiently, etc. Be sure to create an ssh key and add it to your efficiently, etc. Be sure to create an SSH key and add it to your
GitHub account using GitHub account using
[these instructions](https://help.github.com/en/articles/generating-an-ssh-key). [these instructions](https://help.github.com/en/articles/generating-an-ssh-key).
@ -83,8 +83,8 @@ Jump to:
1. Install [Vagrant][vagrant-dl] (latest). 1. Install [Vagrant][vagrant-dl] (latest).
2. Install [VirtualBox][vbox-dl] (latest). 2. Install [VirtualBox][vbox-dl] (latest).
(For a non-free option, but better performance, you can also use [VMWare (For a non-free option, but better performance, you can also use [VMware
Fusion][vmware-fusion-dl] with the [VMWare Fusion Vagrant Fusion][vmware-fusion-dl] with the [VMware Fusion Vagrant
plugin][vagrant-vmware-fusion-dl] or [Parallels Desktop][parallels-desktop-dl] as plugin][vagrant-vmware-fusion-dl] or [Parallels Desktop][parallels-desktop-dl] as
a provider for Vagrant.) a provider for Vagrant.)
@ -252,7 +252,7 @@ git remote add -f upstream https://github.com/zulip/zulip.git
This will create a 'zulip' directory and download the Zulip code into it. This will create a 'zulip' directory and download the Zulip code into it.
Don't forget to replace YOURUSERNAME with your git username. You will see Don't forget to replace YOURUSERNAME with your Git username. You will see
something like: something like:
``` ```
@ -534,7 +534,7 @@ $ ./tools/run-dev.py
Next, read the following to learn more about developing for Zulip: Next, read the following to learn more about developing for Zulip:
* [Git & GitHub Guide][rtd-git-guide] * [Git & GitHub Guide][rtd-git-guide]
* [Using the Development Environment][rtd-using-dev-env] * [Using the development environment][rtd-using-dev-env]
* [Testing][rtd-testing] (and [Configuring CI][ci] to * [Testing][rtd-testing] (and [Configuring CI][ci] to
run the full test suite against any branches you push to your fork, run the full test suite against any branches you push to your fork,
which can help you optimize your development workflow). which can help you optimize your development workflow).
@ -803,7 +803,7 @@ that failed. Once you've resolved the problem, you can rerun
`tools/provision` to proceed; the provisioning system is designed `tools/provision` to proceed; the provisioning system is designed
to recover well from failures. to recover well from failures.
The zulip provisioning system is generally highly reliable; the most common The Zulip provisioning system is generally highly reliable; the most common
cause of issues here is a poor network connection (or one where you need a cause of issues here is a poor network connection (or one where you need a
proxy to access the Internet and haven't [configured the development proxy to access the Internet and haven't [configured the development
environment to use it](#specifying-a-proxy). environment to use it](#specifying-a-proxy).
@ -985,7 +985,7 @@ connect to your development server.
### Customizing CPU and RAM allocation ### Customizing CPU and RAM allocation
When running Vagrant using a VM-based provider such as VirtualBox or When running Vagrant using a VM-based provider such as VirtualBox or
VMWare Fusion, CPU and RAM resources must be explicitly allocated to VMware Fusion, CPU and RAM resources must be explicitly allocated to
the guest system (with Docker and other container-based Vagrant the guest system (with Docker and other container-based Vagrant
providers, explicit allocation is unnecessary and the settings providers, explicit allocation is unnecessary and the settings
described here are ignored). described here are ignored).

View File

@ -34,7 +34,7 @@ Zulip servers. These docs are written in
[Commonmark Markdown](https://commonmark.org/) with a small bit of rST. [Commonmark Markdown](https://commonmark.org/) with a small bit of rST.
We've chosen Markdown because it is We've chosen Markdown because it is
[easy to write](https://commonmark.org/help/). The source for Zulip's [easy to write](https://commonmark.org/help/). The source for Zulip's
developer documentation is at `docs/` in the Zulip git repository, and developer documentation is at `docs/` in the Zulip Git repository, and
they are served in production at they are served in production at
[zulip.readthedocs.io](https://zulip.readthedocs.io/en/latest/). [zulip.readthedocs.io](https://zulip.readthedocs.io/en/latest/).
@ -129,7 +129,7 @@ payload verification. Note that this test does not check for broken
links (those are checked by `test-help-documentation`). links (those are checked by `test-help-documentation`).
* `tools/test-help-documentation` checks `/help/`, `/api/`, * `tools/test-help-documentation` checks `/help/`, `/api/`,
`/integrations/`, and the Core website ("portico") documentation for `/integrations/`, and the core website ("portico") documentation for
broken links. Note that the "portico" documentation check has a broken links. Note that the "portico" documentation check has a
manually maintained whitelist of pages, so if you add a new page to manually maintained whitelist of pages, so if you add a new page to
this site, you will need to edit `PorticoDocumentationSpider` to add it. this site, you will need to edit `PorticoDocumentationSpider` to add it.

View File

@ -11,7 +11,7 @@ The feature articles serve a few different purposes:
* Feature discovery, for someone browsing the `/help` page, and looking at * Feature discovery, for someone browsing the `/help` page, and looking at
the set of titles. the set of titles.
* Public documentation of our featureset, for someone googling "can zulip do .." * Public documentation of our featureset, for someone googling "can zulip do .."
* Canned responses to support questions; if someone emails a zulip admin * Canned responses to support questions; if someone emails a Zulip admin
asking "how do I change my name", they can reply with a link to the doc. asking "how do I change my name", they can reply with a link to the doc.
* Feature explanations for new Zulip users and admins, especially for * Feature explanations for new Zulip users and admins, especially for
organization settings. organization settings.
@ -239,9 +239,9 @@ languages in API docs, etc. To create a tab switcher, write:
{start_tabs} {start_tabs}
{tab|desktop-web} {tab|desktop-web}
# First Tab's content # First tab's content
{tab|ios} {tab|ios}
# Second Tab's content # Second tab's content
{tab|android} {tab|android}
# Third tab's content # Third tab's content
{end_tabs} {end_tabs}

View File

@ -51,8 +51,8 @@ Finally, install the [Zulip developer environment][zulip-rtd-dev-overview], and
*** ***
The following sections will help you be awesome with Zulip and Git/GitHub in a The following sections will help you be awesome with Zulip and Git/GitHub in a
rebased-based workflow. Read through it if you're new to git, to a rebase-based rebased-based workflow. Read through it if you're new to Git, to a rebase-based
git workflow, or if you'd like a git refresher. Git workflow, or if you'd like a Git refresher.
[gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing [gitbook-rebase]: https://git-scm.com/book/en/v2/Git-Branching-Rebasing
[github-rebase-pr]: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request [github-rebase-pr]: https://github.com/edx/edx-platform/wiki/How-to-Rebase-a-Pull-Request

View File

@ -14,7 +14,7 @@ administrator][git-bash-admin] at all times.**
You'll also need a GitHub account, which you can sign up for You'll also need a GitHub account, which you can sign up for
[here][github-join]. [here][github-join].
We highly recommend you create an ssh key if you don't already have We highly recommend you create an SSH key if you don't already have
one and [add it to your GitHub account][github-help-add-ssh-key]. If one and [add it to your GitHub account][github-help-add-ssh-key]. If
you don't, you'll have to type your GitHub username and password every you don't, you'll have to type your GitHub username and password every
time you interact with GitHub, which is usually several times a day. time you interact with GitHub, which is usually several times a day.
@ -44,7 +44,7 @@ If you don't already have one installed, here are some suggestions:
- Windows: [SourceTree][gitgui-sourcetree] - Windows: [SourceTree][gitgui-sourcetree]
If you like working on the command line, but want better visualization and If you like working on the command line, but want better visualization and
navigation of your git repo, try [Tig][tig], a cross-platform ncurses-based navigation of your Git repo, try [Tig][tig], a cross-platform ncurses-based
text-mode interface to Git. text-mode interface to Git.
And, if none of the above are to your liking, try [one of these][gitbook-guis]. And, if none of the above are to your liking, try [one of these][gitbook-guis].

View File

@ -1,7 +1,7 @@
# Important Git terms # Important Git terms
When you install Git, it adds a manual entry for `gitglossary`. You can view When you install Git, it adds a manual entry for `gitglossary`. You can view
this glossary by running `man gitglossary`. Below we've included the git terms this glossary by running `man gitglossary`. Below we've included the Git terms
you'll encounter most often along with their definitions from *gitglossary*. you'll encounter most often along with their definitions from *gitglossary*.
## branch ## branch

View File

@ -1,7 +1,7 @@
# Working copies # Working copies
When you work on Zulip code, there are three working copies When you work on Zulip code, there are three working copies
of the Zulip git repo that you are generally concerned with: of the Zulip Git repo that you are generally concerned with:
- local copy: This lives on your laptop or your remote dev instance. - local copy: This lives on your laptop or your remote dev instance.
- forked copy: This lives on GitHub, and it's tied to your account. - forked copy: This lives on GitHub, and it's tied to your account.

View File

@ -135,7 +135,7 @@ from outside.
and the production build process (`tools/build-release-tarball`) and the production build process (`tools/build-release-tarball`)
compiles, minifies, and installs the static assets into the compiles, minifies, and installs the static assets into the
`prod-static/` tree form. In development, files are served directly `prod-static/` tree form. In development, files are served directly
from `/static/` in the git repository. from `/static/` in the Git repository.
- Requests to `/json/events` and `/api/v1/events`, i.e. the - Requests to `/json/events` and `/api/v1/events`, i.e. the
real-time push system, are sent to the Tornado server. real-time push system, are sent to the Tornado server.
- Requests to all other paths are sent to the Django app running via - Requests to all other paths are sent to the Django app running via
@ -184,25 +184,25 @@ persistence:
# Zulip-specific configuration: disable saving to disk. # Zulip-specific configuration: disable saving to disk.
save "" save ""
People often wonder if we could replace memcached with redis (or People often wonder if we could replace memcached with Redis (or
replace RabbitMQ with redis, with some loss of functionality). replace RabbitMQ with Redis, with some loss of functionality).
The answer is likely yes, but it wouldn't improve Zulip. The answer is likely yes, but it wouldn't improve Zulip.
Operationally, our current setup is likely easier to develop and run Operationally, our current setup is likely easier to develop and run
in production than a pure redis system would be. Meanwhile, the in production than a pure Redis system would be. Meanwhile, the
perceived benefit for using redis is usually to reduce memory perceived benefit for using Redis is usually to reduce memory
consumption by running fewer services, and no such benefit would consumption by running fewer services, and no such benefit would
materialize: materialize:
* Our cache uses significant memory, but that memory usage would be * Our cache uses significant memory, but that memory usage would be
essentially the same with redis as it is with memcached. essentially the same with Redis as it is with memcached.
* All of these services have low minimum memory requirements, and in * All of these services have low minimum memory requirements, and in
fact our applications for redis and RabbitMQ do not use significant fact our applications for Redis and RabbitMQ do not use significant
memory even at scale. memory even at scale.
* We would likely need to run multiple redis services (with different * We would likely need to run multiple Redis services (with different
configurations) in order to ensure the pure LRU use case (memcached) configurations) in order to ensure the pure LRU use case (memcached)
doesn't push out data that we want to persist until expiry doesn't push out data that we want to persist until expiry
(redis-based rate limiting) or until consumed (RabbitMQ-based (Redis-based rate limiting) or until consumed (RabbitMQ-based
queuing of deferred work). queuing of deferred work).
### RabbitMQ ### RabbitMQ
@ -237,12 +237,12 @@ with the operating system.
In production, Postgres is installed with a default configuration. The In production, Postgres is installed with a default configuration. The
directory that would contain configuration files directory that would contain configuration files
(`puppet/zulip/files/postgresql`) has only a utility script and a custom (`puppet/zulip/files/postgresql`) has only a utility script and a custom
list of stopwords used by a Postgresql extension. list of stopwords used by a PostgreSQL extension.
In a development environment, configuration of that postgresql In a development environment, configuration of that PostgreSQL
extension is handled by `tools/postgres-init-dev-db` (invoked by extension is handled by `tools/postgres-init-dev-db` (invoked by
`tools/provision`). That file also manages setting up the `tools/provision`). That file also manages setting up the
development postgresql user. development PostgreSQL user.
`tools/provision` also invokes `tools/rebuild-dev-database` `tools/provision` also invokes `tools/rebuild-dev-database`
to create the actual database with its schema. to create the actual database with its schema.
@ -287,11 +287,11 @@ self-explanatory names.
topic]", or "Link to this conversation". To avoid visual clutter, topic]", or "Link to this conversation". To avoid visual clutter,
the chevron only appears in the web UI upon hover. the chevron only appears in the web UI upon hover.
* **ellipsis**: A small vertical three dot icon(technically called * **ellipsis**: A small vertical three dot icon (technically called
as ellipsis-v), present in sidebars as a menu icon. as ellipsis-v), present in sidebars as a menu icon.
It offers contextual options for Global Filters(All messages It offers contextual options for global filters (All messages
and Starred messages), Stream Filters and Topics in left and Starred messages), stream filters and topics in left
sidebar and User in right sidebar. To avoid visual clutter sidebar and users in right sidebar. To avoid visual clutter
ellipsis only appears in the web UI upon hover. ellipsis only appears in the web UI upon hover.
* **huddle**: What the codebase calls a "group private message". * **huddle**: What the codebase calls a "group private message".

View File

@ -31,7 +31,7 @@ in bursts.
data will fascilitate future features showing a log of activity by data will fascilitate future features showing a log of activity by
a given user or changes to an organization's settings. a given user or changes to an organization's settings.
- Added support for using Sentry for processing backend exceptions. - Added support for using Sentry for processing backend exceptions.
- Added documentation for using `wal-g` for continuous postgres backups. - Added documentation for using `wal-g` for continuous Postgres backups.
- Added loading spinners for message editing widgets. - Added loading spinners for message editing widgets.
- Added live update of compose placeholder text when recipients change. - Added live update of compose placeholder text when recipients change.
- The Zoom integration is now stable (no longer beta). - The Zoom integration is now stable (no longer beta).
@ -50,7 +50,7 @@ in bursts.
- Fixed screenreader accessibility of many components, including - Fixed screenreader accessibility of many components, including
the compose box, message editing, popovers, and many more. the compose box, message editing, popovers, and many more.
- Improved formatting of GitLab integration. - Improved formatting of GitLab integration.
- Improved positioning logic for inline Youtube previews. - Improved positioning logic for inline YouTube previews.
- Upgraded our ancient forked version of bootstrap, on a path towards - Upgraded our ancient forked version of bootstrap, on a path towards
removing the last forked dependencies from the codebase. removing the last forked dependencies from the codebase.
- Updated webapp codebase to use many modern ES6 patterns. - Updated webapp codebase to use many modern ES6 patterns.
@ -124,7 +124,7 @@ in bursts.
- The Zulip server now sets badge counts for the iOS mobile app. - The Zulip server now sets badge counts for the iOS mobile app.
- Quote-and-reply now generates a handy link to the quoted message. - Quote-and-reply now generates a handy link to the quoted message.
- Upgraded Django from 1.11.x to the latest LTS series, 2.2.x. - Upgraded Django from 1.11.x to the latest LTS series, 2.2.x.
- Added integrations for ErrBit, Grafana, Thinkst Canary, and AlertManager. - Added integrations for ErrBit, Grafana, Thinkst Canary, and Alertmanager.
- Extended API documentation to have detailed data on most responses, - Extended API documentation to have detailed data on most responses,
validated against the API's actual implementation and against all validated against the API's actual implementation and against all
tests in our extensive automated test suite. tests in our extensive automated test suite.
@ -132,7 +132,7 @@ in bursts.
global/default policy and policies for specific streams. global/default policy and policies for specific streams.
- Added a new incoming webhook API that accepts messages in the format - Added a new incoming webhook API that accepts messages in the format
used by Slack's incoming webhooks API. used by Slack's incoming webhooks API.
- Introduced the Zulip API Feature Level, a concept that will greatly - Introduced the Zulip API feature level, a concept that will greatly
simplify the implementation of mobile, terminal, and desktop clients simplify the implementation of mobile, terminal, and desktop clients
that need to talk to a wide range of supported Zulip server that need to talk to a wide range of supported Zulip server
versions, as well as the [Zulip API versions, as well as the [Zulip API
@ -162,22 +162,22 @@ in bursts.
accounts affected by this bug, so we expect the vast majority of accounts affected by this bug, so we expect the vast majority of
installations will have none. installations will have none.
- This release switches Zulip to install Postgres 12 from the upstream - This release switches Zulip to install Postgres 12 from the upstream
postgres repository by default, rather than using the default Postgres repository by default, rather than using the default
Postgres version included with the operating system. Existing Zulip Postgres version included with the operating system. Existing Zulip
installations will continue to work with Postgres 10; this detail is installations will continue to work with Postgres 10; this detail is
configured in `/etc/zulip/zulip.conf`. We have no concrete plans to configured in `/etc/zulip/zulip.conf`. We have no concrete plans to
start requiring Postgres 12, though we do expect it to improve start requiring Postgres 12, though we do expect it to improve
performance. Installations that would like to upgrade can follow performance. Installations that would like to upgrade can follow
[our new postgres upgrade guide][postgres-upgrade]. [our new Postgres upgrade guide][postgres-upgrade].
- The format of the `JWT_AUTH_KEYS` setting has changed to include an - The format of the `JWT_AUTH_KEYS` setting has changed to include an
[algorithms](https://pyjwt.readthedocs.io/en/latest/algorithms.html) [algorithms](https://pyjwt.readthedocs.io/en/latest/algorithms.html)
list: `{"subdomain": "key"}` becomes `{"subdomain": {"key": "key", list: `{"subdomain": "key"}` becomes `{"subdomain": {"key": "key",
"algorithms": ["HS256"]}}`. "algorithms": ["HS256"]}}`.
- Added a new Organization Owner permission above the previous - Added a new organization owner permission above the previous
Organization Administrator. All existing organization organization administrator. All existing organization
administrators are automatically converted into organization owners. administrators are automatically converted into organization owners.
Certain sensitive administrative settings are now only Certain sensitive administrative settings are now only
editable by Organization Owners. editable by organization owners.
- The changelog now has a section that makes it easy to find the - The changelog now has a section that makes it easy to find the
Upgrade notes for all releases one is upgrading across. Upgrade notes for all releases one is upgrading across.
@ -322,7 +322,7 @@ in bursts.
### 2.1.7 -- 2020-06-25 ### 2.1.7 -- 2020-06-25
- CVE-2020-15070: Fix privilege escalation vulnerability with custom - CVE-2020-15070: Fix privilege escalation vulnerability with custom
profile fields and direct write access to Zulip's postgres database. profile fields and direct write access to Zulip's Postgres database.
- Changed default memcached authentication username to zulip@localhost, - Changed default memcached authentication username to zulip@localhost,
fixing authentication problems when servers change their hostname. fixing authentication problems when servers change their hostname.
@ -366,7 +366,7 @@ details.
- Fixed a regression in 2.1.3 that impacted creating the very first - Fixed a regression in 2.1.3 that impacted creating the very first
organization via our data import tools. organization via our data import tools.
- Remove the old `tsearch_extras` postgres extension, which was causing - Remove the old `tsearch_extras` Postgres extension, which was causing
an exception restoring backups on fresh Zulip servers that had been an exception restoring backups on fresh Zulip servers that had been
generated on systems that had been upgraded from older Zulip releases. generated on systems that had been upgraded from older Zulip releases.
- Removed fetching GitHub contributor data from static asset build - Removed fetching GitHub contributor data from static asset build
@ -398,7 +398,7 @@ details.
- Fixed copy-to-clipboard button for outgoing webhook bots. - Fixed copy-to-clipboard button for outgoing webhook bots.
- Fixed logging spam from soft_deactivation cron job. - Fixed logging spam from soft_deactivation cron job.
- Fixed email integration handling of emails with nested MIME structure. - Fixed email integration handling of emails with nested MIME structure.
- Fixed unicode bugs in incoming email integration. - Fixed Unicode bugs in incoming email integration.
- Fixed error handling for Slack data import. - Fixed error handling for Slack data import.
- Fixed incoming webhook support for AWX 9.x.y. - Fixed incoming webhook support for AWX 9.x.y.
- Fixed a couple missing translation tags. - Fixed a couple missing translation tags.
@ -413,8 +413,8 @@ details.
- Corrected fix for CVE-2019-19775 (the original fix was affected by - Corrected fix for CVE-2019-19775 (the original fix was affected by
an unfixed security bug in Python's urllib, CVE-2015-2104). an unfixed security bug in Python's urllib, CVE-2015-2104).
- Migrated data for handling replies to missed-message emails from - Migrated data for handling replies to missed-message emails from
semi-persistent redis to the fully persistent database. semi-persistent Redis to the fully persistent database.
- Added authentication for redis and memcached even in configurations - Added authentication for Redis and memcached even in configurations
where these are running on localhost, for add hardening against where these are running on localhost, for add hardening against
attacks from malicious processes running on the Zulip server. attacks from malicious processes running on the Zulip server.
- Improved logging for misconfigurations of LDAP authentication. - Improved logging for misconfigurations of LDAP authentication.
@ -444,7 +444,7 @@ details.
- Added support for Debian buster. Removed support for EOL Ubuntu Trusty. - Added support for Debian buster. Removed support for EOL Ubuntu Trusty.
- Added support for SAML authentication. - Added support for SAML authentication.
- Removed our dependency on `tsearch_extras`, making it possible to - Removed our dependency on `tsearch_extras`, making it possible to
run a production Zulip server against any postgres database run a production Zulip server against any Postgres database
(including those where one cannot install extensions, like Amazon RDS). (including those where one cannot install extensions, like Amazon RDS).
- Significantly improved the email->Zulip gateway, and added [nice - Significantly improved the email->Zulip gateway, and added [nice
setup documentation](../production/email-gateway.md). It now setup documentation](../production/email-gateway.md). It now
@ -488,7 +488,7 @@ configure this feature entirely in the UI. However, servers that had
previously [enabled previews of linked previously [enabled previews of linked
websites](https://zulip.com/help/allow-image-link-previews) will websites](https://zulip.com/help/allow-image-link-previews) will
lose the setting and need to re-enable it. lose the setting and need to re-enable it.
- We rewrote the Google Authentication backend to use the - We rewrote the Google authentication backend to use the
`python-social-auth` system we use for other third-party `python-social-auth` system we use for other third-party
authentication systems. For this release, the old variable names authentication systems. For this release, the old variable names
still work, but users should update the following setting names in still work, but users should update the following setting names in
@ -644,7 +644,7 @@ lose the setting and need to re-enable it.
joined that stream. joined that stream.
- Fixed several subtle real-time sync issues with "stream settings". - Fixed several subtle real-time sync issues with "stream settings".
- Fixed a few subtle Markdown processor bugs involving emoji. - Fixed a few subtle Markdown processor bugs involving emoji.
- Fixed several issues where Linkifiers validation was overly restrictive. - Fixed several issues where linkifiers validation was overly restrictive.
- Fixed several rare/minor UI consistency issues in the left sidebar. - Fixed several rare/minor UI consistency issues in the left sidebar.
- Fixed issues involving saving a message edit before file upload completes. - Fixed issues involving saving a message edit before file upload completes.
- Fixed issues with pasting images into the compose box from Safari. - Fixed issues with pasting images into the compose box from Safari.
@ -700,7 +700,7 @@ lose the setting and need to re-enable it.
- Fixed a table layout bug in "deactivated users" settings. - Fixed a table layout bug in "deactivated users" settings.
- Fixed an exception when administrators edited bot users when custom - Fixed an exception when administrators edited bot users when custom
profile fields were configured in the organization. profile fields were configured in the organization.
- Fixed a bug enabling the PGRoonga search backend with older postgres. - Fixed a bug enabling the PGRoonga search backend with older Postgres.
- Fixed getting personal API key when passwords are disabled. - Fixed getting personal API key when passwords are disabled.
### 2.0.3 -- 2019-04-23 ### 2.0.3 -- 2019-04-23
@ -714,11 +714,11 @@ lose the setting and need to re-enable it.
such a version by default, but one can install it manually). such a version by default, but one can install it manually).
- Fixed `manage.py query_ldap` test tool (broken in 2.0.2). - Fixed `manage.py query_ldap` test tool (broken in 2.0.2).
- Fixed several bugs in new backup and restore tools. - Fixed several bugs in new backup and restore tools.
- Fixed minor bugs with Youtube previews. - Fixed minor bugs with YouTube previews.
### 2.0.2 -- 2019-03-15 ### 2.0.2 -- 2019-03-15
- Fixed a regression in the puppet configuration for S3 upload backend - Fixed a regression in the Puppet configuration for S3 upload backend
introduced in 2.0.1. introduced in 2.0.1.
- Fixed a too-fast fade for "Saved" in organization settings. - Fixed a too-fast fade for "Saved" in organization settings.
- Fixed a white flash when loading a browser in night mode. - Fixed a white flash when loading a browser in night mode.
@ -821,7 +821,7 @@ and is enabled by default in that case. To disable it, set
- Improved accessibility of emoji rendering in messages bodies. - Improved accessibility of emoji rendering in messages bodies.
- Eliminated UI lag when using "Quote and reply". - Eliminated UI lag when using "Quote and reply".
- Expanded production documentation for more unusual deployment options. - Expanded production documentation for more unusual deployment options.
- Expanded set of characters allowed in custom Linkifiers. - Expanded set of characters allowed in custom linkifiers.
- Optimized development provisioning; now takes 2s in the no-op case. - Optimized development provisioning; now takes 2s in the no-op case.
- Zulip's Help Center now has nicely generated open graph tags. - Zulip's Help Center now has nicely generated open graph tags.
- Fixed missing API authentication headers for mobile file access. - Fixed missing API authentication headers for mobile file access.
@ -842,11 +842,11 @@ and is enabled by default in that case. To disable it, set
### 1.9.2 -- 2019-01-29 ### 1.9.2 -- 2019-01-29
This release migrates Zulip off a deprecated Google+ API (necessary This release migrates Zulip off a deprecated Google+ API (necessary
for Google Authentication to continue working past March 7), and for Google authentication to continue working past March 7), and
contains a few bug fixes for the installer and Slack import. It has contains a few bug fixes for the installer and Slack import. It has
minimal changes for existing servers not using Google authentication. minimal changes for existing servers not using Google authentication.
- Updated the Google Auth integration to stop using a deprecated and - Updated the Google auth integration to stop using a deprecated and
soon-to-be-removed Google+ authentication API. soon-to-be-removed Google+ authentication API.
- Improved installer error messages for common configuration problems. - Improved installer error messages for common configuration problems.
- Fixed several bugs in Slack, Gitter, and HipChat import tools. - Fixed several bugs in Slack, Gitter, and HipChat import tools.
@ -976,7 +976,7 @@ Zulip installations; it has minimal changes for existing servers.
- Improved Zulip's layout for windows with a width around 1024px. - Improved Zulip's layout for windows with a width around 1024px.
- Improved Zulip's generic error handling behavior for webhooks. - Improved Zulip's generic error handling behavior for webhooks.
- Improved keyboard navigation of settings and popovers. - Improved keyboard navigation of settings and popovers.
- Renamed "Realm Filters" to "Linkifiers", at least in the UI. - Renamed "realm filters" to "linkifiers", at least in the UI.
- Converted several layered-checkbox settings to clearer dropdowns. - Converted several layered-checkbox settings to clearer dropdowns.
- Cleaned up some legacy APIs still using email addresses. - Cleaned up some legacy APIs still using email addresses.
- Made arrow-key navigation work within right and left sidebar search. - Made arrow-key navigation work within right and left sidebar search.
@ -1079,7 +1079,7 @@ Zulip installations; it has minimal changes for existing servers.
public streams, even though from before a user subscribed. public streams, even though from before a user subscribed.
- Added a menu item to mark all messages as read. - Added a menu item to mark all messages as read.
- Fixed image upload file pickers offering non-image files. - Fixed image upload file pickers offering non-image files.
- Fixed some subtle bugs with full-text search and unicode. - Fixed some subtle bugs with full-text search and Unicode.
- Fixed bugs in the "edit history" HTML rendering process. - Fixed bugs in the "edit history" HTML rendering process.
- Fixed popovers being closed when new messages come in. - Fixed popovers being closed when new messages come in.
- Fixed unexpected code blocks when using the email mirror. - Fixed unexpected code blocks when using the email mirror.
@ -1413,7 +1413,7 @@ running a version from before 1.7 should upgrade directly to 1.7.1.
- Simplified the settings for configuring senders for our emails. - Simplified the settings for configuring senders for our emails.
- Emoji can now be typed with spaces, e.g. entering "robot face" in - Emoji can now be typed with spaces, e.g. entering "robot face" in
the typeahead as well as "robot_face". the typeahead as well as "robot_face".
- Improved title and alt text for unicode emoji. - Improved title and alt text for Unicode emoji.
- Added development tools to make iterating on emails and error pages easy. - Added development tools to make iterating on emails and error pages easy.
- Added backend support for multi-use invite links (no UI for creating yet). - Added backend support for multi-use invite links (no UI for creating yet).
- Added a central debugging log for attempts to send outgoing emails. - Added a central debugging log for attempts to send outgoing emails.
@ -1486,7 +1486,7 @@ Zulip apps.
* Added an icon to distinguish bot users as message senders. * Added an icon to distinguish bot users as message senders.
* Added a command-line Slack importer tool using the API. * Added a command-line Slack importer tool using the API.
* Added new announcement notifications on stream creation. * Added new announcement notifications on stream creation.
* Added support for some newer unicode emoji code points. * Added support for some newer Unicode emoji code points.
* Added support for users deleting realm emoji they themselves uploaded. * Added support for users deleting realm emoji they themselves uploaded.
* Added support for organization administrators deleting messages. * Added support for organization administrators deleting messages.
* Extended data available to mobile apps to cover the entire API. * Extended data available to mobile apps to cover the entire API.
@ -1523,7 +1523,7 @@ Zulip apps.
* Fixed numerous bugs with the message editing widget. * Fixed numerous bugs with the message editing widget.
* Fixed missing logging / rate limiting on browser endpoints. * Fixed missing logging / rate limiting on browser endpoints.
* Fixed regressions in Zulip's browser state preservation on reload logic. * Fixed regressions in Zulip's browser state preservation on reload logic.
* Fixed support for unicode characters in the email mirror system. * Fixed support for Unicode characters in the email mirror system.
* Fixed load spikes when email mirror is receiving a lot of traffic. * Fixed load spikes when email mirror is receiving a lot of traffic.
* Fixed the ugly grey flicker when scrolling fast on Macs. * Fixed the ugly grey flicker when scrolling fast on Macs.
* Fixed previews of GitHub image URLs. * Fixed previews of GitHub image URLs.
@ -1597,7 +1597,7 @@ Zulip apps.
- Added a webhook integration for GitHub, replacing the deprecated - Added a webhook integration for GitHub, replacing the deprecated
github-services hook. github-services hook.
- Normalized the message formatting for all the Zulip Git integrations. - Normalized the message formatting for all the Zulip Git integrations.
- Added support for VMWare Fusion Vagrant provider for faster OSX - Added support for VMware Fusion Vagrant provider for faster OSX
development. development.
- Added a shields.io style badge for joining a Zulip server. - Added a shields.io style badge for joining a Zulip server.
- Added admin setting for which email domains can join a realm. - Added admin setting for which email domains can join a realm.
@ -1630,7 +1630,7 @@ Zulip apps.
- Added several new linters (eslint, pep8) and cleaned the codebase. - Added several new linters (eslint, pep8) and cleaned the codebase.
- Optimized the speed of the Zulip upgrade process, especially with Git. - Optimized the speed of the Zulip upgrade process, especially with Git.
- Have peer_add events send user_id, not email. - Have peer_add events send user_id, not email.
- Fixed problems with rabbitmq when installing Zulip. - Fixed problems with RabbitMQ when installing Zulip.
- Fixed JavaScript not being gzip-compressed properly. - Fixed JavaScript not being gzip-compressed properly.
- Fixed a major performance bug in the Tornado service. - Fixed a major performance bug in the Tornado service.
- Fixed a frontend performance bug creating streams in very large realms. - Fixed a frontend performance bug creating streams in very large realms.
@ -1702,8 +1702,8 @@ Zulip apps.
- Added management command for creating realms through web UI. - Added management command for creating realms through web UI.
- Added management command to send password reset emails. - Added management command to send password reset emails.
- Added endpoint for mobile apps to query available auth backends. - Added endpoint for mobile apps to query available auth backends.
- Added LetsEncrypt documentation for getting SSL certificates. - Added Let's Encrypt documentation for getting SSL certificates.
- Added nice rendering of unicode emoji. - Added nice rendering of Unicode emoji.
- Added support for pinning streams to the top of the left sidebar. - Added support for pinning streams to the top of the left sidebar.
- Added search box for filtering user list when creating a new stream. - Added search box for filtering user list when creating a new stream.
- Added realm setting to disable message editing. - Added realm setting to disable message editing.
@ -1714,10 +1714,10 @@ Zulip apps.
easy to add additional social authentication methods). easy to add additional social authentication methods).
- Added TERMS_OF_SERVICE setting using Markdown formatting to configure - Added TERMS_OF_SERVICE setting using Markdown formatting to configure
the terms of service for a Zulip server. the terms of service for a Zulip server.
- Added numerous hooks to puppet modules to enable more configurations. - Added numerous hooks to Puppet modules to enable more configurations.
- Moved several useful puppet components into the main puppet - Moved several useful Puppet components into the main Puppet
manifests (setting a redis password, etc.). manifests (setting a Redis password, etc.).
- Added automatic configuration of postgres/memcached settings based - Added automatic configuration of Postgres/memcached settings based
on the server's available RAM. on the server's available RAM.
- Added scripts/upgrade-zulip-from-git for upgrading Zulip from a Git repo. - Added scripts/upgrade-zulip-from-git for upgrading Zulip from a Git repo.
- Added preliminary support for Python 3. All of Zulip's test suites now - Added preliminary support for Python 3. All of Zulip's test suites now
@ -1732,7 +1732,7 @@ Zulip apps.
- Improved missed message emails to better support directly replying. - Improved missed message emails to better support directly replying.
- Increased backend test coverage of Python code to 85.5%. - Increased backend test coverage of Python code to 85.5%.
- Increased mypy static type coverage of Python code to 95%. Also - Increased mypy static type coverage of Python code to 95%. Also
fixed many string annotations to properly handle unicode. fixed many string annotations to properly handle Unicode.
- Fixed major i18n-related frontend performance regression on - Fixed major i18n-related frontend performance regression on
/#subscriptions page. Saves several seconds of load time with 1k /#subscriptions page. Saves several seconds of load time with 1k
streams. streams.
@ -1749,7 +1749,7 @@ Zulip apps.
- Fixed EPMD restart being attempted on every puppet apply. - Fixed EPMD restart being attempted on every puppet apply.
- Fixed message cache filling; should improve perf after server restart. - Fixed message cache filling; should improve perf after server restart.
- Fixed caching race condition when changing user objects. - Fixed caching race condition when changing user objects.
- Fixed buggy puppet configuration for supervisord restarts. - Fixed buggy Puppet configuration for supervisord restarts.
- Fixed some error handling race conditions when editing messages. - Fixed some error handling race conditions when editing messages.
- Fixed fastcgi_params to protect against the httpoxy attack. - Fixed fastcgi_params to protect against the httpoxy attack.
- Fixed bug preventing users with mit.edu emails from registering accounts. - Fixed bug preventing users with mit.edu emails from registering accounts.
@ -1757,7 +1757,7 @@ Zulip apps.
- Fixed APNS push notification support (had been broken by Apple changing - Fixed APNS push notification support (had been broken by Apple changing
the APNS API). the APNS API).
- Fixed some logic bugs in how attachments are tracked. - Fixed some logic bugs in how attachments are tracked.
- Fixed unnecessarily resource-intensive rabbitmq cron checks. - Fixed unnecessarily resource-intensive RabbitMQ cron checks.
- Fixed old deployment directories leaking indefinitely. - Fixed old deployment directories leaking indefinitely.
- Fixed need to manually add localhost in ALLOWED_HOSTS. - Fixed need to manually add localhost in ALLOWED_HOSTS.
- Fixed display positioning for the color picker on subscriptions page. - Fixed display positioning for the color picker on subscriptions page.
@ -1817,7 +1817,7 @@ Zulip apps.
- Fixed erroneous WWW-Authenticate headers with expired sessions. - Fixed erroneous WWW-Authenticate headers with expired sessions.
- Changed "coworkers" to "users" in the Zulip UI. - Changed "coworkers" to "users" in the Zulip UI.
- Changed add_default_stream REST API to correctly use PUT rather than PATCH. - Changed add_default_stream REST API to correctly use PUT rather than PATCH.
- Updated the Zulip emoji set (the Android Emoji) to a modern version. - Updated the Zulip emoji set (the Android emoji) to a modern version.
- Made numerous small improvements to the Zulip development experience. - Made numerous small improvements to the Zulip development experience.
- Migrated backend templates to the faster Jinja2 templating system. - Migrated backend templates to the faster Jinja2 templating system.
- Migrated development environment setup scripts to tools/setup/. - Migrated development environment setup scripts to tools/setup/.
@ -1844,7 +1844,7 @@ Zulip apps.
- Added ability for realm administrators to manage custom emoji. - Added ability for realm administrators to manage custom emoji.
- Added guide to writing new integrations. - Added guide to writing new integrations.
- Enabled camo image proxy to fix mixed-content warnings for http images. - Enabled camo image proxy to fix mixed-content warnings for http images.
- Refactored the Zulip puppet modules to be more modular. - Refactored the Zulip Puppet modules to be more modular.
- Refactored the Tornado event system, fixing old memory leaks. - Refactored the Tornado event system, fixing old memory leaks.
- Removed many old-style /json API endpoints - Removed many old-style /json API endpoints
- Implemented running queue processors multithreaded in development, - Implemented running queue processors multithreaded in development,
@ -1864,7 +1864,7 @@ Zulip apps.
- Added new integration for Travis CI. - Added new integration for Travis CI.
- Added settings option to control maximum file upload size. - Added settings option to control maximum file upload size.
- Added support for running Zulip development environment in Docker. - Added support for running Zulip development environment in Docker.
- Added easy configuration support for a remote postgres database. - Added easy configuration support for a remote Postgres database.
- Added extensive documentation on scalability, backups, and security. - Added extensive documentation on scalability, backups, and security.
- Recent private message threads are now displayed expanded similar to - Recent private message threads are now displayed expanded similar to
the pre-existing recent topics feature. the pre-existing recent topics feature.
@ -1886,7 +1886,7 @@ Zulip apps.
- Fixed buggy #! lines in upgrade scripts. - Fixed buggy #! lines in upgrade scripts.
### 1.3.8 - 2015-11-15 ### 1.3.8 - 2015-11-15
- Added options to the Python api for working with untrusted server certificates. - Added options to the Python API for working with untrusted server certificates.
- Added a lot of documentation on the development environment and testing. - Added a lot of documentation on the development environment and testing.
- Added partial support for translating the Zulip UI. - Added partial support for translating the Zulip UI.
- Migrated installing Node dependencies to use npm. - Migrated installing Node dependencies to use npm.
@ -1913,7 +1913,7 @@ Zulip apps.
This section links to the upgrade notes from past releases, so you can This section links to the upgrade notes from past releases, so you can
easily read them all when upgrading across multiple releases. easily read them all when upgrading across multiple releases.
* [Draft Upgrade notes for 4.0](#upgrade-notes-for-4-0) * [Draft upgrade notes for 4.0](#upgrade-notes-for-4-0)
* [Upgrade notes for 3.0](#upgrade-notes-for-3-0) * [Upgrade notes for 3.0](#upgrade-notes-for-3-0)
* [Upgrade notes for 2.1.5](#upgrade-notes-for-2-1-5) * [Upgrade notes for 2.1.5](#upgrade-notes-for-2-1-5)
* [Upgrade notes for 2.1.0](#upgrade-notes-for-2-1-0) * [Upgrade notes for 2.1.0](#upgrade-notes-for-2-1-0)

View File

@ -138,7 +138,7 @@ Django context (i.e. with database access).
------------------------------------------------------------------------- -------------------------------------------------------------------------
### Production puppet configuration ### Production Puppet configuration
This is used to deploy essentially all configuration in production. This is used to deploy essentially all configuration in production.

View File

@ -242,7 +242,7 @@ the areas mentioned above are not your main strength.
As a data point, in Summer 2017, we had 4 students working on the As a data point, in Summer 2017, we had 4 students working on the
React Native mobile app (1 focused primarily on visual design), 1 on React Native mobile app (1 focused primarily on visual design), 1 on
the Electron Desktop app, 2 on bots/integrations, 1 on webapp visual the Electron desktop app, 2 on bots/integrations, 1 on webapp visual
design, 2 on our development tooling and automated testing design, 2 on our development tooling and automated testing
infrastructure, and the remaining 4 on various other parts of the infrastructure, and the remaining 4 on various other parts of the
backend and core webapp. backend and core webapp.
@ -348,7 +348,7 @@ CSS](https://github.com/zulip/zulip/).
(likely part 1) is (likely part 1) is
[here](../subsystems/custom-apps.md). [here](../subsystems/custom-apps.md).
**Skills recommended**: Python and JavaScript/CSS, plus devops **Skills recommended**: Python and JavaScript/CSS, plus devops
skills (Linux deployment, Docker, puppet etc.) are all useful here. skills (Linux deployment, Docker, Puppet etc.) are all useful here.
Experience writing tools using various popular APIs is helpful for Experience writing tools using various popular APIs is helpful for
being able to make good choices. Experts: Steve Howell. being able to make good choices. Experts: Steve Howell.
@ -454,7 +454,7 @@ Expert: Tommy Ip, Tim Abbott.
adding [mypy](../testing/mypy.md) stubs adding [mypy](../testing/mypy.md) stubs
for Django in mypy to make our type checking more powerful. Read 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/) [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 for details on how mypy works and is integrated into Zulip. This
specific project is ideal for a strong contributor interested in specific project is ideal for a strong contributor interested in
type systems. type systems.

View File

@ -56,8 +56,8 @@ file and you'll find inline documentation in comments for how to
configure it. configure it.
Since some of these services require some configuration on the node Since some of these services require some configuration on the node
itself (e.g. installing our `postgres` extensions), we have designed itself (e.g. installing our Postgres extensions), we have designed
the puppet configuration that Zulip uses for installing and upgrading the Puppet configuration that Zulip uses for installing and upgrading
configuration to be completely modular. configuration to be completely modular.
For example, you can install a Zulip rabbitmq server on a machine, you For example, you can install a Zulip rabbitmq server on a machine, you
@ -74,7 +74,7 @@ of includes in
though it's also possible to subclass some of the lower-level though it's also possible to subclass some of the lower-level
manifests defined in that directory if you want to customize. A good manifests defined in that directory if you want to customize. A good
example of doing this is in the example of doing this is in the
[zulip_ops puppet configuration][zulipchat-puppet] that we use as part [zulip_ops Puppet configuration][zulipchat-puppet] that we use as part
of managing chat.zulip.org and zulip.com. of managing chat.zulip.org and zulip.com.
### Using Zulip with Amazon RDS as the database ### Using Zulip with Amazon RDS as the database
@ -117,7 +117,7 @@ This complication will be removed in a future version.
#### Step 2: Create the Postgres database #### Step 2: Create the Postgres database
Access an administrative `psql` shell on your postgres database, and Access an administrative `psql` shell on your Postgres database, and
run the commands in `scripts/setup/create-db.sql` to: run the commands in `scripts/setup/create-db.sql` to:
* Create a database called `zulip`. * Create a database called `zulip`.
@ -126,7 +126,7 @@ run the commands in `scripts/setup/create-db.sql` to:
`zulip` in the `zulip` database. You might have to grant `create` `zulip` in the `zulip` database. You might have to grant `create`
privileges first for the `zulip` user to do this. privileges first for the `zulip` user to do this.
Depending on how authentication works for your postgres installation, Depending on how authentication works for your Postgres installation,
you may also need to set a password for the Zulip user, generate a you may also need to set a password for the Zulip user, generate a
client certificate, or similar; consult the documentation for your client certificate, or similar; consult the documentation for your
database provider for the available options. database provider for the available options.
@ -134,11 +134,11 @@ database provider for the available options.
#### Step 3: Configure Zulip to use the Postgres database #### Step 3: Configure Zulip to use the Postgres database
In `/etc/zulip/settings.py` on your Zulip server, configure the In `/etc/zulip/settings.py` on your Zulip server, configure the
following settings with details for how to connect to your postgres following settings with details for how to connect to your Postgres
server. Your database provider should provide these details. server. Your database provider should provide these details.
* `REMOTE_POSTGRES_HOST`: Name or IP address of the postgres server. * `REMOTE_POSTGRES_HOST`: Name or IP address of the Postgres server.
* `REMOTE_POSTGRES_PORT`: Port on the postgres server. * `REMOTE_POSTGRES_PORT`: Port on the Postgres server.
* `REMOTE_POSTGRES_SSLMODE`: SSL Mode used to connect to the server. * `REMOTE_POSTGRES_SSLMODE`: SSL Mode used to connect to the server.
If you're using password authentication, you should specify the If you're using password authentication, you should specify the
@ -152,7 +152,7 @@ postgres_password = abcd1234
Now complete the installation by running the following commands. Now complete the installation by running the following commands.
``` ```
# Ask Zulip installer to initialize the postgres database. # Ask Zulip installer to initialize the Postgres database.
su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database' su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database'
# And then generate a realm creation link: # And then generate a realm creation link:
@ -233,7 +233,7 @@ For `nginx` configuration, there's two things you need to set up:
`/etc/nginx/sites-available`) for the Zulip app. You can look at `/etc/nginx/sites-available`) for the Zulip app. You can look at
our [nginx reverse proxy configuration][nginx-loadbalancer] to see our [nginx reverse proxy configuration][nginx-loadbalancer] to see
an example of how to do this properly (the various include files are an example of how to do this properly (the various include files are
available via the `zulip::nginx` puppet module). Or modify this available via the `zulip::nginx` Puppet module). Or modify this
example: example:
``` ```

View File

@ -31,7 +31,7 @@ records in DNS.
## Local delivery setup ## Local delivery setup
Zulip's puppet configuration provides everything needed to run this Zulip's Puppet configuration provides everything needed to run this
integration; you just need to enable and configure it as follows. integration; you just need to enable and configure it as follows.
The main decision you need to make is what email domain you want to The main decision you need to make is what email domain you want to

View File

@ -17,7 +17,7 @@ can run them manually before starting the upgrade:
/home/zulip/deployments/current` /home/zulip/deployments/current`
2. Run `./manage.py dbshell`. This will open a shell connected to the 2. Run `./manage.py dbshell`. This will open a shell connected to the
Postgres database. Postgres database.
3. In the postgres shell, run the following commands: 3. In the Postgres shell, run the following commands:
CREATE INDEX CONCURRENTLY CREATE INDEX CONCURRENTLY
zerver_usermessage_is_private_message_id zerver_usermessage_is_private_message_id

View File

@ -12,7 +12,7 @@ service (or back):
* Backups must be restored on a server running the same Zulip * Backups must be restored on a server running the same Zulip
version (most precisely, one where `manage.py showmigrations` has version (most precisely, one where `manage.py showmigrations` has
the same output). the same output).
* Backups must be restored on a server running the same `postgres` * Backups must be restored on a server running the same Postgres
version. version.
* Backups aren't useful for migrating organizations between * Backups aren't useful for migrating organizations between
self-hosting and Zulip Cloud (which may require renumbering all self-hosting and Zulip Cloud (which may require renumbering all
@ -20,7 +20,7 @@ service (or back):
We highly recommend this tool in situations where it is applicable, We highly recommend this tool in situations where it is applicable,
because it is highly optimized and highly stable, since the hard because it is highly optimized and highly stable, since the hard
work is done by the built-in backup feature of `postgres`. We also work is done by the built-in backup feature of Postgres. We also
document [backup details](#backup-details) for users managing document [backup details](#backup-details) for users managing
backups manually. backups manually.
@ -36,7 +36,7 @@ service (or back):
Like the backup tool, logical data exports must be imported on a Like the backup tool, logical data exports must be imported on a
Zulip server running the same version. However, logical data Zulip server running the same version. However, logical data
exports can be imported on Zulip servers running a different exports can be imported on Zulip servers running a different
`postgres` version or hosting a different set of Zulip Postgres version or hosting a different set of Zulip
organizations. We recommend this tool in cases where the backup organizations. We recommend this tool in cases where the backup
tool isn't applicable, including situations where an easily tool isn't applicable, including situations where an easily
machine-parsable export format is desired. machine-parsable export format is desired.
@ -47,7 +47,7 @@ service (or back):
inexpensively preserve public stream conversations when inexpensively preserve public stream conversations when
decommissioning a Zulip organization. decommissioning a Zulip organization.
* It's possible to set up [postgres streaming * It's possible to set up [Postgres streaming
replication](#postgres-streaming-replication) and the [S3 file replication](#postgres-streaming-replication) and the [S3 file
upload upload
backend](../production/upload-backends.html#s3-backend-configuration) backend](../production/upload-backends.html#s3-backend-configuration)
@ -69,7 +69,7 @@ The backup tool provides the following options:
to (default: write to a file in `/tmp`). On success, the to (default: write to a file in `/tmp`). On success, the
console output will show the path to the output tarball. console output will show the path to the output tarball.
- `--skip-db`: Skip backup of the database. Useful if you're using a - `--skip-db`: Skip backup of the database. Useful if you're using a
remote postgres host with its own backup system and just need to remote Postgres host with its own backup system and just need to
backup non-database state. backup non-database state.
- `--skip-uploads`: If `LOCAL_UPLOADS_DIR` is set, user-uploaded files - `--skip-uploads`: If `LOCAL_UPLOADS_DIR` is set, user-uploaded files
in that directory will be ignored. in that directory will be ignored.
@ -154,19 +154,19 @@ emails to send). You can check whether these queues are empty using
#### Backup details #### Backup details
This section is primarily for users managing backups themselves This section is primarily for users managing backups themselves
(E.g. if they're using a remote postgres database with an existing (E.g. if they're using a remote Postgres database with an existing
backup strategy), and also serves as documentation for what is backup strategy), and also serves as documentation for what is
included in the backups generated by Zulip's standard tools. The included in the backups generated by Zulip's standard tools. The
data includes: data includes:
* The postgres database. You can back it up like any postgres * The Postgres database. You can back it up like any Postgres
database. We have some example tooling for doing that incrementally database. We have some example tooling for doing that incrementally
into S3 using [wal-g](https://github.com/wal-g/wal-g) in into S3 using [wal-g](https://github.com/wal-g/wal-g) in
`puppet/zulip/manifests/postgres_backups.pp`. `puppet/zulip/manifests/postgres_backups.pp`.
In short, this requires: In short, this requires:
- Zulip 1.4 or newer release. - Zulip 1.4 or newer release.
- An Amazon S3 bucket for storing the backups. - An Amazon S3 bucket for storing the backups.
- `/etc/zulip/zulip-secrets.conf` on the postgres server like this: - `/etc/zulip/zulip-secrets.conf` on the Postgres server like this:
``` ```
[secrets] [secrets]
s3_backups_key = # aws public key s3_backups_key = # aws public key

View File

@ -33,7 +33,7 @@ sudo wget -O /etc/nginx/nginx.conf.zulip \
sudo meld /etc/nginx/nginx.conf /etc/nginx/nginx.conf.zulip # be sure to merge to the right sudo meld /etc/nginx/nginx.conf /etc/nginx/nginx.conf.zulip # be sure to merge to the right
``` ```
After the zulip installation completes, then you can overwrite (or After the Zulip installation completes, then you can overwrite (or
merge) your new nginx.conf with the installed one: merge) your new nginx.conf with the installed one:
```shell ```shell
@ -41,13 +41,13 @@ $ sudo meld /etc/nginx/nginx.conf.zulip /etc/nginx/nginx.conf # be sure to merg
$ sudo service nginx restart $ sudo service nginx restart
``` ```
Zulip's puppet configuration will change the ownership of Zulip's Puppet configuration will change the ownership of
`/var/log/nginx` so that the `zulip` user can access it. Depending on `/var/log/nginx` so that the `zulip` user can access it. Depending on
your configuration, this may or may not cause problems. your configuration, this may or may not cause problems.
### Puppet ### Puppet
If you have a puppet server running on your server, you will get an If you have a Puppet server running on your server, you will get an
error message about not being able to connect to the client during the error message about not being able to connect to the client during the
install process: install process:
@ -55,7 +55,7 @@ install process:
puppet-agent[29873]: Could not request certificate: Failed to open TCP connection to puppet:8140 puppet-agent[29873]: Could not request certificate: Failed to open TCP connection to puppet:8140
``` ```
So you'll need to shutdown any puppet servers. So you'll need to shutdown any Puppet servers.
```shell ```shell
$ sudo service puppet-agent stop $ sudo service puppet-agent stop
@ -75,7 +75,7 @@ If you have an existing PostgreSQL database, note that Zulip will use
the default `main` as its database name; make sure you're not using the default `main` as its database name; make sure you're not using
that. that.
### Memcached, redis, and rabbitmq ### Memcached, Redis, and RabbitMQ
Zulip will, by default, configure these services for its use. The Zulip will, by default, configure these services for its use. The
configuration we use is pretty basic, but if you're using them for configuration we use is pretty basic, but if you're using them for

View File

@ -9,7 +9,7 @@ The vast majority of Zulip servers host just a single organization (or
documents what's involved in hosting multiple Zulip organizations on a documents what's involved in hosting multiple Zulip organizations on a
single server. single server.
Throughout this article, we'll assume you're working on a zulip 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 with hostname `zulip.example.com`. You may also find the more
[technically focused article on realms](../subsystems/realms.md) to be useful [technically focused article on realms](../subsystems/realms.md) to be useful
reading. reading.
@ -33,7 +33,7 @@ things:
file. That setting is the default in 1.7 and later. file. That setting is the default in 1.7 and later.
* Make sure you have SSL certificates for all of the subdomains you're * Make sure you have SSL certificates for all of the subdomains you're
going to use. If you're using going to use. If you're using
[our LetsEncrypt instructions](ssl-certificates.md), it's easy to [our Let's Encrypt instructions](ssl-certificates.md), it's easy to
just specify multiple subdomains in your certificate request. just specify multiple subdomains in your certificate request.
* If necessary, modify your `nginx` configuration to use your new * If necessary, modify your `nginx` configuration to use your new
certificates. certificates.

View File

@ -8,7 +8,7 @@ Previous versions of Zulip used whatever version of Postgres was
included with the base operating system (E.g. Postgres 12 on Ubuntu included with the base operating system (E.g. Postgres 12 on Ubuntu
Focal, 10 on Ubuntu Bionic, and 9.6 on Ubuntu Xenial). We recommend Focal, 10 on Ubuntu Bionic, and 9.6 on Ubuntu Xenial). We recommend
that installations currently using older Postgres releases [upgrade to that installations currently using older Postgres releases [upgrade to
Postgres 12][upgrade-postgres], as may drop support for older postgres Postgres 12][upgrade-postgres], as may drop support for older Postgres
in a future release. in a future release.
[upgrade-postgres]: ../production/upgrade-or-modify.html#upgrading-postgresql [upgrade-postgres]: ../production/upgrade-or-modify.html#upgrading-postgresql
@ -16,7 +16,7 @@ in a future release.
#### Remote Postgres database #### Remote Postgres database
This is a bit annoying to set up, but you can configure Zulip to use a This is a bit annoying to set up, but you can configure Zulip to use a
dedicated postgres server by setting the `REMOTE_POSTGRES_HOST` dedicated Postgres server by setting the `REMOTE_POSTGRES_HOST`
variable in /etc/zulip/settings.py, and configuring Postgres variable in /etc/zulip/settings.py, and configuring Postgres
certificate authentication (see certificate authentication (see
http://www.postgresql.org/docs/9.1/static/ssl-tcp.html and http://www.postgresql.org/docs/9.1/static/ssl-tcp.html and
@ -25,11 +25,11 @@ documentation on how to set this up and deploy the certificates) to
make the DATABASES configuration in `zproject/computed_settings.py` make the DATABASES configuration in `zproject/computed_settings.py`
work (or override that configuration). work (or override that configuration).
If you want to use a remote Postgresql database, you should configure If you want to use a remote PostgreSQL database, you should configure
the information about the connection with the server. You need a user the information about the connection with the server. You need a user
called "zulip" in your database server. You can configure these called "zulip" in your database server. You can configure these
options in `/etc/zulip/settings.py` (the below descriptions are from the options in `/etc/zulip/settings.py` (the below descriptions are from the
Postgresql documentation): PostgreSQL documentation):
* `REMOTE_POSTGRES_HOST`: Name or IP address of the remote host * `REMOTE_POSTGRES_HOST`: Name or IP address of the remote host
* `REMOTE_POSTGRES_SSLMODE`: SSL Mode used to connect to the server, * `REMOTE_POSTGRES_SSLMODE`: SSL Mode used to connect to the server,
@ -64,15 +64,15 @@ sudo update-rc.d postgresql disable
``` ```
In future versions of this feature, we'd like to implement and In future versions of this feature, we'd like to implement and
document how to the remote postgres database server itself document how to the remote Postgres database server itself
automatically by using the Zulip install script with a different set automatically by using the Zulip install script with a different set
of puppet manifests than the all-in-one feature; if you're interested of Puppet manifests than the all-in-one feature; if you're interested
in working on this, post to the Zulip development mailing list and we in working on this, post to the Zulip development mailing list and we
can give you some tips. can give you some tips.
#### Debugging postgres database issues #### Debugging Postgres database issues
When debugging postgres issues, in addition to the standard `pg_top` When debugging Postgres issues, in addition to the standard `pg_top`
tool, often it can be useful to use this query: tool, often it can be useful to use this query:
``` ```
@ -92,9 +92,9 @@ sending a Postgres process SIGKILL. Doing so will cause the database
to kill all current connections, roll back any pending transactions, to kill all current connections, roll back any pending transactions,
and enter recovery mode. and enter recovery mode.
#### Stopping the Zulip postgres database #### Stopping the Zulip Postgres database
To start or stop postgres manually, use the pg_ctlcluster command: To start or stop Postgres manually, use the pg_ctlcluster command:
``` ```
pg_ctlcluster 9.1 [--force] main {start|stop|restart|reload} pg_ctlcluster 9.1 [--force] main {start|stop|restart|reload}
@ -120,7 +120,7 @@ Many database parameters can be adjusted while the database is
running. Just modify /etc/postgresql/9.1/main/postgresql.conf and running. Just modify /etc/postgresql/9.1/main/postgresql.conf and
issue a reload. The logs will note the change. issue a reload. The logs will note the change.
#### Debugging issues starting postgres #### Debugging issues starting Postgres
pg_ctlcluster often doesn't give you any information on why the pg_ctlcluster often doesn't give you any information on why the
database failed to start. It may tell you to check the logs, but you database failed to start. It may tell you to check the logs, but you
@ -141,7 +141,7 @@ pg_ctlcluster does.
#### Postgres vacuuming alerts #### Postgres vacuuming alerts
The `autovac_freeze` postgres alert from `check_postgres` is The `autovac_freeze` Postgres alert from `check_postgres` is
particularly important. This alert indicates that the age (in terms particularly important. This alert indicates that the age (in terms
of number of transactions) of the oldest transaction id (XID) is of number of transactions) of the oldest transaction id (XID) is
getting close to the `autovacuum_freeze_max_age` setting. When the getting close to the `autovacuum_freeze_max_age` setting. When the
@ -154,4 +154,4 @@ database as a database superuser (`postgres`).
See See
http://www.postgresql.org/docs/9.1/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND http://www.postgresql.org/docs/9.1/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND
for more details on postgres vacuuming. for more details on Postgres vacuuming.

View File

@ -18,8 +18,8 @@ For details on each of these requirements, see below.
#### General #### General
The installer expects Zulip to be the **only thing** running on the The installer expects Zulip to be the **only thing** running on the
system; it will install system packages with `apt` (like nginx, system; it will install system packages with `apt` (like Nginx,
postgresql, and redis) and configure them for its own use. We PostgreSQL, and Redis) and configure them for its own use. We
strongly recommend using either a fresh machine instance in a cloud strongly recommend using either a fresh machine instance in a cloud
provider, a fresh VM, or a dedicated machine. If you decide to provider, a fresh VM, or a dedicated machine. If you decide to
disregard our advice and use a server that hosts other services, we disregard our advice and use a server that hosts other services, we
@ -50,7 +50,7 @@ https://help.ubuntu.com/community/Repositories/Ubuntu
#### Hardware specifications #### Hardware specifications
* CPU and Memory: For installations with 100+ users you'll need a * CPU and memory: For installations with 100+ users you'll need a
minimum of **2 CPUs** and **4GB RAM**. For installations with fewer minimum of **2 CPUs** and **4GB RAM**. For installations with fewer
users, 1 CPU and 2GB RAM is sufficient. We strongly recommend against users, 1 CPU and 2GB RAM is sufficient. We strongly recommend against
installing with less than 2GB of RAM, as you will likely experience installing with less than 2GB of RAM, as you will likely experience
@ -149,7 +149,7 @@ most use cases, there's little scalability benefit to doing so. See
installing Zulip with a dedicated database server. installing Zulip with a dedicated database server.
* **Dedicated database**. For installations with hundreds of daily * **Dedicated database**. For installations with hundreds of daily
active users, we recommend using a [remote postgres active users, we recommend using a [remote Postgres
database](postgres.md), but it's not required. database](postgres.md), but it's not required.
* **RAM:** We recommended more RAM for larger installations: * **RAM:** We recommended more RAM for larger installations:

View File

@ -36,7 +36,7 @@ announcement).
prevent CSRF attacks. prevent CSRF attacks.
* The preferred way to log in to Zulip is using an SSO solution like * The preferred way to log in to Zulip is using an SSO solution like
Google Auth, LDAP, or similar, but Zulip also supports password Google auth, LDAP, or similar, but Zulip also supports password
authentication. See authentication. See
[the authentication methods documentation](../production/authentication-methods.md) [the authentication methods documentation](../production/authentication-methods.md)
for details on Zulip's available authentication methods. for details on Zulip's available authentication methods.
@ -134,11 +134,11 @@ strength allowed is controlled by two settings in
## Users and bots ## Users and bots
* There are several types of users in a Zulip organization: Organization * There are several types of users in a Zulip organization: organization
Owners, Organization Administrators, Members (normal users), Guests, owners, organization administrators, members (normal users), guests,
and Bots. and bots.
* Owners and Administrators have the ability to deactivate and * Owners and administrators have the ability to deactivate and
reactivate other human and bot users, delete streams, add/remove reactivate other human and bot users, delete streams, add/remove
administrator privileges, as well as change configuration for the administrator privileges, as well as change configuration for the
organization. organization.

View File

@ -38,13 +38,13 @@ prefilled with that value.
`AUTHENTICATION_BACKENDS`: Zulip supports a wide range of popular `AUTHENTICATION_BACKENDS`: Zulip supports a wide range of popular
options for authenticating users to your server, including Google options for authenticating users to your server, including Google
Auth, GitHub Auth, LDAP, SAML, REMOTE_USER, and more. auth, GitHub auth, LDAP, SAML, REMOTE_USER, and more.
If you want an additional or different authentication backend, you If you want an additional or different authentication backend, you
will need to uncomment one or more and then do any additional will need to uncomment one or more and then do any additional
configuration required for that backend as documented in the configuration required for that backend as documented in the
`settings.py` file. See the `settings.py` file. See the
[section on Authentication](../production/authentication-methods.md) for more [section on authentication](../production/authentication-methods.md) for more
detail on the available authentication backends and how to configure detail on the available authentication backends and how to configure
them. them.

View File

@ -36,7 +36,7 @@ and restart various services.
### Checking status with `supervisorctl status` ### Checking status with `supervisorctl status`
You can check if the zulip application is running using: You can check if the Zulip application is running using:
``` ```
supervisorctl status supervisorctl status
``` ```
@ -93,10 +93,10 @@ The Zulip application uses several major open source services to store
and cache data, queue messages, and otherwise support the Zulip and cache data, queue messages, and otherwise support the Zulip
application: application:
* postgresql * PostgreSQL
* rabbitmq-server * RabbitMQ
* nginx * Nginx
* redis * Redis
* memcached * memcached
If one of these services is not installed or functioning correctly, If one of these services is not installed or functioning correctly,
@ -140,11 +140,11 @@ problems and how to resolve them:
<https://linoxide.com/ubuntu-how-to/enable-disable-unattended-upgrades-ubuntu-16-04/>`_ <https://linoxide.com/ubuntu-how-to/enable-disable-unattended-upgrades-ubuntu-16-04/>`_
and instead install apt upgrades manually. With unattended upgrades and instead install apt upgrades manually. With unattended upgrades
enabled, the moment a new Postgres release is published, your Zulip enabled, the moment a new Postgres release is published, your Zulip
server will have its postgres server upgraded (and thus restarted). server will have its Postgres server upgraded (and thus restarted).
``` ```
Restarting one of the system services that Zulip uses (`postgres`, Restarting one of the system services that Zulip uses (Postgres,
`memcached`, `redis`, or `rabbitmq`) will drop the connections that memcached, Redis, or Rabbitmq) will drop the connections that
Zulip processes have to the service, resulting in future operations on Zulip processes have to the service, resulting in future operations on
those connections throwing errors. those connections throwing errors.
@ -165,8 +165,8 @@ workers are commonly idle for periods of hours or days at a time.
You can prevent this trickle when doing a planned upgrade by You can prevent this trickle when doing a planned upgrade by
restarting the Zulip server with restarting the Zulip server with
`/home/zulip/deployments/current/scripts/restart-server` after `/home/zulip/deployments/current/scripts/restart-server` after
installing system package updates to `postgres`, `memcached`, installing system package updates to Postgres, memcached,
`rabbitmq`, or `redis`. RabbitMQ, or Redis.
Few system administrators enjoy outages at random times (even if only Few system administrators enjoy outages at random times (even if only
brief) or the resulting distribution of error emails, which is why we brief) or the resulting distribution of error emails, which is why we
@ -189,8 +189,8 @@ standard stuff:
especially for the database and where uploads are stored. especially for the database and where uploads are stored.
* Service uptime and standard monitoring for the [services Zulip * Service uptime and standard monitoring for the [services Zulip
depends on](#troubleshooting-services). Most monitoring software depends on](#troubleshooting-services). Most monitoring software
has standard plugins for `nginx`, `postgres`, `redis`, `rabbitmq`, has standard plugins for Nginx, Postgres, Redis, RabbitMQ,
and `memcached`, and those will work well with Zulip. and memcached, and those will work well with Zulip.
* `supervisorctl status` showing all services `RUNNING`. * `supervisorctl status` showing all services `RUNNING`.
* Checking for processes being OOM killed. * Checking for processes being OOM killed.
@ -230,8 +230,8 @@ Database monitoring:
* `check_fts_update_log`: Checks whether full-text search updates are * `check_fts_update_log`: Checks whether full-text search updates are
being processed properly or getting backlogged. being processed properly or getting backlogged.
* `check_postgres`: General checks for database health. * `check_postgres`: General checks for database health.
* `check_postgres_backup`: Checks status of postgres backups. * `check_postgres_backup`: Checks status of Postgres backups.
* `check_postgres_replication_lag`: Checks whether postgres streaming * `check_postgres_replication_lag`: Checks whether Postgres streaming
replication is up to date. replication is up to date.
Standard server monitoring: Standard server monitoring:

View File

@ -3,7 +3,7 @@
This page explains how to upgrade, patch, or modify Zulip, including: This page explains how to upgrade, patch, or modify Zulip, including:
- [Upgrading to a release](#upgrading-to-a-release) - [Upgrading to a release](#upgrading-to-a-release)
- [Upgrading from a git repository](#upgrading-from-a-git-repository) - [Upgrading from a Git repository](#upgrading-from-a-git-repository)
- [Troubleshooting and rollback](#troubleshooting-and-rollback) - [Troubleshooting and rollback](#troubleshooting-and-rollback)
- [Preserving local changes to configuration files](#preserving-local-changes-to-configuration-files) - [Preserving local changes to configuration files](#preserving-local-changes-to-configuration-files)
- [Upgrading the operating system](#upgrading-the-operating-system) - [Upgrading the operating system](#upgrading-the-operating-system)
@ -166,7 +166,7 @@ the version corresponding to the `restart-server` path you call.
You can test whether this will happen assuming no upstream changes to You can test whether this will happen assuming no upstream changes to
the configuration using `scripts/zulip-puppet-apply` (without the the configuration using `scripts/zulip-puppet-apply` (without the
`-f` option), which will do a test puppet run and output and changes `-f` option), which will do a test Puppet run and output and changes
it would make. Using this list, you can save a copy of any files it would make. Using this list, you can save a copy of any files
that you've modified, do the upgrade, and then restore your that you've modified, do the upgrade, and then restore your
configuration. configuration.
@ -177,7 +177,7 @@ system to Zulip Cloud. Before making local changes to a configuration
file, first check whether there's an option supported by file, first check whether there's an option supported by
`/etc/zulip/zulip.conf` for the customization you need. And if you `/etc/zulip/zulip.conf` for the customization you need. And if you
need to make local modifications, please report the issue so that we need to make local modifications, please report the issue so that we
can make the Zulip puppet configuration flexible enough to handle your can make the Zulip Puppet configuration flexible enough to handle your
setup. setup.
### nginx configuration changes ### nginx configuration changes
@ -195,7 +195,7 @@ some additional steps to update your Zulip installation, documented
below. below.
The steps are largely the same for the various OS upgrades aside from The steps are largely the same for the various OS upgrades aside from
the versions of postgres, so you should be able to adapt these the versions of Postgres, so you should be able to adapt these
instructions for other supported platforms. instructions for other supported platforms.
### Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal ### Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal
@ -226,8 +226,8 @@ instructions for other supported platforms.
release update of Ubuntu 20.04 LTS is released. release update of Ubuntu 20.04 LTS is released.
When `do-release-upgrade` asks you how to upgrade configuration When `do-release-upgrade` asks you how to upgrade configuration
files for services that Zulip manages like `redis`, `postgres`, files for services that Zulip manages like Redis, Postgres,
`nginx`, and `memcached`, the best choice is `N` to keep the Nginx, and memcached, the best choice is `N` to keep the
currently installed version. But it's not important; the next currently installed version. But it's not important; the next
step will re-install Zulip's configuration in any case. step will re-install Zulip's configuration in any case.
@ -357,8 +357,8 @@ instructions for other supported platforms.
[debian-upgrade-os]: https://www.debian.org/releases/buster/amd64/release-notes/ch-upgrading.html [debian-upgrade-os]: https://www.debian.org/releases/buster/amd64/release-notes/ch-upgrading.html
When prompted for you how to upgrade configuration When prompted for you how to upgrade configuration
files for services that Zulip manages like `redis`, `postgres`, files for services that Zulip manages like Redis, Postgres,
`nginx`, and `memcached`, the best choice is `N` to keep the Nginx, and memcached, the best choice is `N` to keep the
currently installed version. But it's not important; the next currently installed version. But it's not important; the next
step will re-install Zulip's configuration in any case. step will re-install Zulip's configuration in any case.

View File

@ -10,7 +10,7 @@ designed around the following goals:
- Efficient to query so that we can display data in-app (e.g. on the streams - Efficient to query so that we can display data in-app (e.g. on the streams
page) with minimum impact on the overall performance of those pages. page) with minimum impact on the overall performance of those pages.
- Storage size smaller than the size of the main Message/UserMessage - Storage size smaller than the size of the main Message/UserMessage
database tables, so that we can store the data in the main postgres database tables, so that we can store the data in the main Postgres
database rather than using a specialized database platform. database rather than using a specialized database platform.
There are a few important things you need to understand in order to There are a few important things you need to understand in order to
@ -64,7 +64,7 @@ summed to rows in InstallationCount with totals for pairs of (end_time,
client). client).
Note: In most cases, we do not store rows with value 0. See Note: In most cases, we do not store rows with value 0. See
[Performance Strategy](#performance-strategy) below. [Performance strategy](#performance-strategy) below.
## CountStats ## CountStats

View File

@ -16,7 +16,7 @@ presented [here](https://packaging.python.org/tutorials/installing-packages/).
2. Create a [source distribution][3]. 2. Create a [source distribution][3].
3. Create a [pure Python Wheel][4]. 3. Create a [pure Python wheel][4].
4. [Upload][5] the distribution file(s) to [zulip-beta][6]. 4. [Upload][5] the distribution file(s) to [zulip-beta][6].

View File

@ -104,12 +104,12 @@ files from S3. Finally, `Attachment`'s `m2m` relationship ties to
Here are the same classes of data, listed in roughly Here are the same classes of data, listed in roughly
decreasing order of riskiness: decreasing order of riskiness:
- Message Data (sheer volume/lack of time/security) - Message data (sheer volume/lack of time/security)
- File-Related Data (S3/security/lots of moving parts) - File-related data (S3/security/lots of moving parts)
- Recipient Data (complexity/security/cross-realm considerations) - Recipient data (complexity/security/cross-realm considerations)
- Cross Realm Data (duplicate ids) - Cross realm data (duplicate ids)
- Disjoint User Data - Disjoint user data
- Public Realm Data - Public realm data
(Note the above list is essentially in reverse order of how we (Note the above list is essentially in reverse order of how we
process the data, which isn't surprising for a top-down approach.) process the data, which isn't surprising for a top-down approach.)

View File

@ -53,17 +53,17 @@ can be the source of the stimulus, or the target of the response,
or both. Along those lines, we divide custom apps into or both. Along those lines, we divide custom apps into
these three types: these three types:
- A **Zulip Reader** uses activity on Zulip to stimulate an external - A **Zulip reader** uses activity on Zulip to stimulate an external
response. An example here would be a follow-up bot that sees response. An example here would be a follow-up bot that sees
messages with the alert word "@todo" on a stream and then messages with the alert word "@todo" on a stream and then
adds a task to a third party todo-list tool. adds a task to a third party todo-list tool.
- A **Zulip Writer** reacts to external stimuli and generates - A **Zulip writer** reacts to external stimuli and generates
Zulip responses. An example here might be a build bot that Zulip responses. An example here might be a build bot that
gets triggered by an automated code build finishing and then gets triggered by an automated code build finishing and then
writes "build finished" to a Zulip stream. writes "build finished" to a Zulip stream.
- A **Zulip Read/Writer** reacts to a stimulus from Zulip by - A **Zulip reader/writer** reacts to a stimulus from Zulip by
responding to Zulip. An example here would be a math bot responding to Zulip. An example here would be a math bot
that sees a message saying "compute 2+2" and responds with that sees a message saying "compute 2+2" and responds with
"2+2=4" on the same stream or back to the user in a PM. "2+2=4" on the same stream or back to the user in a PM.
@ -72,16 +72,16 @@ The above three classifications represent kind of a Zulip-centric
view of the universe, but we should put ourselves in the shoes view of the universe, but we should put ourselves in the shoes
of somebody "out in the world." of somebody "out in the world."
- A **World Reader** is an app that gets some stimulus from - A **world reader** is an app that gets some stimulus from
the outside world and produces a response in Zulip. (So, a world the outside world and produces a response in Zulip. (So, a world
reader is a Zulip writer.) reader is a Zulip writer.)
- A **World Writer** is an app that gets some stimulus from - A **world writer** is an app that gets some stimulus from
Zulip and produces a response in the outside world. (So, a world Zulip and produces a response in the outside world. (So, a world
writer is a Zulip reader.) writer is a Zulip reader.)
Some things are a little outside of the scope of this document. Some things are a little outside of the scope of this document.
We could plausibly extend Zulip some day to host **World Reader/Writer** We could plausibly extend Zulip some day to host **world reader/Writer**
apps that don't even write Zulip messages but simply use apps that don't even write Zulip messages but simply use
Zulip as a kind of middleware platform. Zulip as a kind of middleware platform.
@ -93,14 +93,14 @@ the scope of this document, we won't spend a lot of time talking
about how to build these types of apps, but we are aware that about how to build these types of apps, but we are aware that
any solution needs to accommodate multiple sources and targets. any solution needs to accommodate multiple sources and targets.
### World Reader/Zulip Reader ### World reader/Zulip reader
Finally, we set the stage for how we talk about custom apps in Finally, we set the stage for how we talk about custom apps in
terms of these two broad categories: terms of these two broad categories:
- A **World Reader** responds to stimuli from the outside world (and - A **world reader** responds to stimuli from the outside world (and
typically produces a response in Zulip). typically produces a response in Zulip).
- A **Zulip Reader** responds to stimuli from Zulip conversations (and - A **Zulip reader** responds to stimuli from Zulip conversations (and
typically produces a response in the outside world). typically produces a response in the outside world).
Again, we recognize that there can be overlap between those two Again, we recognize that there can be overlap between those two
@ -152,9 +152,9 @@ party corporate system based on Zulip events, I may want to deploy code
to a public webserver or try to get my code to be part of the to a public webserver or try to get my code to be part of the
Zulip project itself. Zulip project itself.
## World Reader ## World reader
A **World Reader** custom app is an app that responds to stimuli A **world reader** custom app is an app that responds to stimuli
from the world outside of Zulip. It typically functions as a **Zulip from the world outside of Zulip. It typically functions as a **Zulip
Writer** and posts some kind of message to a Zulip stream or user to Writer** and posts some kind of message to a Zulip stream or user to
alert people of world events. Here are some example stimuli: alert people of world events. Here are some example stimuli:
@ -175,11 +175,11 @@ you basically have to solve these problems:
### Zulip integrations ### Zulip integrations
Zulip actually supports a bunch of integrations out-of-the-box that Zulip actually supports a bunch of integrations out-of-the-box that
perform as **World Readers**. perform as **world readers**.
The [three different integration models](https://zulip.com/api/integrations-overview#sending-content-into-zulip) The [three different integration models](https://zulip.com/api/integrations-overview#sending-content-into-zulip)
basically differ in where they perform the main functions of a basically differ in where they perform the main functions of a
**World Reader**. **world reader**.
#### Incoming webhook integrations #### Incoming webhook integrations
@ -240,21 +240,21 @@ Ruby. There are probably still some scenarios, however, where a lot of the
logic for translation could be moved to a Zulip-side integration, and then we logic for translation could be moved to a Zulip-side integration, and then we
supply very thin client code for the plugin. supply very thin client code for the plugin.
## Zulip Reader ## Zulip reader
A **Zulip Reader** custom app gets stimuli from Zerver itself. Most A **Zulip reader** custom app gets stimuli from Zerver itself. Most
**Zulip Reader** apps are packaged/advertised more as what people commonly call **Zulip reader** apps are packaged/advertised more as what people commonly call
"bots" than as "integrations." (But sometimes what is currently a "bot" should really "bots" than as "integrations." (But sometimes what is currently a "bot" should really
be deployed more like an "integration" in an ideal Zulip universe.) be deployed more like an "integration" in an ideal Zulip universe.)
Example custom **Zulip Reader** apps can be serious or whimsical. Example custom **Zulip reader** apps can be serious or whimsical.
**Serious** **Serious**
- A user tags a message with an alert word like `@followup` or `@ticket`. - A user tags a message with an alert word like `@followup` or `@ticket`.
- A user needs help computing something, like a simple math expression - A user needs help computing something, like a simple math expression
or a timezone conversion. or a timezone conversion.
- A **World Reader** custom app posts something to a Zulip stream that we - A **world reader** custom app posts something to a Zulip stream that we
want to cross-post to another external system. want to cross-post to another external system.
- A user wants the custom app to query the outside world, like look up the - A user wants the custom app to query the outside world, like look up the
weather or search Wikipedia. weather or search Wikipedia.
@ -267,7 +267,7 @@ weather or search Wikipedia.
- A user wants to tell the office telepresence robot to "turn left." - A user wants to tell the office telepresence robot to "turn left."
Setting aside whether a custom app is performing a serious or whimsical Setting aside whether a custom app is performing a serious or whimsical
function, there are a few different types of **Zulip Readers**: function, there are a few different types of **Zulip readers**:
- Some readers will do simple local computations and post right back to Zulip. - Some readers will do simple local computations and post right back to Zulip.
- Some readers will do more expensive/web-related computations like searching - Some readers will do more expensive/web-related computations like searching
@ -303,7 +303,7 @@ code to your friends and have them be able to deploy it.
- If you've written a general-use bot, it may be difficult to persuade your - If you've written a general-use bot, it may be difficult to persuade your
admin to give you a superuser account. admin to give you a superuser account.
We want to make it easier to deploy **Zulip Readers** on We want to make it easier to deploy **Zulip readers** on
Zulip hardware. The following document talks about how we want to enable this Zulip hardware. The following document talks about how we want to enable this
from a code structuring standpoint: from a code structuring standpoint:
@ -326,7 +326,7 @@ apps, where an app author might use the following development process:
To give a concrete example, let's say that I work for a company that is To give a concrete example, let's say that I work for a company that is
building an issue tracker, and we want to offer Zulip support. I would building an issue tracker, and we want to offer Zulip support. I would
start by writing a **Zulip Reader** that scans for the alert word `@ticket` start by writing a **Zulip reader** that scans for the alert word `@ticket`
on certain public Zulip streams, and part of that app would have logic on certain public Zulip streams, and part of that app would have logic
to post to my company's issue-tracking API. to post to my company's issue-tracking API.
@ -360,7 +360,7 @@ the "world" as it sees fit.
### Zulip-side support for reader apps ### Zulip-side support for reader apps
Even for app authors that have access to dedicated hardware, Even for app authors that have access to dedicated hardware,
there would be several advantages to running **Zulip Readers** under there would be several advantages to running **Zulip readers** under
the same umbrella as the core Zulip system. the same umbrella as the core Zulip system.
- Your app will automatically inherit the uptime of the Zulip server itself (in - Your app will automatically inherit the uptime of the Zulip server itself (in
@ -382,7 +382,7 @@ the problems below. (One assumption is that we don't run apps truly
in-process.) in-process.)
- **Contributions**: We need a process for users to contribute code. - **Contributions**: We need a process for users to contribute code.
- **Configuration/Discovery**: We need Zulip to be able to find which - **Configuration/discovery**: We need Zulip to be able to find which
apps are allowed to run for a particular apps are allowed to run for a particular
deployment. (The admin may choose to run only a subset of contributed deployment. (The admin may choose to run only a subset of contributed
apps.) apps.)

View File

@ -103,7 +103,7 @@ on specific versions of these packages wherever possible.
The exact lists of `apt` packages needed by Zulip are maintained in a The exact lists of `apt` packages needed by Zulip are maintained in a
few places: few places:
* For production, in our puppet configuration, `puppet/zulip/`, using * For production, in our Puppet configuration, `puppet/zulip/`, using
the `Package` and `SafePackage` directives. the `Package` and `SafePackage` directives.
* For development, in `SYSTEM_DEPENDENCIES` in `tools/lib/provision.py`. * For development, in `SYSTEM_DEPENDENCIES` in `tools/lib/provision.py`.
* The packages needed to build a Zulip virtualenv, in * The packages needed to build a Zulip virtualenv, in
@ -113,7 +113,7 @@ few places:
install other dependencies, and (2) because that list is shared install other dependencies, and (2) because that list is shared
between development and production. between development and production.
We also rely on the `pgroonga` PPA for the `pgroonga` postgres We also rely on the PGroonga PPA for the PGroonga Postgres
extension, used by our [full-text search](full-text-search.md). extension, used by our [full-text search](full-text-search.md).
## Python packages ## Python packages

View File

@ -14,7 +14,7 @@ Currently, Zulip supports these four display formats for emoji:
## Emoji codes ## Emoji codes
The Unicode standard has various ranges of characters set aside for The Unicode standard has various ranges of characters set aside for
emoji. So you can put emoji in your terminal using actual unicode emoji. So you can put emoji in your terminal using actual Unicode
characters like 😀 and 👍. If you paste those into Zulip, Zulip will characters like 😀 and 👍. If you paste those into Zulip, Zulip will
render them as the corresponding emoji image. render them as the corresponding emoji image.
@ -48,7 +48,7 @@ etc. However, we can't use the sprite sheets in some contexts, such
as missed-message and digest emails, that need to have self-contained as missed-message and digest emails, that need to have self-contained
assets. For those, we use individual emoji files under assets. For those, we use individual emoji files under
`static/generated/emoji`. The structure of that repository contains `static/generated/emoji`. The structure of that repository contains
both files named after the unicode representation of emoji (as actual both files named after the Unicode representation of emoji (as actual
image files) as well as symlinks pointing to those emoji. image files) as well as symlinks pointing to those emoji.
We need to maintain those both for the names used in the iamcal emoji We need to maintain those both for the names used in the iamcal emoji
@ -69,7 +69,7 @@ for more details on this strategy.
The emoji tree generated by this process contains several import elements: The emoji tree generated by this process contains several import elements:
* `emoji_codes.json`: A set of mappings used by the Zulip frontend to * `emoji_codes.json`: A set of mappings used by the Zulip frontend to
understand what unicode emoji exist and what their shortnames are, understand what Unicode emoji exist and what their shortnames are,
used for autocomplete, emoji pickers, etc. This has been used for autocomplete, emoji pickers, etc. This has been
deduplicated using the logic in deduplicated using the logic in
`tools/setup/emoji/emoji_setup_utils.py` to generally only have `tools/setup/emoji/emoji_setup_utils.py` to generally only have
@ -80,7 +80,7 @@ The emoji tree generated by this process contains several import elements:
`images/emoji/unicode/` tree. This is used to serve individual emoji `images/emoji/unicode/` tree. This is used to serve individual emoji
images, as well as for the images, as well as for the
[backend Markdown processor](../subsystems/markdown.md) 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 names exist and what Unicode emoji / images they map to. In this
tree, we currently include all of the emoji in `emoji-map.json`; tree, we currently include all of the emoji in `emoji-map.json`;
this means that if you send `:angry_face:`, it won't autocomplete, this means that if you send `:angry_face:`, it won't autocomplete,
but will still work (but not in previews). but will still work (but not in previews).
@ -131,7 +131,7 @@ principles that were applied to the current set of names. We use (strong),
be familiar to a large subset of users. This largely applies to certain be familiar to a large subset of users. This largely applies to certain
faces. (medium) faces. (medium)
* The set of names should be compatible with the iamcal, gemoji, and unicode * The set of names should be compatible with the iamcal, gemoji, and Unicode
names. Compatible here means that if there is an emoji name a user knows names. Compatible here means that if there is an emoji name a user knows
from one of those sets, and the user searches for the key word of that from one of those sets, and the user searches for the key word of that
name, they will get an emoji in our set. It is okay if this emoji has a name, they will get an emoji in our set. It is okay if this emoji has a

View File

@ -137,8 +137,8 @@ Important considerations for any changes are:
Zulip's Markdown processor's rendering supports a number of features Zulip's Markdown processor's rendering supports a number of features
that depend on realm-specific or user-specific data. For example, the that depend on realm-specific or user-specific data. For example, the
realm could have realm could have
[Linkifiers](https://zulip.com/help/add-a-custom-linkification-filter) [linkifiers](https://zulip.com/help/add-a-custom-linkification-filter)
or [Custom emoji](https://zulip.com/help/add-custom-emoji) or [custom emoji](https://zulip.com/help/add-custom-emoji)
configured, and Zulip supports mentions for streams, users, and user configured, and Zulip supports mentions for streams, users, and user
groups (which depend on data like users' names, IDs, etc.). groups (which depend on data like users' names, IDs, etc.).
@ -248,7 +248,7 @@ accurate.
`http://google.com`, and not `https://zulip.com/google.com` which `http://google.com`, and not `https://zulip.com/google.com` which
is the default behavior. is the default behavior.
* Set `title=`(the url) on every link tag. * Set `title=`(the URL) on every link tag.
* Disable link-by-reference syntax, * Disable link-by-reference syntax,
`[foo][bar]` ... `[bar]: https://google.com`. `[foo][bar]` ... `[bar]: https://google.com`.

View File

@ -48,7 +48,7 @@ migrations.
to the table, performing data backfills, or building indexes. We to the table, performing data backfills, or building indexes. We
have a `zerver/lib/migrate.py` library to help with adding columns have a `zerver/lib/migrate.py` library to help with adding columns
and backfilling data. For building indexes on these tables, we and backfilling data. For building indexes on these tables, we
should do this using SQL with postgres's CONCURRENTLY keyword. should do this using SQL with Postgres's CONCURRENTLY keyword.
* **Atomicity**. By default, each Django migration is run atomically * **Atomicity**. By default, each Django migration is run atomically
inside a transaction. This can be problematic if one wants to do inside a transaction. This can be problematic if one wants to do

View File

@ -12,7 +12,7 @@ system and possibly improve it. This document assumes that the
client is our web app, but any client can play along with this client is our web app, but any client can play along with this
protocol. protocol.
Right now typing indicators are only used in "Private Messages" Right now typing indicators are only used in "Private messages"
views. views.
There are two major roles for users in this system: There are two major roles for users in this system:

View File

@ -35,7 +35,7 @@ All users can...
- show up in your message stream - show up in your message stream
- be narrowed to by clicking on recipient bars, etc. - be narrowed to by clicking on recipient bars, etc.
- be narrowed to by searches (but not suggested) - be narrowed to by searches (but not suggested)
- can show up in your "Private Messages" sidebar - can show up in your "Private messages" sidebar
We also have the mirroring world, where we have unknown users We also have the mirroring world, where we have unknown users
that we can send PMs to, and local-echo is allowed to create that we can send PMs to, and local-echo is allowed to create

View File

@ -17,10 +17,10 @@ prevent common coding errors.
We borrow some open source tools for much of our linting, and the links We borrow some open source tools for much of our linting, and the links
below will direct you to the official documentation for these projects. below will direct you to the official documentation for these projects.
- [eslint](https://eslint.org) - [ESLint](https://eslint.org)
- [mypy](http://mypy-lang.org/) - [mypy](http://mypy-lang.org/)
- [Prettier](https://prettier.io/) - [Prettier](https://prettier.io/)
- [puppet](https://puppet.com/) (puppet provides its own mechanism for - [Puppet](https://puppet.com/) (puppet provides its own mechanism for
validating manifests) validating manifests)
- [pyflakes](https://pypi.python.org/pypi/pyflakes) - [pyflakes](https://pypi.python.org/pypi/pyflakes)
- [stylelint](https://github.com/stylelint/stylelint) - [stylelint](https://github.com/stylelint/stylelint)
@ -100,11 +100,11 @@ Most of our lint checks get performed by `./tools/lint`. These include the
following checks: following checks:
- Check Python code with pyflakes. - Check Python code with pyflakes.
- Check JavaScript and TypeScript code with eslint. - Check JavaScript and TypeScript code with ESLint.
- Check CSS, JavaScript, TypeScript, and YAML formatting with Prettier. - Check CSS, JavaScript, TypeScript, and YAML formatting with Prettier.
- Check Python code for custom Zulip rules. - Check Python code for custom Zulip rules.
- Check non-Python code for custom Zulip rules. - Check non-Python code for custom Zulip rules.
- Check puppet manifests with the puppet validator. - Check Puppet manifests with the Puppet validator.
- Check HTML templates for matching tags and indentations. - Check HTML templates for matching tags and indentations.
- Check CSS for parsability and formatting. - Check CSS for parsability and formatting.
- Check JavaScript code for addClass calls. - Check JavaScript code for addClass calls.
@ -136,7 +136,7 @@ types of checks mostly lives [here](https://github.com/zulip/zulip/blob/master/t
You can use the `-h` option for `lint` to see its usage. One particular You can use the `-h` option for `lint` to see its usage. One particular
flag to take note of is the `--modified` flag, which enables you to only run flag to take note of is the `--modified` flag, which enables you to only run
lint checks against files that are modified in your git repo. Most of the lint checks against files that are modified in your Git repo. Most of the
"sub-linters" respect this flag, but some will continue to process all the files. "sub-linters" respect this flag, but some will continue to process all the files.
Generally, a good workflow is to run with `--modified` when you are iterating on Generally, a good workflow is to run with `--modified` when you are iterating on
the code, and then run without that option right before committing new code. the code, and then run without that option right before committing new code.
@ -190,8 +190,8 @@ We check our JavaScript code in a few different ways:
#### Puppet manifests #### Puppet manifests
We use Puppet as our tool to manage configuration files, using We use Puppet as our tool to manage configuration files, using
puppet "manifests." To lint puppet manifests, we use the "parser validate" Puppet "manifests." To lint Puppet manifests, we use the "parser validate"
option of puppet. option of Puppet.
#### HTML templates #### HTML templates

View File

@ -181,10 +181,10 @@ For each of the above types of messages, you will want to cycle
through the following views for Cordelia (and have Hamlet send new through the following views for Cordelia (and have Hamlet send new
messages after each narrow): messages after each narrow):
- Go to All Messages view. - Go to All messages view.
- Go to Private Messages view. - Go to Private messages view.
- Go to Private Messages w/Hamlet. - Go to Private messages w/Hamlet.
- Go to Private Messages w/Hamlet and Othello. - Go to Private messages w/Hamlet and Othello.
- Go to Verona view. - Go to Verona view.
- Go to Verona/bar view. - Go to Verona/bar view.
- Go to Verona/foo view. - Go to Verona/foo view.
@ -212,9 +212,9 @@ populated and where the focus is placed.
- Buttons - Buttons
- Narrow to a stream and click on "New topic" - Narrow to a stream and click on "New topic"
- Narrow "Private Messages" and click on "New topic" - Narrow "Private messages" and click on "New topic"
- Narrow to a stream and click on "New private message" - Narrow to a stream and click on "New private message"
- Narrow "Private Messages" and click on "New private message" - Narrow "Private messages" and click on "New private message"
- Topics - Topics
- Compose/send a message to a stream with no topic. - Compose/send a message to a stream with no topic.
@ -468,7 +468,7 @@ Do these tasks as Cordelia.
- Show user list on left sidebar in narrow windows (verify by making window thinner) - Show user list on left sidebar in narrow windows (verify by making window thinner)
- 24-hour time (and then test going back to AM/PM) - 24-hour time (and then test going back to AM/PM)
- Notifications - Notifications
- Stream Message - Stream message
- turn off notifications at user level - turn off notifications at user level
- create a new stream - create a new stream
- have Hamlet send a message - have Hamlet send a message
@ -477,7 +477,7 @@ Do these tasks as Cordelia.
- have Hamlet send a message - have Hamlet send a message
- then turn off notifications for that stream - then turn off notifications for that stream
- have Hamlet send another message - have Hamlet send another message
- Private Messages and @-mentions - Private messages and @-mentions
- Test Desktop/Audible options - Test Desktop/Audible options
- You can ignore other stuff for now - You can ignore other stuff for now
- Bots/API key - Bots/API key

View File

@ -66,9 +66,9 @@ these goals, but a few techniques are worth highlighting:
outgoing HTTP requests are required to test something, we mock the outgoing HTTP requests are required to test something, we mock the
responses with libraries like `responses`. responses with libraries like `responses`.
* We carefully avoid the potential for contamination of data inside * We carefully avoid the potential for contamination of data inside
services like postgres, redis, and memcached from different tests. services like Postgres, Redis, and memcached from different tests.
* Every test case prepends a unique random prefix to all keys it * Every test case prepends a unique random prefix to all keys it
uses when accessing redis and memcached. uses when accessing Redis and memcached.
* Every test case runs inside a database transaction, which is * Every test case runs inside a database transaction, which is
aborted after the test completes. Each test process interacts aborted after the test completes. Each test process interacts
only with a fresh copy of a special template database used for only with a fresh copy of a special template database used for

View File

@ -203,7 +203,7 @@ These instructions assume you're using the Vagrant development environment.
1. In the `Configure Node.js Remote Interpreter`, window select `Vagrant` 1. In the `Configure Node.js Remote Interpreter`, window select `Vagrant`
1. Wait for WebStorm to connect to Vagrant. This will be displayed 1. Wait for WebStorm to connect to Vagrant. This will be displayed
by the `Vagrant Host URL` section updating to contain the Vagrant by the `Vagrant Host URL` section updating to contain the Vagrant
SSH url, e.g. `ssh://vagrant@127.0.0.1:2222`. SSH URL, e.g. `ssh://vagrant@127.0.0.1:2222`.
1. **Set the `Node.js interpreter path` to `/usr/local/bin/node`** 1. **Set the `Node.js interpreter path` to `/usr/local/bin/node`**
1. Hit `OK` 2 times to get back to the `Run/Debug Configurations` window. 1. Hit `OK` 2 times to get back to the `Run/Debug Configurations` window.
1. Under `Working Directory` select the root `zulip` directory. 1. Under `Working Directory` select the root `zulip` directory.

View File

@ -22,7 +22,7 @@ The test files live in `frontend_tests/puppeteer_tests` and make use
of various useful helper functions defined in of various useful helper functions defined in
`frontend_tests/puppeteer_lib/common.js`. `frontend_tests/puppeteer_lib/common.js`.
## How puppeteer tests work ## How Puppeteer tests work
The Puppeteer tests use a real Chromium browser (powered by The Puppeteer tests use a real Chromium browser (powered by
[puppeteer](https://github.com/puppeteer/puppeteer)), connected to a [puppeteer](https://github.com/puppeteer/puppeteer)), connected to a
@ -93,7 +93,7 @@ These tools/features are often useful when debugging:
debugging test failures. debugging test failures.
* TODO: Mention how to access Puppeteer screenshots in CI. * TODO: Mention how to access Puppeteer screenshots in CI.
* TODO: Add an option for using the `headless: false` debugging mode * TODO: Add an option for using the `headless: false` debugging mode
of puppeteer so you can watch what's happening, and document how to of Puppeteer so you can watch what's happening, and document how to
make that work with Vagrant. make that work with Vagrant.
* TODO: Document `--interactive`. * TODO: Document `--interactive`.
* TODO: Document how to run 100x in CI to check for nondeterminstic * TODO: Document how to run 100x in CI to check for nondeterminstic
@ -108,7 +108,7 @@ These tools/features are often useful when debugging:
includes the console output for the server; any Python exceptions includes the console output for the server; any Python exceptions
are likely actual bugs in the changes being tested. are likely actual bugs in the changes being tested.
See also [puppeteer upstream's debugging See also [Puppeteer upstream's debugging
tips](https://github.com/puppeteer/puppeteer#debugging-tips); some tips](https://github.com/puppeteer/puppeteer#debugging-tips); some
tips may require temporary patches to functions like `run_test` or tips may require temporary patches to functions like `run_test` or
`ensure_browser` in `frontend_tests/puppeteer_lib/common.js`. `ensure_browser` in `frontend_tests/puppeteer_lib/common.js`.
@ -153,4 +153,3 @@ notes above:
`zilencer/management/commands/populate_db.py`. `zilencer/management/commands/populate_db.py`.
[learn-async-await]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await [learn-async-await]: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Async_await

View File

@ -136,7 +136,7 @@ code paths (`httplib2.Http().request`, `requests.request`, etc.) to
throw an exception in the backend tests. While this is enforcement is throw an exception in the backend tests. While this is enforcement is
not complete (there a lot of other ways to use the Internet from not complete (there a lot of other ways to use the Internet from
Python), it is easy to do and catches most common cases of new code Python), it is easy to do and catches most common cases of new code
dependning on Internet access. depending on Internet access.
This enforcement code results in the following exception: This enforcement code results in the following exception:

View File

@ -137,7 +137,7 @@ Since we try to avoid concatenating words whenever possible, don't use
"Privatnachricht" . PN is the officially used abbreviation for "Privatnachricht" . PN is the officially used abbreviation for
"Private Nachricht" and is used in many German chat forums. "Private Nachricht" and is used in many German chat forums.
*"Private Nachricht" (Youtube, Transifex)* *"Private Nachricht" (YouTube, Transifex)*
* Starred Message - **Markierte Nachricht** * Starred Message - **Markierte Nachricht**
@ -260,7 +260,7 @@ works as well, but is not that common in German.
This translation is unambiguous. This translation is unambiguous.
*"Deabonnieren" (Youtube, Transifex)* *"Deabonnieren" (YouTube, Transifex)*
* Narrow to - **Begrenzen auf** * Narrow to - **Begrenzen auf**
@ -293,7 +293,7 @@ preferable due to its brevity.
* Search - **Suchen** * Search - **Suchen**
*"Suchen" (Youtube, Google, Facebook, Transifex)* *"Suchen" (YouTube, Google, Facebook, Transifex)*
* Pin/Unpin - **Anpinnen/Loslösen** * Pin/Unpin - **Anpinnen/Loslösen**

View File

@ -99,7 +99,7 @@ There are a few ways to see your translations in the Zulip UI:
out the language the user requests in a browser using the following out the language the user requests in a browser using the following
prioritization (mostly copied from the Django docs): prioritization (mostly copied from the Django docs):
1. It looks for the language code as a url prefix (e.g. `/de/login/`). 1. It looks for the language code as a URL prefix (e.g. `/de/login/`).
2. It looks for the `LANGUAGE_SESSION_KEY` key in the current user's 2. It looks for the `LANGUAGE_SESSION_KEY` key in the current user's
session (the Zulip language UI option ends up setting this). session (the Zulip language UI option ends up setting this).
3. It looks for the cookie named 'django_language'. You can set a 3. It looks for the cookie named 'django_language'. You can set a

View File

@ -16,7 +16,7 @@ application will serve the request (or deciding to serve the request
itself for static content). itself for static content).
In development, `tools/run-dev.py` fills the role of nginx. Static files In development, `tools/run-dev.py` fills the role of nginx. Static files
are in your git checkout under `static`, and are served unminified. are in your Git checkout under `static`, and are served unminified.
## Static files are [served directly][served-directly] by Nginx ## Static files are [served directly][served-directly] by Nginx
@ -167,7 +167,7 @@ its url patterns (see
[zerver/lib/rest.py](https://github.com/zulip/zulip/blob/master/zerver/lib/rest.py)) [zerver/lib/rest.py](https://github.com/zulip/zulip/blob/master/zerver/lib/rest.py))
so that the action called is `rest_dispatch`. This method will so that the action called is `rest_dispatch`. This method will
authenticate the user, either through a session token from a cookie, authenticate the user, either through a session token from a cookie,
or from an `email:api-key` string given via HTTP Basic Auth for API or from an `email:api-key` string given via HTTP basic auth for API
clients. clients.
It will then look up what HTTP verb was used (GET, POST, etc) to make It will then look up what HTTP verb was used (GET, POST, etc) to make

View File

@ -147,7 +147,7 @@ document it and update any existing documentation that might be
relevant to the new feature. For more information on the kinds of relevant to the new feature. For more information on the kinds of
documentation Zulip has, see [Documentation](../documentation/overview.md). documentation Zulip has, see [Documentation](../documentation/overview.md).
## Example Feature ## Example feature
This example describes the process of adding a new setting to Zulip: a This example describes the process of adding a new setting to Zulip: a
flag that allows an admin to require topics on stream messages (the default flag that allows an admin to require topics on stream messages (the default

View File

@ -112,7 +112,7 @@ which is documented in detail at
[zerver/lib/rest.py](https://github.com/zulip/zulip/blob/master/zerver/lib/rest.py). [zerver/lib/rest.py](https://github.com/zulip/zulip/blob/master/zerver/lib/rest.py).
This method will authenticate the user either through a session token This method will authenticate the user either through a session token
from a cookie on the browser, or from a base64 encoded `email:api-key` from a cookie on the browser, or from a base64 encoded `email:api-key`
string given via HTTP Basic Auth for API clients. string given via HTTP basic auth for API clients.
``` py ``` py
>>> import requests >>> import requests

View File

@ -223,7 +223,7 @@ run_test("title_data", () => {
}; };
assert.deepEqual(buddy_data.get_title_data(bot.user_id, is_group), expected_group_data); assert.deepEqual(buddy_data.get_title_data(bot.user_id, is_group), expected_group_data);
// Individual Users. // Individual users.
user_status.set_status_text({ user_status.set_status_text({
user_id: me.user_id, user_id: me.user_id,
status_text: "out to lunch", status_text: "out to lunch",

View File

@ -369,7 +369,7 @@ run_test("update_user_event", (override) => {
that happen during an event. This concept is called "mocking", that happen during an event. This concept is called "mocking",
and you can find libraries to help do mocking. Here we will and you can find libraries to help do mocking. Here we will
just build our own lightweight mocking system, which is almost just build our own lightweight mocking system, which is almost
trivially easy to do in a language like Javascript. trivially easy to do in a language like JavaScript.
*/ */

View File

@ -223,11 +223,11 @@ run_test("markdown_detection", () => {
"https://zulip.com/image.jpg too", "https://zulip.com/image.jpg too",
"Contains a zulip.com/foo.jpeg file", "Contains a zulip.com/foo.jpeg file",
"Contains a https://zulip.com/image.png file", "Contains a https://zulip.com/image.png file",
"twitter url https://twitter.com/jacobian/status/407886996565016579", "Twitter URL https://twitter.com/jacobian/status/407886996565016579",
"https://twitter.com/jacobian/status/407886996565016579", "https://twitter.com/jacobian/status/407886996565016579",
"then https://twitter.com/jacobian/status/407886996565016579", "then https://twitter.com/jacobian/status/407886996565016579",
"twitter url http://twitter.com/jacobian/status/407886996565016579", "Twitter URL http://twitter.com/jacobian/status/407886996565016579",
"youtube url https://www.youtube.com/watch?v=HHZ8iqswiCw&feature=youtu.be&a", "YouTube URL https://www.youtube.com/watch?v=HHZ8iqswiCw&feature=youtu.be&a",
]; ];
no_markup.forEach((content) => { no_markup.forEach((content) => {
@ -475,7 +475,7 @@ run_test("marked", () => {
'<p><span aria-label="smile" class="emoji emoji-1f642" role="img" title="smile">:smile:</span></p>', '<p><span aria-label="smile" class="emoji emoji-1f642" role="img" title="smile">:smile:</span></p>',
translate_emoticons: true, translate_emoticons: true,
}, },
// Test HTML Escape in Custom Zulip Rules // Test HTML escaping in custom Zulip rules
{ {
input: "@**<h1>The Rogue One</h1>**", input: "@**<h1>The Rogue One</h1>**",
expected: "<p>@**&lt;h1&gt;The Rogue One&lt;/h1&gt;**</p>", expected: "<p>@**&lt;h1&gt;The Rogue One&lt;/h1&gt;**</p>",

View File

@ -48,33 +48,33 @@ run_test("get_emoji_matcher", () => {
run_test("triage", () => { run_test("triage", () => {
const alice = {name: "alice"}; const alice = {name: "alice"};
const Alicia = {name: "Alicia"}; const alicia = {name: "Alicia"};
const steve = {name: "steve"}; const steve = {name: "steve"};
const Stephanie = {name: "Stephanie"}; const stephanie = {name: "Stephanie"};
const names = [alice, Alicia, steve, Stephanie]; const names = [alice, alicia, steve, stephanie];
assert.deepEqual( assert.deepEqual(
typeahead.triage("a", names, (r) => r.name), typeahead.triage("a", names, (r) => r.name),
{ {
matches: [alice, Alicia], matches: [alice, alicia],
rest: [steve, Stephanie], rest: [steve, stephanie],
}, },
); );
assert.deepEqual( assert.deepEqual(
typeahead.triage("A", names, (r) => r.name), typeahead.triage("A", names, (r) => r.name),
{ {
matches: [Alicia, alice], matches: [alicia, alice],
rest: [steve, Stephanie], rest: [steve, stephanie],
}, },
); );
assert.deepEqual( assert.deepEqual(
typeahead.triage("S", names, (r) => r.name), typeahead.triage("S", names, (r) => r.name),
{ {
matches: [Stephanie, steve], matches: [stephanie, steve],
rest: [alice, Alicia], rest: [alice, alicia],
}, },
); );
@ -82,7 +82,7 @@ run_test("triage", () => {
typeahead.triage("fred", names, (r) => r.name), typeahead.triage("fred", names, (r) => r.name),
{ {
matches: [], matches: [],
rest: [alice, Alicia, steve, Stephanie], rest: [alice, alicia, steve, stephanie],
}, },
); );
}); });

View File

@ -143,7 +143,7 @@ run_test("sort_languages", () => {
const a_bot = { const a_bot = {
email: "a_bot@zulip.com", email: "a_bot@zulip.com",
full_name: "A zulip test bot", full_name: "A Zulip test bot",
is_admin: false, is_admin: false,
is_bot: true, is_bot: true,
user_id: 1, user_id: 1,
@ -151,7 +151,7 @@ const a_bot = {
const a_user = { const a_user = {
email: "a_user@zulip.org", email: "a_user@zulip.org",
full_name: "A zulip user", full_name: "A Zulip user",
is_admin: false, is_admin: false,
is_bot: false, is_bot: false,
user_id: 2, user_id: 2,

View File

@ -123,7 +123,7 @@ async function create_stream(page) {
await page.waitForXPath('//*[text()="Create stream"]', {visible: true}); await page.waitForXPath('//*[text()="Create stream"]', {visible: true});
await common.fill_form(page, "form#stream_creation_form", { await common.fill_form(page, "form#stream_creation_form", {
stream_name: "Puppeteer", stream_name: "Puppeteer",
stream_description: "Everything puppeteer", stream_description: "Everything Puppeteer",
}); });
await page.click(await stream_span(page, "Scotland")); // Subscribes all users from Scotland await page.click(await stream_span(page, "Scotland")); // Subscribes all users from Scotland
await page.click(await user_span(page, "cordelia")); // Add cordelia. await page.click(await user_span(page, "cordelia")); // Add cordelia.
@ -142,7 +142,7 @@ async function create_stream(page) {
); );
const subscriber_count_selector = "[data-stream-name='Puppeteer'] .subscriber-count"; const subscriber_count_selector = "[data-stream-name='Puppeteer'] .subscriber-count";
assert.strictEqual(stream_name, "Puppeteer"); assert.strictEqual(stream_name, "Puppeteer");
assert.strictEqual(stream_description, "Everything puppeteer"); assert.strictEqual(stream_description, "Everything Puppeteer");
// Assert subscriber count becomes 5(scotland(+4), cordelia(+1), othello(-1), Desdemona(+1)). // Assert subscriber count becomes 5(scotland(+4), cordelia(+1), othello(-1), Desdemona(+1)).
await page.waitForFunction( await page.waitForFunction(

View File

@ -78,7 +78,7 @@ async function navigation_tests(page) {
await navigate_to(page, verona_narrow, "message_feed_container"); await navigate_to(page, verona_narrow, "message_feed_container");
// Hardcoded this instead of using `navigate_to` // Hardcoded this instead of using `navigate_to`
// as puppeteer cannot click hidden elements. // as Puppeteer cannot click hidden elements.
await page.evaluate(() => $("a[href='#message_feed_container]'").click()); await page.evaluate(() => $("a[href='#message_feed_container]'").click());
await wait_for_tab(page, "message_feed_container"); await wait_for_tab(page, "message_feed_container");

View File

@ -10,7 +10,7 @@
* Based on diffing library difflib, a js port of the python library. * Based on diffing library difflib, a js port of the python library.
* *
* The sole exported function diff_strings(string_0, string_1) returns a pretty-printed * The sole exported function diff_strings(string_0, string_1) returns a pretty-printed
* unicode string containing their diff. * Unicode string containing their diff.
*/ */
const difflib = require("difflib"); const difflib = require("difflib");

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Nagios plugin to check that the rabbitmq has the correct number of consumers. Nagios plugin to check that the RabbitMQ has the correct number of consumers.
This script just checks the contents of /var/lib/nagios_state/check-rabbitmq-consumers, This script just checks the contents of /var/lib/nagios_state/check-rabbitmq-consumers,
which is generated by scripts/nagios/check-rabbitmq-consumers. which is generated by scripts/nagios/check-rabbitmq-consumers.

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Nagios plugin to check that the rabbitmq queues are not overflowing as a result Nagios plugin to check that the RabbitMQ queues are not overflowing as a result
of a stuck consumer. of a stuck consumer.
This script just checks the contents of /var/lib/nagios_state/check-rabbitmq-results, This script just checks the contents of /var/lib/nagios_state/check-rabbitmq-results,

View File

@ -2,7 +2,7 @@
"""Nagios plugin to check the difference between the primary and """Nagios plugin to check the difference between the primary and
replica Postgres servers' xlog location. Requires that the user this replica Postgres servers' xlog location. Requires that the user this
connects to postgres as has been granted the `pg_monitor` role. connects to Postgres as has been granted the `pg_monitor` role.
""" """
import re import re

View File

@ -1,10 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Processes updates to postgres Full Text Search for new/edited messages. # Processes updates to Postgres full-text search for new/edited messages.
# #
# Zulip manages its postgres full-text search as follows. When the # Zulip manages its Postgres full-text search as follows. When the
# content of a message is modified, a postgres trigger logs the # content of a message is modified, a Postgres trigger logs the
# message ID to the `fts_update_log` table. In the background, this # message ID to the `fts_update_log` table. In the background, this
# program processes `fts_update_log`, updating the postgres full-text # program processes `fts_update_log`, updating the Postgres full-text
# search column search_tsvector in the main zerver_message. # search column search_tsvector in the main zerver_message.
import sys import sys
@ -88,12 +88,12 @@ try:
USING_PGROONGA = settings.USING_PGROONGA USING_PGROONGA = settings.USING_PGROONGA
except ImportError: except ImportError:
# process_fts_updates also supports running locally on a remote # process_fts_updates also supports running locally on a remote
# postgres server; in that case, one can just connect to localhost # Postgres server; in that case, one can just connect to localhost
USING_PGROONGA = False USING_PGROONGA = False
# Since we don't want a hard dependency on being able to access the # Since we don't want a hard dependency on being able to access the
# Zulip settings (as we may not be running on a server that has that # Zulip settings (as we may not be running on a server that has that
# data), we determine whether we're using pgroonga using # data), we determine whether we're using PGroonga using
# /etc/zulip/zulip.conf. # /etc/zulip/zulip.conf.
# #
# However, we still also check the `USING_PGROONGA` variable, since # However, we still also check the `USING_PGROONGA` variable, since

View File

@ -9,7 +9,7 @@ class zulip::app_frontend_base {
if $::osfamily == 'debian' { if $::osfamily == 'debian' {
# Upgrade and other tooling wants to be able to get a database # Upgrade and other tooling wants to be able to get a database
# shell. This is not necessary on CentOS because the postgresql # shell. This is not necessary on CentOS because the PostgreSQL
# package already includes the client. This may get us a more # package already includes the client. This may get us a more
# recent client than the database server is configured to be, # recent client than the database server is configured to be,
# ($zulip::postgres_common::version), but they're compatible. # ($zulip::postgres_common::version), but they're compatible.

View File

@ -34,7 +34,7 @@ class zulip::base {
# Used in scripts including install-yarn.sh # Used in scripts including install-yarn.sh
'curl', 'curl',
'wget', 'wget',
# Used to read /etc/zulip/zulip.conf for `zulipconf` puppet function # Used to read /etc/zulip/zulip.conf for `zulipconf` Puppet function
'crudini', 'crudini',
# Used for tools like sponge # Used for tools like sponge
'moreutils', 'moreutils',
@ -42,7 +42,7 @@ class zulip::base {
$zulip::common::nagios_plugins, $zulip::common::nagios_plugins,
# Required for using HTTPS in apt repositories. # Required for using HTTPS in apt repositories.
'apt-transport-https', 'apt-transport-https',
# Needed for the cron jobs installed by puppet # Needed for the cron jobs installed by Puppet
'cron', 'cron',
] ]
} }

View File

@ -1,6 +1,6 @@
# This class includes all the modules you need to install/run a Zulip installation # This class includes all the modules you need to install/run a Zulip installation
# in a single container (without the database, memcached, redis services). # in a single container (without the database, memcached, Redis services).
# The database, memcached, redis services need to be run in separate containers. # The database, memcached, Redis services need to be run in separate containers.
# Through this split of services, it is easier to scale the services to the needs. # Through this split of services, it is easier to scale the services to the needs.
class zulip::dockervoyager { class zulip::dockervoyager {
include zulip::base include zulip::base

View File

@ -1,4 +1,4 @@
# Minimal shared configuration needed to run a Zulip postgres database. # Minimal shared configuration needed to run a Zulip Postgres database.
class zulip::postgres_appdb_base { class zulip::postgres_appdb_base {
include zulip::postgres_common include zulip::postgres_common
include zulip::process_fts_updates include zulip::process_fts_updates
@ -33,7 +33,7 @@ class zulip::postgres_appdb_base {
$pgroonga_setup_sql_path = "${postgres_sharedir}/pgroonga_setup.sql" $pgroonga_setup_sql_path = "${postgres_sharedir}/pgroonga_setup.sql"
$setup_system_deps = 'setup_yum_repo' $setup_system_deps = 'setup_yum_repo'
$postgres_restart = "systemctl restart postgresql-${zulip::postgres_common::version}" $postgres_restart = "systemctl restart postgresql-${zulip::postgres_common::version}"
# TODO Since we can't find the postgres dicts directory on CentOS yet, we # TODO Since we can't find the Postgres dicts directory on CentOS yet, we
# link directly to the hunspell directory. # link directly to the hunspell directory.
$postgres_dict_dict = '/usr/share/myspell/en_US.dic' $postgres_dict_dict = '/usr/share/myspell/en_US.dic'
$postgres_dict_affix = '/usr/share/myspell/en_US.aff' $postgres_dict_affix = '/usr/share/myspell/en_US.aff'

View File

@ -3,7 +3,7 @@ class zulip::rabbit {
'debian' => 'erlang-base', 'debian' => 'erlang-base',
'redhat' => 'erlang', 'redhat' => 'erlang',
} }
$rabbit_packages = [# Needed to run rabbitmq $rabbit_packages = [# Needed to run RabbitMQ
$erlang, $erlang,
'rabbitmq-server', 'rabbitmq-server',
] ]

View File

@ -6,7 +6,7 @@ class zulip::tornado_sharding {
# The file entries below serve only to initialize the sharding config files # The file entries below serve only to initialize the sharding config files
# with the correct default content for the "only one shard" setup. For this # with the correct default content for the "only one shard" setup. For this
# reason they use "replace => false", because the files are managed by # reason they use "replace => false", because the files are managed by
# the sharding script afterwards and puppet shouldn't overwrite them. # the sharding script afterwards and Puppet shouldn't overwrite them.
file { '/etc/zulip/nginx_sharding.conf': file { '/etc/zulip/nginx_sharding.conf':
ensure => file, ensure => file,
owner => 'root', owner => 'root',

View File

@ -1,4 +1,4 @@
# This file is managed by puppet; local changes will be overridden. # This file is managed by Puppet; local changes will be overridden.
smtpd_banner = $myhostname ESMTP $mail_name (Zulip) smtpd_banner = $myhostname ESMTP $mail_name (Zulip)
biff = no biff = no

View File

@ -4,7 +4,7 @@
# #
# Usage: Link or copy into /etc/munin/node.d/ # Usage: Link or copy into /etc/munin/node.d/
# #
# No Parameters # No parameters
# #
# Magic markers (optional - only used by munin-config and some # Magic markers (optional - only used by munin-config and some
# installation scripts): # installation scripts):

View File

@ -1,7 +1,7 @@
# A simple wildcard hostgroup # A simple wildcard hostgroup
define hostgroup { define hostgroup {
hostgroup_name all hostgroup_name all
alias All Servers alias All servers
members * members *
} }
@ -17,70 +17,70 @@ define hostgroup {
define hostgroup { define hostgroup {
hostgroup_name web hostgroup_name web
alias Web Servers alias Web servers
} }
define hostgroup { define hostgroup {
hostgroup_name frontends hostgroup_name frontends
alias Frontend Web Servers alias Frontend web servers
} }
define hostgroup { define hostgroup {
hostgroup_name staging_frontends hostgroup_name staging_frontends
alias Staging Frontend Web Servers alias Staging frontend web servers
} }
define hostgroup { define hostgroup {
hostgroup_name prod_frontends hostgroup_name prod_frontends
alias Production Frontend Web Servers alias Production frontend web servers
} }
define hostgroup { define hostgroup {
hostgroup_name multitornado_frontends hostgroup_name multitornado_frontends
alias Frontend Web Servers with multiple Tornado processes alias Frontend web servers with multiple Tornado processes
} }
define hostgroup { define hostgroup {
hostgroup_name singletornado_frontends hostgroup_name singletornado_frontends
alias Frontend Web Servers with a single Tornado process alias Frontend web servers with a single Tornado process
} }
define hostgroup { define hostgroup {
hostgroup_name redis hostgroup_name redis
alias Redis Servers alias Redis servers
hostgroup_members frontends hostgroup_members frontends
} }
define hostgroup { define hostgroup {
hostgroup_name zmirror hostgroup_name zmirror
alias Zephyr Mirror Servers alias Zephyr mirror servers
} }
define hostgroup { define hostgroup {
hostgroup_name zmirrorp hostgroup_name zmirrorp
alias Zephyr Mirror Personals Servers alias Zephyr mirror personals servers
} }
define hostgroup { define hostgroup {
hostgroup_name zmirror_main hostgroup_name zmirror_main
alias Zephyr Mirror Main Servers alias Zephyr mirror main servers
} }
define hostgroup { define hostgroup {
hostgroup_name postgres hostgroup_name postgres
alias PostgreSQL Servers alias PostgreSQL servers
hostgroup_members postgres_appdb hostgroup_members postgres_appdb
} }
define hostgroup { define hostgroup {
hostgroup_name postgres_appdb hostgroup_name postgres_appdb
alias PostgreSQL App Servers alias PostgreSQL app servers
hostgroup_members postgres_appdb_primary hostgroup_members postgres_appdb_primary
} }
define hostgroup { define hostgroup {
hostgroup_name postgres_appdb_primary hostgroup_name postgres_appdb_primary
alias Primary PostgreSQL App Servers alias Primary PostgreSQL app servers
} }
define hostgroup { define hostgroup {

View File

@ -156,7 +156,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres autovac_freeze service_description Check Postgres autovac_freeze
check_command check_postgres!zulip!nagios!autovac_freeze check_command check_postgres!zulip!nagios!autovac_freeze
hostgroup postgres_appdb_primary hostgroup postgres_appdb_primary
contact_groups admins contact_groups admins
@ -164,7 +164,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres backends service_description Check Postgres backends
check_command check_postgres!zulip!nagios!backends check_command check_postgres!zulip!nagios!backends
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -172,7 +172,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres connection service_description Check Postgres connection
check_command check_postgres!zulip!nagios!connection check_command check_postgres!zulip!nagios!connection
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups page_admins contact_groups page_admins
@ -180,7 +180,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres disabled triggers service_description Check Postgres disabled triggers
check_command check_postgres!zulip!nagios!disabled_triggers check_command check_postgres!zulip!nagios!disabled_triggers
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -188,7 +188,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres hitratio service_description Check Postgres hitratio
check_command check_postgres!zulip!nagios!hitratio check_command check_postgres!zulip!nagios!hitratio
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -196,7 +196,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres locks service_description Check Postgres locks
check_command check_postgres_alert_args!zulip!nagios!locks!400!600 check_command check_postgres_alert_args!zulip!nagios!locks!400!600
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -204,7 +204,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres query_time service_description Check Postgres query_time
check_command check_postgres_alert_args!zulip!nagios!query_time!20 seconds!40 seconds check_command check_postgres_alert_args!zulip!nagios!query_time!20 seconds!40 seconds
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -212,7 +212,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres sequence service_description Check Postgres sequence
check_command check_postgres!zulip!nagios!sequence check_command check_postgres!zulip!nagios!sequence
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -220,7 +220,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres timesync service_description Check Postgres timesync
check_command check_postgres!zulip!nagios!timesync check_command check_postgres!zulip!nagios!timesync
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -228,7 +228,7 @@ define service {
# define service { # define service {
# use generic-service # use generic-service
# service_description Check postgres txn_idle # service_description Check Postgres txn_idle
# check_command check_postgres_alert_args!zulip!nagios!txn_idle!20 seconds!40 seconds # check_command check_postgres_alert_args!zulip!nagios!txn_idle!20 seconds!40 seconds
# hostgroup postgres_appdb # hostgroup postgres_appdb
# contact_groups admins # contact_groups admins
@ -236,7 +236,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check postgres txn_time service_description Check Postgres txn_time
check_command check_postgres_alert_args!zulip!nagios!txn_time!20 seconds!40 seconds check_command check_postgres_alert_args!zulip!nagios!txn_time!20 seconds!40 seconds
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -252,7 +252,7 @@ define service {
define service{ define service{
use generic-service use generic-service
service_description Check postgres replication lag service_description Check Postgres replication lag
check_command check_postgres_replication_lag check_command check_postgres_replication_lag
hostgroup postgres_appdb hostgroup postgres_appdb
contact_groups admins contact_groups admins
@ -288,7 +288,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq queue sizes service_description Check RabbitMQ queue sizes
check_command check_rabbitmq_queues!22 check_command check_rabbitmq_queues!22
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -307,7 +307,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq notify_tornado consumers service_description Check RabbitMQ notify_tornado consumers
check_command check_rabbitmq_consumers!notify_tornado check_command check_rabbitmq_consumers!notify_tornado
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -318,7 +318,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq user_activity_interval consumers service_description Check RabbitMQ user_activity_interval consumers
check_command check_rabbitmq_consumers!user_activity_interval check_command check_rabbitmq_consumers!user_activity_interval
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -329,7 +329,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq user_presence consumers service_description Check RabbitMQ user_presence consumers
check_command check_rabbitmq_consumers!user_presence check_command check_rabbitmq_consumers!user_presence
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -340,7 +340,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq invites consumers service_description Check RabbitMQ invites consumers
check_command check_rabbitmq_consumers!invites check_command check_rabbitmq_consumers!invites
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -351,7 +351,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq signups consumers service_description Check RabbitMQ signups consumers
check_command check_rabbitmq_consumers!signups check_command check_rabbitmq_consumers!signups
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -362,7 +362,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq digest email consumers service_description Check RabbitMQ digest email consumers
check_command check_rabbitmq_consumers!digest_emails check_command check_rabbitmq_consumers!digest_emails
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -373,7 +373,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq email mirror consumers service_description Check RabbitMQ email mirror consumers
check_command check_rabbitmq_consumers!email_mirror check_command check_rabbitmq_consumers!email_mirror
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -384,7 +384,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq missedmessage mobile notifications consumers service_description Check RabbitMQ missedmessage mobile notifications consumers
check_command check_rabbitmq_consumers!missedmessage_mobile_notifications check_command check_rabbitmq_consumers!missedmessage_mobile_notifications
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -395,7 +395,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq missedmessage email consumers service_description Check RabbitMQ missedmessage email consumers
check_command check_rabbitmq_consumers!missedmessage_email check_command check_rabbitmq_consumers!missedmessage_email
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet
@ -406,7 +406,7 @@ define service {
define service { define service {
use generic-service use generic-service
service_description Check rabbitmq user activity consumers service_description Check RabbitMQ user activity consumers
check_command check_rabbitmq_consumers!user_activity check_command check_rabbitmq_consumers!user_activity
# Workaround weird checks 40s after first error causing alerts # Workaround weird checks 40s after first error causing alerts
# from a single failure because cron hasn't run again yet # from a single failure because cron hasn't run again yet

View File

@ -190,8 +190,8 @@ class zulip_ops::base {
ensure => running, ensure => running,
# Because there is no running process for this service, the normal status # Because there is no running process for this service, the normal status
# checks fail. Because puppet then thinks the service has been manually # checks fail. Because Puppet then thinks the service has been manually
# stopped, it won't restart it. This fake status command will trick puppet # stopped, it won't restart it. This fake status command will trick Puppet
# into thinking the service is *always* running (which in a way it is, as # into thinking the service is *always* running (which in a way it is, as
# iptables is part of the kernel.) # iptables is part of the kernel.)
hasstatus => true, hasstatus => true,

View File

@ -23,7 +23,7 @@ jsx-lexer
# Needed for manage.py # Needed for manage.py
ipython ipython
# Needed for Image Processing # Needed for image processing
Pillow Pillow
# Needed for building complex DB queries # Needed for building complex DB queries
@ -59,7 +59,7 @@ httplib2
# Forked to avoid pulling in scipy: https://github.com/mailgun/talon/issues/130 # Forked to avoid pulling in scipy: https://github.com/mailgun/talon/issues/130
https://github.com/zulip/talon/archive/7d8bdc4dbcfcc5a73298747293b99fe53da55315.zip#egg=talon==1.2.10.zulip1 https://github.com/zulip/talon/archive/7d8bdc4dbcfcc5a73298747293b99fe53da55315.zip#egg=talon==1.2.10.zulip1
# Needed for hipchat import # Needed for HipChat import
hypchat hypchat
# Needed for inlining the CSS in emails # Needed for inlining the CSS in emails
@ -71,7 +71,7 @@ PyJWT
# Needed for including other Markdown files for user docs # Needed for including other Markdown files for user docs
markdown-include markdown-include
# Needed to access rabbitmq # Needed to access RabbitMQ
pika pika
# Needed to access our database # Needed to access our database
@ -89,7 +89,7 @@ python-dateutil
# Needed for timezone work # Needed for timezone work
pytz pytz
# Needed for redis # Needed for Redis
redis redis
# Needed to parse source maps for error reporting # Needed to parse source maps for error reporting

View File

@ -9,7 +9,7 @@ from scripts.lib.zulip_tools import parse_cache_script_args
def main() -> None: def main() -> None:
args = parse_cache_script_args("This script cleans unused zulip caches.") args = parse_cache_script_args("This script cleans unused Zulip caches.")
os.chdir(ZULIP_PATH) os.chdir(ZULIP_PATH)
clean_venv_cache.main(args) clean_venv_cache.main(args)
clean_node_cache.main(args) clean_node_cache.main(args)

View File

@ -43,5 +43,5 @@ def main(args: argparse.Namespace) -> None:
EMOJI_CACHE_PATH, caches_in_use, "emoji cache", args) EMOJI_CACHE_PATH, caches_in_use, "emoji cache", args)
if __name__ == "__main__": if __name__ == "__main__":
args = parse_cache_script_args("This script cleans unused zulip emoji caches.") args = parse_cache_script_args("This script cleans unused Zulip emoji caches.")
main(args) main(args)

View File

@ -46,5 +46,5 @@ def main(args: argparse.Namespace) -> None:
NODE_MODULES_CACHE_PATH, caches_in_use, "node modules cache", args) NODE_MODULES_CACHE_PATH, caches_in_use, "node modules cache", args)
if __name__ == "__main__": if __name__ == "__main__":
args = parse_cache_script_args("This script cleans unused zulip npm caches.") args = parse_cache_script_args("This script cleans unused Zulip npm caches.")
main(args) main(args)

View File

@ -54,5 +54,5 @@ def main(args: argparse.Namespace) -> None:
VENV_CACHE_DIR, caches_in_use, "venv cache", args) VENV_CACHE_DIR, caches_in_use, "venv cache", args)
if __name__ == "__main__": if __name__ == "__main__":
args = parse_cache_script_args("This script cleans unused zulip venv caches.") args = parse_cache_script_args("This script cleans unused Zulip venv caches.")
main(args) main(args)

View File

@ -6,13 +6,13 @@ forwarding emails into Zulip.
https://zulip.readthedocs.io/en/latest/production/settings.html#email-gateway https://zulip.readthedocs.io/en/latest/production/settings.html#email-gateway
The email gateway supports two major modes of operation: An email The email gateway supports two major modes of operation: An email
server (using postfix) where the email address configured in server (using Postfix) where the email address configured in
EMAIL_GATEWAY_PATTERN delivers emails directly to Zulip (this) or a EMAIL_GATEWAY_PATTERN delivers emails directly to Zulip (this) or a
cron job that connects to an IMAP inbox (which receives the emails) cron job that connects to an IMAP inbox (which receives the emails)
periodically. periodically.
Zulip's puppet configuration takes care of configuring postfix to Zulip's Puppet configuration takes care of configuring Postfix to
execute this script when emails are received by postfix, piping the execute this script when emails are received by Postfix, piping the
email content via standard input (and the destination email address in email content via standard input (and the destination email address in
the ORIGINAL_RECIPIENT environment variable). the ORIGINAL_RECIPIENT environment variable).
@ -65,7 +65,7 @@ parser.add_argument('-d', '--dst-host', dest="host", default='https://127.0.0.1'
"Address must contain a HTTP protocol.") "Address must contain a HTTP protocol.")
parser.add_argument('-u', '--dst-url', dest="url", default='/email_mirror_message', parser.add_argument('-u', '--dst-url', dest="url", default='/email_mirror_message',
help="Destination relative url for uploading email from email mirror.") help="Destination relative URL for uploading email from email mirror.")
parser.add_argument('-n', '--not-verify-ssl', dest="verify_ssl", action='store_false', parser.add_argument('-n', '--not-verify-ssl', dest="verify_ssl", action='store_false',
help="Disable ssl certificate verifying for self-signed certificates") help="Disable ssl certificate verifying for self-signed certificates")

View File

@ -121,7 +121,7 @@ fi
read -r -a APT_OPTIONS <<<"${APT_OPTIONS:-}" read -r -a APT_OPTIONS <<<"${APT_OPTIONS:-}"
# Install additional packages. # Install additional packages.
read -r -a ADDITIONAL_PACKAGES <<<"${ADDITIONAL_PACKAGES:-}" read -r -a ADDITIONAL_PACKAGES <<<"${ADDITIONAL_PACKAGES:-}"
# Comma-separated list of puppet manifests to install. default is # Comma-separated list of Puppet manifests to install. default is
# zulip::voyager for an all-in-one system or zulip::dockervoyager for # zulip::voyager for an all-in-one system or zulip::dockervoyager for
# Docker. Use e.g. zulip::app_frontend for a Zulip frontend server. # Docker. Use e.g. zulip::app_frontend for a Zulip frontend server.
PUPPET_CLASSES="${PUPPET_CLASSES:-zulip::voyager}" PUPPET_CLASSES="${PUPPET_CLASSES:-zulip::voyager}"
@ -234,8 +234,8 @@ fi
case ",$PUPPET_CLASSES," in case ",$PUPPET_CLASSES," in
*,zulip::voyager,* | *,zulip::postgres_appdb_tuned,*) *,zulip::voyager,* | *,zulip::postgres_appdb_tuned,*)
if [ "$package_system" = apt ]; then if [ "$package_system" = apt ]; then
# We're going to install Postgres from the postgres apt # We're going to install Postgres from the Postgres apt
# repository; this may conflict with the existing postgres. # repository; this may conflict with the existing Postgres.
OTHER_PG="$(dpkg --get-selections \ OTHER_PG="$(dpkg --get-selections \
| grep -E '^postgresql-[0-9]+\s+install$' \ | grep -E '^postgresql-[0-9]+\s+install$' \
| grep -v "^postgresql-$POSTGRES_VERSION\b" \ | grep -v "^postgresql-$POSTGRES_VERSION\b" \
@ -405,7 +405,7 @@ EOF
--classfile=/var/lib/puppet/classes.txt \ --classfile=/var/lib/puppet/classes.txt \
>/dev/null >/dev/null
# We only need the postgres version setting on database hosts; but # We only need the Postgres version setting on database hosts; but
# we don't know if this is a database host until we have the catalog summary. # we don't know if this is a database host until we have the catalog summary.
if ! has_class "zulip::postgres_common" || [ "$package_system" != apt ]; then if ! has_class "zulip::postgres_common" || [ "$package_system" != apt ]; then
crudini --del /etc/zulip/zulip.conf postgresql crudini --del /etc/zulip/zulip.conf postgresql
@ -511,7 +511,7 @@ if has_class "zulip::app_frontend_base"; then
chown -R zulip:zulip /home/zulip /var/log/zulip /etc/zulip/settings.py chown -R zulip:zulip /home/zulip /var/log/zulip /etc/zulip/settings.py
if ! [ -e "/home/zulip/prod-static/generated" ]; then if ! [ -e "/home/zulip/prod-static/generated" ]; then
# If we're installing from a git checkout, we need to run # If we're installing from a Git checkout, we need to run
# `tools/update-prod-static` in order to build the static # `tools/update-prod-static` in order to build the static
# assets. # assets.
su zulip -c '/home/zulip/deployments/current/tools/update-prod-static' su zulip -c '/home/zulip/deployments/current/tools/update-prod-static'
@ -525,7 +525,7 @@ if [ -n "$NO_INIT_DB" ]; then
Success! Success!
Stopping because --no-init-db was passed. Stopping because --no-init-db was passed.
To complete the installation, configure postgres and then run: To complete the installation, configure Postgres and then run:
su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database' su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database'
su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link' su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link'

View File

@ -199,19 +199,19 @@ elif args.from_git:
logging.info("Shutting down server to build static assets on a low-RAM system.") logging.info("Shutting down server to build static assets on a low-RAM system.")
shutdown_server() shutdown_server()
# Note: The fact that this is before we apply puppet changes means # Note: The fact that this is before we apply Puppet changes means
# that we don't support adding new puppet dependencies of # that we don't support adding new Puppet dependencies of
# update-prod-static with the git upgrade process. But it'll fail # update-prod-static with the Git upgrade process. But it'll fail
# safely; this seems like a worthwhile tradeoff to minimize downtime. # safely; this seems like a worthwhile tradeoff to minimize downtime.
logging.info("Building static assets...") logging.info("Building static assets...")
subprocess.check_call(["./tools/update-prod-static", "--prev-deploy=" + subprocess.check_call(["./tools/update-prod-static", "--prev-deploy=" +
os.path.join(DEPLOYMENTS_DIR, 'current')], os.path.join(DEPLOYMENTS_DIR, 'current')],
preexec_fn=su_to_zulip) preexec_fn=su_to_zulip)
logging.info("Caching zulip git version...") logging.info("Caching Zulip Git version...")
subprocess.check_call(["./tools/cache-zulip-git-version"], preexec_fn=su_to_zulip) subprocess.check_call(["./tools/cache-zulip-git-version"], preexec_fn=su_to_zulip)
else: else:
# Since this doesn't do any actual work, it's likely safe to have # Since this doesn't do any actual work, it's likely safe to have
# this run before we apply puppet changes (saving a bit of downtime). # this run before we apply Puppet changes (saving a bit of downtime).
logging.info("Installing static assets...") logging.info("Installing static assets...")
subprocess.check_call(["cp", "-rT", os.path.join(deploy_path, 'prod-static/serve'), subprocess.check_call(["cp", "-rT", os.path.join(deploy_path, 'prod-static/serve'),
'/home/zulip/prod-static'], preexec_fn=su_to_zulip) '/home/zulip/prod-static'], preexec_fn=su_to_zulip)
@ -252,12 +252,12 @@ if os.path.exists("/etc/supervisor/conf.d/zulip_db.conf"):
if (not args.skip_puppet or migrations_needed) and IS_SERVER_UP: if (not args.skip_puppet or migrations_needed) and IS_SERVER_UP:
# By default, we shut down the service to apply migrations and # By default, we shut down the service to apply migrations and
# puppet changes, to minimize risk of issues due to inconsistent # Puppet changes, to minimize risk of issues due to inconsistent
# state. # state.
shutdown_server() shutdown_server()
if not args.skip_puppet: if not args.skip_puppet:
logging.info("Applying puppet changes...") logging.info("Applying Puppet changes...")
subprocess.check_call(["./scripts/zulip-puppet-apply", "--force"]) subprocess.check_call(["./scripts/zulip-puppet-apply", "--force"])
subprocess.check_call(["apt-get", "-y", "upgrade"]) subprocess.check_call(["apt-get", "-y", "upgrade"])
@ -283,5 +283,5 @@ else:
logging.info("Skipping purging old deployments.") logging.info("Skipping purging old deployments.")
if args.skip_puppet: if args.skip_puppet:
logging.info("Showing un-applied puppet changes:") logging.info("Showing un-applied Puppet changes:")
subprocess.check_call(["./scripts/zulip-puppet-apply", "--noop", "--show_diff"]) subprocess.check_call(["./scripts/zulip-puppet-apply", "--noop", "--show_diff"])

View File

@ -124,7 +124,7 @@ def generate_secrets(development: bool = False) -> None:
if settings.MEMCACHED_LOCATION == "127.0.0.1:11211": if settings.MEMCACHED_LOCATION == "127.0.0.1:11211":
add_secret("memcached_password", random_token()) add_secret("memcached_password", random_token())
# Password for authentication to redis. # Password for authentication to Redis.
if need_secret("redis_password"): if need_secret("redis_password"):
# We defer importing settings unless we need it, because # We defer importing settings unless we need it, because
# importing settings is expensive (mostly because of # importing settings is expensive (mostly because of

View File

@ -10,7 +10,7 @@ set -x
# What user should we use for connecting to the database # What user should we use for connecting to the database
POSTGRES_USER="${POSTGRES_USER:-postgres}" POSTGRES_USER="${POSTGRES_USER:-postgres}"
# This psql command may fail because the zulip database doesnt exist, # This psql command may fail because the Zulip database doesnt exist,
# hence the &&. # hence the &&.
if records="$( if records="$(
cd / # Make sure the current working directory is readable by postgres cd / # Make sure the current working directory is readable by postgres

View File

@ -115,10 +115,10 @@ def restore_backup(tarball_file: IO[bytes]) -> None:
"--production", "--production",
]) ])
# If there is a local rabbitmq, we need to reconfigure it # If there is a local RabbitMQ, we need to reconfigure it
# to ensure the rabbitmq password matches the value in the # to ensure the RabbitMQ password matches the value in the
# restored zulip-secrets.conf. We need to be careful to # restored zulip-secrets.conf. We need to be careful to
# only do this if rabbitmq is configured to run locally on # only do this if RabbitMQ is configured to run locally on
# the system. # the system.
rabbitmq_host = subprocess.check_output( rabbitmq_host = subprocess.check_output(
[os.path.join(settings.DEPLOY_ROOT, [os.path.join(settings.DEPLOY_ROOT,

View File

@ -24,8 +24,8 @@ if pg_lsclusters -h | grep -qE "^$UPGRADE_TO\s+main\b"; then
fi fi
( (
# Two-stage application of puppet; we apply the bare-bones # Two-stage application of Puppet; we apply the bare-bones
# postgresql configuration first, so that FTS will be configured # PostgreSQL configuration first, so that FTS will be configured
# prior to the pg_upgradecluster. # prior to the pg_upgradecluster.
TEMP_CONF_DIR=$(mktemp -d) TEMP_CONF_DIR=$(mktemp -d)
cp /etc/zulip/zulip.conf "$TEMP_CONF_DIR" cp /etc/zulip/zulip.conf "$TEMP_CONF_DIR"

View File

@ -11,7 +11,7 @@ from lib.zulip_tools import assert_running_as_root, parse_os_release
assert_running_as_root() assert_running_as_root()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
parser = argparse.ArgumentParser(description="Run puppet") parser = argparse.ArgumentParser(description="Run Puppet")
parser.add_argument('--force', '-f', action="store_true", parser.add_argument('--force', '-f', action="store_true",
help="Do not prompt with proposed changes") help="Do not prompt with proposed changes")
parser.add_argument('--noop', action="store_true", parser.add_argument('--noop', action="store_true",
@ -32,7 +32,7 @@ Exec { path => "/usr/sbin:/usr/bin:/sbin:/bin" }
for pclass in re.split(r'\s*,\s*', config.get('machine', 'puppet_classes')): for pclass in re.split(r'\s*,\s*', config.get('machine', 'puppet_classes')):
puppet_config += f"include {pclass}\n" puppet_config += f"include {pclass}\n"
# We use the puppet configuration from the same Zulip checkout as this script # We use the Puppet configuration from the same Zulip checkout as this script
scripts_path = os.path.join(BASE_DIR, "scripts") scripts_path = os.path.join(BASE_DIR, "scripts")
puppet_module_path = os.path.join(BASE_DIR, "puppet") puppet_module_path = os.path.join(BASE_DIR, "puppet")
puppet_cmd = ["puppet", "apply", f"--modulepath={puppet_module_path}", "-e", puppet_config] puppet_cmd = ["puppet", "apply", f"--modulepath={puppet_module_path}", "-e", puppet_config]
@ -40,12 +40,12 @@ if args.noop:
puppet_cmd += ["--noop"] puppet_cmd += ["--noop"]
puppet_cmd += extra_args puppet_cmd += extra_args
# Set the scripts path to be a factor so it can be used by puppet code # Set the scripts path to be a factor so it can be used by Puppet code
puppet_env = os.environ.copy() puppet_env = os.environ.copy()
puppet_env["FACTER_zulip_conf_path"] = args.config puppet_env["FACTER_zulip_conf_path"] = args.config
puppet_env["FACTER_zulip_scripts_path"] = scripts_path puppet_env["FACTER_zulip_scripts_path"] = scripts_path
# This is to suppress puppet warnings with ruby 2.7. # This is to suppress Puppet warnings with ruby 2.7.
if (distro_info['ID'], distro_info['VERSION_ID']) in [('ubuntu', '20.04')]: if (distro_info['ID'], distro_info['VERSION_ID']) in [('ubuntu', '20.04')]:
puppet_env["RUBYOPT"] = "-W0" puppet_env["RUBYOPT"] = "-W0"

View File

@ -3,7 +3,7 @@ about Noto, please refer to:
https://code.google.com/p/noto/ https://code.google.com/p/noto/
These images were generated from the git repository at These images were generated from the Git repository at
<https://android.googlesource.com/platform/external/noto-fonts> as of <https://android.googlesource.com/platform/external/noto-fonts> as of
90372d894b5d9c9f2a111315d2eb3b8de1979ee4 90372d894b5d9c9f2a111315d2eb3b8de1979ee4

View File

@ -1,6 +1,6 @@
import "./common"; import "./common";
// Import Third party libraries // Import third party libraries
import "../../third/bootstrap-notify/js/bootstrap-notify"; import "../../third/bootstrap-notify/js/bootstrap-notify";
import "../../third/bootstrap-typeahead/typeahead"; import "../../third/bootstrap-typeahead/typeahead";
import "../../third/bootstrap-tooltip/tooltip"; import "../../third/bootstrap-tooltip/tooltip";
@ -12,7 +12,7 @@ import "jquery-validation";
import "flatpickr"; import "flatpickr";
import "flatpickr/dist/plugins/confirmDate/confirmDate"; import "flatpickr/dist/plugins/confirmDate/confirmDate";
// Import App JS // Import app JS
import "../i18n"; import "../i18n";
import "../feature_flags"; import "../feature_flags";
import "../loading"; import "../loading";
@ -195,7 +195,7 @@ import "../search_pill_widget";
import "../stream_ui_updates"; import "../stream_ui_updates";
import "../spoilers"; import "../spoilers";
// Import Styles // Import styles
import "../../third/bootstrap-notify/css/bootstrap-notify.css"; import "../../third/bootstrap-notify/css/bootstrap-notify.css";
import "spectrum-colorpicker/spectrum.css"; import "spectrum-colorpicker/spectrum.css";

View File

@ -104,7 +104,7 @@ exports.compute_placeholder_text = function (opts) {
} }
} }
// For Private Messages // For private messages
if (opts.private_message_recipient) { if (opts.private_message_recipient) {
const recipient_list = opts.private_message_recipient.split(","); const recipient_list = opts.private_message_recipient.split(",");
const recipient_names = recipient_list const recipient_names = recipient_list

View File

@ -59,12 +59,12 @@ exports.encode_stream_name = function (operand) {
exports.decodeHashComponent = function (str) { exports.decodeHashComponent = function (str) {
try { try {
// This fails for URLS containing // This fails for URLs containing
// foo.foo or foo%foo due to our fault in special handling // foo.foo or foo%foo due to our fault in special handling
// of such characters when encoding. This can also, // of such characters when encoding. This can also,
// fail independent of our fault, so just tell the user // fail independent of our fault, so just tell the user
// that the url is invalid. // that the URL is invalid.
// TODO: Show possible valid urls to the user. // TODO: Show possible valid URLs to the user.
return decodeURIComponent(str.replace(/\./g, "%")); return decodeURIComponent(str.replace(/\./g, "%"));
} catch { } catch {
ui_report.error(i18n.t("Invalid URL"), undefined, $("#home-error"), 2000); ui_report.error(i18n.t("Invalid URL"), undefined, $("#home-error"), 2000);

View File

@ -231,7 +231,7 @@ exports.add_topic_links = function (message) {
} }
} }
// Also make raw urls navigable // Also make raw URLs navigable
const url_re = /\b(https?:\/\/[^\s<]+[^\s"'),.:;<\]])/g; // Slightly modified from third/marked.js const url_re = /\b(https?:\/\/[^\s<]+[^\s"'),.:;<\]])/g; // Slightly modified from third/marked.js
const match = topic.match(url_re); const match = topic.match(url_re);
if (match) { if (match) {
@ -268,11 +268,11 @@ function handleEmoji(emoji_name) {
const alt_text = ":" + emoji_name + ":"; const alt_text = ":" + emoji_name + ":";
const title = emoji_name.split("_").join(" "); const title = emoji_name.split("_").join(" ");
// Zulip supports both standard/unicode emoji, served by a // Zulip supports both standard/Unicode emoji, served by a
// spritesheet and custom realm-specific emoji (served by URL). // spritesheet and custom realm-specific emoji (served by URL).
// We first check if this is a realm emoji, and if so, render it. // We first check if this is a realm emoji, and if so, render it.
// //
// Otherwise we'll look at unicode emoji to render with an emoji // Otherwise we'll look at Unicode emoji to render with an emoji
// span using the spritesheet; and if it isn't one of those // span using the spritesheet; and if it isn't one of those
// either, we pass through the plain text syntax unmodified. // either, we pass through the plain text syntax unmodified.
const emoji_url = emoji.get_realm_emoji_url(emoji_name); const emoji_url = emoji.get_realm_emoji_url(emoji_name);
@ -381,7 +381,7 @@ function python_to_js_filter(pattern, url) {
const name = match[1]; const name = match[1];
// Replace named group with regular matching group // Replace named group with regular matching group
pattern = pattern.replace("(?P<" + name + ">", "("); pattern = pattern.replace("(?P<" + name + ">", "(");
// Replace named reference in url to numbered reference // Replace named reference in URL to numbered reference
url = url.replace("%(" + name + ")s", "\\" + current_group); url = url.replace("%(" + name + ")s", "\\" + current_group);
// Reset the RegExp state // Reset the RegExp state

Some files were not shown because too many files have changed in this diff Show More