Frage

Ich bin auf der Suche nach einem Werkzeug, das eine Lizenz in der Masse, Header auf einige Quelldateien hinzufügen wird, haben zum Teil bereits die Header. Gibt es ein Tool gibt, die einen Header eingefügt werden, wenn es nicht bereits vorhanden ist?

Edit: Ich bin nicht absichtlich Kennzeichnung eine Antwort auf diese Frage, da Antworten im Grunde alle umgebungsspezifischen und subjektiv

War es hilfreich?

Lösung

#!/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

Andere Tipps

Python-Lösung, modifizieren für Ihren eigenen Bedarf

Features:

  • Griffe UTF-Header (wichtig für die meisten IDEs)
  • aktualisiert rekursiv alle Dateien im Zielverzeichnis angegeben Maske vorbei (Ändern Sie den .endswith Parameter für die filemask Ihrer Sprache (.c, .java, ..etc)
  • Fähigkeit vorherigen Copyright-Text (liefern alten Copyright Parameter, dies zu tun) zu überschreiben
  • optional auslässt im ExcludeDir Array angegebenen Verzeichnisse

-

# 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()

Schauen Sie sich die Copyright-Header RubyGem. Es unterstützt Dateien mit den Erweiterungen der Endung php, c, h, CPP, HPP, hh, rb, css, js, html. Es kann auch hinzufügen und Header entfernen.

Installieren Sie es, indem Sie "sudo gem install copyright-header"

Danach kann wie etwas tun:

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 ./

Es unterstützt auch benutzerdefinierte Lizenzdateien des --license-Dateiargument verwenden.

Hier ist ein Bash-Skript, das den Trick tun würde, vorausgesetzt, Sie die Lizenz-Header in der Datei license.txt haben:

Datei addlicense.sh:

#!/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  

Jetzt laufen diese in Ihrem Quellverzeichnis:

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

Edit: Wenn Sie Eclipse verwenden, gibt es ein Plugin

Ich schrieb ein einfaches Skript Python basiert auf Silver Dragon Antwort. Ich brauchte eine flexiblere Lösung, damit ich mit dieser kam. Es ermöglicht Ihnen, eine Headerdatei auf alle Dateien in einem Verzeichnis rekursiv hinzuzufügen. Optional können Sie einen regulären Ausdruck hinzufügen, die die Dateinamen sollten, und ein regulärer Ausdruck wich die Verzeichnisnamen übereinstimmen und eine regex sollten übereinstimmen, die die erste Zeile in der Datei sollte nicht überein. Sie können dieses letzte Argument prüfen, ob der Header bereits enthalten ist.

Dieses Skript wird automatisch die erste Zeile in einer Datei überspringen, wenn diese mit einem shebang beginnt (#!). Diese nicht andere Skripte zu brechen, die auf diese vertrauen. Wenn Sie dieses Verhalten nicht wünschen werden Sie 3 Zeilen in writeheader kommentieren Sie müssen.

hier ist sie:

#!/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()

Für Java http://code.google.com/p/maven- Lizenz-plugin /

Mit freundlichen Grüßen

Ok hier ist eine einfache Windows-only UI-Tool, das für alle Dateien Ihrer angegebenen Typs in einem Ordner durchsucht, prepends Sie den Text an die Spitze wollen (Ihre Lizenztext) und kopiert das Ergebnis in ein anderes Verzeichnis (unter Vermeidung von potentiellen überschreiben Probleme). Es ist auch kostenlos. Erforderlich .Net 4.0.

Ich bin eigentlich der Autor, so fühlen sich allerdings frei zu verlangen Korrekturen oder neue Funktionen ... keine Versprechungen auf Lieferplan. ;)

Weitere Informationen: Lizenz-Header-Tool unter Amazify.com

Überprüfen Sie heraus Lizenz-Addierer. Es unterstützt mehrere Codedateien (auch benutzerdefinierte sind) und Griffe korrekt bestehende Header. Kommt schon mit Vorlagen für die gängigsten Open Source-Lizenzen.

Hier ist ein ich auf der Apache-Liste gefunden. Sein in Ruby geschrieben und scheint leicht genug, um zu lesen. Sie sollten auch in der Lage sein, es für ganz besondere Nettigkeit von Rake zu rufen. :)

Hier ist ein ich in PHP gerollt PHP-Dateien zu ändern. Ich hatte alte Lizenzinformationen auch zu löschen, so ersetzt er den alten Text zuerst, fügt dann den neuen Text unmittelbar nach der Eröffnung

<?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();

Wenn Sie noch einen brauchen, gibt es ein kleines Werkzeug, das ich geschrieben habe, mit dem Namen SrcHead . Sie können ihn unter http://www.solvasoft.nl/downloads.html

Wenn Sie sbt verwenden, gibt es https://github.com/Banno/sbt- Lizenz-Plugin

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top