当前位置:  开发笔记 > 编程语言 > 正文

用于将许可证头添加到源文件的工具?

如何解决《用于将许可证头添加到源文件的工具?》经验,为你挑选了7个好方法。

我正在寻找一种工具,它将批量添加许可证标题到某些源文件,其中一些已经有标题.是否有一个工具会插入标题,如果它还没有?

编辑:我故意没有标记这个问题的答案,因为答案基本上都是环境特定和主观的



1> 小智..:
#!/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,你应该引用``"$ i"``
@knocte用$(find / folder -name'* .cc');中的for for替换for循环以在子目录上运行脚本

2> Erik Osterma..:

查看版权标题 RubyGem.它支持扩展名以php,c,h,cpp,hpp,hh,rb,css,js,html结尾的文件.它还可以添加和删除标题.

键入" sudo gem install copyright-header" 安装它

在那之后,可以做类似的事情:

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

它还使用--license-file参数支持自定义许可证文件.


如果为它们创建模板,则可以删除现有标头.使用`--license-file`参数将模板作为参数传递给脚本,并使用`--remove-path`标志从所有文件中删除精确的标头.基本上,有很多不同类型的标头,创建一个算法来可靠地删除它们是非常重要的.

3> Silver Drago..:

Python解决方案,根据您的需要进行修改

特征:

处理UTF头文件(对大多数IDE很重要)

递归更新目标目录中传递给定掩码的所有文件(修改.endswith参数,用于语言的文件掩码(.c,.java,.. etc)

覆盖以前版权文本的能力(提供旧的版权参数来执行此操作)

可选地省略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()


提到你的脚本在python中可能不会有什么坏处.

4> Adam Rosenfi..:

假设你在license.txt文件中有许可证头,这里有一个Bash脚本可以解决这个问题:

文件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  

现在在源目录中运行它:

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



5> Jens Timmerm..:

编辑:如果你正在使用eclipse,那就有一个插件

我根据Silver Dragon的回复写了一个简单的python脚本.我需要一个更灵活的解决方案,所以我想出了这个.它允许您以递归方式将头文件添加到目录中的所有文件.您可以选择添加文件名应匹配的正则表达式,以及目录名称应匹配的正则表达式以及文件中第一行不匹配的正则表达式.您可以使用此最后一个参数来检查标头是否已包含在内.

如果以shebang(#!)开头,此脚本将自动跳过文件中的第一行.这不会破坏依赖于此的其他脚本.如果您不希望出现这种情况,则必须在writeheader中注释掉3行.

这里是:

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


插件断开的链接

6> marcospereir..:

对于Java,http://code.google.com/p/maven-license-plugin/

亲切的问候



7> Brady Moritz..:

好的,这是一个简单的仅限Windows的UI工具,可以在文件夹中搜索指定类型的所有文件,将所需文本添加到顶部(许可证文本),并将结果复制到另一个目录(避免潜在的覆盖问题) .它也是免费的.必需.Net 4.0.

我实际上是作者,所以请随时请求修复或新功能...虽然没有交付时间表的承诺.;)

更多信息:许可证标头工具在Amazify.com

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有