1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-10 08:52:39 +01:00
Commit graph

11904 commits

Author SHA1 Message Date
epriestley
bf43d4cf2a Don't mutate DOM on touch-originated cursor events in Differential
Summary:
Fixes T10229. Broadly:

  - When the user hovers over a line number or inline comment, we update the yellow reticle to highlight the relevant lines. Specifically, this is in response to a `mouseover` event.
  - On touch devices, touches fire `mouseover` and if you mutate the DOM inside the event, the device aborts the touch.

To remedy this:

  - Distingiush between mouse-originated and touch-originated cursor events.
    - We do this, roughly, by setting a flag when we see "touchstart", and clearing it when we see the second copy of any unique cursor event.
    - This method is complex, but should be robust to any implementation differences between devices (for example, it will work no matter which order the events are fired in).
    - This method should also produce the correct results on weird devices that have both mouse-devices and touch-devices available for cursor input.
  - When we see a touch-originated `mouseover` or `mouseout`, don't mutate the DOM.
  - Put an extra DOM mutation into the `click` event to improve highlighting behavior on touch devices.

Test Plan:
  - In iOS Simulator (4s, iOS 9.2), clicked various inline actions ("Reply", "Hide", "Done", "Cancel", line numbers, etc). Got responses after a single touch.
  - Verified hover + click behavior on a desktop.
  - Logged and examined a bunch of events as a general sanity check.

Reviewers: chad

Reviewed By: chad

Subscribers: aljungberg

Maniphest Tasks: T10229

Differential Revision: https://secure.phabricator.com/D15136
2016-01-29 06:55:41 -08:00
epriestley
dbf1d0d721 Improve reliability of detecting small devices when loading Differential changesets
Summary: Ref T10229. Fixes T9969. We make a decision about 1up vs 2up pretty early, and sometimes the viewport size reads as larger than the device, so we incorrectly select 2up when the proper setting would be 1up.

Test Plan:
I can reproduce this by, e.g., reloading a lot on an iPhone 4s in iOS Simulator running iOS 9.2. Sometimes it picks 2-up. I added logging to show that the viewport dimension read was the issue.

After this change, it always selects 1-up (`window.screen.availWidth` is defined and sensible on the device).

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9969, T10229

Differential Revision: https://secure.phabricator.com/D15135
2016-01-29 06:55:22 -08:00
Chad Little
e4372e1276 Add some additional padding before footer on profiles
Summary: Spaces out the page a little better if there is no information on  it.

Test Plan: review a profile and a project home

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15134
2016-01-29 02:31:31 +00:00
Chad Little
5e639feab4 Minor tweaks to Profile/Project
Summary:
- Redirect to profileview when new image is uploaded.
- Add ProfileNav to EditPicture on Profile
- Add ProfileNav to EditProfile on Profile

Test Plan: Set new images on Profiles and Projects. See new redirect. See new navs.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15132
2016-01-28 22:45:19 +00:00
epriestley
a5f6223553 Show blame colors on all lines, instead of only the first affected line
Summary: Fixes T10226. I just made a mistake here when rewriting this recently.

Test Plan: {F1079166}

Reviewers: chad, avivey

Reviewed By: avivey

Maniphest Tasks: T10226

Differential Revision: https://secure.phabricator.com/D15131
2016-01-28 11:17:15 -08:00
Aviv Eyal
8f0d9c3295 Remove email prefixes from doorkeeper titles
Summary: Fixes T10176. The prefix is not useful in the JIRA context, and doubtfully useful in Asana.

Test Plan: Load, make comment on revision, see link in JIRA is pretty.

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: Korvin

Maniphest Tasks: T10176

Differential Revision: https://secure.phabricator.com/D15119
2016-01-28 18:48:28 +00:00
Chad Little
fe5cd4ca2c Move FontIcon calls to Icon
Summary: Normalizes all `setFontIcon` calls to `setIcon`.

Test Plan: UIExamples, Almanac, Apps list, etc.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin, hach-que, yelirekim

Differential Revision: https://secure.phabricator.com/D15129
2016-01-28 08:48:45 -08:00
epriestley
30473549ac Add a basic pull event log for debugging repository cloning
Summary:
Ref T10228. This is currently quite limited:

  - No UI.
  - No SSH support.

