From: Jakub Narebski <jnareb@gmail.com>
To: Thomas Rast <trast@student.ethz.ch>
Cc: git@vger.kernel.org, "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Jonathan Nieder" <jrnieder@gmail.com>,
"Junio C Hamano" <gitster@pobox.com>,
"Sverre Rabbelier" <srabbelier@gmail.com>
Subject: [RFC PATCH v3 2/3 (amend)] Documentation: complete config list from other manpages
Date: Sun, 24 Oct 2010 22:55:13 +0200 [thread overview]
Message-ID: <201010242255.14379.jnareb@gmail.com> (raw)
In-Reply-To: <201010242244.24326.jnareb@gmail.com>
From: Thomas Rast <trast@student.ethz.ch>
Add an autogeneration script Documentation/make-config-list.perl
that complete list of config variables with missing variables
from other manpages.
This script generates minimal documentation for those missing config
variables at appropriate place in Documentation/config-vars.txt,
using the following form:
foo.bar::
foo.baz::
See linkgit:git-foo[1].
It does that as follows:
* parse config-vars-src.txt (was config-vars.txt, which is now generated)
to find out config variables it contains
* parse each manpage source (following includes) for config variable
headers
* assemble a new config-vars.txt that completes the original list with
"See linkgit:git-foo[1]" entries for all variables that were not in
it config-vars-src.txt
Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
This version has removed stray commented out remains of debugging the
make-config-list.perl script, and has it slightly reordered for better
readibility.
I have accidentally included old version of a patch. I am very sorry.
Below there comments from previous email (without references to
attachements, which are not included in this email)
...
The differences from v2 by Thomas Rast:
* Removed stray changes to Documentation/Makefile and
Documentation/config-vars-src.txt
* The config-vars.txt target now depends on $(cmds_txt), which are
included by git.txt (without it, and without 'make doc' ran, the
generation of "make -C Documentation config-vars.txt" failed because
it couldn't find IIRC cmds-mainporcelain.txt). See below.
* The config-vars.txt target now uses $(QUIET_GEN) and $(PERL_PATH),
and makes use of make's automatic variables ($@, $<), like other
targets that run *.perl scripts. It uses $(MAN_TXT) in place of
its definition, i.e. '$(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)'
* The make-config-vars.perl invocation in config-vars.txt target
now has extra '--ignore=merge-config.txt' because config-vars.src.txt
contains 'include::merge-config.txt[]'. See below.
* The make-config-vars.perl got rewritten according to proposals in
parent email. In general this means that instead of decomposing
config-vars-src.txt, adding documentation of missing variables,
and then recomposing it into config-vars.txt (with side-effects
such as lowercasing variable names, and sorting variables), it
simply finds places where to insert missing documentation, and
generates and inserts it there.
This means that read_varlist() got simplified, and main code got
rewritten.
Issues to be solved (aka why this is an RFC):
* Dependencies for config-vars.txt target; probably just needs
modification to build-docdep.perl script.
* read_varlist does not follow includes, and that is why we had to
manually ignore merge-config.txt
* Either sorting or inserting generated documentation could be
improved; as can be seen in attached config-vars.txt the variables
from manpage for git-http-backend got split.
Documentation/Makefile | 5 +
.../{config-vars.txt => config-vars-src.txt} | 0
Documentation/make-config-list.perl | 168 ++++++++++++++++++++
3 files changed, 173 insertions(+), 0 deletions(-)
rename Documentation/{config-vars.txt => config-vars-src.txt} (100%)
create mode 100755 Documentation/make-config-list.perl
diff --git a/Documentation/Makefile b/Documentation/Makefile
index e117bc4..8ce75d2 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -320,6 +320,11 @@ howto-index.txt: howto-index.sh $(wildcard howto/*.txt)
'$(SHELL_PATH_SQ)' ./howto-index.sh $(wildcard howto/*.txt) >$@+ && \
mv $@+ $@
+config-vars.txt: config-vars-src.txt $(MAN_TXT) $(cmds_txt)
+ $(QUIET_GEN)$(PERL_PATH) ./make-config-list.perl \
+ --mainlist=$< --ignore=$@ --ignore=merge-config.txt $(MAN_TXT) >$@+ && \
+ mv $@+ $@
+
$(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt
$(QUIET_ASCIIDOC)$(ASCIIDOC) $(ASCIIDOC_EXTRA) -b xhtml11 $*.txt
diff --git a/Documentation/config-vars.txt b/Documentation/config-vars-src.txt
similarity index 100%
rename from Documentation/config-vars.txt
rename to Documentation/config-vars-src.txt
diff --git a/Documentation/make-config-list.perl b/Documentation/make-config-list.perl
new file mode 100755
index 0000000..2894d96
--- /dev/null
+++ b/Documentation/make-config-list.perl
@@ -0,0 +1,168 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+
+my %ignore;
+my $rc = GetOptions(
+ "mainlist=s" => \my $mainlistfile,
+ "ignore=s" => sub { $ignore{$_[1]} = 1 },
+);
+
+if (!$rc || !defined $mainlistfile) {
+ print "$0 --mainlist=<mainlist> [--ignore=<ignore>...] <asciidoc_manpage>...\n";
+ exit 1;
+}
+
+my %var_manpages;
+my %manpage_section;
+
+foreach my $name (@ARGV) {
+ read_man_txt($name);
+}
+
+my ($mainlist, $mainvars) = read_varlist($mainlistfile);
+
+my @missing_vars =
+ grep { !exists $mainlist->{lc($_)} } keys %var_manpages;
+my %missing_vars =
+ map { $_ => $var_manpages{$_} } @missing_vars;
+
+my %insert = find_insertion_points($mainlist, \%missing_vars);
+
+open my $fh, '<', $mainlistfile
+ or die "Couldn't open '$mainlistfile' for reading: $!";
+while (<$fh>) {
+ if (exists $insert{$.}) {
+ print vars_documentation($insert{$.}, \%missing_vars);
+ print "\n";
+ }
+ print;
+}
+# special case: insertion after last line in $mainlistfile
+print vars_documentation($insert{-1}, \%missing_vars)
+ if exists $insert{-1};
+close $fh
+ or die "Couldn't close '$mainlistfile': $!";
+
+exit 0;
+
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+# ----------------------------------------------------------------------
+
+sub read_varlist {
+ my ($filename) = @_;
+
+ open my $fh, '<', $filename
+ or die "Couldn't open '$filename' for reading: $!";
+
+ my (%mainlist, @mainvars);
+ while (<$fh>) {
+ if (/^(\S+)::/) {
+ my $v = $1;
+ push @mainvars, $v;
+ $mainlist{lc($v)} = $.;
+ }
+ }
+
+ close $fh
+ or die "Couldn't close '$filename': $!";
+
+ return \%mainlist, \@mainvars;
+}
+
+sub read_man_txt {
+ my ($filename, $manpage) = @_;
+ if (!defined $manpage) {
+ $manpage = $filename;
+ $manpage =~ s/\.txt//;
+ }
+
+ open my $fh, '<', $filename
+ or die "Couldn't open '$filename' for reading: $!";
+ while (<$fh>) {
+ if ($. < 5 && /^$manpage\((\d+)\)/) {
+ $manpage_section{$manpage} = $1;
+ }
+ if (/^([a-z0-9]+\.[a-zA-Z<>0-9.]+)::/) {
+ push @{$var_manpages{$1}}, $manpage;
+ }
+ if (/^include::\s*(\S+)\s*\[\]/ &&
+ !exists $ignore{$1}) {
+ read_man_txt($1, $manpage);
+ }
+ }
+ close $fh
+ or die "Couldn't close '$filename': $!";
+}
+
+sub find_insertion_points {
+ my ($mainlist, $missing_vars) = @_;
+ my %insert;
+
+ my %all_vars = (%$mainlist, %$missing_vars);
+ my $lineno = -1; # means after last line
+
+ # reverse order because we want to find a place before which to insert
+ # generated documentation; it is easy to find where description
+ # of variable begins, but in general harder to find where it ends.
+ my @sorted_vars = reverse sort { lc($a) cmp lc($b) } keys %all_vars;
+ foreach my $key (@sorted_vars) {
+ my $val = $all_vars{$key};
+ if (ref $val) {
+ # this came from %$missing_vars
+ push @{$insert{$lineno}}, $key;
+ } else {
+ # this came from %$mainlist
+ if ($lineno < 0) {
+ # $lineno < 0 means after end of file (special case)
+ $lineno = $val;
+ } else {
+ # this is in case of unsorted entries in $mainlistfile
+ $lineno = $val < $lineno ? $val : $lineno; # min($val, $lineno)
+ }
+ }
+ }
+ return %insert;
+}
+
+sub vars_documentation {
+ my ($keylist, $vars) = @_;
+ my @keys = sort @$keylist;
+ my %out;
+
+ # generate output for each key now, because it is easier to compare
+ # strings than arrays; comparing which is needed for compacting output
+ foreach my $k (@keys) {
+ $out{$k} = "\tSee: ".gen_links($vars->{$k}).".\n";
+ }
+
+ my $output = '';
+ while (my $k = pop @keys) {
+ $output .= $k."::\n";
+ unless (@keys && $out{$k} eq $out{$keys[0]}) {
+ $output .= $out{$k};
+ }
+ }
+ return $output;
+}
+
+sub gen_links {
+ my $manpages = shift;
+ return join(", ", map { linkgit($_) } @$manpages);
+}
+
+sub linkgit {
+ my $manpage = shift;
+
+ if (!exists $manpage_section{$manpage}) {
+ warn "section for $manpage unknown, assuming '1'\n";
+ $manpage_section{$manpage} = 1;
+ }
+ return "linkgit:${manpage}[$manpage_section{$manpage}]";
+}
+
+__END__
--
1.7.3
next prev parent reply other threads:[~2010-10-24 20:55 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-22 5:02 [RFC PATCH v2 0/3] Documentation: refactor config variable descriptions Thomas Rast
2010-10-22 5:02 ` [RFC PATCH v2 3/3] Documentation: move format.* documentation to format-patch Thomas Rast
[not found] ` <8145782bddf60325909f328337cb76d25c4402cf.1287690696.git.trast@student.ethz.ch>
2010-10-22 6:19 ` [RFC PATCH v2 2/3] Documentation: complete config list from other manpages Jakub Narebski
2010-10-22 14:31 ` Jakub Narebski
2010-10-23 22:24 ` [PATCH] " Thomas Rast
2010-10-23 22:30 ` Jakub Narebski
2010-10-24 14:36 ` Jakub Narebski
2010-10-24 20:44 ` [RFC PATCH v3 2/3] " Jakub Narebski
2010-10-24 20:55 ` Jakub Narebski [this message]
[not found] ` <c3f621cd062b2c4f80aa2e8dadcfddbc042aefaa.1287690696.git.trast@student.ethz.ch>
2010-10-22 8:18 ` [RFC PATCH v2 1/3] Documentation: Move variables from config.txt to separate file Jakub Narebski
2010-10-22 15:17 ` [RFC PATCH v2 0/3] Documentation: refactor config variable descriptions Jakub Narebski
2010-10-22 15:53 ` Jeff King
2010-10-24 1:24 ` Thomas Rast
2010-10-25 15:04 ` Jeff King
2010-10-25 12:44 ` Jakub Narebski
2010-10-25 15:11 ` Jeff King
2010-10-25 15:49 ` Jakub Narebski
2010-10-27 10:56 ` Jakub Narebski
2010-11-02 13:42 ` Jens Lehmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201010242255.14379.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=srabbelier@gmail.com \
--cc=trast@student.ethz.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).