From 6810652456326f572e2a465a3d12519e4fcef4cf Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Fri, 16 Aug 2013 16:12:44 +0100 Subject: [PATCH] new config... --- TODO | 6 ---- dgit | 100 ++++++++++++++++++++++++++++++++++++++++++++------------- dgit.1 | 35 +++++++++++++++++--- 3 files changed, 107 insertions(+), 34 deletions(-) diff --git a/TODO b/TODO index f7c0b7df..26ce6a9e 100644 --- a/TODO +++ b/TODO @@ -1,9 +1,3 @@ -config for repo locations - -Archive agility. Archive needs to specify (a) way to get versions -and paths in archive for dscs (b) unpriv pull location (c) priv -push location - Vcs-Git-Master: specifies commit hash corresponding to the thing uploaded optional commit hash corresponding to pristine tar?? diff --git a/dgit b/dgit index a158eefd..7e464fe0 100755 --- a/dgit +++ b/dgit @@ -34,11 +34,6 @@ our $sign = 1; our $dryrun = 0; our $changesfile; -our $aliothname = 'iwj@git.debian.org'; -our $aliothpath = '/git/dgit-repos'; -our $alioth_git = "git+ssh://$aliothname/$aliothpath"; -our $alioth_sshtestbodge = [$aliothname,$aliothpath]; - our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)"); our (@git) = qw(git); @@ -136,6 +131,53 @@ sub runcmd_ordryrun { } } +our %defcfg = ('dgit.default.distro' => 'debian', + 'dgit.default.username' => '', + 'dgit-distro.debian.git-host' => 'git.debian.org', + 'dgit-distro.debian.git-proto' => 'git+ssh://', + 'dgit-distro.debian.git-path' => '/git/dgit-repos', + 'dgit-distro.debian.git-check' => 'ssh-cmd', + 'dgit-distro.debian.git-create' => 'ssh-cmd'); + +sub cfg { + foreach my $c (@_) { + my $v = cmdoutput_errok qw(git config --), $c; + if ($?==0) { + chomp $v; + return $v; + } elsif ($?!=256) { + die "$c $?"; + } + my $dv = $defcfg{$c}; + return $dv if defined $dv; + } + return undef; +} + +sub access_cfg ($) { + my ($key) = @_; + my $distro = cfg("dgit-suite.$suite.distro", + "dgit.default.distro"); }); + my $value = cfg("dgit-distro.$distro.$key", + "dgit.default.$key"); + return $value; +} + +sub access_gituserhost () { + my $user = access_cfg('git-user'); + my $host = access_cfg('git-host'); + return defined($user) && length($user) ? "$user\@$host" : $host; +} + +sub access_giturl () { + my $url = access_cfg('git-url'); + return $url if defined $url; + return + access_cfg('git-proto'). + access_gituserhost(). + access_cfg('git-path'); +} + sub parsecontrol { my $c = Dpkg::Control::Hash->new(); $c->load(@_) or return undef; @@ -191,18 +233,34 @@ sub get_archive_dsc () { sub check_for_git () { # returns 0 or 1 - my $cmd= - "ssh $alioth_sshtestbodge->[0] '". - " set -e; cd $alioth_sshtestbodge->[1];". - " if test -d $package.git; then echo 1; else echo 0; fi". - "'"; - print DEBUG "$cmd\n"; - open P, "$cmd |" or die $!; - $!=0; $?=0; - my $r =

; close P; - print DEBUG ">$r<\n"; - die "$r $! $?" unless $r =~ m/^[01]$/; - return $r+0; + my $how = access_config('git-check'); + if ($how eq 'ssh-cmd') { + my $r= cmd_getoutput access_cfg('ssh'),access_gituserhost(), + " set -e; cd ".access_cfg('git-path').";". + " if test -d $package.git; then echo 1; else echo 0; fi"; + print DEBUG "$cmd\n"; + open P, "$cmd |" or die $!; + $!=0; $?=0; + my $r =

; close P; + print DEBUG ">$r<\n"; + die "$r $! $?" unless $r =~ m/^[01]$/; + return $r+0; + } else { + die "unknown git-check $how ?"; + } +} + +sub create_remote_git_repo () { + my $how = access_config('git-create'); + if ($how eq 'ssh-cmd') { + runcmd_ordryrun access_cfg('ssh'),access_gituserhost(), + "set -e; cd ".access_cfg('git-path').";". + " mkdir -p $package.git;". + " cd $package.git;". + " if ! test -d objects; then git init --bare; fi"; + } else { + die "unknown git-create $how ?"; + } } our ($dsc_hash,$upload_hash); @@ -403,7 +461,7 @@ sub clone ($) { open H, "> .git/HEAD" or die $!; print H "ref: ".lref()."\n" or die $!; close H or die $!; - runcmd @git, qw(remote add), 'origin', "$alioth_git/$package.git"; + runcmd @git, qw(remote add), 'origin', access_giturl($package); if (check_for_git()) { print "fetching existing git history\n"; git_fetch_us(); @@ -465,11 +523,7 @@ sub dopush () { } my $tag = debiantag($dsc->{Version}); if (!check_for_git()) { - runcmd_ordryrun qw(ssh),$alioth_sshtestbodge->[0], - "set -e; cd $alioth_sshtestbodge->[1];". - " mkdir -p $package.git;". - " cd $package.git;". - " if ! test -d objects; then git init --bare; fi"; + create_remote_git_repo(); } runcmd_ordryrun @git, qw(push),$remotename,"HEAD:".rrref(); if ($sign) { diff --git a/dgit.1 b/dgit.1 index 51940cab..84e54695 100644 --- a/dgit.1 +++ b/dgit.1 @@ -133,12 +133,37 @@ debsign. Use repeatedly if multiple additional options are required. Specifies the .changes file which is to be uploaded. By default dgit push looks for single .changes file in the parent directory whose filename suggests they it is for the right package and version. +.SH CONFIGURATION +dgit looks at the following git config keys to control its behaviour. +You may set them with git-config (either in system-global or per-tree +configuration), or provide +.BI -c key = value +on the dgit command line. +.TP +.BI dgit-suite. suite .distro +.TP +.BI dgit.default.distro +.TP +.BI dgit.default.username +.TP +.BI dgit-distro. distro .git-url +.TP +.BI dgit-distro. distro .git-host +.TP +.BI dgit-distro. distro .git-proto +.TP +.BI dgit-distro. distro .git-path +.TP +.BI dgit-distro. distro .git-check +.TP +.BI dgit-distro. distro .git-create +.TP +.BI dgit-distro. distro .ssh +.TP +.BR dgit.default. * +for each +.BR dgit-distro. \fIdistro\fR . * .SH BUGS -dgit is not nearly configurable enough. The locations for dgit-repos -(on alioth) and for the Debian archive are currently hardcoded. -There is not yet any support for suites which are in different -distributions to Debian. - dgit will only work with packages in main. The madison http query API does not give the component. -- 2.30.2