Making changes across the open source ecosystem is very hard; software is hosted on different platforms and in many different version control repositories. Not being able to make bulk changes slows down the rate of progress. For example, instead of being able to actively run a a script that strips out an obsolete header file (say “DM-Upload-Allowed”) across all Debian packages, we make the linter warn about the deprecated header and wait as all developers manually remove the deprecated header.
Silver Platter
Silver-platter is a new tool that aids in making automated changes across different version control repositories. It provides a common command-line interface and API that is not specific to a single version control system or hosting platform, so that it’s easy to propose changes based on a single script across a large set of repositories.
The tool will check out a repository, run a user-specified script that makes changes to the repository, and then either push those changes to the upstream repository or propose them for merging.
It’s specifically built so that it can be run in a shell loop over many different repository URLs.
Example
As an example, you could use the following script (fix-fsf-address.sh) to update the FSF address in copyright headers:
#!/bin/sh
perl -i -pe \
'BEGIN{undef $/;} s/Free Software
([# ]+)Foundation, Inc\., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA/Free Software
\1Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA/smg' *
echo "Update FSF postal address."
Say you a wanted to create a merge proposal with these changes against offlineimap. First, log into GitHub (this needs to be done once per hosting site):
$ svp login https://github.com
To see what the changes would be without actually creating the pull request, do a dry-run:
$ svp run --dry-run --diff ./fix-fsf-address.sh https://github.com/offlineimap/offlineimap
Merge proposal created.
Description: Update FSF postal address.
=== modified file 'offlineimap.py'
--- upstream/offlineimap.py 2018-03-04 03:28:30 +0000
+++ proposed/offlineimap.py 2019-04-06 21:07:25 +0000
@@ -14,7 +14,7 @@
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os
import sys
=== modified file 'setup.py'
--- upstream/setup.py 2018-05-01 01:48:26 +0000
+++ proposed/setup.py 2019-04-06 21:07:25 +0000
@@ -19,7 +19,7 @@
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os
from distutils.core import setup, Command
Then, create the actual pull request by running:
$ svp run ./fix-fsf-address.sh https://github.com/offlineimap/offlineimap
...
Reusing existing repository https://github.com/jelmer/offlineimap
Merge proposal created.
URL: https://github.com/OfflineIMAP/offlineimap/pull/609
Description: Update FSF postal address.
This would create a new commit with the updated postal address (if any files were changed) and the commit message Update FSF postal address. You can see the resulting pull request here.
Debian-specific operations
To make working with Debian packaging repositories easier, Silver Platter comes with a wrapper (debian-svp) specifically for Debian packages.
This wrapper allows specifying package names to refer to packaging branches; packaging URLs are retrieved from the Vcs-Git header in a package. For example:
1 | $ debian-svp run ~/fix-fsf-address.sh offlineimap |
to fix the same issue in the offlineimap package.
(Of course, you wouldn’t normally fix upstream issues like this in the Debian package but forward them upstream instead)
There is also a debian-svp lintian-brush subcommand that will invoke lintian-brush on a packaging branch.
Supported technologies
Silver-Platter currently supports the following hosting platforms:
- GitHub
- GitLab instances (for example Salsa or GNOME gitlab)
- Launchpad (both Git and Bazaar repositories through Breezy)
It works in one of three modes:
- propose: Always create a pull request with the changes
- push: Directly push changes back to the original branch
- attempt-push: Attempt push, and fall back to propose if the current users doesn’t have permissions to push to the repository or the branch.
Installation
There is a Silver Platter repository on GitHub. Silver Platter is also available as a Debian package in unstable (not buster).
More information
For a full list of svp subcommands, see svp(1).