2009-12-29 3 views
3

Я работаю над проектом с открытым исходным кодом, а часть его лицензируется по разрешительной лицензии, написанной оригинальным разработчиком. Лицензия очень короткая и не очень подробная. Более того, он, похоже, не совместим с лицензией, которую использует остальная часть проекта.Как освободить бесплатный код?

Я хотел бы попросить оригинального разработчика пересмотреть код под другой лицензией с открытым исходным кодом. Проблема в том, что я не знаю, что им нужно сделать для этого. Например, я знаю, что в руководстве по использованию GPL говорится, что каждый файл должен иметь определенный «заголовок», ссылающийся на лицензию. Предположительно, другие лицензии (скажем, BSD) «активируются» аналогичным образом.

Исходный код уже находится в SCM. Нужно ли мне спрашивать у человека, чтобы он модифицировал каждый отдельный файл, или я могу каким-то образом уменьшить его работу?

(В случае, если вы задаетесь вопросом, почему я хочу, чтобы вы не попросили человека совершить изменения - это потому, что на самом деле есть довольно много работы. Проект - только для Windows, а SCM, Mercurial на BitBucket, требует SSH как это работать на Windows, кто-то без предыдущего опыта. - даже если они являются хорошим разработчиком - это ничего, кроме тривиального)

+1

Независимо от того, что вы делаете, не ходите GPL - это неоднозначно, заразительно и предотвращает все последующие повторные передачи. Я не думаю, что лицензия BSD требует каких-либо изменений кода, просто меняя файл LICENSE, и комментариев, которые указывают на лицензию, должно быть достаточно. – Kimvais

+3

Также неверно, что каждый файл должен содержать определенный заголовок. Технические проблемы делают это просто невозможным для некоторых типов файлов. – 2009-12-29 13:19:43

+0

Правовой вопрос. – bmargulies

ответ

7

Юридически, все, что вам нужно, это письменное разрешение всех оригинальных авторов. опубликовать проект под другой, несовместимой лицензией (очевидно, вам не нужно разрешение, если лицензия совместима или в тривиальном случае) одна и та же.

Чтобы защитить проект новой лицензией, кто-то должен заменить все тексты лицензий во всех файлах. Это может сделать любой, у кого есть необходимые разрешения (так это может быть вы или он или кто-то еще).

Примечание: при совместном использовании проекта может быть предоставлено столько лицензий, сколько необходимо. Поэтому, если вам нужно, вы можете создать два клона, где один распространяется в лицензии A и второй экземпляр, который распространяется по лицензии B. Используйте инструмент, который может искать «куски фрагментов текста» и принимать только взносы, когда авторы разрешают вы можете поделиться ими по обеим лицензиям.

+0

В стороне, в то время как вы можете публиковать код под одной лицензией в проекте с совместимой лицензией, вы * не можете * обязательно просто пересмотреть код, о котором идет речь. например, если проект GPL включает в себя отдельные файлы, которые являются BSD, обязательства GPL не применяются к этим файлам, и их просто невозможно просто перераспределить как GPL без утверждения оригинального автора. –

+0

@camccann: Вы смешиваете две проблемы: 1. Не существует правила, согласно которому проект должен иметь только одну лицензию. 2. Если вы хотите поделиться проектом с более чем одной лицензией, вам необходимо одобрение всех авторов. –

+2

Нет, я согласен с этим. Я просто хотел уточнить, что «использование кода с совместимой лицензией» - это не то же самое, что «передискретизация этого кода». Я мог бы включать код BSD в более крупный проект GPL без специального разрешения, но я не мог просто изменить фактический текст лицензии на код BSD на GPL без разрешения автора, не больше, чем я мог бы удалить уведомление об авторских правах и потребовать код как мой собственный. –

0

«Исходный код уже находится в SCM. Должен ли я попросить человека самостоятельно изменить каждый отдельный файл, или я могу как-то уменьшить его работу?»

