Live data from Hacker News

Kicking the Bukkit: Anatomy of an open source meltdown

slideshare.net

51–59 of 59 posts

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#51
post #39

Earlier quoted context omitted.

Controversy isn't part of the equation here. You change from license A to license B to your project without asking permission of those that contributed under license A. Some party uses the code under B and violates B, but not A. Their attorney argues that you didn't have permission to re-license from all contributors, so the switch wasn't possible. You try to contact all developers that committed under A. Sadly, one…

spindritf said "make any changes" coldpie seemed to assume s/he meant "any changes", not "any changes to the license"

But the initial part of the thread is about a CLA and a CLA covers the licensing part of the business.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#52
post #50
post #44

Earlier quoted context omitted.

> only use GPL It looks like the lesson from Bukkit is that if you use GPL and there's some problem, then a disgruntlend copyright holder (of GPL-licensed code) can get your entire project into trouble. The project of course was wrong to include or link to proprietary code. But had they used a free license for their own stuff, Wolfe wouldn't have had a claim to make.

Actually I can't think of a single license that would have been valid here unless it came with Mojang's permission. The problem was the proprietary code. Had everything been GPL, not a single copyright holder could have affected the project in such a way.

No, the proprietary code was a problem. Another problem was a license that gave a single developer the power to take the project down. If the code were permissively licensed, he could've not done that. Yes, it would still infringe on Mojang's rights, but that could've been addressed separately.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#53
A few comments say things like "they shouldn't include the binaries" or "why can't they just link to the binary, let the user download it themselves" etc.

There may have been a way to achieve that (and we talked about a few of them quite a few times) but it was never as simple as just 'linking to the binary'.

The Bukkit project was actually composed of a few different pieces, designed to make maintenance of the mod manageable across upgrades of the game. This architectural change was one of the main reasons Bukkit split off from hMod in the first place.

There were 4 main codebases in play; the Bukkit API, the CraftBukkit server mod, the reverse-engineering-tools project, and various plugins supplied by the Project or for use as examples.

I go into more detail below, but the reason why just hooking into the binary was so hard is two fold, and meant that CraftBukkit could never really just be a server wrapper.

1. Methods, method calls, and program logic needed to be modified directly to enable things like turning off fire on the server. Anytime the game tried to start a fire CraftBukkit had to fire an event, and allow that event to be cancelled. So CraftBukkit had to be a mod in the purest sense.

2. Obfuscation meant that modified files had to be translated every single upgrade. To reduce this burden large swathes of the code was de-obfuscated, so that the upgrade process was de-obfuscate core code -> translate any mod changes that used obfuscated code -> apply mod changes on top of the core code -> fix the thousands of bugs we missed in the translate step. So much of the mod was on top of this de-obfuscated version of the server that any distribution would require distributing large amounts of de-obfuscated code - there was no other source for this.

So there may have been ways to avoid shipping Mojang code, but it was always going to be a hard slog. When the core team started conversations with Mojang it always seemed like there was never a pressing need, and as I understand it Mojang still hasn't shut down Bukkit. It was a lone developer asserting a DMCA take down.

I would be very interested to know if there is a better architecture that solves these problems, some more of which I have listed out below.

==== More Details ====

The Bukkit API consisted of JAVA interfaces, providing a stable(ish) API against which plugin authors could build plugins, and some glue code to manage the plugins. This had no code from Mojang in it.

The various 'official' plugins were coded against the API, and similarly had no Mojang code in it.

The reverse-engineering-tools project was used to, perhaps unsurprisingly, reverse engineer the official server. A lot of the code had been de-obfuscated, but that de-obfuscation was usually a painstaking task performed by hand. These tools made that process much easier. It included a decompiled version of the official server code, but the project was private and wasn't distributed. Not sure how that impacts everything.

The CraftBukkit server mod of course DID contain Mojang code, the modded server. It's job was to implement the Bukkit API.

The API was almost entirely event based. Plugins would hook on certain events, and the server would wait for the plugins to process the events before continuing with whatever it was doing.

Someone tries to set a house on fire -> LightFireEvent is fired -> NoFire plugin hooks the event -> NoFire plugin cancels the event -> in game no fire is lit.

In order to implement these events, entire code paths within the game need to be diverted, hooked in to, subverted, or replaced. There are lots of ways a fire might start, so we had events triggering when lava ignites a block next to it, and explosion sets some grass on fire, someone uses flint to light a tree, etc. Each one requires

* finding the obfuscated code path that implements the feature we want to hook

* de-obfuscating the code so it is clear(er) to see how to modify it correctly

* modifying the de-obfuscated code to introduce the hooking code, and implement the API

