To perform change handoff to build systems, it would be ideal to represent diffs as virtual refs in hosted repositories.
- arc could upload changes by pushing to a virtual ref (like review) instead of by shipping JSON over Conduit.
- The repository would accept the change and redirect the write to some known internal ref (like phabricator/diff/12345) while making the client believe the write occurred cleanly. It could then lift the change out of the ref and into Differential if the ultimate destination was a diff.
- These refs would be hidden from the web UI and from git clone, so users wouldn't see them normally or have their workflows gummed up by a lot of internal glue.
- An alternate view of the repository used by build systems could see and interact with these refs.
For example, the goal is to enable workflows like these:
Create a new diff by pushing (see T5000):
$ git push origin diff Creating a new diff: Diff URI: https://secure.phabricator.com/differential/diff/123/ (Also this should exit with 0 as an exit code.)
Create a new durable ref by pushing to some other ref, then get JSON back:
$ git push origin diff/json { "id": 123, "remote-ref": "phabricator/diff/123", "blah1": "other information useful for arc", "blah2": "like we ran differential.creatediff" }
Check out a remote and only see meaningful, human-facing refs:
$ git clone ssh://dweller@vault.phabricator.com/diffusion/X/x.git $ cd x $ git ls-remote origin abcdef refs/heads/master
Add an alternate view of a remote and see "virtual" refs which are useful to a build system:
$ git remote add build-view ssh://dweller@vault.phabricator.com/diffusion/build/X/x.git $ git ls-remote build-view abcdef refs/heads/master abcde1 phabricator/diff/123 abcde2 phabricator/diff/124 ... <a million more entries> ...
Check out those refs:
$ git fetch build-view diff/123 (This actually works.) $ git checkout build-view/diff/123 (This also works.) $ run fancy builds (This works if your code is in good shape.)
Enforce ref-based permissions checks:
$ git fetch build-view diff/456 You Shall Not Pass: You don't have permission to see this diff. Users who can see this diff include: ...