У меня на самом деле была такая же проблема для старого проекта. В итоге я сломался и просто написал небольшой инструмент для замены лицензий автоматически. Он взял файл, содержащий лицензию, и ввел текст во все файлы .cs (он был aC# project), который он нашел в данной директории и всех своих поддиреях после удаления их старого (он просто искал начальный комментарий ... это было быстро и грязно).

Здесь он находится в C#. Распространяется в соответствии с MIT/X11:

/* 
    Copyright (c) 2009 Benjamin J. Setel 

    Permission is hereby granted, free of charge, to any person 
    obtaining a copy of this software and associated documentation 
    files (the "Software"), to deal in the Software without 
    restriction, including without limitation the rights to use, 
    copy, modify, merge, publish, distribute, sublicense, and/or sell 
    copies of the Software, and to permit persons to whom the 
    Software is furnished to do so, subject to the following 
    conditions: 

    The above copyright notice and this permission notice shall be 
    included in all copies or substantial portions of the Software. 

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
    OTHER DEALINGS IN THE SOFTWARE. 
*/ 

using System.IO; 
using System.Text.RegularExpressions; 
using System.Collections.Generic; 
using System; 


namespace Tools 
{ 
    class LicenseInjector 
    { 
     public static void Main() 
     { 
      Console.WriteLine("Please enter the full root folder path (i.e. /home/usr/code/): "); 
      string folder = Console.ReadLine(); 

      Console.WriteLine("Please enter full path to license data: "); 
      string LicensePath = Console.ReadLine(); 

      FileStream ReadFile = new FileStream(LicensePath, FileMode.Open, FileAccess.Read); 
      StreamReader sr = new StreamReader(ReadFile); 
      string license = sr.ReadToEnd(); 
      sr.Close(); 
      ReadFile.Close(); 

      Recursion.RecursivePrepend(folder, license); 

     }//Main 
    }//LicenseInjector 

    public static class Recursion 
    { 
     public static void RecursivePrepend(string folder, string license) 
     { 
      string [] Subdirs = Directory.GetDirectories(folder); 
      if(Subdirs.Length != 0) 
      { 
       foreach(string s in Subdirs) 
        RecursivePrepend(s, license); 
      } 

      string[] files = PatternFind.DirPatternFinder(folder, ".cs"); 
      foreach(string s in files) 
       Prepend.Prepender(s, license);  

     }//RecursivePrepend() 
    }//Recursion 

    public static class PatternFind 
    { 
     public static string[] DirPatternFinder(string ToLook, string Pattern) 
     { 
      Regex r = new Regex(Pattern); 
      string[] files = Directory.GetFiles(ToLook); 
      List<string> results = new List<string>(); 

      for(int i = 0; i < files.Length; ++i) 
      { 
        Match m = r.Match(files[i]); 
        if(m.Success) 
         results.Add(files[i]); 
      } 
      return results.ToArray(); 
     }//DirPatternFinder() 

     public static string PatternFinder(string Pattern1, string Pattern2) 
     { 
      Regex r = new Regex(Pattern1); 
      Match m = r.Match(Pattern2); 
      return m.ToString(); 
     }//PatternFinder() 
    }//PatternFind 
    public static class Prepend 
    { 
     public static void Prepender(string path, string ToPut) 
     { 
      FileStream ReadFile = new FileStream(path, FileMode.Open, FileAccess.Read); 
      StreamReader sr = new StreamReader(ReadFile); 
      string s = sr.ReadToEnd(); 
      sr.Close(); 
      ReadFile.Close(); 


      bool HasLicense = false; 
      if(s.Substring(0, 2) == "/*") 
       HasLicense = true; 

      if(HasLicense) //If the file already has the license, we have to strip it out before adding it back in 
          // so that the file does not wind up with more than one copy. 
      { 
       int i = 1; 
       string c = "("; 
       while(c != "*/" && i < s.Length) 
       { 
        c = s.Substring(i, 2); 
        ++i; 
       } 
       if(String.Compare("\n\n", s.Substring(i+1, 2)) == 0) //If there's already a newline after the license 
       { 
        s = s.Remove(0, i+3);    
       }    
       else 
       {    
        s = s.Remove(0, i+2); 
       } 
      } 


      FileStream WriteFile = new FileStream(path, FileMode.Open, FileAccess.Write); 
      StreamWriter FileWriter = new StreamWriter(WriteFile); 
      FileWriter.Write(ToPut); 
      FileWriter.Write("\n"); 
      FileWriter.Write(s); 
      FileWriter.Close(); 
      WriteFile.Close(); 
      return;    
     }//Prepender() 
    }//Prepend 
}//Tools 
Смежные вопросы