{"push_id":904197805,"size":36,"distinct_size":36,"ref":"refs/heads/master","head":"d03035987671c73e9bb3f5859aeeb9be76759518","before":"476e03a84d6823132983264ba48b04d32570833a","commits":[{"sha":"4ec6990ca767efd8c878a4115428759dd34ecf16","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Implement a rough initial version of ApplicationSearch-driven Conduit read endpoints\n\nSummary:\nRef T9964. See that task for some context and discussion.\n\nRef T7715, which has the bigger picture here.\n\nBasically, I want Conduit read endpoints to be full-power, ApplicationSearch-driven endpoints, so that applications can:\n\n  - Write one EditEngine and get web + conduit writes for free.\n  - Write one SearchEngine and get web + conduit reads for free.\n\nI previously made some steps toward this, but this puts more of the structure in place.\n\nTest Plan:\nViewed API console endpoint and read 20 pages of docs:\n\n{F1021961}\n\nMade various calls: with query keys, constraints, pagination, and limits.\n\nViewed new {nav Config > Modules} page.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T7715, T9964\n\nDifferential Revision: https://secure.phabricator.com/D14743","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/4ec6990ca767efd8c878a4115428759dd34ecf16"},{"sha":"7b997359466f08dcee82f9942534b7a1eb31d18c","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Throw CommandException instead of Exception after `git fetch` failure in repository updates\n\nSummary: Fixes T9966. In this unusual, difficult-to-reach case, we throw `Exception` (which has no censoring) instead of `CommandException` (which has censoring). Throw `CommandException` instead.\n\nTest Plan:\n  - Hacked up a bunch of stuff in order to hit this: disabled origin validation, origin correction, and pointed repository at a bad domain.\n  - Verified message is now censored correctly.\n\n{F1022217}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9966\n\nDifferential Revision: https://secure.phabricator.com/D14745","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/7b997359466f08dcee82f9942534b7a1eb31d18c"},{"sha":"efb6bb3dcfae23fe12bf5a841116b6048a723255","author":{"email":"c34c009102e60d77975598e1f414f8a701c22d0b@chadsdomain.com","name":"Chad Little"},"message":"Add \"Blogs\" section to PhameHome\n\nSummary: Ref T9927. Adds a \"Blogs\" section to PhameHome. Removes \"New Post\" Controller. Adds flipped layout for PHUITwoColumnView\n\nTest Plan:\nTest PhameHome, Ponder, New Post, etc. Mobile and Desktop states.\n\n{F1022080}\n\nReviewers: epriestley\n\nReviewed By: epriestley\n\nSubscribers: johnny-bit, Korvin\n\nManiphest Tasks: T9927\n\nDifferential Revision: https://secure.phabricator.com/D14744","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/efb6bb3dcfae23fe12bf5a841116b6048a723255"},{"sha":"dbdd70270230885d2a5a89417be60efcca6b107c","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"404 older-style Phame URIs properly\n\nSummary: Ref T9968. Some of the crumb/route handling wasn't quite tight enough and could hit a fatal.\n\nTest Plan: Hit previously-fataling URI, got a 404 instead.\n\nReviewers: chad\n\nReviewed By: chad\n\nSubscribers: starruler\n\nManiphest Tasks: T9968\n\nDifferential Revision: https://secure.phabricator.com/D14747","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/dbdd70270230885d2a5a89417be60efcca6b107c"},{"sha":"4b77bbd60c2466398fcb9ce896facd4303457ca2","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Clarify that the \"Add Comment\" button might not literally add a comment if you haven't typed a comment\n\nSummary: Ref T9908.\n\nTest Plan: Careful reading.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9908\n\nDifferential Revision: https://secure.phabricator.com/D14746","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/4b77bbd60c2466398fcb9ce896facd4303457ca2"},{"sha":"3d14b76f4dbe994dec01779d840e7dc8a0ffd98b","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Fix double feed stories in Phame\n\nSummary:\nRef T9360. Fixes the double-rendering of post bodies in feed stories.\n\nDownside is that 'publish' (on its own) no longer shows a body, but that seems fine.\n\nTest Plan:\n  - Got some double bodies.\n  - Applied patch.\n  - No more double bodies.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9360\n\nDifferential Revision: https://secure.phabricator.com/D14748","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/3d14b76f4dbe994dec01779d840e7dc8a0ffd98b"},{"sha":"30255fe42075fc8487fae57618801fb6945c3901","author":{"email":"c34c009102e60d77975598e1f414f8a701c22d0b@chadsdomain.com","name":"Chad Little"},"message":"Mobile tweaks to new PhameHome\n\nSummary: Better color, space for Blog List.\n\nTest Plan: Review PhameHome at mobile, tablet and desktop breakpoints.\n\nReviewers: epriestley\n\nReviewed By: epriestley\n\nSubscribers: Korvin\n\nDifferential Revision: https://secure.phabricator.com/D14749","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/30255fe42075fc8487fae57618801fb6945c3901"},{"sha":"32a7674c22b97a438c88fe1950c07dcafb75ddbc","author":{"email":"c34c009102e60d77975598e1f414f8a701c22d0b@chadsdomain.com","name":"Chad Little"},"message":"Add Drafts to PhameHome\n\nSummary: Adds a list of your drafts. Fixes T9927y\n\nTest Plan:\nLoad up home, see my drafts. Fake 0 drafts, see fallback message.\n\n{F1023139}\n\nReviewers: epriestley\n\nReviewed By: epriestley\n\nSubscribers: Korvin\n\nDifferential Revision: https://secure.phabricator.com/D14756","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/32a7674c22b97a438c88fe1950c07dcafb75ddbc"},{"sha":"9499987cfe6f28f91baa718b7fd464b8048349a1","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Add \"owners.search\" Conduit API endpoint, with CustomField support\n\nSummary:\nRef T9964. Adds a new-style \"owners.search\" endpoint, and an extension for customfields.\n\nPuts enough indirection in place to give us nice, consistent \"custom.key\" user-facing keys instead of \"std:custom:owners:na0shf9a8dfdsafl\" junk.\n\nTest Plan:\n  - Searched Owners via API.\n  - Searched by ID.\n  - Ordered by custom fields.\n  - Reviewed API docs.\n  - Used normal search with ordering.\n  - Viewed custom field values in search results.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14758","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/9499987cfe6f28f91baa718b7fd464b8048349a1"},{"sha":"f3b57990bfe46aa9c78c9544a5f356ce6d4fb85f","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Add \"maniphest.search\" Conduit API endpoint\n\nSummary: Ref T9964. This is a basic implementation of the new \"maniphest.search\" endpoint.\n\nTest Plan: Clicked the button in the web UI, got meaningful results back.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14760","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/f3b57990bfe46aa9c78c9544a5f356ce6d4fb85f"},{"sha":"d1a1d4800143f937937f3797038f41a5b45a6cf9","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Give ConduitAPIMethod->getMethodDescription() access to a real Viewer\n\nSummary:\nRef T9964. The new `*.search` and `*.edit` methods generate documentation which depends on the viewer.\n\nFor example, the `*.search` methods show a reference table of the keys for all your saved queries.\n\nGive them a real viewer to work with.\n\nDuring normal execution, just populate this viewer with the request's viewer, so `$request->getViewer()` and `$this->getViewer()` both work and mean the same thing.\n\nTest Plan: {F1023780}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14761","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/d1a1d4800143f937937f3797038f41a5b45a6cf9"},{"sha":"05a798e3ac6864e124af8bb6aa67514d907ebbb0","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Add basic typechecking support to Conduit\n\nSummary:\nRef T9964. I want to show users what we're expecting in \"constraints\", and let constraints like \"authors=epriestley\" work to make things easier.\n\nI'm generally very happy with the \"HTTPParameterType\" stuff from EditEngine, so add a parallel set of \"ConduitParameterType\" classes. These are a little simpler than the HTTP ones, but have a little more validation logic.\n\nTest Plan:\nThis is really just a proof of concept; some of these fields are now filled in:\n\n{F1023845}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14763","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/05a798e3ac6864e124af8bb6aa67514d907ebbb0"},{"sha":"1b325a0a899a9be815004d0947da2463ac838d32","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Modularize SearchEngine extensions\n\nSummary:\nRef T9964. ApplicationSearch currently has a bunch of hard-coded `if ($object instanceof thing)` stuff.\n\nPull that out so it can live in extensions.\n\nTest Plan:\n - Searched by spaces, subscribers, projects.\n\n{F1023921}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14764","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/1b325a0a899a9be815004d0947da2463ac838d32"},{"sha":"0282ce74ab8ccc38b5bf4529b8ab11f171587375","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Flesh out Conduit types for Paste search fields\n\nSummary: Ref T9964. This fills in types and descriptions for ApplicationSearch fields in Paste.\n\nTest Plan:\nGot this nice table now:\n\n{F1023999}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14765","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/0282ce74ab8ccc38b5bf4529b8ab11f171587375"},{"sha":"663dce5029f592b7a09ae0a57ec457cdc7f1a8db","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Flesh out Conduit parameter types for Owners + CustomFields\n\nSummary:\nRef T9964. Fill in more parameter types and descriptions.\n\n(No date support yet since it's a bit more involved.)\n\nTest Plan: {F1024022}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14766","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/663dce5029f592b7a09ae0a57ec457cdc7f1a8db"},{"sha":"99ade500bc3ae127ca462bf555324b3551c7beaf","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Flesh out Conduit parmeter types for maniphest.search\n\nSummary: Ref T9964. I left a couple of these unsupported for now since they're weird in some way.\n\nTest Plan: {F1024031}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14767","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/99ade500bc3ae127ca462bf555324b3551c7beaf"},{"sha":"fdd2d802d245828fb1c893d74aa1bec021a1ec08","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Clean up \"*.search\" API method documentation pages\n\nSummary:\nRef T9964. Building tables in Remarkup is kind of neat-ish but ends up feeling kind of hacky, and requires weird workarounds if any of the values have `|` in them.\n\nSwitch to normal elements instead.\n\nAlso move the magic \"ids\" and \"phids\" to be more like real fields. I'll clean this up fully in a diff or two, it's just a little tricky because Maniphest has an \"ids\" field.\n\nTest Plan: {F1024294}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14768","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/fdd2d802d245828fb1c893d74aa1bec021a1ec08"},{"sha":"8ec413b97201332affa1151dde5e05cb0832cb27","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Clean up \"ids\" and \"phids\" handling in SearchEngines\n\nSummary:\nRef T9964. I added several hacks to get these working. Clean them up and pull this into a proper extension.\n\nThe behavior in the web UI is:\n\n  - they work in all applications; but\n  - they only show up in the UI if a value is specified.\n\nSo if you visit `/view/?ids=1,2` you get the field, but normally it's not present. We could refine this later. I'm going to add documentation about how to prefill these forms regardless, which should make this discoverable by reading the documentation.\n\nThere's one teensey weensey hack: in the API, I push these fields to the top of the table. That one feels OK, since it's purely a convenience/display adjustment.\n\nTest Plan: Queried by IDs, reviewed docs.\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14769","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/8ec413b97201332affa1151dde5e05cb0832cb27"},{"sha":"2160c4561990f8938016e0ff85623ccbde03056f","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Implement an \"Attachments\" behavior for Conduit Search APIs\n\nSummary:\nRef T9964. We have various kinds of secondary data on objects (like subscribers, projects, paste content, Owners paths, file attachments, etc) which is somewhat slow, or somewhat large, or both.\n\nSome approaches to handling this in the API include:\n\n  - Always return all of it (very easy, but slow).\n  - Require users to make separate API calls to get each piece of data (very simple, but inefficient and really cumbersome to use).\n  - Implement a hierarchical query language like GraphQL (powerful, but very complex).\n  - Kind of mix-and-match a half-power query language and some extra calls? (fairly simple, not too terrible?)\n\nWe currently mix-and-match internally, with `->needStuff(true)`. This is not a general-purpose, full-power graph query language like GraphQL, and it occasionally does limit us.\n\nFor example, there is no way to do this sort of thing:\n\n  $conpherence_thread_query = id(new ConpherenceThreadQuery())\n    ->setViewer($viewer)\n    // ...\n    ->setNeedMessages(true)\n    ->setWhenYouLoadTheMessagesTheyNeedProfilePictures(true);\n\nHowever, we almost never actually need to do this and when we do want to do it we usually don't //really// want to do it, so I don't think this is a major limit to the practical power of the system for the kinds of things we really want to do with it.\n\nPut another way, we have a lot of 1-level hierarchical queries (get pictures or repositories or projects or files or content for these objects) but few-to-no 2+ level queries (get files for these objects, then get all the projects for those files).\n\nSo even though 1-level hierarchies are not a beautiful, general-purpose, fully-abstract system, they've worked well so far in practice and I'm comfortable moving forward with them in the API.\n\nIf we do need N-level queries in the future, there is no technical reason we can't put GraphQL (or something similar) on top of this eventually, and this would represent a solid step toward that. However, I suspect we'll never need them.\n\nUpshot: I'm pretty happy with \"->needX()\" for all practical purposes, so this is just adding a way to say \"->needX()\" to the API.\n\nSpecifically, you say:\n\n```\n{\n  \"attachments\": {\n    \"subscribers\": true,\n  }\n}\n```\n\n...and get back subscriber data. In the future (or for certain attachments), `true` might become a dictionary of extra parameters, if necessary, and could do so without breaking the API.\n\nTest Plan:\n- Ran queries to get attachments.\n\n{F1025449}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14772","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/2160c4561990f8938016e0ff85623ccbde03056f"},{"sha":"c0e20a11c1d46cc04ef2dc436a8f2c5a1f309fce","author":{"email":"46f1a0bd5592a2f9244ca321b129902a06b53e03@epriestley.com","name":"epriestley"},"message":"Add a \"projects\" Search attachment for Conduit APIs\n\nSummary: Ref T9964. Builds on D14772. Allows callers to request project PHIDs for objects.\n\nTest Plan: {F1025468}\n\nReviewers: chad\n\nReviewed By: chad\n\nManiphest Tasks: T9964\n\nDifferential Revision: https://secure.phabricator.com/D14773","distinct":true,"url":"https://api.github.com/repos/Khan/phabricator/commits/c0e20a11c1d46cc04ef2dc436a8f2c5a1f309fce"}]}