My primary goal is to debug the issue in T10228. In the long run we can expand this to be a bit fancier.

Test Plan:
Made various valid and invalid clones, got sucess responses and not-so-successful responses, viewed the log table for general corresponding messages and broad sanity.

Ran GC via `bin/phd debug trigger`, no issues.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10228

Differential Revision: https://secure.phabricator.com/D15127
2016-01-28 08:18:34 -08:00
epriestley
c00cd5c2a3 Make hidden and locked configuration even more explicit
Summary:
A user in IRC seemed very confused by this, and worked extremely hard to shoot themsevles in the foot by manually writing locked configuration to the database.

Try to explain why configuration is locked better.

Test Plan:
Mostly reading.

{F1078905}

{F1078906}

Reviewers: chad

Reviewed By: chad

Differential Revision: https://secure.phabricator.com/D15128
2016-01-28 08:18:24 -08:00
Chad Little
8900f36326 Fix backdrop color
Summary: All our builtin images use #c4cde0 for the backdrop. This makes generation match the builtins.

Test Plan:
Build a new bug icon in Maniphest

{F1077934}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15126
2016-01-27 21:20:41 -08:00
Chad Little
36158dbdc0 Convert all calls to 'IconFont' to just 'Icon'
Summary: Mostly for consistency, we're not using other forms of icons and this makes all classes that use an icon call it in the same way.

Test Plan: tested uiexamples, lots of other random pages.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15125
2016-01-27 20:59:27 -08:00
Chad Little
43b8581d72 Fix some spelling errors in Icons
Summary: Some minor spelling mistakes.

Test Plan: Read

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15122
2016-01-27 20:59:14 -08:00
Chad Little
c9119306d7 Extend PHUITheme to include Profile Nav
Summary: Reasonable first pass, removes the "light" header, due to pain of upkeep. Reinforces UI color into the Profile Nav (and later likely dropmenu hovers). Most of this is reasonably easy to maintain now, but I may do a more accurate color pass after I get some more time together with it. For now this feels pretty good if you're developing in a different color UI.

Test Plan:
Switch between all the colors, hover over all the states.

{F1076766}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15120
2016-01-27 13:56:04 -08:00
Chad Little
a599aed9e2 Clean up Project Members UI
Summary:
 - Better spacing for images
 - Remove border
 - White BG on Members page

Test Plan: Review Projects / Project Home / Project Members

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15118
2016-01-26 21:41:24 +00:00
epriestley
49a44a0b1f Make project menus unconditionally configurable
Summary: Fixes T10213. I think the "Edit" item was originally conditional (or maybe I just forgot to add that part), but that got dropped when we swapped how it worked. This is all stable now anyway and can be available without needing prototypes enabled.

Test Plan: Edited a project menu.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10213

Differential Revision: https://secure.phabricator.com/D15117
2016-01-26 08:26:33 -08:00
epriestley
9c19a026a8 Update old documentation about arc set-config
Summary: Fixes T10223.

Test Plan: Read documentation.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10223

Differential Revision: https://secure.phabricator.com/D15116
2016-01-26 08:26:26 -08:00
Chad Little
6349741760 First pass at new Workboard UI
Summary: Cleans up Workboards to match the mocks. No new functionality, just more consistent colors/spacing/common components.

Test Plan:
Visit a few workboards, drag and drop items. Mobile, Tablet, Desktop

{F1070733}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15115
2016-01-25 13:35:23 -08:00
epriestley
1e69f06d74 Remove redundant restructured text entry in default Paste highlighting options
Summary: Fixes T10217. This extra entry is just a mistake because of `rst` + `rest` both being valid suffixes. We don't need both entries.

Test Plan: Edited a paste, only saw one entry in dropdown for restructured text.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10217

Differential Revision: https://secure.phabricator.com/D15114
2016-01-25 06:47:53 -08:00
epriestley
c11c7f2900 Prevent "Manage" profile menu items from being hidden
Summary: Ref T10054. Prevent users from removing this item and locking themselves out of the system unless they can guess the URI.

Test Plan: Tried to disable "Manage", wasn't permitted to.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15113
2016-01-25 06:43:03 -08:00
Mike Riley
e7195628d5 Use correct transaction types when creating diffs
Summary: See T10214 for context.  These transaction types are obviously wrong as far as I can tell.

