git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/5] cvsserver: Make the database backend configurable

From
Frank Lichtenheld <frank@lichtenheld.de>
Date
Mar 19, 2007, 15:56 UTC
Message-ID
<11743197611364-git-send-email-frank@lichtenheld.de>
In-Reply-To
<11743197614111-git-send-email-frank@lichtenheld.de>
Make all the different parts of the database backend connection
configurable. This adds the following string configuration variables:
- gitcvs.dbdriver
- gitcvs.dbname
- gitcvs.dbuser
- gitcvs.dbpass
The default values emulate the current behavior exactly for
backwards compatibility.
All configuration variables can also be specified for a specific
access method (i.e. in the form gitcvs.<method>.<var>)

The dbdriver/dbuser/dbpass variables are added for completness. No other backend than SQLite is tested yet. The dbname variable on the other hand is useful with this backend already (to not discriminate against other possible backends it was not splitted in dbdir and dbfile).

Both dbname and dbuser support dynamic variable substitution where
the available variables are:
%m -- the CVS 'module' (i.e. GIT 'head') worked on
%a -- CVS access method used (i.e. 'ext' or 'pserver')
%u -- User name of the user invoking git-cvsserver
%G -- .git directory name
%g -- .git directory name, mangled to be used in a filename,
      currently this substitutes all chars except for [\w.-]
      with '_'
Signed-off-by: Frank Lichtenheld <frank@lichtenheld.de>
---
 git-cvsserver.perl |   40 ++++++++++++++++++++++++++++++++++------
 1 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 5d2b6f3..6d10aa3 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -2141,19 +2141,33 @@ sub new
 
     bless $self, $class;
 
-    $self->{dbdir} = $config . "/";
-    die "Database dir '$self->{dbdir}' isn't a directory" unless ( defined($self->{dbdir}) and -d $self->{dbdir} );
-
     $self->{module} = $module;
-    $self->{file} = $self->{dbdir} . "/gitcvs.$module.sqlite";
-
     $self->{git_path} = $config . "/";
 
     $self->{log} = $log;
 
     die "Git repo '$self->{git_path}' doesn't exist" unless ( -d $self->{git_path} );
 
-    $self->{dbh} = DBI->connect("dbi:SQLite:dbname=" . $self->{file},"","");
+    $self->{dbdriver} = $cfg->{gitcvs}{$state->{method}}{dbdriver} ||
+        $cfg->{gitcvs}{dbdriver} || "dbi:SQLite";
+    $self->{dbname} = $cfg->{gitcvs}{$state->{method}}{dbname} ||
+        $cfg->{gitcvs}{dbname} || "%Ggitcvs.%m.sqlite";
+    $self->{dbuser} = $cfg->{gitcvs}{$state->{method}}{dbuser} ||
+        $cfg->{gitcvs}{dbuser} || "";
+    $self->{dbpass} = $cfg->{gitcvs}{$state->{method}}{dbpass} ||
+        $cfg->{gitcvs}{dbpass} || "";
+    my %mapping = ( m => $module,
+                    a => $state->{method},
+                    u => getlogin || getpwuid($<) || $<,
+                    G => $self->{git_path},
+                    g => mangle_dirname($self->{git_path}),
+                    );
+    $self->{dbname} =~ s/%([mauGg])/$mapping{$1}/eg;
+    $self->{dbuser} =~ s/%([mauGg])/$mapping{$1}/eg;
+
+    $self->{dbh} = DBI->connect("$self->{dbdriver}:dbname=$self->{dbname}",
+                                $self->{dbuser},
+                                $self->{dbpass});
 
     $self->{tables} = {};
     foreach my $table ( $self->{dbh}->tables )
@@ -2857,5 +2871,19 @@ sub safe_pipe_capture {
     return wantarray ? @output : join('',@output);
 }
 
+=head2 mangle_dirname
+
+create a string from a directory name that is suitable to use as
+part of a filename, mainly by converting all chars except \w.- to _
+
+=cut
+sub mangle_dirname {
+    my $dirname = shift;
+    return unless defined $dirname;
+
+    $dirname =~ s/[^\w.-]/_/g;
+
+    return $dirname;
+}
 
 1;
-- 
1.5.0.3
Previous: Frank LichtenheldNext: Martin Langhoff
Message 5 of 23 in “cvsserver: Make configuration way more flexible”
  1. cvsserver: Make configuration way more flexibleFrank Lichtenheld, Mar 19, 2007
  2. 1/5 cvsserver: Introduce new state variable 'method'Frank Lichtenheld, Mar 19, 2007
  3. 2/5 cvsserver: Handle three part keys in git config correctlyFrank Lichtenheld, Mar 19, 2007
  4. 3/5 cvsserver: Allow to override the configuration per access methodFrank Lichtenheld, Mar 19, 2007
  5. 4/5 cvsserver: Make the database backend configurableFrank Lichtenheld, Mar 19, 2007
  6. Martin LanghoffMar 19, 2007
  7. Frank LichtenheldMar 23, 2007
  8. Frank LichtenheldMar 23, 2007
  9. 5/5 cvsserver: Abort if connect to database failsFrank Lichtenheld, Mar 19, 2007
  10. cvsserver: Use DBI->table_info instead of DBI->tablesFrank Lichtenheld, Mar 31, 2007
  11. Frank LichtenheldMar 31, 2007
  12. 0/3 cvsserver: small corrections and bring documentation up to speedFrank Lichtenheld, Apr 7, 2007
  13. 1/3 cvsserver: small corrections to asciidoc documentationFrank Lichtenheld, Apr 7, 2007
  14. 2/3 cvsserver: Corrections to the database backend configurationFrank Lichtenheld, Apr 7, 2007
  15. 3/3 cvsserver: Add asciidoc documentation for new database backend configurationFrank Lichtenheld, Apr 7, 2007
  16. Junio C HamanoApr 8, 2007
  17. Frank LichtenheldApr 11, 2007
  18. cvsserver: Add asciidoc documentation for new database backend configurationFrank Lichtenheld, Apr 12, 2007
  19. Jakub NarebskiApr 13, 2007
  20. config.txt: Add gitcvs.db* variablesFrank Lichtenheld, Apr 13, 2007
  21. cvsserver: Document the GIT branches -> CVS modules mapping more prominentlyFrank Lichtenheld, Apr 12, 2007
  22. Junio C HamanoApr 12, 2007
  23. Frank LichtenheldApr 12, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.