เครื่องมือสำหรับเพิ่มส่วนหัวใบอนุญาตให้กับไฟล์ต้นฉบับ? [ปิด]


90

ฉันกำลังมองหาเครื่องมือที่จะเพิ่มส่วนหัวใบอนุญาตให้กับไฟล์ต้นฉบับบางไฟล์ซึ่งบางส่วนมีส่วนหัวอยู่แล้ว มีเครื่องมือที่จะแทรกส่วนหัวหรือไม่ถ้ายังไม่มีอยู่

แก้ไข: ฉันตั้งใจที่จะไม่ทำเครื่องหมายคำตอบสำหรับคำถามนี้เนื่องจากคำตอบโดยทั่วไปแล้วจะขึ้นอยู่กับสภาพแวดล้อมและอัตนัย


5
"ฉันตั้งใจจะไม่ทำเครื่องหมายคำตอบสำหรับคำถามนี้เนื่องจากคำตอบนั้นขึ้นอยู่กับสภาพแวดล้อมและอัตนัย" คุณกำลังมองหาโซลูชันที่ไม่เชื่อเรื่องพระเจ้าเกี่ยวกับสภาพแวดล้อมเช่นรหัสหลอกหรือไม่? หากไม่เป็นเช่นนั้นโปรดแจ้งให้เราทราบว่าคุณกำลังทำงานกับสภาพแวดล้อมใด
jrummell

1
jrummell: ไม่ไม่ได้มองหาโซลูชันที่ไม่เชื่อเรื่องพระเจ้าต่อสิ่งแวดล้อม กำลังมองหาสิ่งที่ทีมงานหลายสภาพแวดล้อมที่ฉันอยู่สามารถใช้ได้
Alex Lyman

แอป windows UI ที่ให้คุณทำจะเป็นคำตอบที่ยอมรับได้หรือไม่?
Brady Moritz

@boomhauer ฉันกำลังมองหาแอพ windows UI คุณรู้หรือไม่?
จัส

ฉันเพิ่มคำตอบใหม่ด้านล่างมันควรทำแค่นี้
Brady Moritz

คำตอบ:


64
#!/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
สำหรับฉันใน "$ @" เป็นตัวเลือกที่ดีทีเดียว คุณยังสามารถสร้างสรรค์ได้ด้วยการชำระเงินหากระบบ VCS ของคุณต้องการสิ่งเหล่านี้
Jonathan Leffler

10
-1 คุณควรพูด"$i"
Aleks-Daniel Jakimenko-A

