Ferramenta para adicionar cabeçalhos de licença para arquivos de origem? [fechadas]

StackOverflow https://stackoverflow.com/questions/151677

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu estou procurando uma ferramenta que irá, a granel, adicionar um cabeçalho de licença para alguns arquivos de origem, alguns dos quais já têm o cabeçalho. Existe uma ferramenta lá fora, que irá inserir um cabeçalho, se ele já não estiver presente?

Editar: Eu estou intencionalmente não marcar uma resposta a esta questão, uma vez que as respostas são específicas ambiente de basicamente tudo e subjetiva

Foi útil?

Solução

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

Outras dicas

solução Python, modificar para sua própria necessidade

características:

  • alças cabeçalhos UTF (importante para a maioria das IDEs)
  • recursivamente atualiza todos os arquivos no diretório de destino passando dada máscara (modificar o parâmetro .endswith para o filemask de seu idioma (.c, .java, .etc)
  • capacidade de substituir texto de direitos autorais anterior (fornecer parâmetro copyright velho para fazer isso)
  • opcionalmente omite directórios dadas na matriz excludedir

-

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

Confira o copyright-header RubyGem. Ele suporta arquivos com extensões que terminam em php, c, h, CPP, hpp, hh, rb, css, js, html. Ele também pode adicionar e remover cabeçalhos.

Instale-o, digitando "sudo gem install copyright-header"

Depois disso, pode fazer algo como:

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

Ele também suporta arquivos de licença personalizadas usando o argumento-file --license.

Aqui está um script que vai fazer o truque, supondo que você tenha o cabeçalho licença no license.txt arquivo:

addlicense.sh arquivo:

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

Agora executar este em seu diretório fonte:

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

Edit: Se você estiver usando eclipse, há um plugin

Eu escrevi um script python simples com base na resposta do Silver Dragon. Eu precisava de uma solução mais flexível para que eu vim com isso. Ele permite que você adicione um headerfile a todos os arquivos em um diretório, de forma recursiva. Opcionalmente, é possível adicionar um regex que os nomes de arquivo deve corresponder, e uma regex wich os nomes de diretório devem corresponder e um regex que a primeira linha no arquivo não deve corresponder. Você pode usar este último argumento para verificar se o cabeçalho já está incluído.

Este script irá ignorar automaticamente na primeira linha em um arquivo, se isso começa com um shebang (#!). Isto para não quebrar outros scripts que contam com isso. Se você não quiser esse comportamento você tem que comentar a 3 linhas em writeheader.

aqui está:

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

Ok aqui é uma ferramenta de interface do usuário somente para Windows simples que procura todos os arquivos de um determinado tipo em uma pasta, prepends o texto que você desejar para o topo (seu texto de licença), e copia o resultado para outro diretório (potencial de evitar problemas sobrescrever). Ele também é grátis. Necessário .Net 4.0.

Eu sou realmente o autor, tão à vontade para solicitar correções ou novos recursos ... sem promessas no cronograma de entrega embora. ;)

Mais informações: Licença ferramenta Header em Amazify.com

Confira licença de víbora. Ele suporta múltiplos arquivos de código (mesmo personalizados uns) e cabeçalhos alças existentes corretamente. já vem com modelos para as licenças mais comuns de código aberto.

Aqui está um que encontrei na lista Apache. Sua escrita em Ruby e parece bastante fácil de ler. Você deve mesmo ser capaz de chamá-lo de ancinho para niceness especial extra. :)

Aqui está um que eu rolou em PHP para modificar arquivos PHP. Eu também tive informações de licença antiga para apagar assim que substitui o antigo texto em primeiro lugar, em seguida, adiciona o novo texto imediatamente após a abertura

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

Se você ainda precisa de um, há uma pequena ferramenta que escrevi, chamado SrcHead . Você pode encontrá-lo em http://www.solvasoft.nl/downloads.html

Se você estiver usando sbt, há https://github.com/Banno/sbt- licença-plugin

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top