/** * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * 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., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html */
You're probably wondering what this task is about but needed to read past that legal preamble. Sorry about that. Just try to ignore it so we can focus on the task. I am not a lawyer but as a coder, I claim that unnecessary legal notices should be avoided as they compound and create significant noise as much as any boilerplate does.
For example, consider a typical GPL license like the one above ^. Imagine this was at the start of every page of your favorite book and you'll quickly understand how distracting it can be! It is my understanding that the suggested usage is to copy and paste this legal notice into the top of every file of every project. That's a lot of text to ignore! Fortunately, many editors help diminish the visual impact these license blocks have but that is a workaround, non-default configuration, and not all tooling can support it. For example, ripgrep supports ignoring specific files like:
license LICENSE license.txt LICENSE.txt package-lock.json COPYING
But ignoring entire passages of code that is actually legalese is less straightforward when it's intermingled with real code. I would even go so far as to claim that it adds a micro-friction to getting things done and Grep help you if you have to search for a term that happens to appear in the legal preamble for a repo that religiously adheres to per file licensing! I think it would be far more ideal from a development perspective to use a single line license reference if that's legally viable to do so.
In fact, there are already many files that do not have any licensing information. While this isn't justification to do the wrong thing, it does exemplify that simply saying this per file licensing is necessary doesn't make it so.
As an example, from MinervaNeue's menu entries:
find includes/menu/Entries -type f -name \*.php|xargs -rd\\n wc -l 35 includes/menu/Entries/LogInMenuEntry.php 48 includes/menu/Entries/IMenuEntry.php 68 includes/menu/Entries/AuthMenuEntry.php 149 includes/menu/Entries/SingleMenuEntry.php 54 includes/menu/Entries/CompositeMenuEntry.php 95 includes/menu/Entries/MenuEntry.php 116 includes/menu/Entries/LanguageSelectorEntry.php 40 includes/menu/Entries/LogOutMenuEntry.php 103 includes/menu/Entries/HomeMenuEntry.php 40 includes/menu/Entries/IProfileMenuEntry.php 93 includes/menu/Entries/ProfileMenuEntry.php 841 total
The license is 14 lines long and there are 11 files so 154 lines or 18.5% of the code is licensing.
I propose to strategically replace this licensing information with a single attribution per file similar to how all of Wikibase does. In my opinion, this will improve the readability, grepability, and consistency of all code.
There seems to be precedence for single line licenses @license usage suggetings it's a defacto convention already:
Assert CLDRPluralRuleParser Extension:AbuseFilter Extension:AccessControl Extension:AddThis Extension:AdvancedSearch Extension:AkismetKlik Extension:Arrays Extension:ArticleMetaDescription Extension:ArticlePlaceholder Extension:ArticleToCategory2 Extension:Athena Extension:Awesomeness Extension:AzharAuth Extension:Babel Extension:BetaFeatures Extension:BibManager Extension:BlockAndNuke Extension:BlogPage Extension:BlueSpiceAbout Extension:BlueSpiceArticleInfo Extension:BlueSpiceArticlePreviewCapture Extension:BlueSpiceAuthors Extension:BlueSpiceAvatars Extension:BlueSpiceBookshelf Extension:BlueSpiceBookshelfUI Extension:BlueSpiceCategoryManager Extension:BlueSpiceChecklist Extension:BlueSpiceConfigManager Extension:BlueSpiceContextMenu Extension:BlueSpiceCountThings Extension:BlueSpiceCustomMenu Extension:BlueSpiceDashboards Extension:BlueSpiceEditNotifyConnector Extension:BlueSpiceEmoticons Extension:BlueSpiceExpiry Extension:BlueSpiceExportTables Extension:BlueSpiceExtendedSearch Extension:BlueSpiceExtendedStatistics Extension:BlueSpiceFilterableTables Extension:BlueSpiceFoundation Extension:BlueSpiceGroupManager Extension:BlueSpiceHideTitle Extension:BlueSpiceInsertCategory Extension:BlueSpiceInsertFile Extension:BlueSpiceInsertLink Extension:BlueSpiceInsertMagic Extension:BlueSpiceInsertTemplate Extension:BlueSpiceInterWikiLinks Extension:BlueSpiceNSFileRepoConnector Extension:BlueSpiceNamespaceCSS Extension:BlueSpiceNamespaceManager Extension:BlueSpicePageAccess Extension:BlueSpicePageAssignments Extension:BlueSpicePageTemplates Extension:BlueSpicePagesVisited Extension:BlueSpicePermissionManager Extension:BlueSpiceRSSFeeder Extension:BlueSpiceRating Extension:BlueSpiceReaders Extension:BlueSpiceReminder Extension:BlueSpiceSMWConnector Extension:BlueSpiceSaferEdit Extension:BlueSpiceSignHere Extension:BlueSpiceSmartList Extension:BlueSpiceSocial Extension:BlueSpiceSocialArticleActions Extension:BlueSpiceSocialBlog Extension:BlueSpiceSocialComments Extension:BlueSpiceSocialMicroBlog Extension:BlueSpiceSocialProfile Extension:BlueSpiceSocialRating Extension:BlueSpiceSocialResolve Extension:BlueSpiceSocialTags Extension:BlueSpiceSocialTimelineUpdate Extension:BlueSpiceSocialTopics Extension:BlueSpiceSocialWatch Extension:BlueSpiceSocialWikiPage Extension:BlueSpiceTagCloud Extension:BlueSpiceUEModuleBookPDF Extension:BlueSpiceUEModuleDOCX Extension:BlueSpiceUEModuleHTML Extension:BlueSpiceUEModulePDF Extension:BlueSpiceUEModulePDFRecursive Extension:BlueSpiceUEModulePDFSubpages Extension:BlueSpiceUEModuleTable2Excel Extension:BlueSpiceUniversalExport Extension:BlueSpiceUsageTracker Extension:BlueSpiceUserInfo Extension:BlueSpiceUserManager Extension:BlueSpiceUserSidebar Extension:BlueSpiceVisualDiff Extension:BlueSpiceVisualEditorConnector Extension:BlueSpiceWatchList Extension:BlueSpiceWhoIsOnline Extension:BlueSpiceWikiExplorer Extension:BounceHandler Extension:BreadCrumbs Extension:BreadCrumbs2 Extension:Buggy Extension:CSS Extension:Capiunto Extension:CategoryTree Extension:CentralAuth Extension:CentralNotice Extension:ChangeAuthor Extension:Cite Extension:Citoid Extension:CleanChanges Extension:Cognate Extension:Comments Extension:ContactPage Extension:ContentTranslation Extension:CreateAPage Extension:CreatePage Extension:DebugMode Extension:DebugTemplates Extension:DeleteOwn Extension:DeleteUserPages Extension:Description2 Extension:Disambiguator Extension:DiscussionTools Extension:DismissableSiteNotice Extension:Drafts Extension:DynamicPageList Extension:Echo Extension:EditSimilar Extension:ElectronPdfService Extension:EmailCapture Extension:EmailDiff Extension:EnhanceContactForm Extension:EntitySchema Extension:ErrorHandler Extension:EtherpadLite Extension:EventLogging Extension:ExternalGuidance Extension:FanBoxes Extension:Farmer Extension:FileAnnotations Extension:FileExporter Extension:FileImporter Extension:FilterListUsers Extension:Flow Extension:FlvHandler Extension:ForcePreview Extension:FormWizard Extension:GWToolset Extension:Gadgets Extension:GlobalBlocking Extension:GlobalNotice Extension:GlobalPreferences Extension:GlobalUserGroups Extension:GlobalUserrights Extension:GoogleAdSense Extension:GoogleAppEngine Extension:GoogleDocs4MW Extension:Graph Extension:GraphQL Extension:HAWelcome Extension:HTMLets Extension:HashTables Extension:HelpCommons Extension:HelpPages Extension:HitCounters Extension:Html2Wiki Extension:I18nTags Extension:IfTemplates Extension:ImageTweaks Extension:ImportArticles Extension:ImportFreeImages Extension:ImportUsers Extension:InlineCategorizer Extension:InputBox Extension:InteractiveBlockMessage Extension:InterwikiSorting Extension:InviteSignup Extension:Jade Extension:JsonConfig Extension:JsonData Extension:Kartographer Extension:LabeledSectionTransclusion Extension:LanguageSelector Extension:LifeWeb Extension:Lingo Extension:LinkSuggest Extension:LinkTarget Extension:Link_Attributes Extension:LinkedWiki Extension:LiquidThreads Extension:LiveTranslate Extension:LocalisationUpdate Extension:LockDownEnglishPages Extension:Lockdown Extension:LogEntry Extension:LoopFunctions Extension:MagicNoCache Extension:MagicNumberedHeadings Extension:Mailgun Extension:MaintenanceShell Extension:MapSources Extension:MassEditRegex Extension:MassMessage Extension:MassMessageEmail Extension:Math Extension:MathSearch Extension:MediaFunctions Extension:MediaWikiFarm Extension:MessageCommons Extension:MixedNamespaceSearchSuggestions Extension:MultiMaps Extension:MultiUpload Extension:MultimediaPlayer Extension:MyVariables Extension:NamespaceHTML Extension:NamespacePaths Extension:NavigationTiming Extension:Negref Extension:NewSignupPage Extension:NewUserMessage Extension:NewUserNotif Extension:NewestPages Extension:NewsBox Extension:NewsTicker Extension:Newsletter Extension:NoBogusUserpages Extension:NoTitle Extension:NumberFormat Extension:NumberOfWikis Extension:Numbertext Extension:NumerAlpha Extension:OAuth Extension:ORES Extension:OfflineImportLexicon Extension:OnlineStatus Extension:OnlineStatusBar Extension:OnlyRecentRecentChanges Extension:OpenGraphMeta Extension:OpenID Extension:OpenStackManager Extension:PCRGUIInserts Extension:PGFTikZ Extension:PageCreationNotif Extension:PageForms Extension:PageImages Extension:PageNotice Extension:PageSchemas Extension:PageTools Extension:PageTriage Extension:PagesList Extension:PaginateText Extension:ParserFun Extension:Patroller Extension:PhabTaskGraph Extension:PhpHighlight Extension:PhpTagsFunctions Extension:PhpTagsMaps Extension:PhpTagsSMW Extension:PhpTagsSPARQL Extension:PictureGame Extension:PipeEscape Extension:Poem Extension:Poll Extension:PrivateDomains Extension:ProofreadPage Extension:PropertySuggester Extension:ProtectSite Extension:Push Extension:PushToWatch Extension:Quantcast Extension:QuickResponse Extension:QuizGame Extension:RT Extension:RandomGameUnit Extension:RandomImage Extension:RandomImageByCategory Extension:RandomInCategory Extension:ReassignEdits Extension:RefreshSpecial Extension:RegexBlock Extension:RegexFun Extension:RegexFunctions Extension:ReplaceSet Extension:ReplaceText Extension:RevisionSlider Extension:RightFunctions Extension:SandboxLink Extension:Sarcasm Extension:Score Extension:Scribunto Extension:SearchStats Extension:SecureSessions Extension:SemanticACL Extension:SemanticBundle Extension:SemanticGenealogy Extension:SemanticWebBrowser Extension:SendGrid Extension:ShortDescription Extension:ShortUrl Extension:ShoutWikiAPI Extension:ShoutWikiAds Extension:SidebarDonateBox Extension:SignWritingMediaWikiPlugin Extension:SimpleChanges Extension:SimpleFarm Extension:SimpleSecurity Extension:SiteMetrics Extension:SlimboxThumbs Extension:SocialProfile Extension:SoftRedirector Extension:SoftwareVersion Extension:Solarium Extension:SoundManager2Button Extension:SpamDiffTool Extension:SpecialNamespaces Extension:SpellingApi Extension:SpellingDictionary Extension:StaffEdits Extension:StaffPowers Extension:StalkerLog Extension:StarterWiki Extension:StickToThatLanguage Extension:SubpageFun Extension:SubpageSortkey Extension:Sudo Extension:SwiftMailer Extension:SyntaxHighlight_GeSHi Extension:TEI Extension:THICC Extension:Tabber Extension:TemplateStyles Extension:TestLanguageNameGrammar Extension:TextExtracts Extension:Thanks Extension:TheWikipediaLibrary Extension:Theme Extension:ThrottleOverride Extension:TimedMediaHandler Extension:TimelineTable Extension:TinyMCE Extension:TitleBlacklist Extension:TocTree Extension:TorBlock Extension:Translate Extension:TranslateSvg Extension:TranslationNotifications Extension:TweetANew Extension:TwitterCards Extension:TwitterLogin Extension:TwnMainPage Extension:TwoColConflict Extension:UIFeedback Extension:UILangCode Extension:UniversalLanguageSelector Extension:UpdateMediaWiki Extension:UploadWizard Extension:UploadsLink Extension:UrlGetParameters Extension:UrlShortener Extension:UserFunctions Extension:UserGroups Extension:UserOptionStats Extension:UserPageEditProtection Extension:VirtualKeyboard Extension:VisualEditor Extension:VoteNY Extension:WebChat Extension:WebDAV Extension:WhitelistPages Extension:WhosOnline Extension:WikiArticleFeeds Extension:WikiLexicalData Extension:WikiLovesMonuments Extension:WikiTextLoggedInOut Extension:Wikibase Extension:WikibaseCirrusSearch Extension:WikibaseLexeme Extension:WikibaseLexemeCirrusSearch Extension:WikibaseMediaInfo Extension:WikibaseQualityConstraints Extension:Wikidata.org Extension:WikidataPageBanner Extension:WikimediaBadges Extension:WikimediaEvents Extension:WikimediaIncubator Extension:Wikisource Extension:Wikispeech Extension:XSL Extension:YetAnotherKeywords Extension:cldr Extension:examples Fannon/SimpleTooltip Hutchy68/Purge HydraWiki/ImageSizeInfoFunctions HydraWiki/LuaCache HydraWiki/SpriteSheet HydraWiki/Streamer JeroenDeDauw/Maps MediaWiki core Nikerabbit/mediawiki-extensions-Ainut Nikerabbit/mediawiki-extensions-FileSystemImageServer Nikerabbit/mediawiki-extensions-FinnFrameNet Nikerabbit/mediawiki-extensions-Lud Nikerabbit/mediawiki-extensions-Nimiarkisto Nikerabbit/mediawiki-extensions-Sanat Nikerabbit/mediawiki-extensions-Termbank Nikerabbit/mediawiki-extensions-WordNet SemanticMediaWiki/Mermaid SemanticMediaWiki/SemanticApprovedRevs SemanticMediaWiki/SemanticBreadcrumbLinks SemanticMediaWiki/SemanticCite SemanticMediaWiki/SemanticCompoundQueries SemanticMediaWiki/SemanticExternalQueryLookup SemanticMediaWiki/SemanticExtraSpecialProperties SemanticMediaWiki/SemanticFormsSelect SemanticMediaWiki/SemanticGlossary SemanticMediaWiki/SemanticInterlanguageLinks SemanticMediaWiki/SemanticMediaWiki SemanticMediaWiki/SemanticMetaTags SemanticMediaWiki/SemanticNotifications SemanticMediaWiki/SemanticResultFormats SemanticMediaWiki/SemanticScribunto SemanticMediaWiki/SemanticSignup SemanticMediaWiki/SemanticTasks SemanticMediaWiki/SemanticWatchlist SemanticMediaWiki/SummaryCards SemanticMediaWiki/WhatsNearby Skin:Daddio Skin:DeskMessMirrored Skin:Nimbus Skin:Schulenburg Skin:Truglass Skin:p2wiki VisualEditor core WikibaseDataModel WikibaseDataModelSerialization WikibaseDataModelServices WikibaseInternalSerialization Wikifab/AutoSetPageLang Wikifab/mediawiki-extension-ImageAnnotator Wikimedia MediaWiki config Wikimedia Puppet cmln/chameleon cmln/mw-font-awesome cmln/mw-scss enterprisemediawiki/WatchAnalytics hexmode/mediawiki-MagicNumberedHeadings hydrawiki/extensions/EmbedVideo hydrawiki/extensions/PDFEmbed hydrawiki/extensions/Tabber jeblad/BCmath jeblad/Expect jeblad/Pickle lingua-libre/RecordWizard miraheze/MirahezeMagic oetterer/BootstrapComponents s7eph4n/PurgePage s7eph4n/SimpleBatchUpload s7eph4n/mediawiki-extensions-Bootstrap thingles/foreground tinymighty/wiki-seo translatewiki.net wiki-chan/ModernSkylight
Prior art: