login
Header Space

 
 

[RFC] Git config file reader in Perl (WIP)

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: <git@...>
Date: Sunday, January 14, 2007 - 8:44 pm

To make gitweb faster I thought about adding to it, or to Git.pm,
simple nonvalidation config file reader. Nonvalidating means that
it would accept some input which git-repo-config considers invalid.

Some of the trouble is caused because of coner cases like this 
example

[section "sub ; # sect \" ion\\"] ; "]
	key = a " b ; " ; " c ; "

which is valid, but strange.

I'm not proficent in Perl, so help is appreciated.

-- >8 --
#!/usr/bin/perl

use strict;
use warnings;

use Text::Balanced qw(extract_delimited);


sub read_config {
	my $configfile = shift;
	my $section = shift;
	my %config;

	open my $fd, $configfile
		or die "Cannot open $configfile: $!";

	my $sectfull;
	while (my $line = <$fd>) {
		chomp $line;

		if ($line =~ m/^\s*\[\s*([^][:space:]]*)\s*\](.*)$/) {
			# section without subsection

			my $sect = lc($1);

			$sectfull = $sect;

		} elsif ($line =~ m/\s*\[([^][:space:]]*)\s"((?:\\.|[^"])*)"\](.*)$/) {
			# section with subsection

			my $sect = lc($1);
			my $subsect = $2;
			$subsect =~ s/\\(.)/$1/g;

			$sectfull = "$sect.$subsect";

		} elsif ($line =~ m/\s*(\w+)\s*=\s*(.*?)\s*$/) {
			# variable assignment

			my $key = lc($1);
			my $rhs = $2;

			my $value = '';
			my ($next, $remainder, $prefix) = qw();
		DELIM: {
				do {
					($next, $remainder, $prefix) =
						extract_delimited($rhs, '"', qr/(?:\\.|[^"])*/);

					if ($prefix =~ s/\s*[;#].*$//) {
						# comment in unquoted part
						$value .= $prefix;
						last DELIM;
					} else {
						$value .= $prefix if $prefix;
						if ($next && $next =~ s/^"(.*)"$/$1/) {
							$value .= $next;
						}
					}

					$rhs = $remainder;
				} while ($rhs && $next);
			} # DELIM:

			if ($remainder) {
				$remainder =~ s/\s*[;#].*$//;
				$value .= $remainder;
			}

			$value =~ s/\\(.)/$1/g;

			if (exists $config{"$sectfull.$key"}) {
				push @{$config{"$sectfull.$key"}}, $value;
			} else {
				$config{"$sectfull.$key"} = [ $value ];
			}

		} elsif ($line =~ m/^\s*(\w+)\s*(:?[;#].*)?$/) {
			# boolean variable without value

			my $key = lc($1);

			if (exists $config{"$sectfull.$key"}) {
				push @{$config{"$sectfull.$key"}}, undef;
			} else {
				$config{"$sectfull.$key"} = [ undef ];
			}
		} # end if
	}

	close $fd
		or die "Cannot close $configfile: $!";

	return wantarray ? %config : \%config;
}

# --------------------------------------------------------------------------

my %config;

%config = read_config("~/git/.git/config");
%config = read_config("/tmp/jnareb/gitconfig");

foreach my $ckey (sort keys %config) {
	foreach my $cvalue (@{$config{$ckey}}) {
		if (defined $cvalue) {
			print "$ckey=$cvalue\n";
		} else {
			print "$ckey\n";
		}
	}
}

__END__
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Sun Jan 14, 8:44 pm)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Mon Jan 15, 3:08 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Mon Jan 15, 5:03 am)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Mon Jan 15, 5:56 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Mon Jan 15, 6:32 am)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Mon Jan 15, 7:26 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Mon Jan 15, 8:15 am)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Tue Jan 16, 5:51 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Tue Jan 16, 6:47 am)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Tue Jan 16, 3:53 pm)
Re: [RFC] Git config file reader in Perl (WIP), Nikolai Weibull, (Mon Jan 15, 11:34 am)
Re: [RFC] Git config file reader in Perl (WIP), Junio C Hamano, (Tue Jan 16, 6:45 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Tue Jan 16, 7:12 am)
Re: [RFC] Git config file reader in Perl (WIP), Eric Wong, (Tue Jan 16, 3:09 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Tue Jan 16, 10:14 am)
Re: [RFC] Git config file reader in Perl (WIP), Nikolai Weibull, (Tue Jan 16, 6:17 pm)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Tue Jan 16, 6:42 pm)
Re: [RFC] Git config file reader in Perl (WIP), Nikolai Weibull, (Wed Jan 17, 2:08 pm)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Wed Jan 17, 8:50 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Wed Jan 17, 3:25 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Wed Jan 17, 3:22 pm)
Re: [RFC] Git config file reader in Perl (WIP), Nikolai Weibull, (Wed Jan 17, 4:01 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Tue Jan 16, 6:37 pm)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Tue Jan 16, 6:56 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Tue Jan 16, 7:24 pm)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Wed Jan 17, 4:51 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Wed Jan 17, 5:48 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Wed Jan 17, 6:44 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Wed Jan 17, 8:11 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Wed Jan 17, 8:37 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Wed Jan 17, 10:00 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Fri Jan 19, 8:10 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Fri Jan 19, 9:20 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Fri Jan 19, 6:44 pm)
Re: [RFC] Git config file reader in Perl (WIP), Junio C Hamano, (Fri Jan 19, 8:19 pm)
[PATCH] config_set_multivar(): disallow newlines in keys, Johannes Schindelin, (Fri Jan 19, 9:25 pm)
Re: [PATCH] config_set_multivar(): disallow newlines in keys, Johannes Schindelin, (Mon Jan 22, 11:21 am)
Re: [PATCH] config_set_multivar(): disallow newlines in keys, Johannes Schindelin, (Mon Jan 22, 11:44 am)
Re: [PATCH] config_set_multivar(): disallow newlines in keys, Johannes Schindelin, (Tue Jan 23, 7:26 am)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Fri Jan 19, 8:08 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Fri Jan 19, 8:59 pm)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Fri Jan 19, 8:25 am)
Re: [RFC] Git config file reader in Perl (WIP), Jakub Narebski, (Mon Jan 15, 12:00 pm)
Re: [RFC] Git config file reader in Perl (WIP), Johannes Schindelin, (Mon Jan 15, 11:44 am)
Re: [RFC] Git config file reader in Perl (WIP), Nikolai Weibull, (Mon Jan 15, 12:22 pm)
Re: [RFC] Git config file reader in Perl (WIP), Shawn O. Pearce, (Mon Jan 15, 6:01 am)
speck-geostationary