Công cụ để thêm tiêu đề giấy phép vào tệp nguồn? [đóng cửa]


89

Tôi đang tìm kiếm một công cụ có thể thêm hàng loạt tiêu đề giấy phép vào một số tệp nguồn, một số tệp đã có tiêu đề. Có một công cụ nào đó sẽ chèn một tiêu đề, nếu nó chưa có?

Chỉnh sửa: Tôi cố ý không đánh dấu câu trả lời cho câu hỏi này, vì các câu trả lời về cơ bản là tất cả các câu trả lời theo môi trường cụ thể và chủ quan


5
"Tôi cố ý không đánh dấu câu trả lời cho câu hỏi này, vì các câu trả lời về cơ bản là tất cả các câu trả lời về môi trường cụ thể và chủ quan" Bạn đang tìm kiếm một giải pháp bất khả tri về môi trường, chẳng hạn như mã giả? Nếu không, vui lòng cho chúng tôi biết bạn đang làm việc với môi trường nào.
jrummell

1
jrummell: Không, không phải tìm kiếm một giải pháp bất khả tri với môi trường. Đang tìm kiếm những thứ mà một nhóm đa môi trường mà tôi đã tham gia có thể sử dụng.
Alex Lyman

một ứng dụng Windows UI có cho phép bạn làm điều này, có phải là một câu trả lời chấp nhận được không?
Brady Moritz

@boomhauer Tôi đang tìm ứng dụng Windows UI. Bạn có biết cái nào không?
Jus12

Tôi đã thêm một câu trả lời mới bên dưới, nó sẽ làm được điều này.
Brady Moritz,

Câu trả lời:


61
#!/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 với tôi trong "$ @" là một lựa chọn khá tốt. Bạn cũng có thể sáng tạo với các thanh toán nếu hệ thống VCS của bạn cần những thứ đó.
Jonathan Leffler 30/09/08

10
-1, bạn nên trích dẫn"$i"
Aleks-Daniel Jakimenko-A.