Test Plan:
Created a revision and didn't see an error in the daemon log.

```lang=php
<?php

require_once dirname(__FILE__).'/phabricator/scripts/__init_script__.php';

$yelirekim = (new PhabricatorPeopleQuery)
  ->setViewer(PhabricatorUser::getOmnipotentUser())
  ->withUsernames(['yelirekim'])
  ->executeOne();

$raw_diff = (new PhabricatorDifferenceEngine)
  ->generateRawDiffFromFileContent('oldfile', 'newfile');
$diff = (new ConduitCall('differential.createrawdiff', [
      'diff' => $raw_diff,
    ]))
  ->setUser($yelirekim)
  ->execute();

$xactions = (new DifferentialDiffTransactionQuery)
  ->setViewer($yelirekim)
  ->withObjectPHIDs([$diff['phid']])
  ->execute();

foreach ($xactions as $xaction) {
  echo $xaction->getPHID().':'.$xaction->getTitle().PHP_EOL;
}
```

for sanity

Reviewers: #blessed_reviewers, epriestley

Reviewed By: #blessed_reviewers, epriestley

Subscribers: michaeljs1990, epriestley

Differential Revision: https://secure.phabricator.com/D15112
2016-01-25 02:17:42 -08:00
Chad Little
a9e2e6c5aa Update Profiles to look like Project UI
Summary: Updates People profiles to look more like Project profiles. This removes Conpherence and Flag links. Don't think you like Conpherence links much and for Flags maybe we can put them in the quick create menu?

Test Plan:
View profiles with and without Badges.

{F1069365}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15111
2016-01-24 17:42:57 -08:00
epriestley
df50a52628 Chomp chomp! 2016-01-24 15:04:54 -08:00
epriestley
64b1b212df Cancel autocomplete on "{" and "}"
Summary: Ref T10163. These are almost certainly not username/project characters, and are fairly likely to be `@{...}` Diviner references.

Test Plan: Typed `@{...`, no more autocomplete.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10163

Differential Revision: https://secure.phabricator.com/D15110
2016-01-24 15:03:36 -08:00
Chad Little
19f4e8631f Add an edit link on hover for Project profile images
Summary: Minor point of polish, but feels really nice. Hover over photo and edit a link to change the picture.

Test Plan:
hover hover, clicky clicky

{F1069179}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15109
2016-01-24 13:20:54 -08:00
epriestley
cb1c3424a8 Use "tag" more consistenty when referring to associating a project with an object
Summary:
Ref T10144. This isn't comprehensive, but we can give it a try and see how it feels?

  - EditEngine forms now say "Tags" instead of "Projects".
  - Modern SearchEngine forms now say "Tags" instead of "Projects".
  - For clarity, replaced as much "in project" language as I could find with "tagged with project" language.

Test Plan: reading / grepping + used "not tagged with any project" token

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10144

Differential Revision: https://secure.phabricator.com/D15108
2016-01-24 10:02:42 -08:00
epriestley
7bbd949703 Document that tagging something with a project never affects visibility
Summary: Fixes T10144.

Test Plan: (-O.O-)

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10144

Differential Revision: https://secure.phabricator.com/D15107
2016-01-24 10:02:22 -08:00
epriestley
9c28ae9ba7 Add more information (colors, members, watchers) to project.search
Summary: Fixes T6501. This adds more API information to the newish `project.search` API method.

Test Plan: Called `project.search`, used attachments.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T6501

Differential Revision: https://secure.phabricator.com/D15105
2016-01-24 10:02:05 -08:00
epriestley
8efaaa188f Move user editing/management actions to a separate "Manage" item, like projects
Summary: This improves consistency (by making this UI more similar to the projects UI) and gives us more flexibility the next time we update user profiles.

Test Plan:
{F1068889}

Took all the actions (probably?) to check that all the redirects were updated.

Reviewers: chad

Reviewed By: chad

Differential Revision: https://secure.phabricator.com/D15104
2016-01-24 10:01:31 -08:00
epriestley
06aa207960 Allow users to have profile icons
Summary: Ref T10054. This primarily improves aesthetics and consistency for member/wathcher lists in projects.

Test Plan:
{F1068873}

