私は、いくつかのソースファイルに一括してライセンスヘッダーを追加するツールを探しています。その一部は既にヘッダーを持っています。ヘッダーがまだ存在しない場合、ヘッダーを挿入するツールはありますか?
編集:答えは基本的にすべて環境固有で主観的であるため、この質問に対する答えを意図的にマークしていません
#!/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
copyright-header 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 <[email protected]>' \
--copyright-holder 'Dude2 <[email protected]>' \
--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引数を使用したカスタムライセンスファイルもサポートしています。
Pythonソリューション、独自のニーズに合わせて変更
特徴:
-
# 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()
ファイル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
編集:Eclipseを使用している場合、 プラグイン があります
Silver Dragonの返信に基づいた簡単なpythonスクリプトを作成しました。より柔軟なソリューションが必要だったので、これを思いつきました。ディレクトリ内のすべてのファイルに再帰的にヘッダーファイルを追加できます。オプションで、ファイル名が一致する正規表現、ディレクトリ名が一致する正規表現、およびファイルの最初の行が一致しない正規表現を追加できます。この最後の引数を使用して、ヘッダーがすでに含まれているかどうかを確認できます。
このスクリプトは、シバン(#!)で始まる場合、ファイルの最初の行を自動的にスキップします。これに依存する他のスクリプトを壊さないために。この動作を望まない場合は、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()
OKは、フォルダー内の指定したタイプのすべてのファイルを検索し、必要なテキスト(ライセンステキスト)を先頭に追加し、結果を別のディレクトリにコピーする(潜在的な上書き問題を回避する)シンプルなWindows専用UIツールです。また、無料です。 .Net 4.0が必要です。
私は実際に作者ですので、修正や新機能をお気軽にお問い合わせください。 ;)
詳細: ライセンスヘッダーツール at Amazify.com
ライセンス加算器を確認してください。複数のコードファイル(カスタムファイルも含む)をサポートし、既存のヘッダーを正しく処理します。最も一般的なオープンソースライセンスのテンプレートが既に付属しています。
ここに1つ Apacheリストで見つけました。 Rubyで書かれており、読みやすいように思えます。特別な便利さのためにrakeから呼び出すこともできます。:)
ここに私がロールインしたものがありますPHP変更するためにPHPファイル。削除する古いライセンス情報もあったので、最初に古いテキストを置き換えてから、新しいものを追加します。オープニング直後のテキスト
<?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();
それでもまだ必要な場合は、SrcHeadという名前の小さなツールを作成しました。 http://www.solvasoft.nl/downloads.html で見つけることができます
sbtを使用している場合、 https://github.com/Banno/sbt-license-plugin があります