Every time there was an upgrade to the server we would have to map every modification made to the new obfuscated code base. So if CraftBukkit had modified or included a call to an obfuscated method (which happened often enough for it to be a pain) then those changes had to be mapped to the new method signatures of the upgraded server. c(wx, f, b, 23) might now be e(ww, f, b, 23) and translating that to a modified code base can be hell.

The Bukkit team took that process on itself, which is one of the reasons it was so successful. As long as the API points used don't change, a plugin will continue working as soon as CraftBukkit is upgraded.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#54
post #34
post #25

Earlier quoted context omitted.

Not having your contributors sign a CLA is a huge mistake. Without a CLA, one contributors work can taint the entire project. All open source projects should be aware of this.

The Wine project has no such agreement. I'm not involved with the legal stuff myself, but I know it's been considered by the project bigwigs, and the decision was that an agreement would be too onerous and discourage contributions, especially from non-English developers. We are, however, very careful that all submissions are accepted under the original author's name. We rarely accept patches of the form "I took someo…

This is interesting, because I may have done this recently and I didn't think twice about it. I took someone else's patch (which had been submitted but never merged), merged it in to a newer version, fixed quite a few conflicts and tests, and committed it. Is that problematic? The original submitter's commits are intact and all the "fix-up" code is in the merge commit in my name. What if it is a rebase or cherry-pick where the commits themselves are re-written but retain the original submitter's name?

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#55
post #52
post #50

Earlier quoted context omitted.

Actually I can't think of a single license that would have been valid here unless it came with Mojang's permission. The problem was the proprietary code. Had everything been GPL, not a single copyright holder could have affected the project in such a way.

No, the proprietary code was a problem . Another problem was a license that gave a single developer the power to take the project down. If the code were permissively licensed, he could've not done that. Yes, it would still infringe on Mojang's rights, but that could've been addressed separately.

Another problem was a license that gave a single developer the power to take the project down.

It gave a developer the power to take down a project violating the GPL. That's probably a quite good power for them to have. I don't see how that's a problem for anyone except if you currently are or wish you could violate the terms of the GPL.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#56

Earlier quoted context omitted.

sorry to follow-up with an even dumber question(?). Feel like an old fossil not playing a game in probably 25 years or so. What's the motivation for running a server? and how do people using the game decide which server to use and why? I'm really stuck at the basics.

Many people set up servers so they and their real life friends can play in the same world together in real time. That way, you can both work on building a house, or a city or a world. Larger servers have complex mods that add tremendous functionality to the game. Some may have roleplaying mods, where you can find a role (blacksmith, lumberjack, etc) and participate in the economy. Others may set up a world just for p…

Thanks for the clear explanation. I somehow thought everything was in one "game world". The way you described it makes a lot more sense to me now.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#57
post #53

A few comments say things like "they shouldn't include the binaries" or "why can't they just link to the binary, let the user download it themselves" etc. There may have been a way to achieve that (and we talked about a few of them quite a few times) but it was never as simple as just 'linking to the binary'. The Bukkit project was actually composed of a few different pieces, designed to make maintenance of the mod m…

Forge was based on decompiling and patching mojang binaries, it works pretty well.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#58
post #53

A few comments say things like "they shouldn't include the binaries" or "why can't they just link to the binary, let the user download it themselves" etc. There may have been a way to achieve that (and we talked about a few of them quite a few times) but it was never as simple as just 'linking to the binary'. The Bukkit project was actually composed of a few different pieces, designed to make maintenance of the mod m…

Forge was based on decompiling and patching mojang binaries, it works pretty well.

Yeah, as I mentioned we did talk about it a lot. As it seemed like a lot of work, and since mojang had turned a blind eye, the effort never seemed worth it. The core team got bought before it all came to a head, otherwise you might have seen a greater effort to separate the code bases.

I'll have to look in to forge, I haven't yet seen what they are doing, but it sounds interesting.

EDIT: the other aspect was the fact so much code was written against the de-obfuscated version of the code base. There's an argument that distributing that patch would also be distributing mojang code.

Re: Kicking the Bukkit: Anatomy of an open source meltdown

#59
post #53

A few comments say things like "they shouldn't include the binaries" or "why can't they just link to the binary, let the user download it themselves" etc. There may have been a way to achieve that (and we talked about a few of them quite a few times) but it was never as simple as just 'linking to the binary'. The Bukkit project was actually composed of a few different pieces, designed to make maintenance of the mod m…

>So much of the mod was on top of this de-obfuscated version of the server that any distribution would require distributing large amounts of de-obfuscated code - there was no other source for this.

How much of the updating and deployment tasks could be done by a script on the user's computer/server? Decompile with MCP and pull in all the changes as patches, like the Craftbukkit github was when I saw it?

Post reply on HN