Tôi đoán đây không làm việc trong thư mục con đệ quy :-(
knocte

2
@knocte Thay thế cho vòng lặp với điều này for i in $(find /folder -name '*.cc');để chạy các script trên thư mục con
Joyce

16

Giải pháp Python, sửa đổi theo nhu cầu của riêng bạn

Đặc trưng:

  • xử lý các tiêu đề UTF (quan trọng đối với hầu hết các IDE)
  • cập nhật đệ quy tất cả các tệp trong thư mục đích truyền mặt nạ đã cho (sửa đổi tham số .endswith cho mặt nạ tệp của ngôn ngữ của bạn (.c, .java, ..etc)
  • khả năng ghi đè văn bản bản quyền trước đó (cung cấp thông số bản quyền cũ để thực hiện việc này)
  • tùy chọn bỏ qua các thư mục được cung cấp trong mảng loại trừ

-

# 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
Có lẽ sẽ không có hại khi đề cập đến tập lệnh của bạn là trong python.
Dana

16

Kiểm tra tiêu đề bản quyền RubyGem. Nó hỗ trợ các tệp có phần mở rộng kết thúc bằng php, c, h, cpp, hpp, hh, rb, css, js, html. Nó cũng có thể thêm và xóa tiêu đề.

Cài đặt nó bằng cách gõ " sudo gem install copyright-header"

Sau đó, có thể làm điều gì đó như:

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

Nó cũng hỗ trợ các tệp giấy phép tùy chỉnh bằng cách sử dụng đối số --license-file.


Này là rất tốt ngoại trừ việc nó không loại bỏ tiêu đề tùy chỉnh hiện :(
pgpb.padilla

3
Bạn có thể xóa các tiêu đề hiện có nếu bạn tạo mẫu cho chúng. Chuyển mẫu làm đối số cho tập lệnh có --license-fileđối số và sử dụng --remove-pathcờ để tách tiêu đề chính xác đó khỏi tất cả các tệp. Về cơ bản, có rất nhiều loại tiêu đề khác nhau, việc tạo ra một thuật toán để loại bỏ chúng một cách đáng tin cậy là không hề nhỏ.
Erik Osterman

1
Chúng tôi vừa mới bổ sung thêm một Dockerfilevì vậy cài đặt phụ thuộc ruby phiền hà không còn là một vấn đề
Erik Osterman

15

Đây là một tập lệnh Bash sẽ thực hiện thủ thuật, giả sử bạn có tiêu đề giấy phép trong tệp license.txt:

Tệp 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  

Bây giờ chạy điều này trong thư mục nguồn của bạn:

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

1
Biểu thức sed sẽ không hoạt động tốt nếu tên tệp chứa các chữ số. Thay vào đó, hãy xem xét sử dụngcut -f1 -d ' '
schweerelos

1
@Rosenfield Dấu nháy đơn kết thúc bị thiếu trong báo cáo xuất.
Talespin_Kit

tại sao bạn cần dấu ngoặc đơn trong lệnh find? nó thất bại đối với tôi
knocte

13

Chỉnh sửa: Nếu bạn đang sử dụng eclipse, có một plugin

Tôi đã viết một kịch bản python đơn giản dựa trên câu trả lời của Silver Dragon. Tôi cần một giải pháp linh hoạt hơn nên tôi đã nghĩ ra điều này. Nó cho phép bạn thêm một tệp tiêu đề vào tất cả các tệp trong một thư mục, một cách đệ quy. Bạn có thể tùy chọn thêm một regex mà các tên tệp phải khớp và một regex cho các tên thư mục phải khớp và một regex mà dòng đầu tiên trong tệp không khớp. Bạn có thể sử dụng đối số cuối cùng này để kiểm tra xem tiêu đề đã được bao gồm chưa.

Tập lệnh này sẽ tự động bỏ qua dòng đầu tiên trong tệp nếu điều này bắt đầu bằng shebang (#!). Điều này để không phá vỡ các tập lệnh khác dựa vào điều này. Nếu bạn không muốn hành vi này, bạn sẽ phải bình luận 3 dòng trong giấy viết thư.

nó đây:

#!/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
Liên kết bị phá vỡ cho các plugin
mjaggard

Tôi nghĩ đây có thể là nó: wiki.eclipse.org/Development_Resources/…
mbdevpl Ngày

Tôi đã không thể google kỹ lưỡng trước khi viết phiên bản gói python của riêng mình về điều này. Tôi có thể sẽ rút ra giải pháp của bạn để cải tiến trong tương lai. github.com/zkurtz/license_proliferator
zkurtz Ngày


11

Ok đây là một công cụ giao diện người dùng chỉ dành cho cửa sổ đơn giản giúp tìm kiếm tất cả các tệp thuộc loại được chỉ định của bạn trong một thư mục, thêm văn bản bạn muốn lên đầu (văn bản giấy phép của bạn) và sao chép kết quả vào một thư mục khác (tránh các sự cố ghi đè tiềm ẩn) . Nó cũng miễn phí. Yêu cầu .Net 4.0.

Tôi thực sự là tác giả, vì vậy hãy thoải mái yêu cầu các bản sửa lỗi hoặc các tính năng mới ... mặc dù không có lời hứa về lịch trình giao hàng. ;)

thêm thông tin: Công cụ Tiêu đề Giấy phép tại Amazify.com


Ngoài ra, tôi đánh giá cao bất kỳ thông tin phản hồi về vấn đề này, nhờ
Brady Moritz

1
Tôi thực sự thích phần mềm nhưng cần có macro để nhập tên tệp vào tiêu đề. Allso sẽ rất tuyệt khi hiển thị danh sách các tệp sẽ được chỉnh sửa với tùy chọn loại trừ tệp. (:
hs2d

Cảm ơn, vĩ mô và danh sách loại trừ là một ý tưởng tuyệt vời
Brady Moritz

Liên kết của bạn đã hết hạn. Cũng không thể tải xuống từ trang web
valijon

Cảm ơn, tôi sẽ sửa nó
Brady Moritz

5

Kiểm tra trình bổ sung giấy phép. Nó hỗ trợ nhiều tệp mã (ngay cả những tệp tùy chỉnh) và xử lý chính xác các tiêu đề hiện có. Đã có sẵn các mẫu cho các giấy phép Nguồn mở phổ biến nhất.


1
Cảm ơn vì điều này, license-adderchính xác là bạn đang đề cập đến? Tôi đã tìm thấy giấy phép cộng - ứng dụng .NET miễn phí - Dự án Google Hosting , và Giấy phép-Adder · đơn giản python script · GitHub
sdaau

GitHub bây giờ thấy: github.com/sanandrea/License-Adder
koppor

4

Đây là một trong những tôi đã sử dụng PHP để sửa đổi các tệp PHP. Tôi cũng có thông tin giấy phép cũ cần xóa để nó thay thế văn bản cũ trước, sau đó thêm văn bản mới ngay sau khi mở

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


1

Nếu bạn vẫn cần, có một công cụ nhỏ mà tôi đã viết, tên là SrcHead . Bạn có thể tìm thấy nó tại http://www.solvasoft.nl/downloads.html


3
Từ trang tải xuống: "Nó được viết cho Windows và cần .NET Framework 2.0 để hoạt động."
Riccardo Murri,

Thêm tiêu đề kiểu C / C ++ và BOM Unicode. Ý nghĩa: Nội dung của header.txtđược thêm vào trước //ở mỗi dòng và dòng đầu tiên bắt đầu bằng Unicode BOM.
koppor

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.