Original Article: cloc
Author: Al Danial

README.md

cloc

Contagem de linhas de código


cloc conta linhas em branco, linhas de comentários e linhas físicas de código fonte em muitas linguagens de programação.

Última versão: v1.74 (8 de setembro de 2017)

Hospedado em http://cloc.sourceforge.net/ desde agosto de 2006, o cloc começou a transição para o GitHub em setembro de 2015.

Começo rápido ▲

Passo 1: Baixar cloc (vários métodos, veja abaixo).

Passo 2: Abra um terminal (cmd.exe no Windows).

Passo 3: invoque cloc para contar seus arquivos de origem, diretórios ou arquivos. O nome do executável difere dependendo se você usa a versão de origem de desenvolvimento (cloc), fonte para uma versão lançada (cloc-1.74.pl) ou um executável do Windows (cloc-1.74.exe). Nesta pagina, cloc é o termo genérico usado para se referir a qualquer um desses.

um arquivo

prompt> cloc hello.c
       1 text file.
       1 unique file.
       0 files ignored.

https://github.com/AlDanial/cloc v 1.65  T=0.04 s (28.3 files/s, 340.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                                1              0              7              5
-------------------------------------------------------------------------------

a directory

prompt> cloc gcc-5.2.0/gcc/c
      16 text files.
      15 unique files.
       3 files ignored.

https://github.com/AlDanial/cloc v 1.65  T=0.23 s (57.1 files/s, 188914.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               10           4680           6621          30812
C/C++ Header                     3             99            286            496
-------------------------------------------------------------------------------
SUM:                            13           4779           6907          31308
-------------------------------------------------------------------------------

an archive

We'll pull cloc's source zip file from GitHub, then count the contents:

prompt> wget https://github.com/AlDanial/cloc/archive/master.zip

prompt> cloc master.zip
https://github.com/AlDanial/cloc v 1.65  T=0.07 s (26.8 files/s, 141370.3 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                             2            725           1103           8713
-------------------------------------------------------------------------------
SUM:                             2            725           1103           8713
-------------------------------------------------------------------------------

um repositório git, usando um commit específico

Este exemplo usa código de PuDB, um fantástico debugador de Python.

prompt> git clone http://git.tiker.net/trees/pudb.git

prompt> cd pudb

prompt> cloc 6be804e07a5db
      48 text files.
      48 unique files.
      15 files ignored.

