mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 13:22:42 +01:00
Write some basic "dealing with Conduit changes" documentation
Summary: Ref T9980. No magic here, just write a little bit about how to find outdated callers. Update the technical doc. Also: - Fix an unrelated bug where you couldn't leave comments if an object had missing, required, custom fields. - Restore the ConduitConnectionLog table so `bin/storage adjust` doesn't complain. Test Plan: Read docs. Reviewers: chad Reviewed By: chad Maniphest Tasks: T9980 Differential Revision: https://secure.phabricator.com/D14784
This commit is contained in:
parent
81ae9f8fb6
commit
c19654db16
5 changed files with 97 additions and 45 deletions
|
@ -1883,6 +1883,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php',
|
'PhabricatorConduitAPIController' => 'applications/conduit/controller/PhabricatorConduitAPIController.php',
|
||||||
'PhabricatorConduitApplication' => 'applications/conduit/application/PhabricatorConduitApplication.php',
|
'PhabricatorConduitApplication' => 'applications/conduit/application/PhabricatorConduitApplication.php',
|
||||||
'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php',
|
'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/PhabricatorConduitCertificateToken.php',
|
||||||
|
'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/PhabricatorConduitConnectionLog.php',
|
||||||
'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php',
|
'PhabricatorConduitConsoleController' => 'applications/conduit/controller/PhabricatorConduitConsoleController.php',
|
||||||
'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php',
|
'PhabricatorConduitController' => 'applications/conduit/controller/PhabricatorConduitController.php',
|
||||||
'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php',
|
'PhabricatorConduitDAO' => 'applications/conduit/storage/PhabricatorConduitDAO.php',
|
||||||
|
@ -5996,6 +5997,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorConduitAPIController' => 'PhabricatorConduitController',
|
'PhabricatorConduitAPIController' => 'PhabricatorConduitController',
|
||||||
'PhabricatorConduitApplication' => 'PhabricatorApplication',
|
'PhabricatorConduitApplication' => 'PhabricatorApplication',
|
||||||
'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO',
|
'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO',
|
||||||
|
'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO',
|
||||||
'PhabricatorConduitConsoleController' => 'PhabricatorConduitController',
|
'PhabricatorConduitConsoleController' => 'PhabricatorConduitController',
|
||||||
'PhabricatorConduitController' => 'PhabricatorController',
|
'PhabricatorConduitController' => 'PhabricatorController',
|
||||||
'PhabricatorConduitDAO' => 'PhabricatorLiskDAO',
|
'PhabricatorConduitDAO' => 'PhabricatorLiskDAO',
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorConduitConnectionLog extends PhabricatorConduitDAO {
|
||||||
|
|
||||||
|
protected $client;
|
||||||
|
protected $clientVersion;
|
||||||
|
protected $clientDescription;
|
||||||
|
protected $username;
|
||||||
|
|
||||||
|
protected function getConfiguration() {
|
||||||
|
return array(
|
||||||
|
self::CONFIG_COLUMN_SCHEMA => array(
|
||||||
|
'client' => 'text255?',
|
||||||
|
'clientVersion' => 'text255?',
|
||||||
|
'clientDescription' => 'text255?',
|
||||||
|
'username' => 'text255?',
|
||||||
|
),
|
||||||
|
self::CONFIG_KEY_SCHEMA => array(
|
||||||
|
'key_created' => array(
|
||||||
|
'columns' => array('dateCreated'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
) + parent::getConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1431,6 +1431,7 @@ abstract class PhabricatorEditEngine
|
||||||
$editor = $object->getApplicationTransactionEditor()
|
$editor = $object->getApplicationTransactionEditor()
|
||||||
->setActor($viewer)
|
->setActor($viewer)
|
||||||
->setContinueOnNoEffect($request->isContinueRequest())
|
->setContinueOnNoEffect($request->isContinueRequest())
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
->setContentSourceFromRequest($request)
|
->setContentSourceFromRequest($request)
|
||||||
->setIsPreview($is_preview);
|
->setIsPreview($is_preview);
|
||||||
|
|
||||||
|
|
|
@ -3,54 +3,26 @@
|
||||||
|
|
||||||
Technical overview of the Conduit API.
|
Technical overview of the Conduit API.
|
||||||
|
|
||||||
= Overview =
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
Conduit is an informal mechanism for transferring ad-hoc JSON blobs around on
|
Conduit is the HTTP API for Phabricator. It is roughly JSON-RPC: you usually
|
||||||
the internet.
|
pass a JSON blob, and usually get a JSON blob back, although both call and
|
||||||
|
result formats are flexible in some cases.
|
||||||
|
|
||||||
Theoretically, it provides an API to Phabricator so external scripts (including
|
The easiest way to begin exploring Conduit is by visiting {nav Conduit} in the
|
||||||
scripts written in other languages) can interface with the applications in the
|
web UI. The application provides an API console which you can use to explore
|
||||||
Phabricator suite. It technically does this, sort of, but it is unstable and
|
available methods, make calls, read documentation, and see examples.
|
||||||
incomplete so you should keep your expectations very low if you choose to build
|
|
||||||
things on top of it.
|
|
||||||
|
|
||||||
NOTE: Hopefully, this should improve over time, but making Conduit more robust
|
The API console has details about how to construct calls and generate API
|
||||||
isn't currently a major project priority because there isn't much demand for it
|
tokens for authentication.
|
||||||
outside of internal scripts. If you want to use Conduit to build things on top
|
|
||||||
of Phabricator, let us know so we can adjust priorities.
|
|
||||||
|
|
||||||
Conduit provides an authenticated HTTP API for Phabricator. It is informal and
|
The three primary ways to make Conduit calls are:
|
||||||
extremely simple: you post a JSON blob and you get a JSON blob back. You can
|
|
||||||
access Conduit in PHP with @{class@libphutil:ConduitClient}, or in any language
|
|
||||||
by executing `arc call-conduit method` (see `arc help call-conduit` for
|
|
||||||
more information). You can see and test available methods at `/conduit/` in
|
|
||||||
the web interface.
|
|
||||||
|
|
||||||
Arcanist is implemented using Conduit, and @{class:PhabricatorBot} is
|
- `arc call-conduit`: You can use this `arc` command to execute low-level
|
||||||
intended as a practical example of how to write a program which interfaces with
|
Conduit calls.
|
||||||
Phabricator over Conduit.
|
- `curl`: You can format a call with basic HTTP parameters and cURL.
|
||||||
|
- `ConduitClient`:
|
||||||
|
|
||||||
= Class Relationships =
|
There are also clients available in other languages. The Arcanist CLI client
|
||||||
|
for Phabricator is implemented over Conduit.
|
||||||
The primary Conduit workflow is exposed at `/api/`, which routes to
|
|
||||||
@{class:PhabricatorConduitAPIController}. This controller builds a
|
|
||||||
@{class:ConduitAPIRequest} representing authentication information and POST
|
|
||||||
parameters, instantiates an appropriate subclass of @{class:ConduitAPIMethod},
|
|
||||||
and passes the request to it. Subclasses of @{class:ConduitAPIMethod} implement
|
|
||||||
the actual methods which Conduit exposes.
|
|
||||||
|
|
||||||
Conduit calls which fail throw @{class:ConduitException}, which the controller
|
|
||||||
handles.
|
|
||||||
|
|
||||||
There is a web interface for viewing and testing Conduit called the "Conduit
|
|
||||||
Console", implemented by @{class:PhabricatorConduitConsoleController} at
|
|
||||||
`/conduit/`.
|
|
||||||
|
|
||||||
A log of connections and calls is stored in
|
|
||||||
@{class:PhabricatorConduitMethodCallLog}, and can be accessed on the web via
|
|
||||||
@{class:PhabricatorConduitLogController} at `/conduit/log/`.
|
|
||||||
|
|
||||||
Conduit provides a token-based handshake mechanism used by
|
|
||||||
`arc install-certificate` at `/conduit/token/`, implemented by
|
|
||||||
@{class:PhabricatorConduitTokenController} which stores generated tokens using
|
|
||||||
@{class:PhabricatorConduitCertificateToken}.
|
|
||||||
|
|
51
src/docs/user/field/conduit_changes.diviner
Normal file
51
src/docs/user/field/conduit_changes.diviner
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
@title Managing Conduit Changes
|
||||||
|
@group fieldmanual
|
||||||
|
|
||||||
|
Help with managing Conduit API changes.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
Many parts of the Conduit API are stable, but some parts are subject to change.
|
||||||
|
For example, when we write a new application, it usually adds several new API
|
||||||
|
methods and may update older methods.
|
||||||
|
|
||||||
|
This document discusses API stability and how to minimize disruption when
|
||||||
|
transitionig between API versions.
|
||||||
|
|
||||||
|
|
||||||
|
Method Statuses
|
||||||
|
===============
|
||||||
|
|
||||||
|
Methods have one of three statuses:
|
||||||
|
|
||||||
|
- **Unstable**: This is a new or experimental method which is subject to
|
||||||
|
change. You may call these methods to get access to recently released
|
||||||
|
features, but should expect that you may need to adjust your usage of
|
||||||
|
them before they stabilize.
|
||||||
|
- **Stable**: This is an established method which generally will not change.
|
||||||
|
- **Deprecated**: This method will be removed in a future version of
|
||||||
|
Phabricator and callers should cease using it.
|
||||||
|
|
||||||
|
Normally, a method is deprecated only when it is obsolete or a new, more
|
||||||
|
powerful method is available to replace it.
|
||||||
|
|
||||||
|
|
||||||
|
Finding Deprecated Calls
|
||||||
|
========================
|
||||||
|
|
||||||
|
You can identify calls to deprecated methods in {nav Conduit > Call Logs}.
|
||||||
|
Use {nav My Deprecated Calls} to find calls to deprecated methods you have
|
||||||
|
made, and {nav Deprecated Call Logs} to find deprecated calls by all users.
|
||||||
|
|
||||||
|
You can also search for calls by specific users. For example, it may be useful
|
||||||
|
to serach for any bot accounts you run to make sure they aren't calling
|
||||||
|
outdated APIs.
|
||||||
|
|
||||||
|
The most common cause of calls to deprecated methods is users running very
|
||||||
|
old versions of Arcanist. They can normally upgrade by running `arc upgrade`.
|
||||||
|
|
||||||
|
When the changelogs mention a method deprecation, you can use the call logs
|
||||||
|
to identify callers and notify them to upgrade or switch away. When the
|
||||||
|
changelogs mention a method removal, you can use the call logs to verify that
|
||||||
|
you will not be impacted.
|
Loading…
Reference in a new issue