PlasticSCM: The Nightmare SCM

2023-02-12

Context

I’m working as a composer for a videogame. We use the Unity engine (Yes, I know. Not my decision.), and something called PlasticSCM for source control. It is the single worst SCM software I’ve ever experienced. It makes git feel like absolute heaven.

Constant empty changes

The Plastic people supply their own GUI, which is nice. The GUI is alright. At least it has a dark mode. But no matter how many times you tell it not to give you update popups, it still gives you update popups every time it launches.

In this GUI, you have a list of uncommitted changes. Or as they call it, “Pending changes”, because there is no such thing as a commit. There are only changesets. When you “commit”, you also push. You have to push when you commit. These push-commits are called changesets.

“Files are identical.

Well, this list of pending changes is constantly getting filled with unchanged files. Files you never touched, but they’re there in the list, as if they’ll be part of the changeset. You can click on them and see the diff. Nothing. No difference. They’ve even added a button you can press to remove all the changes that don’t contain any changes. Incredible. This is true innovation. With two clicks of your mouse you can revert all your non-existent changes to how they were before you didn’t change them. Exactly as they already are now.

And if you don’t do that it can actually cause problems. One time, I was going to do the equivalent of a pull, and it said that the lead programmer had made changes to the master soundbank. Which is completely stupid, he would never have.

Lead programmer saying he didn’t touch it

Luckily, this was a small changeset, and I knew to look out for this. If I didn’t, it could’ve easily done a bad auto-merge with some old version of a file nobody noticed that Plastic had erroneously added to the changeset. Et voila, mysterious bugs!

The Catch 22 Lockup

I tried to checkout another branch once, and all the changes it made to the files in order to get me to that branch, it thought I had done and was waiting for me to commit them. 884 pending changes I never made.

If I tried to revert these changes, it threw an error saying it didn’t know what to revert to.
If I tried to change branch back to where I was, it threw an error saying I had uncommitted changes.
If I tried to temporarily shelf the changes, it threw an error.
If I tried to commit the changes, it threw an error.

I literally had no way to recover, and all I could do was download the project all over, and set it up again. And because it is a Unity project, that took multiple days. I had heard Unity was slow, but holy shit.

This is it trying to open the project for the first time. That number means 13+ hours. This also happens when you change the build target. Download the project, try to open it, leave that over night, change the build target, and leave it over night again.

This is it literally just quitting. It sometimes takes 5 to 6 minutes to just quit the program. Usually it takes just a few seconds, but on occasion it just sits there for multiple minutes.

Selective merging

After doing that, and finally starting to get back to work, it was time to merge my changes with the progressively named “main” branch. I needed to merge all the stuff I had added and removed, but I didn’t want to touch the files that the rest of the team had been working on. Good thing there’s absolutely no way to do that.

With git, all you need to do is checkout the branch you’re wanting to merge into, and from there, checkout the specific files you want to bring over from your branch.

In PlasticSCM, however they have two options: Merge, and Cherry Pick.

Merging means you have to merge everything, and if the program thinks it can auto-merge your files, it will. Even if you go to the merge options and tell it you want to do it manually. After merging everything, the merged things go in the pending changes list. If you then try to undo the changes to specific files, it won’t let you because you can’t undo just some of a merge. You have to undo all of it at once. WHY?? JUST LET ME DO THAT, IF IT IS EXACTLY WHAT I WANT TO DO.

The other option, Cherry Pick, doesn’t let me cherry pick anything, it just randomly happens to merge only the exact files I don’t want it to merge, with no actual way of selecting what files I want to merge. It just picks the two files I don’t want to merge, and I can’t do anything about it. All the files I’ve added it just leaves behind. It’s as if it only can see the changed files, not the added files. Maybe because those files weren’t there in the master branch before my branch started? No clue, but either way, it leaves the cherry picking option useless.

My solution: Copy the files I want to merge to another folder, checkout the branch I want to merge into, and copy the files back into the repository. All the while praying I don’t get stuck in the same catch 22 lockup I was earlier when changing branches.

Diff and merge tool

When the merge tool has you resolving conflicts, it seems to copy and rename the files it needs to diff into a temp folder before launching the merge tool. This means that when you look at the incredibly unhelpful file titles of “Source”, “Destination” and “Base”, you will have no help to understand what files are what, because they’re all named “D:/Something/PlasticSCM/temp/F79QPFG.temp”.

Even better is this thing:

Which has me resorting to the command line version of Plastic, which is fully capable of giving me the diff. What makes the GUI so much more handicapped is a mystery.

Goodbye Babylon

The project is nearing its end now, though, and I can’t wait to go back to git. I’ve been wanting to try out Sublime Merge, because even as a vim user of many years, Sublime Text has recently impressed me.