{F1068874}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15103
2016-01-24 09:58:01 -08:00
Chad Little
bba14118c7 Add setProfileHeader to PHUIHeaderView for reuse
Summary: Moves some profile css into PHUI, cleans up mobile view and desktop spacing.

Test Plan: Test Project at desktop and mobile breakpoints.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15106
2016-01-24 09:39:41 -08:00
epriestley
710fc0ce7f Don't render anything on project homepages if there are no properties at all
Summary: Ref T10054.

Test Plan:
{F1068420}

Also looked at a project which did have stuff to make sure the stuff still worked.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15102
2016-01-23 17:19:39 -08:00
Chad Little
8c25f0e7a2 Lighten up grey-box
Summary: This felt a little dark in actual use, lighten it up 40%.

Test Plan: Review project home pages.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15101
2016-01-23 17:10:42 -08:00
epriestley
b53d61c909 Fix bad call to getShortName()
Summary: Fixes T10212. This method was removed in D14990, but I missed a callsite.

Test Plan: Disabling blame now works nicely.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10212

Differential Revision: https://secure.phabricator.com/D15100
2016-01-23 17:07:27 -08:00
Chad Little
a0a3ac51f6 Fix project image redirect in files
Summary: I moved history to manage and missed this callsite.

Test Plan: Use present icon/color quick select.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15099
2016-01-23 16:46:12 -08:00
Chad Little
b381265d92 First cut of new Project Home
Summary:
First pass at a new Project Home page. This is starting to sprawl, so punting this up now before it gets too large.

 - Project homes now have "large header"
 - Custom Fields / Descriptions are in the main column
 - Feed is simpler visually
 - new "Background" option for PHUIObjectBoxView
 - move header buttons globally to "Grey" instead of "Simple"
 - New color and hover states for "Grey"
 - Transitions on Buttons haha
 - Edit Icon on Nav is now under "Manage" panel
 - New "Manage" Panel

TODO:
 - More testing of bad cases of Custom Fields
 - Members Page in flux, needs design
 - Um still not sure how to make Custom Field not show UI

Test Plan:
Lots of random Project page visits. Save project, watch project, edit project, etc.

{F1068191}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15097
2016-01-23 16:11:45 -08:00
epriestley
9ecd82a993 Improve profile menu animation
Summary:
The text sliding around feels a bit jank to me. Instead, here's an attempt at a three-part effect:

  - Fade out the content of the menu (first quarter of the animation).
  - Shrink the menu (half the animation).
  - Fade the menu content back in (final quarter).

This isn't perfect, but feels less weird to me since the text doesn't dance?

Test Plan: clickey clickey

Reviewers: chad

Reviewed By: chad

Differential Revision: https://secure.phabricator.com/D15098
2016-01-23 14:48:05 -08:00
epriestley
0b4ed94cc6 Fix text for Passphrase credential destruction transaction when restoring credentials
Summary:
Fixes T10211. This transaction can either be setting or removing the "destroyed" flag, but we show "destroyed" in both cases.

Instead, if the transaction is clearing the flag, render "restored".

Test Plan: {F1068142}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10211

Differential Revision: https://secure.phabricator.com/D15096
2016-01-23 12:25:59 -08:00
epriestley
0b67e89904 Add a "make the workboard the default view" checkbox when creating a workboard
Summary: Ref T10054. Since we no longer have the "workboard default if it exists" rule, provide a quick way to make it the default.

Test Plan: Created a new workboard with the box checked, saw menu change appropriately.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15092
2016-01-23 04:52:47 -08:00
epriestley
66ef506808 Redirect to profile after watching a project, not default page
Summary: Ref T10054.

Test Plan: watched project o_O

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15095
2016-01-22 17:30:32 -08:00
Sbastien Santoro
b1f3e02d82 Fixed typo in PhabricatorMotivatorProfilePanel
Summary: racooons → racoons

Test Plan: Read again the sentence.

Reviewers: #blessed_reviewers, chad

Reviewed By: #blessed_reviewers, chad

Subscribers: epriestley

Differential Revision: https://secure.phabricator.com/D15094
2016-01-22 20:19:46 +00:00
epriestley
9f56a014e2 Migrate existing projects to retain "Workboard" as default item
Summary:
Ref T10054. Ref T6961.

  - Existing projects with workboards had "Workboard" as the default menu item. Retain this behavior.
  - Populate the recently-added `hasWorkboard` flag so we can do a couple of things a little faster (see T6961).