github.com/AlDanial/cloc v 1.73  T=0.15 s (223.1 files/s, 46159.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                          28           1519            728           4659
YAML                             2              9              2             75
Bourne Shell                     3              6              0             17
make                             1              4              6             10
-------------------------------------------------------------------------------
SUM:                            34           1538            736           4761
-------------------------------------------------------------------------------

cada subdiretório de um diretório particular

Digamos que você tenha um diretório com três projetos gerenciados por git diferentes, Project0, Project1, e Project2. Você pode usar a capacidade de loop do seu shell para contar o código em cada um. Este exemplo usa bash:

prompt> for d in ./*/ ; do (cd "$d" && echo "$d" && cloc --vcs git); done
./Project0/
7 text files.
       7 unique files.
       1 file ignored.

github.com/AlDanial/cloc v 1.71  T=0.02 s (390.2 files/s, 25687.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
D                                4             61             32            251
Markdown                         1              9              0             38
make                             1              0              0              4
-------------------------------------------------------------------------------
SUM:                             6             70             32            293
-------------------------------------------------------------------------------
./Project1/
       7 text files.
       7 unique files.
       0 files ignored.

github.com/AlDanial/cloc v 1.71  T=0.02 s (293.0 files/s, 52107.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Go                               7            165            282            798
-------------------------------------------------------------------------------
SUM:                             7            165            282            798
-------------------------------------------------------------------------------
./Project2/
      49 text files.
      47 unique files.
      13 files ignored.

github.com/AlDanial/cloc v 1.71  T=0.10 s (399.5 files/s, 70409.4 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                          33           1226           1026           3017
C                                4            327            337            888
Markdown                         1             11              0             28
YAML                             1              0              2             12
-------------------------------------------------------------------------------
SUM:                            39           1564           1365           3945
-------------------------------------------------------------------------------

Visão geral ▲

cloc conta linhas em branco, linhas de comentários e linhas físicas do código fonte em muitas linguagens de programação. Dado duas versões de uma base de código, o cloc pode calcular diferenças em linhas em branco, comentários e fontes. É escrito inteiramente no Perl sem dependências fora da distribuição padrão do Perl v5.6 e superior (o código de alguns módulos externos é incorporado no cloc) e por isso é bastante portátil. O cloc é conhecido por funcionar em muitos sabores do Linux, FreeBSD, NetBSD, OpenBSD, Mac OS X, AIX, HP-UX, Solaris, IRIX, z / OS e Windows (Para executar a versão de origem Perl do cloc no Windows one precisa ActiveState Perl 5.6.1 ou superior, Strawberry Perl, Cygwin, ou MobaXTerm com o plug-in Perl instalado. Alternativamente, pode-se usar o binário Windows de cloc gerado com PAR::Packer para executar em computadores Windows que não possuem Perl nem Cygwin.)

Cloc contém código de David Wheeler SLOCCount, Damian Conway e o módulo Perl de Abigail Regexp::Common, Módulo Perl de Sean M. Burke Win32::Autoglob, e o módulo Perl de Tye McQueen Algorithm::Diff. Os fatores de escala de linguagem foram derivados do site da Mayes Consulting, LLC http://softwareestimator.com/IndustryData2.htm.

Instalar através do gerenciador de pacotes

Dependendo do seu sistema operacional, um desses métodos de instalação pode funcionar para você:

npm install -g cloc                    # https://www.npmjs.com/package/cloc
sudo apt-get install cloc              # Debian, Ubuntu
sudo yum install cloc                  # Red Hat, Fedora
sudo dnf install cloc                  # Fedora 22 or later
sudo pacman -S cloc                    # Arch
emerge -av dev-util/cloc               # Gentoo https://packages.gentoo.org/packages/dev-util/cloc
sudo pkg install cloc                  # FreeBSD
sudo port install cloc                 # Mac OS X with MacPorts
brew install cloc                      # Mac OS X with Homebrew
choco install cloc                     # Windows with Chocolatey
scoop install cloc                     # Windows with Scoop

Nota: Não controlo nenhum desses pacotes. Se você encontrar um bug no cloc usando um dos pacotes acima, tente com o cloc tirado da última versão estável aqui no github (link abaixo) antes de enviar um relatório de problema.

Versão estável

https://github.com/AlDanial/cloc/releases/latest

Versão de desenvolvimento

https://github.com/AlDanial/cloc/raw/master/cloc

Licença ▲

O cloc é licenciado sob o GNU General Public License, v 2, excluindo porções que são copiadas de outras fontes. O código copiado dos módulos Regexp :: Common, Win32 :: Autoglob e Algorithm :: Diff Perl está sujeito à Licença artística.

Por que usar cloc? ▲

O cloc tem muitos recursos que facilitam o uso, completos, extensíveis e portáteis.:

  1. Existe como um único arquivo autônomo que exige um mínimo de esforço de instalação --- basta baixar o arquivo e executá-lo.
  2. Pode ler definições de comentários de idioma de um arquivo e, portanto, potencialmente trabalhar com linguagens de computador que ainda não existem.
  3. Permite que os resultados de várias corridas sejam resumidos por idioma e por projeto.
  4. Pode produzir resultados em uma variedade de formatos: texto simples, SQL, JSON, XML, YAML, valores separados por vírgula.
  5. Pode contar código dentro de arquivos compactados (bolas de alcatrão, arquivos zip, arquivos Java .ear).
  6. Tem inúmeras opções de solução de problemas.
  7. Manipula nomes de arquivos e diretórios com espaços e outros caracteres incomuns.
  8. Não há dependências fora da distribuição padrão de Perl.
  9. Funciona em sistemas Linux, FreeBSD, NetBSD, OpenBSD, Mac OS X, AIX, HP-UX, Solaris, IRIX e z / OS que possuem Perl 5.6 ou superior. A versão original é executada no Windows com plug-in ActiveState Perl, Strawberry Perl, Cygwin ou MobaXTerm + Perl. Alternativamente, no Windows, pode-se executar o binário do Windows que não possui dependências.

Outros contadores ▲

Se o cloc não se adequar às suas necessidades aqui estão outros contadores disponíveis gratuitamente para considerar:

Outras referências:

Regexp::Common, Digest::MD5, Win32::Autoglob, Algorithm::Diff

Embora o cloc não precise de módulos Perl fora dos encontrados na distribuição padrão, o cloc depende de alguns módulos externos. Código de três desses módulos externos - Regexp :: Common, Win32 :: Autoglob e Algorithm :: Diff - está incorporado dentro do cloc. Um quarto módulo, Digest :: MD5, é usado somente se estiver disponível. Se o cloc encontrar Regexp :: Common ou Algorithm :: Diff instalado localmente, ele usará a instalação. Se isso não acontecer, o cloc instalará as partes do Regexp :: Common e / ou Algorithm: Diff, ele precisa de diretórios temporários que são criados no início de uma corrida de cloc, em seguida, removidos quando a execução estiver concluída. O código necessário do Regexp :: Common v2.120 e Algorithm :: Diff v1.1902 são incorporados no código-fonte do cloc (veja as sub-rotinas Install_Regexp_Common() e Install_Algorithm_Diff() ). Apenas são necessárias três linhas do Win32 :: Autoglob e estas estão incluídas diretamente no cloc.

Além disso, o cloc usará o Digest :: MD5 para validar a singularidade entre os arquivos de entrada se o Digest :: MD5 estiver instalado localmente. Se Digest :: MD5 não for encontrado, a verificação da unicidade do arquivo é ignorada.

O binário do Windows é construído em um computador que possui Regexp :: Common e Digest :: MD5 instalado localmente.

Criando um executável do Windows ▲

Os três downloads mais recentes do Windows, cloc-1.70.exe, cloc-1.72.exe, ane cloc-1.74.exe, foram construidos com PAR::Packer e Strawberry Perl 5.24.0.1 em uma instância do t2.micro de Web Services da Amazon com 32 bits do Microsoft Windows Server 2008.

O cloc-1.66.exe executável foi construído com PAR::Packer em uma imagem do Windows 7 VirtualBox de 32 bits retirado de https://dev.windows.com/en-us/microsoft-edge/tools/vms/linux/ e executando em um host Ubuntu 15.10. A máquina virtual funcionou Strawberry Perl versão 5.22.1. Os executáveis do Windows de versões cloc 1.60 e anteriores foram criados com perl2exe em um computador Windows XP de 32 bits. Uma pequena modificação foi feita no código-fonte do cloc antes de passá-lo para perl2exe; as linhas 87 e 88 não foram feitas:

85  # Uncomment next two lines when building Windows executable with perl2exe
86  # or if running on a system that already has Regexp::Common.
87  #use Regexp::Common;
88  #$HAVE_Rexexp_Common = 1;

O executável do Windows é seguro para ser executado? Tem malware?

Idealmente, ninguém precisaria do executável do Windows porque eles têm um intérprete Perl instalado em suas máquinas e podem executar o arquivo de fonte do cloc. Em máquinas corporativas Windows geridas de forma centralizada, no entanto, isso pode ser difícil ou impossível.

O executável do Windows distribuído com cloc é fornecido como o melhor esforço de um vírus e livre de malware .exe. Você é encorajado a executar seus próprios scanners de vírus contra o executável e também verificar sites como https://www.virustotal.com/ . As entradas para versões recentes são:

cloc 1.72 exe: https://www.virustotal.com/en/url/8fd2af5cd972f648d7a2d7917bc202492012484c3a6f0b48c8fd60a8d395c98c/analysis/

cloc 1.70 exe: https://www.virustotal.com/en/url/63edef209099a93aa0be1a220dc7c4c7ed045064d801e6d5daa84ee624fc0b4a/analysis/

cloc 1.68 exe: https://www.virustotal.com/en/file/c484fc58615fc3b0d5569b9063ec1532980281c3155e4a19099b11ef1c24443b/analysis/

cloc 1.66 exe: https://www.virustotal.com/en/file/54d6662e59b04be793dd10fa5e5edf7747cf0c0cc32f71eb67a3cf8e7a171d81/analysis/1453601367/

Por que o executável do Windows é tão grande?

Os executáveis do Windows de cloc versões 1.60 e anteriores, criados com perl2exe como mencionado acima, são cerca de 1.6 MB, enquanto as versões 1.62 e 1.54, criadas com PAR::Packer, são 11 MB. Versão 1.66, construída com uma versão mais recente de PAR::Packer, é de cerca de 5,5 MB. Por que o PAR::Packer, executáveis muito maiores do que os construídos com perl2exe? Minha teoria é que perl2exe usa uma lógica de poda de árvore mais inteligente do que PAR::Packer, mas essa é pura especulação.

Crie seu próprio executável

A opção mais robusta para criar um Windows executável de clock é útil Kit de Desenvolvimento Perl do ActiveState. Inclui uma utilidade, perlapp, que pode criar binários Windows, Mac e Linux independentes do código-fonte Perl.

perl2exe também vai fazer o truque. Se você tiver perl2exe, modifique as linhas 84-87 no código-fonte do cloc para uma modificação de código menor que seja necessária para tornar um executável do cloc do Windows.

Caso contrário, para criar um executável do Windows com pp do PAR::Packer, primeiro instale uma distribuição Perl baseada no Windows (por exemplo, Strawberry Perl ou ActivePerl) seguindo suas instruções. Em seguida, abra um prompt de comando, também conhecido como uma janela do DOS e instale o módulo PAR :: Packer. Finalmente, invoque o comando pp recém-instalado com o código-fonte do cloc para criar um arquivo .exe:

C:> cpan -i Digest::MD5
C:> cpan -i Regexp::Common
C:> cpan -i Algorithm::Diff
C:> cpan -i PAR::Packer
C:> pp -M Digest::MD5 -c -x -o cloc-1.74.exe cloc

Uma variação nas instruções acima é se você instalou a versão portátil do Strawberry Perl, você precisará executar portableshell.bat primeiro, configure corretamente o seu ambiente.

Uso básico ▲

cloc é um programa de linha de comando que leva nomes de arquivo, diretório e / ou arquivo como entradas. Aqui está um exemplo de execução de cloc contra a distribuição de origem do Perl v5.22.0:

prompt> cloc perl-5.22.0.tar.gz
    5605 text files.
    5386 unique files.
    2176 files ignored.

https://github.com/AlDanial/cloc v 1.65  T=25.49 s (134.7 files/s, 51980.3 lines/s)
-----------------------------------------------------------------------------------
Language                         files          blank        comment           code
-----------------------------------------------------------------------------------
Perl                              2892         136396         184362         536445
C                                  130          24676          33684         155648
C/C++ Header                       148           9766          16569         147858
Bourne Shell                       112           4044           6796          42668
Pascal                               8            458           1603           8592
XML                                 33            142              0           2410
YAML                                49             20             15           2078
C++                                 10            313            277           2033
make                                 4            426            488           1986
Prolog                              12            438              2           1146
JSON                                14              1              0           1037
yacc                                 1             85             76            998
Windows Message File                 1            102             11            489
DOS Batch                           14             92             41            389
Windows Resource File                3             10              0             85
D                                    1              5              7              8
Lisp                                 2              0              3              4
-----------------------------------------------------------------------------------
SUM:                              3434         176974         243934         903874
-----------------------------------------------------------------------------------

Para executar o cloc em computadores com Windows, primeiro é preciso abrir uma janela de comando (aka DOS) e invocar cloc.exe da linha de comando lá.

Opções ▲

prompt> cloc --help

Usage: cloc [options]  |   | 

 Count, or compute differences of, physical lines of source code in the
 given files (may be archives such as compressed tarballs or zip files)
 and/or recursively below the given directories.

 Input Options
   --extract-with=CMD        This option is only needed if cloc is unable
                             to figure out how to extract the contents of
                             the input file(s) by itself.
                             Use CMD to extract binary archive files (e.g.:
                             .tar.gz, .zip, .Z).  Use the literal '>FILE<' as
                             a stand-in for the actual file(s) to be
                             extracted.  For example, to count lines of code
                             in the input files
                                gcc-4.2.tar.gz  perl-5.8.8.tar.gz
                             on Unix use
                               --extract-with='gzip -dc >FILE< | tar xf -'
                             or, if you have GNU tar,
                               --extract-with='tar zxf >FILE<'
                             and on Windows use, for example:
                               --extract-with="\"c:\Program Files\WinZip\WinZip32.exe\" -e -o >FILE< ."
                             (if WinZip is installed there).
   --list-file=FILE          Take the list of file and/or directory names to
                             process from FILE, which has one file/directory
                             name per line.  Only exact matches are counted;
                             relative path names will be resolved starting from
                             the directory where cloc is invoked.
                             See also --exclude-list-file.
   --vcs=VCS                 Invoke a system call to VCS to obtain a list of
                             files to work on.  If VCS is 'git', then will
                             invoke 'git ls-files' to get a file list and
                             'git submodule status' to get a list of submodules
                             whose contents will be ignored.  See also --git
                             which accepts git commit hashes and branch names.
                             If VCS is 'svn' then will invoke 'svn list -R'.
                             The primary benefit is that cloc will then skip
                             files explicitly excluded by the versioning tool
                             in question, ie, those in .gitignore or have the
                             svn:ignore property.
                             Alternatively VCS may be any system command
                             that generates a list of files.
                             Note:  cloc must be in a directory which can read
                             the files as they are returned by VCS.  cloc will
                             not download files from remote repositories.
                             'svn list -R' may refer to a remote repository
                             to obtain file names (and therefore may require
                             authentication to the remote repository), but
                             the files themselves must be local.
   --unicode                 Check binary files to see if they contain Unicode
                             expanded ASCII text.  This causes performance to
                             drop noticeably.

 Processing Options
   --autoconf                Count .in files (as processed by GNU autoconf) of
                             recognized languages.  See also --no-autogen.
   --by-file                 Report results for every source file encountered.
   --by-file-by-lang         Report results for every source file encountered
                             in addition to reporting by language.
   --count-and-diff SET1 SET2
                             First perform direct code counts of source file(s)
                             of SET1 and SET2 separately, then perform a diff
                             of these.  Inputs may be pairs of files, directories,
                             or archives.  If --out or --report-file is given,
                             three output files will be created, one for each
                             of the two counts and one for the diff.  See also
                             --diff, --diff-alignment, --diff-timeout,
                             --ignore-case, --ignore-whitespace.
   --diff SET1 SET2          Compute differences in code and comments between
                             source file(s) of SET1 and SET2.  The inputs
                             may be any mix of files, directories, archives,
                             or git commit hashes (Unix only).
                             Use --diff-alignment to generate a list showing
                             which file pairs where compared.  See also
                             --count-and-diff, --diff-alignment, --diff-timeout,
                             --ignore-case, --ignore-whitespace.
   --diff-timeout N          Ignore files which take more than N seconds
                             to process.  Default is 10 seconds.
                             (Large files with many repeated lines can cause
                             Algorithm::Diff::sdiff() to take hours.)
   --follow-links            [Unix only] Follow symbolic links to directories
                             (sym links to files are always followed).
   --force-lang=LANG,EXT
                             Process all files that have a EXT extension
                             with the counter for language LANG.  For
                             example, to count all .f files with the
                             Fortran 90 counter (which expects files to
                             end with .f90) instead of the default Fortran 77
                             counter, use
                               --force-lang="Fortran 90",f
                             If EXT is omitted, every file will be counted
                             with the LANG counter.  This option can be
                             specified multiple times (but that is only
                             useful when EXT is given each time).
                             See also --script-lang, --lang-no-ext.
   --force-lang-def=FILE     Load language processing filters from FILE,
                             then use these filters instead of the built-in
                             filters.  Note:  languages which map to the same
                             file extension (for example:
                             MATLAB/Mathematica/Objective C/MUMPS/Mercury;
                             Pascal/PHP; Lisp/OpenCL; Lisp/Julia; Perl/Prolog)
                             will be ignored as these require additional
                             processing that is not expressed in language
                             definition files.  Use --read-lang-def to define
                             new language filters without replacing built-in
                             filters (see also --write-lang-def).
   --git                     Forces the inputs to be interpreted as git targets
                             (commit hashes, branch names, et cetera) if these
                             are not first identified as file or directory
                             names.  This option overrides the --vcs=git logic
                             if this is given; in other words, --git gets its
                             list of files to work on directly from git using
                             the hash or branch name rather than from
                             'git ls-files'.  This option can be used with
                             --diff to perform line count diffs between git
                             commits, or between a git commit and a file,
                             directory, or archive.  Use -v/--verbose to see
                             the git system commands cloc issues.
   --ignore-whitespace       Ignore horizontal white space when comparing files
                             with --diff.  See also --ignore-case.
   --ignore-case             Ignore changes in case; consider upper- and lower-
                             case letters equivalent when comparing files with
                             --diff.  See also --ignore-whitespace.
   --lang-no-ext=LANG        Count files without extensions using the LANG
                             counter.  This option overrides internal logic
                             for files without extensions (where such files
                             are checked against known scripting languages
                             by examining the first line for #!).  See also
                             --force-lang, --script-lang.
   --max-file-size=MB        Skip files larger than MB megabytes when
                             traversing directories.  By default, MB=100.
                             cloc's memory requirement is roughly twenty times
                             larger than the largest file so running with
                             files larger than 100 MB on a computer with less
                             than 2 GB of memory will cause problems.
                             Note:  this check does not apply to files
                             explicitly passed as command line arguments.
   --no-autogen[=list]       Ignore files generated by code-production systems
                             such as GNU autoconf.  To see a list of these files
                             (then exit), run with --no-autogen list
                             See also --autoconf.
   --original-dir            [Only effective in combination with
                             --strip-comments]  Write the stripped files
                             to the same directory as the original files.
   --read-binary-files       Process binary files in addition to text files.
                             This is usually a bad idea and should only be
                             attempted with text files that have embedded
                             binary data.
   --read-lang-def=FILE      Load new language processing filters from FILE
                             and merge them with those already known to cloc.
                             If FILE defines a language cloc already knows
                             about, cloc's definition will take precedence.
                             Use --force-lang-def to over-ride cloc's
                             definitions (see also --write-lang-def ).
   --script-lang=LANG,S      Process all files that invoke S as a #!
                             scripting language with the counter for language
                             LANG.  For example, files that begin with
                                #!/usr/local/bin/perl5.8.8
                             will be counted with the Perl counter by using
                                --script-lang=Perl,perl5.8.8
                             The language name is case insensitive but the
                             name of the script language executable, S,
                             must have the right case.  This option can be
                             specified multiple times.  See also --force-lang,
                             --lang-no-ext.
   --sdir=DIR                Use DIR as the scratch directory instead of
                             letting File::Temp chose the location.  Files
                             written to this location are not removed at
                             the end of the run (as they are with File::Temp).
   --skip-uniqueness         Skip the file uniqueness check.  This will give
                             a performance boost at the expense of counting
                             files with identical contents multiple times
                             (if such duplicates exist).
   --stdin-name=FILE         Give a file name to use to determine the language
                             for standard input.  (Use - as the input name to
                             receive source code via STDIN.)
   --strip-comments=EXT      For each file processed, write to the current
                             directory a version of the file which has blank
                             and commented lines removed (in-line comments
                             persist).  The name of each stripped file is the
                             original file name with .EXT appended to it.
                             It is written to the current directory unless
                             --original-dir is on.
   --sum-reports             Input arguments are report files previously
                             created with the --report-file option.  Makes
                             a cumulative set of results containing the
                             sum of data from the individual report files.
   --unix                    Override the operating system autodetection
                             logic and run in UNIX mode.  See also
                             --windows, --show-os.
   --use-sloccount           If SLOCCount is installed, use its compiled
                             executables c_count, java_count, pascal_count,
                             php_count, and xml_count instead of cloc's
                             counters.  SLOCCount's compiled counters are
                             substantially faster than cloc's and may give
                             a performance improvement when counting projects
                             with large files.  However, these cloc-specific
                             features will not be available: --diff,
                             --count-and-diff, --strip-comments, --unicode.
   --windows                 Override the operating system autodetection
                             logic and run in Microsoft Windows mode.
                             See also --unix, --show-os.

 Filter Options
   --exclude-dir=D1[,D2,]    Exclude the given comma separated directories
                             D1, D2, D3, et cetera, from being scanned.  For
                             example  --exclude-dir=.cache,test  will skip
                             all files and subdirectories that have /.cache/
                             or /test/ as their parent directory.
                             Directories named .bzr, .cvs, .hg, .git, .svn,
                             and .snapshot are always excluded.
                             This option only works with individual directory
                             names so including file path separators is not
                             allowed.  Use --fullpath and --not-match-d=REGEX
                             to supply a regex matching multiple subdirectories.
   --exclude-ext=EXT1[,EXT2[...]]
                             Do not count files having the given file name
                             extensions.
   --exclude-lang=L1[,L2,]   Exclude the given comma separated languages
                             L1, L2, L3, et cetera, from being counted.
   --exclude-list-file=FILE  Ignore files and/or directories whose names
                             appear in FILE.  FILE should have one file
                             name per line.  Only exact matches are ignored;
                             relative path names will be resolved starting from
                             the directory where cloc is invoked.
                             See also --list-file.
   --fullpath                Modifies the behavior of --match-f, --not-match-f,
                             and --not-match-d to include the file's path
                             in the regex, not just the file's basename.
                             (This does not expand each file to include its
                             absolute path, instead it uses as much of
                             the path as is passed in to cloc.)
                             Note:  --match-d always looks at the full
                             path and therefore is unaffected by --fullpath.
   --include-lang=L1[,L2,]   Count only the given comma separated languages
                             L1, L2, L3, et cetera.
   --match-d=REGEX           Only count files in directories matching the Perl
                             regex.  For example
                               --match-d='/(src|include)/'
                             only counts files in directories containing
                             /src/ or /include/.  Unlike --not-match-d,
                             --match-f, and --not-match-f, --match-d always
                             compares the fully qualified path against the
                             regex.
   --not-match-d=REGEX       Count all files except those in directories
                             matching the Perl regex.  Only the trailing
                             directory name is compared, for example, when
                             counting in /usr/local/lib, only 'lib' is
                             compared to the regex.
                             Add --fullpath to compare parent directories to
                             the regex.
                             Do not include file path separators at the
                             beginning or end of the regex.
   --match-f=REGEX           Only count files whose basenames match the Perl
                             regex.  For example
                               --match-f='^[Ww]idget'
                             only counts files that start with Widget or widget.
                             Add --fullpath to include parent directories
                             in the regex instead of just the basename.
   --not-match-f=REGEX       Count all files except those whose basenames
                             match the Perl regex.  Add --fullpath to include
                             parent directories in the regex instead of just
                             the basename.
   --skip-archive=REGEX      Ignore files that end with the given Perl regular
                             expression.  For example, if given
                               --skip-archive='(zip|tar(.(gz|Z|bz2|xz|7z))?)'
                             the code will skip files that end with .zip,
                             .tar, .tar.gz, .tar.Z, .tar.bz2, .tar.xz, and
                             .tar.7z.
   --skip-win-hidden         On Windows, ignore hidden files.

 Debug Options
   --categorized=FILE        Save names of categorized files to FILE.
   --counted=FILE            Save names of processed source files to FILE.
   --diff-alignment=FILE     Write to FILE a list of files and file pairs
                             showing which files were added, removed, and/or
                             compared during a run with --diff.  This switch
                             forces the --diff mode on.
   --explain=LANG            Print the filters used to remove comments for
                             language LANG and exit.  In some cases the
                             filters refer to Perl subroutines rather than
                             regular expressions.  An examination of the
                             source code may be needed for further explanation.
   --help                    Print this usage information and exit.
   --found=FILE              Save names of every file found to FILE.
   --ignored=FILE            Save names of ignored files and the reason they
                             were ignored to FILE.
   --print-filter-stages     Print processed source code before and after
                             each filter is applied.
   --show-ext[=EXT]          Print information about all known (or just the
                             given) file extensions and exit.
   --show-lang[=LANG]        Print information about all known (or just the
                             given) languages and exit.
   --show-os                 Print the value of the operating system mode
                             and exit.  See also --unix, --windows.
   -v[=N]                    Verbose switch (optional numeric value).
   -verbose[=N]              Long form of -v.
   --version                 Print the version of this program and exit.
   --write-lang-def=FILE     Writes to FILE the language processing filters
                             then exits.  Useful as a first step to creating
                             custom language definitions (see also
                             --force-lang-def, --read-lang-def).

 Output Options
   --3                       Print third-generation language output.
                             (This option can cause report summation to fail
                             if some reports were produced with this option
                             while others were produced without it.)
   --by-percent  X           Instead of comment and blank line counts, show
                             these values as percentages based on the value
                             of X in the denominator:
                                X = 'c'   -> # lines of code
                                X = 'cm'  -> # lines of code + comments
                                X = 'cb'  -> # lines of code + blanks
                                X = 'cmb' -> # lines of code + comments + blanks
                             For example, if using method 'c' and your code
                             has twice as many lines of comments as lines
                             of code, the value in the comment column will
                             be 200%.  The code column remains a line count.
   --csv                     Write the results as comma separated values.
   --csv-delimiter=C         Use the character C as the delimiter for comma
                             separated files instead of ,.  This switch forces
   --json                    Write the results as JavaScript Object Notation
                             (JSON) formatted output.
   --md                      Write the results as Markdown-formatted text.
   --out=FILE                Synonym for --report-file=FILE.
   --progress-rate=N         Show progress update after every N files are
                             processed (default N=100).  Set N to 0 to
                             suppress progress output (useful when redirecting
                             output to STDOUT).
   --quiet                   Suppress all information messages except for
                             the final report.
   --report-file=FILE        Write the results to FILE instead of STDOUT.
   --sql=FILE                Write results as SQL create and insert statements
                             which can be read by a database program such as
                             SQLite.  If FILE is -, output is sent to STDOUT.
   --sql-append              Append SQL insert statements to the file specified
                             by --sql and do not generate table creation
                             statements.  Only valid with the --sql option.
   --sql-project=NAME        Use NAME as the project identifier for the
                             current run.  Only valid with the --sql option.
   --sql-style=STYLE         Write SQL statements in the given style instead
                             of the default SQLite format.  Currently, the
                             only style option is Oracle.
   --sum-one                 For plain text reports, show the SUM: output line
                             even if only one input file is processed.
   --xml                     Write the results in XML.
   --xsl=FILE                Reference FILE as an XSL stylesheet within
                             the XML output.  If FILE is 1 (numeric one),
                             writes a default stylesheet, cloc.xsl (or
                             cloc-diff.xsl if --diff is also given).
                             This switch forces --xml on.
   --yaml                    Write the results in YAML.

Idiomas Reconhecidos ▲

prompt> cloc --show-lang

ABAP                       (abap)
ActionScript               (as)
Ada                        (ada, adb, ads, pad)
ADSO/IDSM                  (adso)
AMPLE                      (ample, dofile, startup)
Ant                        (build.xml, build.xml)
ANTLR Grammar              (g, g4)
Apex Trigger               (trigger)
Arduino Sketch             (ino, pde)
ASP                        (asa, asp)
ASP.NET                    (asax, ascx, asmx, aspx, master, sitemap, webinfo)
AspectJ                    (aj)
Assembly                   (asm, s, S)
AutoHotkey                 (ahk)
awk                        (awk)
Blade                      (blade.php)
Bourne Again Shell         (bash)
Bourne Shell               (sh)
BrightScript               (brs)
builder                    (xml.builder)
C                          (c, ec, pgc)
C Shell                    (csh, tcsh)
C#                         (cs)
C++                        (C, c++, cc, cpp, CPP, cxx, pcc)
C/C++ Header               (H, h, hh, hpp, hxx)
CCS                        (ccs)
Chapel                     (chpl)
Clean                      (dcl, icl)
Clojure                    (clj)
ClojureC                   (cljc)
ClojureScript              (cljs)
CMake                      (cmake, CMakeLists.txt)
COBOL                      (CBL, cbl, COB, cob)
CoffeeScript               (coffee)
ColdFusion                 (cfm)
ColdFusion CFScript        (cfc)
Coq                        (v)
Crystal                    (cr)
CSON                       (cson)
CSS                        (css)
Cucumber                   (feature)
CUDA                       (cu, cuh)
Cython                     (pyx)
D                          (d)
DAL                        (da)
Dart                       (dart)
diff                       (diff)
DITA                       (dita)
DOORS Extension Language   (dxl)
DOS Batch                  (bat, BAT, BTM, btm, CMD, cmd)
Drools                     (drl)
DTD                        (dtd)
dtrace                     (d)
ECPP                       (ecpp)
EEx                        (eex)
Elixir                     (ex, exs)
Elm                        (elm)
ERB                        (erb, ERB)
Erlang                     (erl, hrl)
Expect                     (exp)
F#                         (fsi, fs, fs)
F# Script                  (fsx)
Focus                      (focexec)
Forth                      (4th, e4, f83, fb, forth, fpm, fr, frt, ft, fth, rx, fs, f, for)
Fortran 77                 (F, f77, F77, FOR, ftn, FTN, pfo, f, for)
Fortran 90                 (F90, f90)
Fortran 95                 (f95, F95)
Freemarker Template        (ftl)
GDScript                   (gd)
Glade                      (glade, ui)
GLSL                       (comp, frag, geom, glsl, tesc, tese, vert)
Go                         (go)
Grails                     (gsp)
GraphQL                    (gql, graphql)
Groovy                     (gant, gradle, groovy)
Haml                       (haml)
Handlebars                 (handlebars, hbs)
Harbour                    (hb)
Haskell                    (hs, lhs)
Haxe                       (hx)
HLSL                       (cg, cginc, hlsl, shader)
HTML                       (htm, html)
IDL                        (idl, pro)
Idris                      (idr)
INI                        (ini)
InstallShield              (ism)
Java                       (java)
JavaScript                 (es6, js)
JavaServer Faces           (jsf)
JCL                        (jcl)
JSON                       (json)
JSP                        (jsp, jspf)
JSX                        (jsx)
Julia                      (jl)
Kermit                     (ksc)
Korn Shell                 (ksh)
Kotlin                     (kt, kts)
LESS                       (less)
lex                        (l)
LFE                        (lfe)
liquid                     (liquid)
Lisp                       (asd, el, lisp, lsp, cl, jl)
Literate Idris             (lidr)
LiveLink OScript           (oscript)
Logtalk                    (lgt, logtalk)
Lua                        (lua)
m4                         (ac, m4)
make                       (am, Gnumakefile, gnumakefile, Makefile, makefile, mk)
Mako                       (mako)
Markdown                   (md)
Mathematica                (mt, wl, wlt, m)
MATLAB                     (m)
Maven                      (pom, pom.xml)
Modula3                    (i3, ig, m3, mg)
MSBuild script             (csproj, vbproj, vcproj, wdproj, wixproj)
MUMPS                      (mps, m)
Mustache                   (mustache)
MXML                       (mxml)
NAnt script                (build)
NASTRAN DMAP               (dmap)
Nemerle                    (n)
Nim                        (nim)
Objective C                (m)
Objective C++              (mm)
OCaml                      (ml, mli, mll, mly)
OpenCL                     (cl)
Oracle Forms               (fmt)
Oracle Reports             (rex)
Pascal                     (dpr, p, pas)
Pascal/Puppet              (pp)
Patran Command Language    (pcl, ses)
Perl                       (perl, plh, plx, pm, pm6, pl)
PHP                        (php, php3, php4, php5, phtml)
PHP/Pascal                 (inc)
Pig Latin                  (pig)
PL/I                       (pl1)
PO File                    (po)
PowerBuilder               (sra, srf, srm, srs, sru, srw)
PowerShell                 (ps1, psd1, psm1)
Prolog                     (P, pl, pro)
Protocol Buffers           (proto)
Pug                        (pug)
PureScript                 (purs)
Python                     (py)
QML                        (qml)
Qt                         (ui)
Qt Linguist                (ts)
Qt Project                 (pro)
R                          (r, R)
Racket                     (rkt, rktl, scrbl)
RapydScript                (pyj)
Razor                      (cshtml)
Rexx                       (rexx)
RobotFramework             (robot, tsv)
Ruby                       (rake, rb)
Ruby HTML                  (rhtml)
Rust                       (rs)
SAS                        (sas)
Sass                       (sass, scss)
Scala                      (scala)
Scheme                     (sc, sch, scm, sld, sls, ss)
sed                        (sed)
SKILL                      (il)
SKILL++                    (ils)
Slice                      (ice)
Slim                       (slim)
Smalltalk                  (st, cs)
Smarty                     (smarty, tpl)
Softbridge Basic           (SBL, sbl)
Solidity                   (sol)
Specman e                  (e)
SQL                        (psql, SQL, sql)
SQL Data                   (data.sql)
SQL Stored Procedure       (spc.sql, spoc.sql, sproc.sql, udf.sql)
Standard ML                (fun, sig, sml)
Stata                      (do, DO)
Stylus                     (styl)
Swift                      (swift)
Tcl/Tk                     (itk, tcl, tk)
Teamcenter met             (met)
Teamcenter mth             (mth)
TeX                        (bst, dtx, sty, tex)
TITAN Project File Information (tpd)
Titanium Style Sheet       (tss)
TOML                       (toml)
TTCN                       (ttcn, ttcn2, ttcn3, ttcnpp)
Twig                       (twig)
TypeScript                 (tsx, ts)
Unity-Prefab               (mat, prefab)
Vala                       (vala)
Vala Header                (vapi)
Velocity Template Language (vm)
Verilog-SystemVerilog      (sv, svh, v)
VHDL                       (VHD, vhd, vhdl, VHDL)
vim script                 (vim)
Visual Basic               (bas, cls, ctl, dsr, frm, VB, vb, vba, VBA, vbs, VBS)
Visual Fox Pro             (sca, SCA)
Visualforce Component      (component)
Visualforce Page           (page)
Vuejs Component            (vue)
Windows Message File       (mc)
Windows Module Definition  (def)
Windows Resource File      (rc, rc2)
WiX include                (wxi)
WiX source                 (wxs)
WiX string localization    (wxl)
XAML                       (xaml)
xBase                      (prg)
xBase Header               (ch)
XHTML                      (xhtml)
XMI                        (xmi, XMI)
XML                        (XML, xml)
XQuery                     (xq, xquery)
XSD                        (XSD, xsd)
XSLT                       (xsl, XSL, XSLT, xslt)
yacc                       (y)
YAML                       (yaml, yml)
zsh                        (zsh)

A lista acima pode ser personalizada, lendo definições de linguagem de um arquivo com o --read-lang-def ou a opçaõ --force-lang-def.

Estas extensões de arquivos mapeiam vários idiomas:

  • .cl arquivos podem ser Lisp ou OpenCL
  • .d os arquivos podem ser D ou Dtrace
  • .f ou .for arquivos poderiam ser Fortran ou Forth
  • .fs arquivos podem ser Forth ou F#
  • .inc arquivos podem ser PHP ou Pascal
  • .jl arquivos podem ser Lisp ou Julia
  • .m arquivos podem ser MATLAB, Mathematica, Mercury, MUMPS ou Objective C
  • .pl os arquivos podem ser Perl ou Prolog
  • .pp arquivos podem ser Pascal ou Puppet
  • .pro arquivos podem ser IDL, Prolog ou um Projeto Qt
  • .ts os arquivos podem ser TypeScript ou Qt Linguist
  • .v arquivos Coq ou Verilog/SystemVerilog

Cloc tem sub-rotinas que tentam identificar o idioma correto com base no conteúdo do arquivo para esses casos especiais. A precisão da identificação da linguagem é uma função da quantidade de código que o arquivo contém; arquivos .m com apenas uma ou duas linhas, por exemplo, raramente têm informações suficientes para distinguir corretamente entre MATLAB, Mercury, MUMPS ou Objective C.

Os idiomas com colisões de extensão de arquivo são difíceis de personalizar com --read-lang-def ou --force-lang-def pois não possuem mecanismos para identificar idiomas com extensões comuns. Nesta situação, é necessário modificar o código-fonte do cloc.

Como funciona ▲

O método de operação do cloc se assemelha a SLOCCount: primeiro, crie uma lista de arquivos a considerar. Em seguida, tente determinar se os arquivos encontrados ou não possuem código-fonte de idioma de computador reconhecido. Finalmente, para arquivos identificados como arquivos de origem, invoque rotinas específicas do idioma para contar o número de linhas de origem.

Uma descrição mais detalhada:

  1. Se o arquivo de entrada for um arquivo (como um arquivo .tar.gz ou .zip), crie um diretório temporário e expanda o arquivo lá usando uma chamada de sistema para um utilitário subjacente apropriado (tar, bzip2, unzip, etc) e adicione este diretório temporário como uma das entradas. (Isso funciona de forma mais confiável no Unix do que no Windows.)

  2. Use File :: Find para descer recursivamente os diretórios de entrada e criar uma lista de nomes de arquivos candidatos. Ignore arquivos binários e de tamanho zero.

  3. Certifique-se de que os arquivos na lista de candidatos possuem conteúdos exclusivos (primeiro, comparando tamanhos de arquivo, então, para arquivos de tamanho similar, compare os hashes MD5 do conteúdo do arquivo com Digest :: MD5). Para cada conjunto de arquivos idênticos, remova tudo, exceto a primeira cópia, conforme determinado por um tipo lexical, de arquivos idênticos do conjunto. Os arquivos removidos não estão incluídos no relatório. (O --skip-uniqueness desligar desativa os testes de singularidade e força todas as cópias de arquivos a serem incluídas no relatório.) Veja também o --ignored= mude para ver quais arquivos foram ignorados e por que.

  4. Digitalize a lista de arquivos candidatos para extensões de arquivo que o cloc associa com linguagens de programação (consulte o --show-lang e --show-ext opções). Os arquivos que correspondem são classificados como contendo o código-fonte para esse idioma. Cada arquivo sem extensões é aberto e sua primeira linha é lida para ver se é um script de shell Unix (qualquer coisa que comece com #!). Se for script shell, o arquivo é classificado por esse idioma de script (se o idioma for reconhecido). Se o arquivo não tiver uma extensão reconhecida ou não for uma linguagem de script reconhecida, o arquivo será ignorado.

  5. Todos os arquivos restantes na lista de candidatos devem agora ser arquivos de origem para linguagens de programação conhecidas. Para cada um desses arquivos:

    1. Leia todo o arquivo na memória.
    2. Contar o número de linhas (= Loriginal).
    3. Remova as linhas em branco, então conte novamente (= Lnon_blank).
    4. Loop sobre os filtros de comentários definidos para este idioma. (Por exemplo, C ++ tem dois filtros: (1) remova linhas que começam com espaços em branco opcionais seguidos de // e (2) remova texto entre / * e * /) Aplique cada filtro no código para remover comentários. Conte a esquerda sobre linhas (= Lcode).
    5. Salve as contagens para este idioma:
      • linhas em branco = Loriginal - Lnon_blank
      • linhas de comentários = Lnon_blank - Lcode
      • linhas de código = Lcode

As opções modificam o algoritmo ligeiramente. o --read-lang-def a opção, por exemplo, permite ao usuário ler definições de filtros de comentários, extensões de arquivos conhecidas e linguagens de script conhecidas a partir de um arquivo. O código para esta opção é processado entre os Passos 2 e 3.

Uso Avançado ▲

Remover comentários do código-fonte ▲

Como você pode dizer se o cloc identifica corretamente os comentários? Uma maneira de convencer-se de que o cloc está fazendo o certo é usar seu --strip-comments opção para remover comentários e linhas em branco de arquivos, em seguida, compare os arquivos despojados para originais.

Vamos tentar isso com a amalgamação SQLite, um arquivo C contendo todos os códigos necessários para criar a biblioteca SQLite juntamente com um arquivo de cabeçalho:

prompt> tar zxf sqlite-amalgamation-3.5.6.tar.gz
prompt> cd sqlite-3.5.6/
prompt> cloc --strip-comments=nc sqlite.c
       1 text file.
       1 unique file.
Wrote sqlite3.c.nc
       0 files ignored.

http://cloc.sourceforge.net v 1.03  T=1.0 s (1.0 files/s, 82895.0 lines/s)
-------------------------------------------------------------------------------
Language          files     blank   comment      code    scale   3rd gen. equiv
-------------------------------------------------------------------------------
C                     1      5167     26827     50901 x   0.77 =       39193.77
-------------------------------------------------------------------------------

O argumento de extensão dado a --strip-comments é arbitrário; aqui nc foi usado como abreviatura de "nenhum comentário".

O cloc removeu mais de 31.000 linhas do arquivo:

prompt> wc -l sqlite3.c sqlite3.c.nc
  82895 sqlite3.c
  50901 sqlite3.c.nc
 133796 total
prompt> echo "82895 - 50901" | bc
31994

Agora podemos comparar o arquivo original, sqlite3.c e o desprovido de comentários, sqlite3.c.nc com ferramentas como diff ou vimdiff e veja o que exatamente o cloc considerou comentários e linhas em branco. Uma prova rigorosa de que o arquivo despojado contém o mesmo código C que o original é compilar esses arquivos e comparar somas de verificação dos arquivos de objeto resultantes.

Primeiro, o arquivo original:

prompt> gcc -c sqlite3.c
prompt> md5sum sqlite3.o
cce5f1a2ea27c7e44b2e1047e2588b49  sqlite3.o

Em seguida, a versão sem comentários:

prompt> mv sqlite3.c.nc sqlite3.c
prompt> gcc -c sqlite3.c
prompt> md5sum sqlite3.o
cce5f1a2ea27c7e44b2e1047e2588b49  sqlite3.o

O cloc removeu mais de 31.000 linhas de comentários e espaços em branco, mas não modificou o código-fonte de forma significativa, pois o arquivo de objeto resultante corresponde ao original.

Trabalhar com arquivos compactados ▲

As versões de cloc antes da v1.07 exigiram uma --extract-with=CMD opção para dizer ao cloc como expandir um arquivo de arquivo. Começando com v1.07, esta é a tentativa de extração automaticamente. No momento, o método de extração automática funciona razoavelmente bem nos sistemas operacionais de tipo Unix para os seguintes tipos de arquivos: .tar.gz, .tar.bz2, .tar.xz, .tgz, .zip, .ear, .deb. Algumas dessas extensões funcionam no Windows se alguém tiver o WinZip instalado no local padrão (C:\Program Files\WinZip\WinZip32.exe). Além disso, com versões mais recentes do WinZip, o [http://www.winzip.com/downcl.htm](command line add-on) é necessário para uma operação correta; neste caso, invocaria cloc com algo como

 --extract-with="\"c:\Program Files\WinZip\wzunzip\" -e -o >FILE< ."
 
(ref. [http://sourceforge.net/projects/cloc/forums/forum/600963/topic/4021070?message=8938196](forum post)).

Em situações em que a extração automática falha, pode-se tentar o --extract-with=CMD opção para contar linhas de código dentro de arquivos tar, arquivos Zip ou outros arquivos compactados para os quais se possui uma ferramenta de extração. cloc leva o comando de extração fornecido pelo usuário e expande o arquivo para um diretório temporário (criado com File :: Temp), conta as linhas de código no diretório temporário e, em seguida, remove esse diretório. Embora não seja especialmente útil ao lidar com um único arquivo comprimido (afinal, se você for digitar o comando de extração de qualquer maneira, por que não apenas expandir manualmente o arquivo?), Esta opção é útil para trabalhar com vários arquivos ao mesmo tempo..

Por exemplo, diga que você tem os seguintes tarballs de origem em uma máquina Unix

perl-5.8.5.tar.gz
Python-2.4.2.tar.gz

e você quer contar todo o código dentro deles. O comando seria

cloc --extract-with='gzip -dc >FILE< | tar xf -' perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Se essa máquina Unix tiver GNU tar (que pode descompactar e extrair em um passo), o comando pode ser encurtado para

cloc --extract-with='tar zxf >FILE<' perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Em um computador Windows com WinZip instalado em c:\Program Files\WinZip o comando pareceria

cloc.exe --extract-with="\"c:\Program Files\WinZip\WinZip32.exe\" -e -o >FILE< ." perl-5.8.5.tar.gz Python-2.4.2.tar.gz

Java .ear arquivos são arquivos Zip que contêm arquivos Zip adicionais. O cloc pode lidar com arquivos comprimidos aninhados sem dificuldade - desde que todos esses arquivos sejam compactados e arquivados da mesma maneira. Exemplos de contar um Java .ear file in Unix and Windows:

Unix> cloc --extract-with="unzip -d . >FILE< " Project.ear
DOS> cloc.exe --extract-with="\"c:\Program Files\WinZip\WinZip32.exe\" -e -o >FILE< ." Project.ear

Differences

O --diff O interruptor permite medir a mudança relativa no código-fonte e os comentários entre duas versões de um arquivo, diretório ou arquivo. As diferenças revelam muito mais do que as contagens de código absoluto de duas versões de arquivos. Por exemplo, digamos que um arquivo fonte possui 100 linhas e seu desenvolvedor oferece uma versão mais recente com 102 linhas. O desenvolvedor adicionou duas linhas de comentários ou excluiu dezessete linhas de origem e adicionou quatorze linhas de origem e cinco linhas de comentários, ou o desenvolvedor fez uma reescrita completa, descartando todas as 100 linhas originais e adicionando 102 linhas de todas as novas fontes? A opção diff indica quantas linhas de fonte foram adicionadas, removidas, modificadas ou permaneceram as mesmas, e quantas linhas de comentários foram adicionadas, removidas, modificadas ou permaneceram as mesmas.

Além dos pares de arquivos, pode-se dar pares de diretórios de cloc, ou pares de arquivos, ou um arquivo de arquivo e um diretório. Cloc tentará alinhar pares de arquivos dentro dos diretórios ou arquivos e comparar diffs para cada par. Por exemplo, para ver o que mudou entre o GCC 4.4.0 e 4.5.0, pode-se fazer

cloc --diff gcc-4.4.0.tar.bz2  gcc-4.5.0.tar.bz2

Esteja preparado para esperar um pouco pelos resultados; a --diff A opção corre muito mais devagar do que uma contagem absoluta de código.

Para ver como o cloc alinha os arquivos entre os dois arquivos, use a opção --diff-alignment

cloc --diff-aligment=align.txt gcc-4.4.0.tar.bz2  gcc-4.5.0.tar.bz2

para produzir o arquivo align.txt que mostra os pares de arquivos, bem como os arquivos adicionados e excluídos. Os símbolos == e != antes de cada par de arquivos indicar se os arquivos são idênticos (==) ou se eles tiverem conteúdo diferente (!=).

Aqui está a saída da amostra mostrando a diferença entre os lançamentos do Python 2.6.6 e 2.7:

prompt> cloc --diff Python-2.7.9.tgz Python-2.7.10.tar.xz
    4315 text files.
    4313 text files.s
    2173 files ignored.

4 errors:
Diff error, exceeded timeout:  /tmp/8ToGAnB9Y1/Python-2.7.9/Mac/Modules/qt/_Qtmodule.c
Diff error, exceeded timeout:  /tmp/M6ldvsGaoq/Python-2.7.10/Mac/Modules/qt/_Qtmodule.c
Diff error (quoted comments?):  /tmp/8ToGAnB9Y1/Python-2.7.9/Mac/Modules/qd/qdsupport.py
Diff error (quoted comments?):  /tmp/M6ldvsGaoq/Python-2.7.10/Mac/Modules/qd/qdsupport.py

https://github.com/AlDanial/cloc v 1.65  T=298.59 s (0.0 files/s, 0.0 lines/s)
-----------------------------------------------------------------------------
Language                   files          blank        comment           code
-----------------------------------------------------------------------------
Visual Basic
 same                          2              0              1             12
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
make
 same                         11              0            340           2952
 modified                      1              0              0              1
 added                         0              0              0              0
 removed                       0              0              0              0
diff
 same                          1              0             87            105
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
CSS
 same                          0              0             19            327
 modified                      1              0              0              1
 added                         0              0              0              0
 removed                       0              0              0              0
Objective C
 same                          7              0             61            635
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
NAnt script
 same                          2              0              0             30
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
XML
 same                          3              0              2             72
 modified                      1              0              0              1
 added                         0              0              0              1
 removed                       0              1              0              0
Windows Resource File
 same                          3              0             56            206
 modified                      1              0              0              1
 added                         0              0              0              0
 removed                       0              0              0              0
Expect
 same                          6              0            161            565
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
HTML
 same                         14              0             11           2344
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
vim script
 same                          1              0              7            106
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
C++
 same                          2              0             18            128
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
Windows Module Definition
 same                          7              0            187           2080
 modified                      2              0              0              0
 added                         0              0              0              1
 removed                       0              1              0              2
Prolog
 same                          1              0              0             24
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
Javascript
 same                          3              0             49            229
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
Assembly
 same                         51              0           6794          12298
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
Bourne Shell
 same                         41              0           7698          45024
 modified                      1              0              0              3
 added                         0             13              2             64
 removed                       0              0              0              0
DOS Batch
 same                         29              0            107            494
 modified                      1              0              0              9
 added                         0              1              0              3
 removed                       0              0              0              0
MSBuild script
 same                         77              0              3          38910
 modified                      0              0              0              0
 added                         0              0              0              0
 removed                       0              0              0              0
Python
 same                       1947              0         109012         430335
 modified                    192              0             94            950
 added                         2            323            283           2532
 removed                       2             55             58            646
m4
 same                         18              0            191          15352
 modified                      1              0              0              2
 added                         1             31              0            205
 removed                       0              0              0              0
C
 same                        505              0          37439         347837
 modified                     45              0             13            218
 added                         0             90             33            795
 removed                       0              9              2            148
C/C++ Header
 same                        255              0          10361          66635
 modified                      5              0              5              7
 added                         0              1              3            300
 removed                       0              0              0              0
---------------------------------------------------------------------
SUM:
 same                       2986              0         172604         966700
 modified                    251              0            112           1193
 added                         3            459            321           3901
 removed                       2             66             60            796
---------------------------------------------------------------------

Ocorreu um par de erros. O primeiro par foi causado pelo tempo limite ao calcular diffs do arquivo Python-X/Mac/Modules/qt/_Qtmodule.c em cada versão do Python. Este arquivo tem > 26,000 linhas do código C e leva mais de 10 segundos - a duração máxima padrão para difamar um único arquivo - no meu computador lento. (Nota: refere-se a realizar diferenças com o sdiff() funciona no Perl Algorithm::Diff modulo, não a linha de comando diff utilidade.) Este erro pode ser superado aumentando o tempo para, digamos, 20 segundos com --diff-timeout 20.

O segundo erro é mais problemático. Os arquivos Python-X/Mac/Modules/qd/qdsupport.py incluir Python docstring (texto entre pares de cotações triplas) contendo comentários C. O cloc trata igrejas como comentários e manipula-os primeiro convertendo-os para comentários C, em seguida, usando o comentário C removendo a expressão regular. Os comentários C aninhados produzem resultados errôneos no entanto.

Criar definições de idioma personalizado ▲

Cloc pode escrever suas definições de comentários de idioma em um arquivo ou pode ler as definições de comentários de um arquivo, substituindo as definições incorporadas. Isso pode ser útil quando você deseja usar o cloc para contar linhas de um idioma ainda não incluído, para alterar a associação de extensões de arquivos para idiomas ou para modificar a maneira como os idiomas existentes são contados.

A maneira mais fácil de criar um arquivo de definição de idioma personalizado é fazer com que o cloc escreva suas definições em um arquivo e, em seguida, modifique esse arquivo:

Unix> cloc --write-lang-def=my_definitions.txt

cria o arquivo my_definitions.txt que pode ser modificado e depois lido de volta com o --read-lang-def ou --force-lang-def opção. A diferença entre as opções é o anterior mescla as definições de linguagem do arquivo fornecido com as definições internas do cloc com a prioridade do cloc se houver sobreposições. o --force-lang-def opção, por outro lado, substitui completamente as definições de cloc. Esta opção tem uma desvantagem na prevenção do cloc da contagem idiomas cujas extensões mapeiam para vários idiomas como essas linguas requerem lógica adicional que não é facilmente expressa em um arquivo de definições.

Unix> cloc --read-lang-def=my_definitions.txt  file1 file2 dir1 ...

Cada entrada de idioma tem quatro partes:

  • O nome do idioma que começa style="text-decoration: none;" na coluna 1.
  • Um ou mais comentários filters starting in column 5.
  • Uma ou mais extensões de nome de arquivo começando na coluna 5.
  • Um fator de escala de 3ª geração a partir da coluna 5. Essa entrada deve ser fornecida, mas seu valor não é importante a menos que você queira comparar seu idioma com uma linguagem de programação hipotética de terceira geração.

Um filtro define um método para remover texto de comentários do arquivo de origem. Por exemplo, a entrada para C ++ parece assim

C++
    filter call_regexp_common C++
    filter remove_inline //.*$
    extension C
    extension c++
    extension cc
    extension cpp
    extension cxx
    extension pcc
    3rd_gen_scale 1.51
    end_of_line_continuation \\$

C ++ tem dois filtros: primeiro, remova as linhas que correspondem ao regex do comentário C ++ do Regexp :: Common. O segundo filtro usando remove_inline está atualmente não utilizado. Sua intenção é identificar linhas com código e comentários e pode ser implementada no futuro.

Uma discussão mais completa das diferentes opções de filtro pode aparecer aqui no futuro. A produção de cloc --write-lang-def a opção deve fornecer exemplos suficientes para indivíduos motivados para modificar ou ampliar as definições de linguagem do cloc.

Combinar relatórios ▲

Se você gerencia vários projetos de software, talvez esteja interessado em ver contagens de linhas por projeto, não apenas por idioma. Digamos que você gerencie três projetos de software chamados MariaDB, PostgreSQL e SQLite. As equipes responsáveis por cada um desses projetos executam cloc no código-fonte e fornecem o resultado. Por exemplo, a equipe da MariaDB faz

cloc --out mariadb-10.1.txt mariadb-server-10.1.zip

e fornece o arquivo mariadb-10.1.txt. O conteúdo dos três arquivos que você obtém são

Unix> cat mariadb-10.1.txt
https://github.com/AlDanial/cloc v 1.65  T=45.36 s (110.5 files/s, 66411.4 lines/s)
-----------------------------------------------------------------------------------
Language                         files          blank        comment           code
-----------------------------------------------------------------------------------
C++                               1613         225338         290077         983026
C                                  853          62442          73017         715018
C/C++ Header                      1327          48300         114577         209394
Bourne Shell                       256          10224          10810          61943
Perl                               147          10342           8305          35562
Pascal                             107           4907           5237          32541
HTML                                56            195              6          16489
Javascript                           5           3309           3019          15540
m4                                  30           1599            359          14215
CMake                              190           1919           4097          12206
XML                                 35            648             56           5210
Ruby                                59            619            184           4998
Puppet                              10              0              1           3848
make                               134            724            360           3631
SQL                                 23            306            377           3405
Python                              34            371            122           2545
Bourne Again Shell                  27            299            380           1604
Windows Module Definition           37             27             13           1211
lex                                  4            394            166            991
yacc                                 2            152             64            810
DOS Batch                           19             89             82            700
Prolog                               1              9             40            448
RobotFramework                       1              0              0            441
CSS                                  2             33            155            393
JSON                                 5              0              0            359
dtrace                               9             59            179            306
Windows Resource File               10             61             89            250
Assembly                             2             70            284            237
WiX source                           1             18             10            155
Visual Basic                         6              0              0             88
YAML                                 2              4              4             65
PHP                                  1             11              2             24
SKILL                                1              8             15             16
sed                                  2              0              0             16
Windows Message File                 1              2              8              6
diff                                 1              1              4              4
D                                    1              4             11              4
-----------------------------------------------------------------------------------
SUM:                              5014         372484         512110        2127699
-----------------------------------------------------------------------------------

Unix> cat sqlite-3081101.txt
https://github.com/AlDanial/cloc v 1.65  T=1.22 s (3.3 files/s, 143783.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                                2          11059          53924         101454
C/C++ Header                     2            211           6630           1546
-------------------------------------------------------------------------------
SUM:                             4          11270          60554         103000
-------------------------------------------------------------------------------

Unix> cat postgresql-9.4.4.txt
https://github.com/AlDanial/cloc v 1.65  T=22.46 s (172.0 files/s, 96721.6 lines/s)
-----------------------------------------------------------------------------------
Language                         files          blank        comment           code
-----------------------------------------------------------------------------------
HTML                              1254           3725              0         785991
C                                 1139         139289         244045         736519
C/C++ Header                       667          12277          32488          57014
SQL                                410          13400           8745          51926
yacc                                 8           3163           2669          28491
Bourne Shell                        41           2647           2440          17170
Perl                                81           1702           1308           9456
lex                                  9            792           1631           4285
make                               205           1525           1554           4114
m4                                  12            218             25           1642
Windows Module Definition           13              4             17           1152
XSLT                                 5             76             55            294
DOS Batch                            7             29             30             92
CSS                                  1             20              7             69
Assembly                             3             17             38             69
D                                    1             14             14             66
Windows Resource File                3              4              0             62
Lisp                                 1              1              1             16
sed                                  1              1              7             15
Python                               1              5              0             13
Bourne Again Shell                   1              8              6             10
Windows Message File                 1              0              0              5
-----------------------------------------------------------------------------------
SUM:                              3864         178917         295080        1698471
-----------------------------------------------------------------------------------

Embora esses três arquivos sejam interessantes, você também deseja ver as contagens combinadas de todos os projetos. Isso pode ser feito com opção cloc --sum_reports:

Unix> cloc --sum-reports --out=databases mariadb-10.1.txt  sqlite-3081101.txt  postgresql-9.4.4.txt
Wrote databases.lang
Wrote databases.file

A combinação de relatórios produz dois arquivos de saída, um para somas pela linguagem de programação (databases.lang) e um por projeto (databases.file). Seus conteúdos são

Unix> cat databases.lang
https://github.com/AlDanial/cloc v 1.65
--------------------------------------------------------------------------------
Language                      files          blank        comment           code
--------------------------------------------------------------------------------
C                              1994         212790         370986        1552991
C++                            1613         225338         290077         983026
HTML                           1310           3920              6         802480
C/C++ Header                   1996          60788         153695         267954
Bourne Shell                    297          12871          13250          79113
SQL                             433          13706           9122          55331
Perl                            228          12044           9613          45018
Pascal                          107           4907           5237          32541
yacc                             10           3315           2733          29301
m4                               42           1817            384          15857
Javascript                        5           3309           3019          15540
CMake                           190           1919           4097          12206
make                            339           2249           1914           7745
lex                              13           1186           1797           5276
XML                              35            648             56           5210
Ruby                             59            619            184           4998
Puppet                           10              0              1           3848
Python                           35            376            122           2558
Windows Module Definition        50             31             30           2363
Bourne Again Shell               28            307            386           1614
DOS Batch                        26            118            112            792
CSS                               3             53            162            462
Prolog                            1              9             40            448
RobotFramework                    1              0              0            441
JSON                              5              0              0            359
Windows Resource File            13             65             89            312
Assembly                          5             87            322            306
dtrace                            9             59            179            306
XSLT                              5             76             55            294
WiX source                        1             18             10            155
Visual Basic                      6              0              0             88
D                                 2             18             25             70
YAML                              2              4              4             65
sed                               3              1              7             31
PHP                               1             11              2             24
SKILL                             1              8             15             16
Lisp                              1              1              1             16
Windows Message File              2              2              8             11
diff                              1              1              4              4
--------------------------------------------------------------------------------
SUM:                           8882         562671         867744        3929170
--------------------------------------------------------------------------------

Unix> cat databases.file
----------------------------------------------------------------------------------
File                            files          blank        comment           code
----------------------------------------------------------------------------------
mariadb-10.1.txt                 5014         372484         512110        2127699
postgresql-9.4.4.txt             3864         178917         295080        1698471
sqlite-3081101.txt                  4          11270          60554         103000
----------------------------------------------------------------------------------
SUM:                             8882         562671         867744        3929170
----------------------------------------------------------------------------------

Os arquivos do relatório podem ser resumidos. Digamos que você também gerencie o desenvolvimento de Perl e Python e que deseja acompanhar essas contas de linha separadamente dos projetos de banco de dados. Primeiro crie relatórios para Perl e Python separadamente:

cloc --out perl-5.22.0.txt   perl-5.22.0.tar.gz
cloc --out python-2.7.10.txt Python-2.7.10.tar.xz

em seguida, somem estes em conjunto com

Unix> cloc --sum-reports --out script_lang perl-5.22.0.txt python-2.7.10.txt
Wrote script_lang.lang
Wrote script_lang.file

Unix> cat script_lang.lang
https://github.com/AlDanial/cloc v 1.65
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                          2892         136396         184362         536445
C                              680          75566          71211         531203
Python                        2141          89642         109524         434015
C/C++ Header                   408          16433          26938         214800
Bourne Shell                   154          11088          14496          87759
MSBuild script                  77              0              3          38910
m4                              20           1604            191          15559
Assembly                        51           3775           6794          12298
Pascal                           8            458           1603           8592
make                            16            897            828           4939
XML                             37            198              2           2484
HTML                            14            393             11           2344
C++                             12            338            295           2161
Windows Module Definition        9            171            187           2081
YAML                            49             20             15           2078
Prolog                          12            438              2           1146
JSON                            14              1              0           1037
yacc                             1             85             76            998
DOS Batch                       44            199            148            895
Objective C                      7             98             61            635
Expect                           6            104            161            565
Windows Message File             1            102             11            489
CSS                              1             98             19            328
Windows Resource File            7             55             56            292
Javascript                       3             31             49            229
vim script                       1             36              7            106
diff                             1             17             87            105
NAnt script                      2              1              0             30
IDL                              1              0              0             24
Visual Basic                     2              1              1             12
D                                1              5              7              8
Lisp                             2              0              3              4
-------------------------------------------------------------------------------
SUM:                          6674         338250         417148        1902571
-------------------------------------------------------------------------------

Unix> cat script_lang.file
-------------------------------------------------------------------------------
File                         files          blank        comment           code
-------------------------------------------------------------------------------
python-2.7.10.txt             3240         161276         173214         998697
perl-5.22.0.txt               3434         176974         243934         903874
-------------------------------------------------------------------------------
SUM:                          6674         338250         417148        1902571
-------------------------------------------------------------------------------

Finalmente, combine os arquivos de combinação:

Unix> cloc --sum-reports --report_file=everything databases.lang script_lang.lang
Wrote everything.lang
Wrote everything.file

Unix> cat everything.lang
https://github.com/AlDanial/cloc v 1.65
---------------------------------------------------------------------------------
Language                       files          blank        comment           code
---------------------------------------------------------------------------------
C                               2674         288356         442197        2084194
C++                             1625         225676         290372         985187
HTML                            1324           4313             17         804824
Perl                            3120         148440         193975         581463
C/C++ Header                    2404          77221         180633         482754
Python                          2176          90018         109646         436573
Bourne Shell                     451          23959          27746         166872
SQL                              433          13706           9122          55331
Pascal                           115           5365           6840          41133
MSBuild script                    77              0              3          38910
m4                                62           3421            575          31416
yacc                              11           3400           2809          30299
Javascript                         8           3340           3068          15769
make                             355           3146           2742          12684
Assembly                          56           3862           7116          12604
CMake                            190           1919           4097          12206
XML                               72            846             58           7694
lex                               13           1186           1797           5276
Ruby                              59            619            184           4998
Windows Module Definition         59            202            217           4444
Puppet                            10              0              1           3848
YAML                              51             24             19           2143
DOS Batch                         70            317            260           1687
Bourne Again Shell                28            307            386           1614
Prolog                            13            447             42           1594
JSON                              19              1              0           1396
CSS                                4            151            181            790
Objective C                        7             98             61            635
Windows Resource File             20            120            145            604
Expect                             6            104            161            565
Windows Message File               3            104             19            500
RobotFramework                     1              0              0            441
dtrace                             9             59            179            306
XSLT                               5             76             55            294
WiX source                         1             18             10            155
diff                               2             18             91            109
vim script                         1             36              7            106
Visual Basic                       8              1              1            100
D                                  3             23             32             78
sed                                3              1              7             31
NAnt script                        2              1              0             30
IDL                                1              0              0             24
PHP                                1             11              2             24
Lisp                               3              1              4             20
SKILL                              1              8             15             16
---------------------------------------------------------------------------------
SUM:                           15556         900921        1284892        5831741
---------------------------------------------------------------------------------

Unix> cat everything.file
-------------------------------------------------------------------------------
File                         files          blank        comment           code
-------------------------------------------------------------------------------
databases.lang                8882         562671         867744        3929170
script_lang.lang              6674         338250         417148        1902571
-------------------------------------------------------------------------------
SUM:                         15556         900921        1284892        5831741
-------------------------------------------------------------------------------

SQL ▲

O Cloc pode escrever resultados na forma de tabela SQL criar e inserir instruções para uso com programas de banco de dados relacionais, como SQLite, MySQL, PostgreSQL, Oracle ou Microsoft SQL. Uma vez que as informações de contagem de código estão em um banco de dados, a informação pode ser interrogada e exibida de maneiras interessantes.

Um banco de dados criado a partir de saída cloc SQL tem duas tabelas, metadata e t:

Table metadata:

Field Type
timestamp text
project text
elapsed_s text

Table t:

Field Type
project text
language text
file text
nBlank integer
nComment integer
nCode integer
nScaled real

A tabela metadata contém informações sobre quando o relógio foi executado. o --sql-append alternar permite combinar muitas execuções em um único banco de dados; cada execução adiciona uma linha à tabela de metadados. A informação de contagem de código reside na tabela t.

Vamos repetir os exemplos de contagem de códigos de tarballs Perl, Python, SQLite, MySQL e PostgreSQL mostrados no Combinar relatórios exemplo acima, desta vez usando as opções de saída SQL e o SQLite mecanismo de banco de dados.

O --sql switch diz ao cloc para gerar saída style="text-decoration: none;" na forma de tabela SQL create e comandos insert. O switch leva um argumento de um nome de arquivo para escrever essas instruções SQL, ou, se o argumento for 1 (numérico), o fluxo de saída para STDOUT. Como o programa de linha de comando SQLite, sqlite3, pode ler os comandos do STDIN, podemos dispensar o armazenamento de instruções SQL em um arquivo e usar --sql 1 para transmitir dados diretamente no executável SQLite:

cloc --sql 1 --sql-project mariadb mariadb-server-10.1.zip | sqlite3 code.db

A parte --sql-project mariadb é opcional; não há necessidade de especificar um nome de projeto ao trabalhar com apenas uma base de código. No entanto, uma vez que iremos adicionando contagens de códigos de outros quatro mapas, só poderemos identificar dados por fonte de entrada se fornecemos um nome de projeto para cada execução.

Agora que temos um banco de dados, precisaremos passar no --sql-append mude para dizer ao cloc que não limpe este banco de dados, mas, em vez disso, adicione mais dados:

cloc --sql 1 --sql-project postgresql --sql-append postgresql-9.4.4.tar.bz2        | sqlite3 code.db
cloc --sql 1 --sql-project sqlite     --sql-append sqlite-amalgamation-3081101.zip | sqlite3 code.db
cloc --sql 1 --sql-project python     --sql-append Python-2.7.10.tar.xz            | sqlite3 code.db
cloc --sql 1 --sql-project perl       --sql-append perl-5.22.0.tar.gz              | sqlite3 code.db

Agora a diversão começa - temos um banco de dados, code.db, with lots of information about the five projects and can query it for all manner of interesting facts.

Qual é o arquivo mais longo em todos os projetos?

prompt> sqlite3 code.db 'select project,file,nBlank+nComment+nCode as nL from t
                                 where nL = (select max(nBlank+nComment+nCode) from t)'

sqlite|sqlite-amalgamation-3081101/sqlite3.c|161623

sqlite3 formato de saída padrão deixa um pouco a desejar. Podemos adicionar uma opção ao arquivo rc do programa, ~/.sqliterc, para mostrar cabeçalhos de coluna:

  .header on

Pode-se ter a impressão de incluir também

  .mode column

em ~/.sqliterc mas isso causa problemas quando a saída tem mais de uma linha, uma vez que as larguras das entradas na primeira linha governam a largura máxima para todas as linhas subseqüentes. Muitas vezes isso leva a saída truncada - não é desejável. Uma opção é escrever um formatador de saída SQLite personalizado, como sqlite_formatter, incluído com cloc.

Para usá-lo, simplesmente passe sqlite3's STDOUT entre sqlite_formatter através de um tubo:

prompt> sqlite3 code.db 'select project,file,nBlank+nComment+nCode as nL from t
                         where nL = (select max(nBlank+nComment+nCode) from t)' | ./sqlite_formatter
  
  -- Loading resources from ~/.sqliterc
  Project File                                  nL
  _______ _____________________________________ ______
  sqlite  sqlite-amalgamation-3081101/sqlite3.c 161623
  

Se a linha "Project File" não aparecer, adicione .header on para o seu ~/.sqliterc arquivo conforme explicado acima.

Qual é o arquivo mais longo em todos os projetos??

prompt> sqlite3 code.db 'select project,file,nBlank+nComment+nCode as nL from t
                         where nL = (select max(nBlank+nComment+nCode) from t)' | sqlite_formatter

Project File                                  nL
_______ _____________________________________ ______
sqlite  sqlite-amalgamation-3081101/sqlite3.c 161623

Qual é o arquivo mais longo em cada projeto?

prompt> sqlite3 code.db 'select project,file,max(nBlank+nComment+nCode) as nL from t
                          group by project order by nL;' | sqlite_formatter

Project    File                                                             nL
__________ ________________________________________________________________ ______
python     Python-2.7.10/Mac/Modules/qt/_Qtmodule.c                          28091
postgresql postgresql-9.4.4/src/interfaces/ecpg/preproc/preproc.c            54623
mariadb    server-10.1/storage/mroonga/vendor/groonga/lib/nfkc.c             80246
perl       perl-5.22.0/cpan/Locale-Codes/lib/Locale/Codes/Language_Codes.pm 100747
sqlite     sqlite-amalgamation-3081101/sqlite3.c                            161623

Quais arquivos em cada projeto possuem a maioria das linhas de código?

prompt> sqlite3 code.db 'select project,file,max(nCode) as nL from t
                         group by project order by nL desc;' | sqlite_formatter

Project    File                                                             nL
__________ ________________________________________________________________ ______
perl       perl-5.22.0/cpan/Locale-Codes/lib/Locale/Codes/Language_Codes.pm 100735
sqlite     sqlite-amalgamation-3081101/sqlite3.c                             97469
mariadb    server-10.1/storage/mroonga/vendor/groonga/lib/nfkc.c             80221
postgresql postgresql-9.4.4/src/interfaces/ecpg/preproc/preproc.c            45297
python     Python-2.7.10/Mac/Modules/qt/_Qtmodule.c                          26705

Quais arquivos de origem C com mais de 300 linhas têm uma relação de comentários abaixo de 1%?

prompt> sqlite3 code.db 'select project, file, nCode, nComment,
                         (100.0*nComment)/(nComment+nCode) as comment_ratio from t
                         where language="C" and nCode > 300 and
                         comment_ratio < 1 order by comment_ratio;' | sqlite_formatter

Project    File                                                                                            nCode nComment comment_ratio
__________ _______________________________________________________________________________________________ _____ ________ __________________
mariadb    server-10.1/storage/mroonga/vendor/groonga/lib/nfkc.c                                           80221       14 0.0174487443135789
python     Python-2.7.10/Python/graminit.c                                                                  2175        1 0.0459558823529412
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c                            2095        1 0.0477099236641221
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_french.c                             1211        1 0.0825082508250825
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c                        1201        1 0.0831946755407654
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c                          1182        1 0.084530853761623
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_hungarian.c                     1178        1 0.0848176420695505
mariadb    server-10.1/strings/ctype-eucjpms.c                                                             67466       60 0.0888546633889169
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_english.c                            1072        1 0.0931966449207828
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c                       1064        1 0.0938967136150235
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c                            1053        1 0.094876660341556
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c                       1049        1 0.0952380952380952
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_italian.c                            1031        1 0.0968992248062016
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c                       1023        1 0.09765625
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c                          981        1 0.10183299389002
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c                     975        1 0.102459016393443
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c                            967        1 0.103305785123967
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c                       961        1 0.103950103950104
mariadb    server-10.1/strings/ctype-ujis.c                                                                67177       79 0.117461639110265
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c                             720        1 0.13869625520111
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_porter.c                              717        1 0.139275766016713
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c                        714        1 0.13986013986014
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c                         711        1 0.140449438202247
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c                            660        1 0.151285930408472
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_russian.c                             654        1 0.152671755725191
python     Python-2.7.10/Mac/Modules/qt/_Qtmodule.c                                                        26705       42 0.157026956294164
python     Python-2.7.10/Mac/Modules/icn/_Icnmodule.c                                                       1521        3 0.196850393700787
mariadb    server-10.1/strings/ctype-extra.c                                                                8282       18 0.216867469879518
postgresql postgresql-9.4.4/src/bin/psql/sql_help.c                                                         3576        8 0.223214285714286
mariadb    server-10.1/strings/ctype-sjis.c                                                                34006       86 0.252258594391646
python     Python-2.7.10/Python/Python-ast.c                                                                6554       17 0.258712524729874
mariadb    server-10.1/strings/ctype-cp932.c                                                               34609       92 0.265122042592432
perl       perl-5.22.0/keywords.c                                                                           2815        8 0.283386468296139
python     Python-2.7.10/Mac/Modules/menu/_Menumodule.c                                                     3263       10 0.305530094714329
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c                               596        2 0.334448160535117
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c                          586        2 0.340136054421769
mariadb    server-10.1/strings/ctype-gbk.c                                                                 10684       38 0.354411490393583
python     Python-2.7.10/Mac/Modules/qd/_Qdmodule.c                                                         6694       24 0.357249181303959
python     Python-2.7.10/Mac/Modules/win/_Winmodule.c                                                       3056       11 0.358656667753505
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_german.c                              476        2 0.418410041841004
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c                         470        2 0.423728813559322
mariadb    server-10.1/strings/ctype-euc_kr.c                                                               9956       44 0.44
postgresql postgresql-9.4.4/src/backend/utils/fmgrtab.c                                                     4815       23 0.475403059115337
python     Python-2.7.10/Mac/Modules/ctl/_Ctlmodule.c                                                       5442       28 0.511882998171846
python     Python-2.7.10/Mac/Modules/ae/_AEmodule.c                                                         1347        7 0.51698670605613
python     Python-2.7.10/Mac/Modules/app/_Appmodule.c                                                       1712        9 0.52295177222545
mariadb    server-10.1/strings/ctype-gb2312.c                                                               6377       35 0.54585152838428
mariadb    server-10.1/storage/tokudb/ft-index/third_party/xz-4.999.9beta/src/liblzma/lzma/fastpos_table.c   516        3 0.578034682080925
python     Python-2.7.10/Mac/Modules/evt/_Evtmodule.c                                                        504        3 0.591715976331361
python     Python-2.7.10/Modules/expat/xmlrole.c                                                            1256        8 0.632911392405063
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_UTF_8_danish.c                              312        2 0.636942675159236
postgresql postgresql-9.4.4/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c                         310        2 0.641025641025641
python     Python-2.7.10/Mac/Modules/res/_Resmodule.c                                                       1621       12 0.734843845682792
python     Python-2.7.10/Mac/Modules/drag/_Dragmodule.c                                                     1046        8 0.759013282732448
python     Python-2.7.10/Mac/Modules/list/_Listmodule.c                                                     1021        8 0.777453838678329
python     Python-2.7.10/Mac/Modules/te/_TEmodule.c                                                         1198       10 0.827814569536424
python     Python-2.7.10/Mac/Modules/cg/_CGmodule.c                                                         1190       10 0.833333333333333
python     Python-2.7.10/Modules/clmodule.c                                                                 2379       23 0.957535387177352
python     Python-2.7.10/Mac/Modules/folder/_Foldermodule.c                                                  306        3 0.970873786407767

Quais são os dez arquivos mais longos (com base em linhas de código) que não têm comentários? Excluir cabeçalho, .html e arquivos YAML.

prompt> sqlite3 code.db 'select project, file, nCode from t
                         where nComment = 0 and
                         language not in ("C/C++ Header", "YAML", "HTML")
                         order by nCode desc limit 10;' | sqlite_formatter

Project File                                                                 nCode
_______ ____________________________________________________________________ _____
perl    perl-5.22.0/cpan/Unicode-Collate/Collate/Locale/ja.pl                 1938
python  Python-2.7.10/PCbuild/pythoncore.vcproj                               1889
python  Python-2.7.10/PC/VS8.0/pythoncore.vcproj                              1889
mariadb server-10.1/mysql-test/extra/binlog_tests/mysqlbinlog_row_engine.inc  1862
perl    perl-5.22.0/cpan/Unicode-Collate/Collate/Locale/zh_strk.pl            1589
perl    perl-5.22.0/cpan/Unicode-Collate/Collate/Locale/zh_zhu.pl             1563
mariadb server-10.1/storage/mroonga/vendor/groonga/configure.ac               1526
perl    perl-5.22.0/cpan/Unicode-Collate/Collate/Locale/zh_pin.pl             1505
mariadb server-10.1/mysql-test/suite/funcs_1/storedproc/storedproc_02.inc     1465
python  Python-2.7.10/PC/VS8.0/_bsddb.vcproj                                  1463

Quais são as línguas mais populares (em termos de linhas de código) em cada projeto?

prompt> sqlite3 code.db 'select project, language, sum(nCode) as SumCode from t
                         group by project,language
                         order by project,SumCode desc;' | sqlite_formatter
Project    Language                  SumCode
__________ _________________________ _______
mariadb    C++                        983026
mariadb    C                          715018
mariadb    C/C++ Header               209394
mariadb    Bourne Shell                61943
mariadb    Perl                        35562
mariadb    Pascal                      32541
mariadb    HTML                        16489
mariadb    Javascript                  15540
mariadb    m4                          14215
mariadb    CMake                       12206
mariadb    XML                          5210
mariadb    Ruby                         4998
mariadb    Puppet                       3848
mariadb    make                         3631
mariadb    SQL                          3405
mariadb    Python                       2545
mariadb    Bourne Again Shell           1604
mariadb    Windows Module Definition    1211
mariadb    lex                           991
mariadb    yacc                          810
mariadb    DOS Batch                     700
mariadb    Prolog                        448
mariadb    RobotFramework                441
mariadb    CSS                           393
mariadb    JSON                          359
mariadb    dtrace                        306
mariadb    Windows Resource File         250
mariadb    Assembly                      237
mariadb    WiX source                    155
mariadb    Visual Basic                   88
mariadb    YAML                           65
mariadb    PHP                            24
mariadb    SKILL                          16
mariadb    sed                            16
mariadb    Windows Message File            6
mariadb    D                               4
mariadb    diff                            4
perl       Perl                       536445
perl       C                          155648
perl       C/C++ Header               147858
perl       Bourne Shell                42668
perl       Pascal                       8592
perl       XML                          2410
perl       YAML                         2078
perl       C++                          2033
perl       make                         1986
perl       Prolog                       1146
perl       JSON                         1037
perl       yacc                          998
perl       Windows Message File          489
perl       DOS Batch                     389
perl       Windows Resource File          85
perl       D                               8
perl       Lisp                            4
postgresql HTML                       785991
postgresql C                          736519
postgresql C/C++ Header                57014
postgresql SQL                         51926
postgresql yacc                        28491
postgresql Bourne Shell                17170
postgresql Perl                         9456
postgresql lex                          4285
postgresql make                         4114
postgresql m4                           1642
postgresql Windows Module Definition    1152
postgresql XSLT                          294
postgresql DOS Batch                      92
postgresql Assembly                       69
postgresql CSS                            69
postgresql D                              66
postgresql Windows Resource File          62
postgresql Lisp                           16
postgresql sed                            15
postgresql Python                         13
postgresql Bourne Again Shell             10
postgresql Windows Message File            5
python     Python                     434015
python     C                          375555
python     C/C++ Header                66942
python     Bourne Shell                45091
python     MSBuild script              38910
python     m4                          15559
python     Assembly                    12298
python     make                         2953
python     HTML                         2344
python     Windows Module Definition    2081
python     Objective C                   635
python     Expect                        565
python     DOS Batch                     506
python     CSS                           328
python     Javascript                    229
python     Windows Resource File         207
python     C++                           128
python     vim script                    106
python     diff                          105
python     XML                            74
python     NAnt script                    30
python     Prolog                         24
python     Visual Basic                   12
sqlite     C                          101454
sqlite     C/C++ Header                 1546

Fatores de escala de linguagem de terceira geração ▲

As versões de cloc antes de 1.50 por computação padrão, para as entradas fornecidas, uma estimativa aproximada de quantas linhas de código seriam necessárias para escrever o mesmo código em uma hipotética linguagem computacional de terceira geração. Para produzir esta saída, é preciso usar o switch --3.

Os fatores de escala foram derivados da versão de 2006 dos índices de engrenagem da linguagem listados no site da Mayes Consulting, http://softwareestimator.com/IndustryData2.htm, usando esta equação:

fator de escala de cloc para linguagem X = razão de engrenagem padrão de terceira geração / relação de engrenagem X do idioma

Por exemplo, cloc fator de escala de 3ª geração para DOS Batch = 80/128 = 0.625.

A maior falha com esta abordagem é que as relações de engrenagem são definidas para linhas lógicas de código-fonte e não linhas físicas (que conta cloc). Os valores na "escala" e na "terceira geração" do cloc. equiv. as colunas devem ser colhidas com um grande grão de sal.

Limitações ▲

Identificar comentários dentro do código-fonte é mais complicado do que se poderia esperar. Muitas línguas precisariam de um analisador completo para ser contado corretamente. cloc não tenta analisar qualquer uma das línguas que pretende contar e, portanto, é uma ferramenta imperfeita. Os seguintes são problemas conhecidos:

  1. As linhas que contêm código fonte e comentários são contadas como linhas de código.
  2. Marcadores de comentários dentro de strings ou here-documents são tratados como marcadores de comentários reais e não literais de string. Por exemplo, as seguintes linhas de código C
    printf(" /* ");
    for (i = 0; i < 100; i++) {
        a += i;
    }
    printf(" */ ");
    
    look to cloc like this:
    printf(" xxxxxxx
    xxxxxxx
    xxxxxxx
    xxxxxxx
    xxxxxxx     ");
    
    onde `xxxxxxx` representa a visão de cloc do texto comentado. Portanto, cloc conta as cinco linhas como duas linhas de código C e três linhas de comentários (as linhas com código e comentários são contadas como código).

Como solicitar suporte para idiomas adicionais ▲

Se o cloc não reconhecer um idioma que esteja interessado em contar, crie um GitHub issue solicitando suporte para o seu idioma. Inclua esta informação:

  1. Extensões de arquivo associadas ao idioma. Se o idioma não depender de extensões de arquivo e, em vez disso, funciona com nomes de arquivos fixos ou com invocações de programa de estilo `#!`, Explique o que são.
  2. Uma descrição de como os comentários são definidos.
  3. Links para código de exemplo.

Recursos atualmente em desenvolvimento ▲

Aqui, em nenhuma ordem específica e sem promessa de entrega futura, os recursos e as capacidades estão atualmente em desenvolvimento:

  1. produce reStructuredText output with `--rst`
  2. código de contagem (por exemplo, Javascript) incorporado em arquivos HTML

Os pedidos de envio para esses recursos receberão consideração extra.

Reconhecimentos ▲

Wolfram Rösler forneceu a maioria dos exemplos de código no conjunto de testes. Estes exemplos vêm da sua Coleção Hello World.

Ismet Kursunoglu encontrou erros com o contador MUMPS e forneceu acesso a um computador com um grande código de MUMPS para testar o cloc.

Tod Huggins deu sugestões úteis para os filtros do Visual Basic.

Anton Demichev encontrou uma falha no contador JSP no cloc v0.76 e escreveu o gerador de saída XML para a opção --xml.

Reuben Thomas apontou que o ISO C99 permite // como um marcador de comentário, forneceu o código para o --no3 e --stdin-name opções, contando o idioma m4, e sugeriu vários aprimoramentos da interface do usuário.

Michael Bello forneceu um código para o --opt-match-f, --opt-not-match-f, --opt-match-d, e as opções --opt-not-match-d.

Mahboob Hussain inspirou o --original-dir e as opções --skip-uniqueness, encontrou um erro na lógica de detecção de arquivos duplicados e melhorou o filtro JSP.

Randy Sharo encontrou e corrigiu um erro de variável não inicializado para scripts de shell com apenas uma linha.

Steven Baker encontrou e corrigiu um problema com o gerador de saída YAML.

Greg Toth forneceu código para melhorar a detecção de linha em branco no COBOL.

Joel Oliveira forneceu código para deixar --exclude-list-file lidar com exclusão de nome de diretório.

Blazej Kroll forneceu código para produzir um arquivo XSLT, cloc-diff.xsl, ao produzir saída XML para a opção --diff.

Denis Silakov aprimorou o código que gera cloc.xsl ao usar --by-file e --by-file-by-lang opções, e forneceu um arquivo XSL que funciona com a saida --diff.

Andy (awalshe@sf.net) código fornecido para corrigir vários erros: saída correta de --counted de modo que apenas aparecem arquivos que são usados na contagem de códigos e que os resultados são mostrados pelo idioma em vez do nome do arquivo; permitir --diff saída de várias corridas para serem somadas --sum-reports.

Jari Aalto criou a versão inicial de cloc.1.pod e mantém o pacote Debian para cloc.

Mikkel Christiansen (mikkels@gmail.com) forneceu definições de contador para Clojure e ClojureScript.

Erik Gooven Arellano Casillas provided an update to the MXML counter to recognize Actionscript comments.

Gianluca Casati criou um pacote CPAM CPOC.

Ryan Lindeman implementou a característica --by-percent.

Kent C. Dodds, @kentcdodds, criou e mantém o pacote npm de cloc.

O desenvolvimento do cloc foi parcialmente financiado pela Northrop Grumman Corporation.

Direito Autoral ▲

Copyright (c) 2006-2017, Al Danial