ฉันเดาว่านี่ใช้ไม่ได้ในไดเรกทอรีย่อยแบบวนซ้ำ :-(
knocte

3
@knocte แทนที่ for-loop ด้วยสิ่งนี้for i in $(find /folder -name '*.cc');เพื่อเรียกใช้สคริปต์ในไดเรกทอรีย่อย
Joyce

16

โซลูชัน Python แก้ไขตามความต้องการของคุณเอง

คุณสมบัติ:

  • จัดการส่วนหัว UTF (สำคัญสำหรับ IDE ส่วนใหญ่)
  • อัพเดตไฟล์ทั้งหมดซ้ำ ๆ ในไดเร็กทอรีเป้าหมายที่ส่งมาสก์ที่กำหนด (แก้ไขพารามิเตอร์. endwith สำหรับ filemask ของภาษาของคุณ (.c, .java, ..etc)
  • ความสามารถในการเขียนทับข้อความลิขสิทธิ์ก่อนหน้า (ระบุพารามิเตอร์ลิขสิทธิ์เก่าเพื่อดำเนินการนี้)
  • เลือกที่จะละเว้นไดเรกทอรีที่ระบุในอาร์เรย์ที่ยกเว้น

-

# 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
อาจจะไม่เจ็บที่จะพูดถึงสคริปต์ของคุณอยู่ใน python
Dana

16

ตรวจสอบส่วนหัวของลิขสิทธิ์ 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 <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 ./

นอกจากนี้ยังรองรับไฟล์ลิขสิทธิ์แบบกำหนดเองโดยใช้อาร์กิวเมนต์ --license-file


สิ่งนี้ดีมากยกเว้นว่าจะไม่ลบส่วนหัวที่กำหนดเองที่มีอยู่ :(
pgpb.padilla

3
คุณสามารถลบส่วนหัวที่มีอยู่ได้หากคุณสร้างเทมเพลตสำหรับพวกเขา ส่งเทมเพลตเป็นอาร์กิวเมนต์ไปยังสคริปต์ด้วย--license-fileอาร์กิวเมนต์และใช้--remove-pathแฟล็กเพื่อดึงส่วนหัวที่แน่นอนออกจากไฟล์ทั้งหมด โดยพื้นฐานแล้วมีส่วนหัวประเภทต่างๆมากมายการสร้างอัลกอริทึมเพื่อลบออกอย่างน่าเชื่อถือนั้นไม่ใช่เรื่องเล็กน้อย
Erik Osterman

1
เราเพิ่งเพิ่มการDockerfileติดตั้งการพึ่งพาทับทิมที่ยุ่งยากจึงไม่เป็นปัญหาอีกต่อไป
Erik Osterman

15

นี่คือสคริปต์ Bash ที่จะทำเคล็ดลับโดยสมมติว่าคุณมีส่วนหัวใบอนุญาตในไฟล์ license.txt:

ไฟล์ 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  

1
นิพจน์ sed จะทำงานได้ไม่ดีหากชื่อไฟล์มีตัวเลข ให้พิจารณาใช้cut -f1 -d ' '
schweerelos

1
@Rosenfield ใบเสนอราคาเดียวปิดไม่ได้อยู่ในคำสั่งการส่งออก
Talespin_Kit

ทำไมคุณถึงต้องมีวงเล็บในคำสั่ง find มันล้มเหลวสำหรับฉัน
knocte

13

แก้ไข: หากคุณใช้ eclipse มีปลั๊กอิน

ฉันเขียนสคริปต์ python อย่างง่ายตามคำตอบของ Silver Dragon ฉันต้องการโซลูชันที่ยืดหยุ่นมากขึ้นดังนั้นฉันจึงคิดสิ่งนี้ขึ้นมา ช่วยให้คุณสามารถเพิ่ม headerfile ให้กับไฟล์ทั้งหมดในไดเร็กทอรีแบบวนซ้ำ คุณสามารถเลือกที่จะเพิ่ม regex ที่ชื่อไฟล์ควรตรงกันและ regex ที่มีชื่อไดเร็กทอรีควรตรงกันและ regex ที่บรรทัดแรกในไฟล์ไม่ควรตรงกัน คุณสามารถใช้อาร์กิวเมนต์สุดท้ายนี้เพื่อตรวจสอบว่ารวมส่วนหัวไว้แล้วหรือไม่

สคริปต์นี้จะข้ามบรรทัดแรกในไฟล์โดยอัตโนมัติหากเริ่มต้นด้วย shebang (#!) เพื่อไม่ทำลายสคริปต์อื่น ๆ ที่อาศัยสิ่งนี้ หากคุณไม่ต้องการพฤติกรรมนี้คุณจะต้องแสดงความคิดเห็น 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()

3
ลิงก์เสียสำหรับปลั๊กอิน
mjaggard

ฉันคิดว่านี่อาจเป็นได้: wiki.eclipse.org/Development_Resources/…
mbdevpl

ฉันล้มเหลวในการใช้ Google อย่างละเอียดก่อนที่จะเขียนเวอร์ชันแพ็คเกจ python ของตัวเอง ฉันจะใช้วิธีแก้ปัญหาของคุณเพื่อการปรับปรุงในอนาคต github.com/zkurtz/license_proliferator
zkurtz


11

ตกลงนี่คือเครื่องมือ UI แบบธรรมดาสำหรับ Windows เท่านั้นที่ค้นหาไฟล์ทั้งหมดตามประเภทที่คุณระบุในโฟลเดอร์นำข้อความที่คุณต้องการไปไว้ด้านบนสุด (ข้อความใบอนุญาตของคุณ) และคัดลอกผลลัพธ์ไปยังไดเร็กทอรีอื่น (หลีกเลี่ยงปัญหาการเขียนทับที่อาจเกิดขึ้น) . นอกจากนี้ยังฟรี จำเป็น. Net 4.0

ฉันเป็นผู้เขียนจริงๆดังนั้นอย่าลังเลที่จะขอการแก้ไขหรือคุณสมบัติใหม่ ๆ ... ไม่มีสัญญาเกี่ยวกับกำหนดการส่งมอบ ;)

ข้อมูลเพิ่มเติม: License Header toolที่Amazify.com


นอกจากนี้ฉันขอขอบคุณข้อเสนอแนะใด ๆ เกี่ยวกับเรื่องนี้ขอบคุณ
Brady Moritz

1
ฉันชอบซอฟต์แวร์นี้มาก แต่จำเป็นต้องมีมาโครเพื่อป้อนชื่อไฟล์ไปที่ส่วนหัว Allso จะเป็นการดีที่จะแสดงรายการไฟล์ที่จะแก้ไขพร้อมตัวเลือกในการยกเว้นไฟล์ (:
hs2d

ขอบคุณมาโครและรายการยกเว้นเป็นความคิดที่ดี
Brady Moritz

ลิงก์ของคุณหมดอายุแล้ว ไม่สามารถดาวน์โหลดได้จากเว็บไซต์เช่นกัน
valijon

ขอบคุณฉันจะซ่อมให้
Brady Moritz

5

ตรวจสอบใบอนุญาตแอดเดอร์ รองรับไฟล์รหัสหลายไฟล์ (แม้แต่ไฟล์ที่กำหนดเอง) และจัดการส่วนหัวที่มีอยู่ได้อย่างถูกต้อง มาพร้อมกับเทมเพลตสำหรับใบอนุญาตโอเพ่นซอร์สที่พบบ่อยที่สุด


1
ขอบคุณสำหรับสิ่งนี้ที่license-adderคุณหมายถึง? ฉันพบlicense-adder - แอปพลิเคชัน. NET ฟรี - Google Project HostingและLicense-Adder ·สคริปต์ python แบบง่าย· GitHub
sdaau

GitHub พบแล้ว: github.com/sanandrea/License-Adder
koppor

4

นี่คือสิ่งที่ฉันรีดใน 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();

3

นี่คือสิ่งที่ฉันพบในรายการ Apache มันเขียนด้วย Ruby และดูเหมือนง่ายพอที่จะอ่าน คุณควรจะเรียกมันจากคราดเพื่อความสวยงามพิเศษเป็นพิเศษ :)


1

หากคุณยังจำเป็นต้องมีเครื่องมือเล็ก ๆ น้อยฉันได้เขียนชื่อSrcHead คุณสามารถค้นหาได้ที่http://www.solvasoft.nl/downloads.html


3
จากหน้าดาวน์โหลด: "ถูกเขียนขึ้นสำหรับ Windows และต้องใช้. NET Framework 2.0 เพื่อให้ทำงานได้"
Riccardo Murri

เพิ่มส่วนหัวสไตล์ C / C ++ และ Unicode BOM ความหมาย: เนื้อหาของheader.txtจะอยู่ข้างหน้า//ในแต่ละบรรทัดและบรรทัดแรกเริ่มต้นด้วย Unicode BOM
koppor

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.