Test Plan:
  - Ran migration.
  - Verified a bunch of projects looked sensible/correct after the migration.
  - Created a workboard, verified `hasWorkboard` got set properly.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T6961, T10054

Differential Revision: https://secure.phabricator.com/D15093
2016-01-22 09:44:43 -08:00
epriestley
b64d67f47a Frame workboard empty/create states inside profile menu
Summary:
Ref T10054. Uncreated workboards feel a little awkward right now because you lose the menu. Instead, keep the menu.

I also plan to:

  - add a "[X] Make the workboard the default view for this project." checkbox; and
  - resolve T6961.

...which will touch this workflow, so modernize/straighten it out.

Test Plan:
Viewed workboard, no access state, empty state. Created empty board, imported board.

{F1066973}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T6961, T10054

Differential Revision: https://secure.phabricator.com/D15091
2016-01-22 08:15:17 -08:00
epriestley
df4b484a5f Write documentation for profile menus
Summary: Ref T10054. This is all pretty straightforward. Also include some project-specific examples in the project documentation.

Test Plan: Read documentation.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15090
2016-01-22 08:15:03 -08:00
epriestley
51ed95c00b Give profile menus more straightforward hide/disable/delete/default interactions
Summary:
Ref T10054.

  - Just let users delete non-builtin items.
  - Let users choose a default item explicitly.
  - Do a better job of cleaning up items which no longer exist or belong to uninstalled applications.

(NOTE) This has one user-facing change: workboards are no longer the default on projects with workboards. I think this is probably OK since we're giving users a ton of new toys at the same time, but I'll write some docs at least.

Test Plan:
  - Deleted custom items.
  - Disabled/enabled builtin items.
  - Made various things defaults.
  - Uninstalled Maniphest, saw Workboards tab disappear entirely.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15089
2016-01-22 08:14:39 -08:00
epriestley
c25de5e02f Allow project colors to be relabeled
Summary: Fixes T5819. Adds configuration for setting color labels on projects and changing the default. Options are locked to what we make available.

Test Plan: {F1066823}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T5819

Differential Revision: https://secure.phabricator.com/D15088
2016-01-22 08:13:53 -08:00
epriestley
12a8726783 Fix an issue where the first click on the profile menu collapse link could be swallowed
Summary: `alterClass()` is strict about true/false but we set 0/1 elsewhere.

Test Plan: Collapsed/expanded menu, reloaded expanded menu, clicked collapse, got immediate collapse.

Reviewers: chad

Reviewed By: chad

Differential Revision: https://secure.phabricator.com/D15087
2016-01-22 08:13:44 -08:00
Chad Little
1eec747123 More profile nav updates
Summary: Sets the edit, collapse icons back in the footer, also adds basic transitions.

Test Plan:
lots of clicking, safari and chrome

{F1066381}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15083
2016-01-21 19:38:59 -08:00
epriestley
6ea9aa39a0 Fix quicksand interaction with HTTP GET prefilling in ApplicationSearch
Summary:
Fixes T10196. This is a weird interaction and this might not be the best long-term fix, but just get it working OK for now.

General problem is that Quicksand doesn't currently use GET for requests. This is a very unusual case where the method is relevant. In the future, I might change Quicksand to use GET.

Test Plan: Clicked "Open Tasks" with Quicksand active, got a results list.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10196

Differential Revision: https://secure.phabricator.com/D15082
2016-01-21 16:29:45 -08:00
epriestley
5f170847ca Throw a more tailored error when a storage upgrade patch can't access a database
Summary: Fixes T8762.

Test Plan: Ran `bin/storage upgrade --namespace ... --user limited`, saw a more specific error.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T8762

Differential Revision: https://secure.phabricator.com/D15080
2016-01-21 14:54:56 -08:00
Chad Little
6a701c1988 Spiffy up new sidebar, simplify UI
Summary: Mostly a visual spacing pass, also adds in circle icons for edit, collapse. For now removing the fixed position on the icons for simplicity while the basics are being polished.

Test Plan: Projects, Profiles, wide and narrow.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D15081
2016-01-21 14:08:59 -08:00