Select the types of activity you want to include in your feed.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
···3232 if (phid_get_type($dst) == PhabricatorPHIDConstants::PHID_TYPE_UNKNOWN) {
3333 // At least one old install ran into some issues here. Skip the row if we
3434 // can't figure out what the destination PHID is. See here:
3535- // https://github.com/facebook/phabricator/pull/507
3535+ // https://github.com/phacility/phabricator/pull/507
3636 continue;
3737 }
3838
···2233final class PhabricatorApplicationAudit extends PhabricatorApplication {
4455- public function getShortDescription() {
66- return pht('Audit Code');
77- }
88-95 public function getBaseURI() {
106 return '/audit/';
117 }
128139 public function getIconName() {
1410 return 'audit';
1111+ }
1212+1313+ public function getShortDescription() {
1414+ return pht('Browse and Audit Commits');
1515 }
16161717 public function getHelpURI() {
···1414 return 'authentication';
1515 }
16161717+ public function getShortDescription() {
1818+ return pht('Configure Login and Registration');
1919+ }
2020+1721 public function getHelpURI() {
1822 // NOTE: Although reasonable help exists for this in "Configuring Accounts
1923 // and Registration", specifying a help URI here means we get the menu
+3-5
src/applications/base/PhabricatorApplication.php
···155155 }
156156157157 public function getHelpURI() {
158158- // TODO: When these applications get created, link to their docs:
159159- //
160160- // - Drydock
161161- // - OAuth Server
162162-158158+ return null;
159159+ }
163160161161+ public function getOverview() {
164162 return null;
165163 }
166164
···33final class PhabricatorApplicationCalendar extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return pht('Dates and Stuff');
66+ return pht('Upcoming Events');
77 }
8899 public function getFlavorText() {
···1919 }
20202121 public function getShortDescription() {
2222- return 'Conduit API Console';
2222+ return pht('Phabricator Developer API Console');
2323 }
24242525 public function getTitleGlyph() {
···1111 }
12121313 public function getShortDescription() {
1414- return pht('Countdown Timers');
1414+ return pht('Countdown to Events');
1515 }
16161717 public function getTitleGlyph() {
···3636 );
3737 }
38383939+ public function getOverview() {
4040+ return pht(<<<EOTEXT
4141+Differential is a **code review application** which allows engineers to review,
4242+discuss and approve changes to software.
4343+EOTEXT
4444+);
4545+ }
4646+3947 public function getRoutes() {
4048 return array(
4149 '/D(?P<id>[1-9]\d*)' => 'DifferentialRevisionViewController',
···4444 protected function getCoreFieldRequiredErrorString() {
4545 return pht(
4646 'You must provide a test plan. Describe the actions you performed '.
4747- 'to verify the behvaior of this change.');
4747+ 'to verify the behavior of this change.');
4848 }
49495050 public function readValueFromRequest(AphrontRequest $request) {
···33final class PhabricatorApplicationDiffusion extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return pht('Repository Browser');
66+ return pht('Host and Browse Repositories');
77 }
8899 public function getBaseURI() {
···3636 }
37373838 public function getApplicationGroup() {
3939- return self::GROUP_COMMUNICATION;
3939+ return self::GROUP_UTILITIES;
4040 }
41414242 public function getRemarkupRules() {
···66 return false;
77 }
8899- public function getBaseURI() {
1010- return '/doorkeeper/';
1111- }
1212-139 public function shouldAppearInLaunchView() {
1410 return false;
1111+ }
1212+1313+ public function getShortDescription() {
1414+ return pht('Connect to Other Software');
1515 }
16161717 public function getRemarkupRules() {
···33final class PhabricatorApplicationFact extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return 'Analyze Data';
66+ return pht('Chart and Analyze Data');
77 }
8899 public function getName() {
···33final class PhabricatorApplicationFlags extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return pht('Reminders');
66+ return pht('Personal Bookmarks and Reminders');
77 }
8899 public function getBaseURI() {
···2525 }
26262727 public function getApplicationGroup() {
2828- return self::GROUP_ORGANIZATION;
2828+ return self::GROUP_UTILITIES;
2929 }
30303131 public function loadStatus(PhabricatorUser $user) {
···77 }
8899 public function getShortDescription() {
1010- return pht('Continuous Build');
1010+ return pht('Builds and Continuous Integration');
1111 }
12121313 public function getIconName() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Legal Documents');
1010+ return pht('Agreements and Signatures');
1111 }
12121313 public function getIconName() {
···218218 ->setSummary(pht("Custom Maniphest fields."))
219219 ->setDescription(
220220 pht(
221221- "Array of custom fields for Maniphest tasks. For details on ".
222222- "adding custom fields to Maniphest, see 'Maniphest User Guide: ".
223223- "Adding Custom Fields'."))
221221+ 'Array of custom fields for Maniphest tasks. For details on '.
222222+ 'adding custom fields to Maniphest, see "Configuring Custom '.
223223+ 'Fields" in the documentation.'))
224224 ->addExample(
225225 '{"mycompany:estimated-hours": {"name": "Estimated Hours", '.
226226 '"type": "int", "caption": "Estimated number of hours this will '.
···2233final class PhabricatorApplicationMetaMTA extends PhabricatorApplication {
4455- public function getBaseURI() {
66- return '/mail/';
77- }
88-95 public function getIconName() {
106 return 'metamta';
77+ }
88+99+ public function getShortDescription() {
1010+ return pht('Delivers Mail');
1111 }
12121313 public function getFlavorText() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Beep Beep Bloop');
1010+ return pht('Real-Time Updates and Alerts');
1111 }
12121313 public function getRoutes() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Credential Management');
1010+ return pht('Store Passwords and Credentials');
1111 }
12121313 public function getIconName() {
···1818 return self::GROUP_UTILITIES;
1919 }
20202121+ public function getShortDescription() {
2222+ return pht('Share Text Snippets');
2323+ }
2424+2125 public function getRemarkupRules() {
2226 return array(
2327 new PhabricatorPasteRemarkupRule(),
···33final class PhabricatorApplicationPeople extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return pht('User Accounts');
66+ return pht('User Accounts and Profiles');
77 }
8899 public function getBaseURI() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Design Review');
1010+ return pht('Review Mocks and Design');
1111 }
12121313 public function getIconName() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Account and Billing');
1010+ return pht('Accounts and Billing');
1111 }
12121313 public function getIconName() {
···33final class PhabricatorApplicationPhrequent extends PhabricatorApplication {
4455 public function getShortDescription() {
66- return pht('Track Time');
66+ return pht('Track Time Spent');
77 }
8899 public function getBaseURI() {
···1919 }
20202121 public function getApplicationGroup() {
2222- return self::GROUP_ORGANIZATION;
2222+ return self::GROUP_UTILITIES;
2323 }
24242525 public function getApplicationOrder() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Find Answers');
1010+ return pht('Questions and Answers');
1111 }
12121313 public function getIconName() {
···77 }
8899 public function getShortDescription() {
1010- return pht('Organize Work');
1010+ return pht('Create Groups, Tags, and Projects');
1111 }
12121313 public function getBaseURI() {
···384384 // This behavior has been reverted, but users who updated between Feb 1,
385385 // 2012 and Mar 1, 2012 will have the erroring version. Do a dumb test
386386 // against stdout to check for this possibility.
387387- // See: https://github.com/facebook/phabricator/issues/101/
387387+ // See: https://github.com/phacility/phabricator/issues/101/
388388389389 // NOTE: Mercurial has translated versions, which translate this error
390390 // string. In a translated version, the string will be something else,
···1919 }
20202121 public function getShortDescription() {
2222- return pht('Acquire Trinkets');
2222+ return pht('Award and Acquire Trinkets');
2323 }
24242525 public function getApplicationGroup() {
···77 }
8899 public function getShortDescription() {
1010- return 'Developer UI Examples';
1010+ return pht('Phabricator Developer UI Examples');
1111 }
12121313 public function getIconName() {
+1-1
src/docs/user/feedback.diviner
···3939= GitHub Issues =
40404141You can also use
4242-[[https://github.com/facebook/phabricator/issues/new | GitHub Issues]] if you
4242+[[https://github.com/phacility/phabricator/issues/new | GitHub Issues]] if you
4343prefer.
44444545= IRC =
···92929393To install Arcanist, pick an install directory and clone the code from GitHub:
94949595- some_install_path/ $ git clone git://github.com/facebook/libphutil.git
9696- some_install_path/ $ git clone git://github.com/facebook/arcanist.git
9595+ some_install_path/ $ git clone git://github.com/phacility/libphutil.git
9696+ some_install_path/ $ git clone git://github.com/phacility/arcanist.git
97979898This should leave you with a directory structure like this
9999···162162163163The first place where the setting is defined wins.
164164165165-Existing settings can be printed with `arc set-config --show`.
165165+Existing settings can be printed with `arc get-config`.
166166167167== Next Steps ==
168168
···7474 solution to certificate validity problems, and is discouraged. Instead,
7575 use valid certificates.
76767777-For a complete list of options, run `arc set-config --show`. Although all
7777+For a complete list of options, run `arc get-config`. Although all
7878options can be set in `.arcconfig`, some options (like `editor`) usually do not
7979make sense to set here because they're likely to vary from user to user.
8080
···11package {
2233- import flash.net.*;
44- import flash.utils.*;
55- import flash.media.*;
66- import flash.display.*;
77- import flash.events.*;
33+ import flash.display.Sprite;
84 import flash.external.ExternalInterface;
55+ import flash.net.LocalConnection;
961010- import vegas.strings.JSON;
117128 public class Aphlict extends Sprite {
1391414- private var client:String;
1010+ /**
1111+ * A transport channel used to receive data.
1212+ */
1313+ protected var recv:LocalConnection;
15141616- private var socket:Socket;
1717- private var readBuffer:ByteArray;
1515+ /**
1616+ * A transport channel used to send data.
1717+ */
1818+ protected var send:LocalConnection;
18191919- private var remoteServer:String;
2020- private var remotePort:Number;
21202221 public function Aphlict() {
2322 super();
24232525- ExternalInterface.addCallback('connect', this.externalConnect);
2626- ExternalInterface.call(
2727- 'JX.Stratcom.invoke',
2828- 'aphlict-component-ready',
2929- null,
3030- {});
3131- }
3232-3333- public function externalConnect(server:String, port:Number):void {
3434- this.externalInvoke('connect');
3535-3636- this.remoteServer = server;
3737- this.remotePort = port;
2424+ this.recv = new LocalConnection();
2525+ this.recv.client = this;
38263939- this.connectToServer();
2727+ this.send = new LocalConnection();
4028 }
41294242-4343- public function connectToServer():void {
4444- var socket:Socket = new Socket();
4545-4646- socket.addEventListener(Event.CONNECT, didConnectSocket);
4747- socket.addEventListener(Event.CLOSE, didCloseSocket);
4848- socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket);
4949-5050- socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket);
5151- socket.addEventListener(
5252- SecurityErrorEvent.SECURITY_ERROR,
5353- didSecurityErrorSocket);
5454-5555- socket.connect(this.remoteServer, this.remotePort);
5656-5757- this.readBuffer = new ByteArray();
5858- this.socket = socket;
5959- }
6060-6161- private function didConnectSocket(event:Event):void {
6262- this.externalInvoke('connected');
6363- }
6464-6565- private function didCloseSocket(event:Event):void {
6666- this.externalInvoke('close');
6767- }
6868-6969- private function didIOErrorSocket(event:IOErrorEvent):void {
7070- this.externalInvoke('error', event.text);
7171- }
7272-7373- private function didSecurityErrorSocket(event:SecurityErrorEvent):void {
7474- this.externalInvoke('error', event.text);
7575- }
7676-7777- private function didReceiveSocket(event:Event):void {
7878- var b:ByteArray = this.readBuffer;
7979- this.socket.readBytes(b, b.length);
8080-8181- do {
8282- b = this.readBuffer;
8383- b.position = 0;
8484-8585- if (b.length <= 8) {
8686- break;
8787- }
8888-8989- var msg_len:Number = parseInt(b.readUTFBytes(8), 10);
9090- if (b.length >= msg_len + 8) {
9191- var bytes:String = b.readUTFBytes(msg_len);
9292- var data:Object = vegas.strings.JSON.deserialize(bytes);
9393- var t:ByteArray = new ByteArray();
9494- t.writeBytes(b, msg_len + 8);
9595- this.readBuffer = t;
9696-9797- this.receiveMessage(data);
9898- } else {
9999- break;
100100- }
101101- } while (true);
102102-103103- }
104104-105105- public function receiveMessage(msg:Object):void {
106106- this.externalInvoke('receive', msg);
107107- }
108108-109109- public function externalInvoke(type:String, object:Object = null):void {
3030+ protected function externalInvoke(type:String, object:Object = null):void {
11031 ExternalInterface.call('JX.Aphlict.didReceiveEvent', type, object);
11132 }
11233113113- public function log(message:String):void {
114114- ExternalInterface.call('console.log', message);
3434+ protected function log(message:String):void {
3535+ this.externalInvoke('log', message);
11536 }
1163711738 }
+129
support/aphlict/client/src/AphlictClient.as
···11+package {
22+33+ import flash.events.TimerEvent;
44+ import flash.external.ExternalInterface;
55+ import flash.utils.Timer;
66+77+88+ public class AphlictClient extends Aphlict {
99+1010+ /**
1111+ * The connection name for this client. This will be used for the
1212+ * @{class:LocalConnection} object.
1313+ */
1414+ private var client:String;
1515+1616+ /**
1717+ * The expiry timestamp for the @{class:AphlictMaster}. If this time is
1818+ * elapsed then the master will be assumed to be dead and another
1919+ * @{class:AphlictClient} will create a master.
2020+ */
2121+ private var expiry:Number = 0;
2222+2323+ /**
2424+ * The interval at which to ping the @{class:AphlictMaster}.
2525+ */
2626+ public static const INTERVAL:Number = 3000;
2727+2828+ private var master:AphlictMaster;
2929+ private var timer:Timer;
3030+3131+ private var remoteServer:String;
3232+ private var remotePort:Number;
3333+3434+3535+ public function AphlictClient() {
3636+ super();
3737+3838+ ExternalInterface.addCallback('connect', this.externalConnect);
3939+ ExternalInterface.call(
4040+ 'JX.Stratcom.invoke',
4141+ 'aphlict-component-ready',
4242+ null,
4343+ {});
4444+ }
4545+4646+ public function externalConnect(server:String, port:Number):void {
4747+ this.externalInvoke('connect');
4848+4949+ this.remoteServer = server;
5050+ this.remotePort = port;
5151+5252+ this.client = AphlictClient.generateClientId();
5353+ this.recv.connect(this.client);
5454+5555+ this.timer = new Timer(AphlictClient.INTERVAL);
5656+ this.timer.addEventListener(TimerEvent.TIMER, this.keepalive);
5757+5858+ this.connectToMaster();
5959+ }
6060+6161+ /**
6262+ * Generate a unique identifier that will be used to communicate with the
6363+ * @{class:AphlictMaster}.
6464+ */
6565+ private static function generateClientId():String {
6666+ return 'aphlict_client_' + Math.round(Math.random() * 100000);
6767+ }
6868+6969+ /**
7070+ * Create a new connection to the @{class:AphlictMaster}.
7171+ *
7272+ * If there is no current @{class:AphlictMaster} instance, then a new master
7373+ * will be created.
7474+ */
7575+ private function connectToMaster():void {
7676+ this.timer.stop();
7777+7878+ // Try to become the master.
7979+ try {
8080+ this.log('Attempting to become the master...');
8181+ this.master = new AphlictMaster(this.remoteServer, this.remotePort);
8282+ this.log('I am the master.');
8383+ } catch (x:Error) {
8484+ // Couldn't become the master
8585+ this.log('Cannot become the master... probably one already exists');
8686+ }
8787+8888+ this.send.send('aphlict_master', 'register', this.client);
8989+ this.expiry = new Date().getTime() + (5 * AphlictClient.INTERVAL);
9090+ this.log('Registered client ' + this.client);
9191+9292+ this.timer.start();
9393+ }
9494+9595+ /**
9696+ * Send a keepalive signal to the @{class:AphlictMaster}.
9797+ *
9898+ * If the connection to the master has expired (because the master has not
9999+ * sent a heartbeat signal), then a new connection to master will be
100100+ * created.
101101+ */
102102+ private function keepalive(event:TimerEvent):void {
103103+ if (new Date().getTime() > this.expiry) {
104104+ this.connectToMaster();
105105+ }
106106+107107+ this.send.send('aphlict_master', 'ping', this.client);
108108+ }
109109+110110+ /**
111111+ * This function is used to receive the heartbeat signal from the
112112+ * @{class:AphlictMaster}.
113113+ */
114114+ public function pong():void {
115115+ this.expiry = new Date().getTime() + (2 * AphlictClient.INTERVAL);
116116+ }
117117+118118+ /**
119119+ * Receive a message from the Aphlict Server, via the
120120+ * @{class:AphlictMaster}.
121121+ */
122122+ public function receiveMessage(msg:Object):void {
123123+ this.log('Received message.');
124124+ this.externalInvoke('receive', msg);
125125+ }
126126+127127+ }
128128+129129+}
+166
support/aphlict/client/src/AphlictMaster.as
···11+package {
22+33+ import flash.events.Event;
44+ import flash.events.IOErrorEvent;
55+ import flash.events.ProgressEvent;
66+ import flash.events.SecurityErrorEvent;
77+ import flash.events.TimerEvent;
88+ import flash.net.Socket;
99+ import flash.utils.ByteArray;
1010+ import flash.utils.Dictionary;
1111+ import flash.utils.Timer;
1212+ import vegas.strings.JSON;
1313+1414+1515+ public class AphlictMaster extends Aphlict {
1616+1717+ /**
1818+ * The pool of connected clients.
1919+ */
2020+ private var clients:Dictionary;
2121+2222+ /**
2323+ * A timer used to trigger periodic events.
2424+ */
2525+ private var timer:Timer;
2626+2727+ /**
2828+ * The interval after which clients will be considered dead and removed
2929+ * from the pool.
3030+ */
3131+ public static const PURGE_INTERVAL:Number = 3 * AphlictClient.INTERVAL;
3232+3333+ /**
3434+ * The hostname for the Aphlict Server.
3535+ */
3636+ private var remoteServer:String;
3737+3838+ /**
3939+ * The port number for the Aphlict Server.
4040+ */
4141+ private var remotePort:Number;
4242+4343+ private var socket:Socket;
4444+ private var readBuffer:ByteArray;
4545+4646+4747+ public function AphlictMaster(server:String, port:Number) {
4848+ super();
4949+5050+ this.remoteServer = server;
5151+ this.remotePort = port;
5252+5353+ // Connect to the Aphlict Server.
5454+ this.recv.connect('aphlict_master');
5555+ this.connectToServer();
5656+5757+ this.clients = new Dictionary();
5858+5959+ // Start a timer and regularly purge dead clients.
6060+ this.timer = new Timer(AphlictMaster.PURGE_INTERVAL);
6161+ this.timer.addEventListener(TimerEvent.TIMER, this.purgeClients);
6262+ this.timer.start();
6363+ }
6464+6565+ /**
6666+ * Register a @{class:AphlictClient}.
6767+ */
6868+ public function register(client:String):void {
6969+ if (!this.clients[client]) {
7070+ this.log('Registering client: ' + client);
7171+ this.clients[client] = new Date().getTime();
7272+ }
7373+ }
7474+7575+ /**
7676+ * Purge stale client connections from the client pool.
7777+ */
7878+ private function purgeClients(event:TimerEvent):void {
7979+ for (var client:String in this.clients) {
8080+ var checkin:Number = this.clients[client];
8181+8282+ if (new Date().getTime() - checkin > AphlictMaster.PURGE_INTERVAL) {
8383+ this.log('Purging client: ' + client);
8484+ delete this.clients[client];
8585+ }
8686+ }
8787+ }
8888+8989+ /**
9090+ * Clients will regularly "ping" the master to let us know that they are
9191+ * still alive. We will "pong" them back to let the client know that the
9292+ * master is still alive.
9393+ */
9494+ public function ping(client:String):void {
9595+ this.clients[client] = new Date().getTime();
9696+ this.send.send(client, 'pong');
9797+ }
9898+9999+ private function connectToServer():void {
100100+ var socket:Socket = new Socket();
101101+102102+ socket.addEventListener(Event.CONNECT, didConnectSocket);
103103+ socket.addEventListener(Event.CLOSE, didCloseSocket);
104104+ socket.addEventListener(ProgressEvent.SOCKET_DATA, didReceiveSocket);
105105+106106+ socket.addEventListener(IOErrorEvent.IO_ERROR, didIOErrorSocket);
107107+ socket.addEventListener(
108108+ SecurityErrorEvent.SECURITY_ERROR,
109109+ didSecurityErrorSocket);
110110+111111+ socket.connect(this.remoteServer, this.remotePort);
112112+113113+ this.readBuffer = new ByteArray();
114114+ this.socket = socket;
115115+ }
116116+117117+ private function didConnectSocket(event:Event):void {
118118+ this.externalInvoke('connected');
119119+ }
120120+121121+ private function didCloseSocket(event:Event):void {
122122+ this.externalInvoke('close');
123123+ }
124124+125125+ private function didIOErrorSocket(event:IOErrorEvent):void {
126126+ this.externalInvoke('error', event.text);
127127+ }
128128+129129+ private function didSecurityErrorSocket(event:SecurityErrorEvent):void {
130130+ this.externalInvoke('error', event.text);
131131+ }
132132+133133+ private function didReceiveSocket(event:Event):void {
134134+ var b:ByteArray = this.readBuffer;
135135+ this.socket.readBytes(b, b.length);
136136+137137+ do {
138138+ b = this.readBuffer;
139139+ b.position = 0;
140140+141141+ if (b.length <= 8) {
142142+ break;
143143+ }
144144+145145+ var msg_len:Number = parseInt(b.readUTFBytes(8), 10);
146146+ if (b.length >= msg_len + 8) {
147147+ var bytes:String = b.readUTFBytes(msg_len);
148148+ var data:Object = vegas.strings.JSON.deserialize(bytes);
149149+ var t:ByteArray = new ByteArray();
150150+ t.writeBytes(b, msg_len + 8);
151151+ this.readBuffer = t;
152152+153153+ // Send the message to all clients.
154154+ for (var client:String in this.clients) {
155155+ this.log('Sending message to client: ' + client);
156156+ this.send.send(client, 'receiveMessage', data);
157157+ }
158158+ } else {
159159+ break;
160160+ }
161161+ } while (true);
162162+ }
163163+164164+ }
165165+166166+}