Kaynak dosyalara lisans başlıkları eklemek için bir araç mı? [kapalı]


90

Bazılarında zaten başlık bulunan bazı kaynak dosyalara toplu olarak bir lisans başlığı ekleyecek bir araç arıyorum. Zaten mevcut değilse, üstbilgi ekleyecek bir araç var mı?

Düzenleme: Bu sorunun cevabını kasıtlı olarak işaretlemiyorum, çünkü cevaplar temelde tamamen çevreye özgü ve özneldir


5
"Cevaplar temelde tamamen çevreye özgü ve öznel olduğundan, kasıtlı olarak bu sorunun cevabını işaretlemiyorum" Sözde kod gibi ortamdan bağımsız bir çözüm mü arıyorsunuz? Değilse, lütfen bize hangi ortamda çalıştığınızı bildirin.
jrummell

1
jrummell: Hayır, çevreye duyarlı bir çözüm aramıyorum. İçinde bulunduğum çoklu ortam ekibinin kullanabileceği şeyleri arıyordum.
Alex Lyman

Bunu yapmanıza izin veren bir Windows UI uygulaması kabul edilebilir bir cevap olabilir mi?
Brady Moritz

@boomhauer Bir Windows UI uygulaması arıyorum. Biliyor musun?
Jus12

Aşağıya yeni bir cevap ekledim, sadece bunu yapmalı.
Brady Moritz

Yanıtlar:


64
#!/bin/bash

for i in *.cc # or whatever other pattern...
do
  if ! grep -q Copyright $i
  then
    cat copyright.txt $i >$i.new && mv $i.new $i
  fi
done

1
"$ @" daki i için oldukça iyi bir seçimdir. VCS sisteminiz buna ihtiyaç duyuyorsa, satın alma işlemlerinde de yaratıcı olabilirsiniz.
Jonathan Leffler

10
-1, alıntı yapmalısınız"$i"
Aleks-Daniel Jakimenko-A.

Sanırım bu, alt dizinlerde yinelemeli olarak çalışmıyor :-(
knocte

3
@knocte for i in $(find /folder -name '*.cc');Komut dosyasını alt dizinlerde çalıştırmak için for-döngüsünü bununla değiştirin
Joyce

16

Python çözümü, kendi ihtiyacınıza göre değiştirin

Özellikleri:

  • UTF başlıklarını işler (çoğu IDE için önemlidir)
  • verilen maskeyi geçen hedef dizindeki tüm dosyaları yinelemeli olarak günceller (kendi dilinizin dosya görevi için .endswith parametresini değiştirin (.c, .java, ..etc)
  • önceki telif hakkı metninin üzerine yazma yeteneği (bunu yapmak için eski telif hakkı parametresini sağlayın)
  • isteğe bağlı olarak dışlanır dizide verilen dizinleri atlar

-

# updates the copyright information for all .cs files
# usage: call recursive_traversal, with the following parameters
# parent directory, old copyright text content, new copyright text content

import os

excludedir = ["..\\Lib"]

def update_source(filename, oldcopyright, copyright):
    utfstr = chr(0xef)+chr(0xbb)+chr(0xbf)
    fdata = file(filename,"r+").read()
    isUTF = False
    if (fdata.startswith(utfstr)):
        isUTF = True
        fdata = fdata[3:]
    if (oldcopyright != None):
        if (fdata.startswith(oldcopyright)):
            fdata = fdata[len(oldcopyright):]
    if not (fdata.startswith(copyright)):
        print "updating "+filename
        fdata = copyright + fdata
        if (isUTF):
            file(filename,"w").write(utfstr+fdata)
        else:
            file(filename,"w").write(fdata)

def recursive_traversal(dir,  oldcopyright, copyright):
    global excludedir
    fns = os.listdir(dir)
    print "listing "+dir
    for fn in fns:
        fullfn = os.path.join(dir,fn)
        if (fullfn in excludedir):
            continue
        if (os.path.isdir(fullfn)):
            recursive_traversal(fullfn, oldcopyright, copyright)
        else:
            if (fullfn.endswith(".cs")):
                update_source(fullfn, oldcopyright, copyright)


oldcright = file("oldcr.txt","r+").read()
cright = file("copyrightText.txt","r+").read()
recursive_traversal("..", oldcright, cright)
exit()

6
Muhtemelen senaryonuzun python'da olduğunu söylemekten zarar gelmez.
Dana

16

Check Telif hakkı başlık RubyGem. Php, c, h, cpp, hpp, hh, rb, css, js, html ile biten uzantılara sahip dosyaları destekler. Ayrıca üstbilgi ekleyip kaldırabilir.

" sudo gem install copyright-header" Yazarak yükleyin

Bundan sonra şunun gibi bir şey yapabilirsiniz:

copyright-header --license GPL3 \
  --add-path lib/ \
  --copyright-holder 'Dude1 <dude1@host.com>' \
  --copyright-holder 'Dude2 <dude2@host.com>' \
  --copyright-software 'Super Duper' \
  --copyright-software-description "A program that makes life easier" \
  --copyright-year 2012 \
  --copyright-year 2012 \
  --word-wrap 80 --output-dir ./

Ayrıca --license-file argümanını kullanan özel lisans dosyalarını da destekler.


Bu, mevcut özel başlıkları kaldırmaması dışında harika :(
pgpb.padilla

3
Onlar için bir şablon oluşturursanız, mevcut üstbilgileri kaldırabilirsiniz. Şablonu bağımsız değişkenle birlikte betiğe bir bağımsız değişken olarak --license-fileiletin ve --remove-pathbu tam başlığı tüm dosyalardan çıkarmak için bayrağı kullanın. Temel olarak, pek çok farklı başlık türü vardır ve bunları güvenilir bir şekilde kaldırmak için bir algoritma oluşturmak önemsiz değildir.
Erik Osterman

1
Kısa bir süre önce, Dockerfilezahmetli bir yakut bağımlılığı yüklemesinin artık sorun olmadığını ekledik
Erik Osterman

15

License.txt dosyasında lisans başlığına sahip olduğunuzu varsayarak, işi yapacak bir Bash betiği:

Addlicense.sh dosyası:

#!/bin/bash  
for x in $*; do  
head -$LICENSELEN $x | diff license.txt - || ( ( cat license.txt; echo; cat $x) > /tmp/file;  
mv /tmp/file $x )  
done  

Şimdi bunu kaynak dizininizde çalıştırın:

export LICENSELEN=`wc -l license.txt | cut -f1 -d ' '`  
find . -type f \(-name \*.cpp -o -name \*.h \) -print0 | xargs -0 ./addlicense.sh  

1
Dosya adı rakamlar içeriyorsa sed ifadesi iyi çalışmayacaktır. Bunun yerine şunu kullanmayı düşününcut -f1 -d ' '
schweerelos

1
@Rosenfield Kapanıştaki tek alıntı ihracat bildiriminde eksik.
Talespin_Kit

bul komutundaki paranteze neden ihtiyacınız var? benim için başarısız oldu
knocte

13

Düzenleme: Eclipse kullanıyorsanız, bir eklenti var

Silver Dragon'un cevabına dayalı basit bir python betiği yazdım. Daha esnek bir çözüme ihtiyacım vardı, bu yüzden bunu buldum. Bir dizindeki tüm dosyalara özyinelemeli bir başlık dosyası eklemenizi sağlar. İsteğe bağlı olarak, dosya adlarının eşleşmesi gereken bir normal ifade ve dizin adlarının eşleşmesi gereken bir normal ifade ve dosyadaki ilk satırın eşleşmemesi gereken bir normal ifade ekleyebilirsiniz. Başlığın zaten dahil edilip edilmediğini kontrol etmek için bu son bağımsız değişkeni kullanabilirsiniz.

Bu komut dosyası bir shebang (#!) İle başlıyorsa bir dosyadaki ilk satırı otomatik olarak atlayacaktır. Bu, buna dayanan diğer komut dosyalarını bozmamak için. Bu davranışı istemezseniz, yazma başlığında 3 satırı yorumlamanız gerekir.

işte burada:

#!/usr/bin/python
"""
This script attempts to add a header to each file in the given directory 
The header will be put the line after a Shebang (#!) if present.
If a line starting with a regular expression 'skip' is present as first line or after the shebang it will ignore that file.
If filename is given only files matchign the filename regex will be considered for adding the license to,
by default this is '*'

usage: python addheader.py headerfile directory [filenameregex [dirregex [skip regex]]]

easy example: add header to all files in this directory:
python addheader.py licenseheader.txt . 

harder example adding someone as copyrightholder to all python files in a source directory,exept directories named 'includes' where he isn't added yet:
python addheader.py licenseheader.txt src/ ".*\.py" "^((?!includes).)*$" "#Copyright .* Jens Timmerman*" 
where licenseheader.txt contains '#Copyright 2012 Jens Timmerman'
"""
import os
import re
import sys

def writeheader(filename,header,skip=None):
    """
    write a header to filename, 
    skip files where first line after optional shebang matches the skip regex
    filename should be the name of the file to write to
    header should be a list of strings
    skip should be a regex
    """
    f = open(filename,"r")
    inpt =f.readlines()
    f.close()
    output = []

    #comment out the next 3 lines if you don't wish to preserve shebangs
    if len(inpt) > 0 and inpt[0].startswith("#!"): 
        output.append(inpt[0])
        inpt = inpt[1:]

    if skip and skip.match(inpt[0]): #skip matches, so skip this file
        return

    output.extend(header) #add the header
    for line in inpt:
        output.append(line)
    try:
        f = open(filename,'w')
        f.writelines(output)
        f.close()
        print "added header to %s" %filename
    except IOError,err:
        print "something went wrong trying to add header to %s: %s" % (filename,err)


def addheader(directory,header,skipreg,filenamereg,dirregex):
    """
    recursively adds a header to all files in a dir
    arguments: see module docstring
    """
    listing = os.listdir(directory)
    print "listing: %s " %listing
    #for each file/dir in this dir
    for i in listing:
        #get the full name, this way subsubdirs with the same name don't get ignored
        fullfn = os.path.join(directory,i) 
        if os.path.isdir(fullfn): #if dir, recursively go in
            if (dirregex.match(fullfn)):
                print "going into %s" % fullfn
                addheader(fullfn, header,skipreg,filenamereg,dirregex)
        else:
            if (filenamereg.match(fullfn)): #if file matches file regex, write the header
                writeheader(fullfn, header,skipreg)


def main(arguments=sys.argv):
    """
    main function: parses arguments and calls addheader
    """
    ##argument parsing
    if len(arguments) > 6 or len(arguments) < 3:
        sys.stderr.write("Usage: %s headerfile directory [filenameregex [dirregex [skip regex]]]\n" \
                         "Hint: '.*' is a catch all regex\nHint:'^((?!regexp).)*$' negates a regex\n"%sys.argv[0])
        sys.exit(1)

    skipreg = None
    fileregex = ".*"
    dirregex = ".*"
    if len(arguments) > 5:
        skipreg = re.compile(arguments[5])
    if len(arguments) > 3:
        fileregex =  arguments[3]
    if len(arguments) > 4:
        dirregex =  arguments[4]
    #compile regex    
    fileregex = re.compile(fileregex)
    dirregex = re.compile(dirregex)
    #read in the headerfile just once
    headerfile = open(arguments[1])
    header = headerfile.readlines()
    headerfile.close()
    addheader(arguments[2],header,skipreg,fileregex,dirregex)

#call the main method
main()

3
Eklenti için
bozuk


Bunun kendi python paketi versiyonunu yazmadan önce iyice google'da başarısız oldum. Muhtemelen gelecekteki iyileştirmeler için çözümünüzden yararlanacağım. github.com/zkurtz/license_proliferator
zkurtz


11

Tamam burada, bir klasörde belirttiğiniz türdeki tüm dosyaları arayan, istediğiniz metni en üste ekleyen (lisans metniniz) ve sonucu başka bir dizine kopyalayan (olası üzerine yazma sorunlarından kaçınarak) basit bir yalnızca Windows kullanıcı arabirimi aracıdır. . Ayrıca ücretsizdir. Gerekli .Net 4.0.

Aslında yazar benim, bu yüzden düzeltmeler veya yeni özellikler talep etmekten çekinmeyin ... yine de teslimat programında söz vermeyin. ;)

Daha fazla bilgi: Lisans Başlık aracı olarak Amazify.com


ayrıca,
Brady Moritz

1
Yazılımı gerçekten seviyorum, ancak dosya adını başlığa girmek için bir makroya ihtiyaç var. Ayrıca, düzenlenecek dosyaların listesini, dosyaları dışlama seçeneğiyle birlikte göstermek güzel olurdu. (:
hs2d

Teşekkürler, makro ve dışlama listesi harika bir fikir
Brady Moritz

Bağlantınızın süresi doldu.
Siteden

Teşekkürler, tamir ettireceğim
Brady Moritz

5

Lisans toplayıcıya bakın. Birden çok kod dosyasını (özel olanlar dahil) destekler ve mevcut başlıkları doğru şekilde işler. En yaygın Açık Kaynak lisansları için şablonlarla birlikte gelir.


1
Bunun için teşekkürler, license-addertam olarak hangisinden bahsediyorsun? Lisans toplayıcı buldum - ücretsiz .NET uygulaması - Google Proje Barındırma ve Lisans Toplayıcı · basit python komut dosyası · GitHub
sdaau

GitHub şimdi şunu bulur: github.com/sanandrea/License-Adder
koppor

4

İşte PHP dosyalarını değiştirmek için PHP'de kullandığım bir tanesi. Ayrıca silmem gereken eski lisans bilgilerim de vardı, bu yüzden önce eski metnin yerini alıyor, ardından yeni metni açılıştan hemen sonra ekliyor

<?php
class Licenses
{
    protected $paths = array();
    protected $oldTxt = '/**
 * Old license to delete
 */';
    protected $newTxt = '/**
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */';

    function licensesForDir($path)
    {
        foreach(glob($path.'/*') as $eachPath)
        {
            if(is_dir($eachPath))
            {
                $this->licensesForDir($eachPath);
            }
            if(preg_match('#\.php#',$eachPath))
            {
                $this->paths[] = $eachPath;
            }
        }
    }

    function exec()
    {

        $this->licensesForDir('.');
        foreach($this->paths as $path)
        {
            $this->handleFile($path);
        }
    }

    function handleFile($path)
    {
        $source = file_get_contents($path);
        $source = str_replace($this->oldTxt, '', $source);
        $source = preg_replace('#\<\?php#',"<?php\n".$this->newTxt,$source,1);
        file_put_contents($path,$source);
        echo $path."\n";
    }
}

$licenses = new Licenses;
$licenses->exec();

3

İşte Apache listesinde bulduğum bir tanesi . Ruby ile yazılmış ve okunması yeterince kolay görünüyor. Ekstra özel bir nezaket için onu tırmıktan bile arayabilmelisiniz. :)


1

Hala ihtiyacınız varsa, yazdığım SrcHead adında küçük bir araç var . Bunu http://www.solvasoft.nl/downloads.html adresinde bulabilirsiniz.


3
İndirme sayfasından: "Windows için yazılmıştır ve çalışması için .NET Framework 2.0 gerekir."
Riccardo Murri

C / C ++ Stil üstbilgileri ve bir Unicode malzeme listesi ekler. Anlamı: içeriği her satırın header.txtbaşına eklenir //ve ilk satır Unicode BOM ile başlar.
koppor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.