Currently there is no real way to version files. Because of this, even though you can upload a file as an artifact from a build, there's no way to specify that this file is a particular version of a particular package (e.g. the result of the build is "MyApp 1.0").
This also means there's no way to relate files with regard to making queries like "Retrieve the latest version of MyApp for Windows" or "Give me specific changes between my version and the latest version".
I'd like to explore the idea of a "Bundle" application (the alternative name was Phormation, but I don't particular like this). This intended to be a lightweight package and distribution system, although there are no initial intentions to represent dependencies between packages (because the packages in this case are being directly delivered to users as installable or extractable packages).
The following concepts exist in Bundle:
- `BundlePackage`: A package such as "MyApp". This encompasses different versions of a package.
- `BundleVersion`: A version of a package. This has an associated `filePHID` which is intended to be a ZIP file. I'm a bit torn between whether it should be a 1:1 mapping, with the target file a ZIP package; or a 1:* mapping with each individual file mapped. The latter has the distinct disadvantage that it makes it painful to upload results from a build (since it would need to transfer individual files).
There's the intention of supporting a delta-based update mechanism; where one can make a request with "I currently have version 15 of MyApp, what are the delta updates to the files between 15 and the latest version?" and the server will respond with the appropriate delta updates. This is similar to the way https://github.com/hach-que/Pivot.Update provides incremental updates for software, although having this service available with Phabricator's build system makes it much more powerful.