chiark / gitweb /
wip new arrangements for clean etc.
[dgit.git] / dgit
diff --git a/dgit b/dgit
index 41375195d6cdd997ff79ff8aff572930647af1bf..4792c5372f51c3f616c1205c05cbd9e8b0abaa42 100755 (executable)
--- a/dgit
+++ b/dgit
@@ -24,6 +24,7 @@ use Data::Dumper;
 use LWP::UserAgent;
 use Dpkg::Control::Hash;
 use File::Path;
+use File::Basename;
 use Dpkg::Version;
 use POSIX;
 
@@ -36,6 +37,7 @@ our $dryrun = 0;
 our $changesfile;
 our $new_package = 0;
 our $existing_package = 'dpkg';
+our $build_use_dpkgbuildpackage = 0;
 
 our %format_ok = map { $_=>1 } ("1.0","3.0 (native)","3.0 (quilt)");
 
@@ -45,6 +47,7 @@ our (@dput) = qw(dput);
 our (@debsign) = qw(debsign);
 our (@sbuild) = qw(sbuild -A);
 our (@dpkgbuildpackage) = qw(dpkg-buildpackage -i\.git/ -I.git);
+our (@dpkgsource) = qw(dpkg-source -i\.git/ -I.git);
 our (@mergechanges) = qw(mergechanges -f);
 
 
@@ -52,6 +55,7 @@ our %opts_opt_map = ('dget' => \@dget,
                     'dput' => \@dput,
                     'debsign' => \@debsign,
                      'sbuild' => \@sbuild,
+                     'dpkg-source' => \@dpkgsource,
                      'dpkg-buildpackage' => \@dpkgbuildpackage,
                      'mergechanges' => \@mergechanges);
 
@@ -456,9 +460,7 @@ sub create_remote_git_repo () {
        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");
+            " cp -a _template $package.git");
     } else {
        badcfg "unknown git-create \`$how'";
     }
@@ -661,11 +663,12 @@ sub fetch_from_archive () {
     if (defined $dsc_hash) {
        fail "missing git history even though dsc has hash -".
            " could not find commit $dsc_hash".
-           " (should be in ".access_giturl()."#".rref().")"
+           " (should be in ".access_giturl()."#".rrref().")"
            unless $upload_hash;
        $hash = $dsc_hash;
        ensure_we_have_orig();
-       if (is_fast_fwd($dsc_hash,$upload_hash)) {
+       if ($dsc_hash eq $upload_hash) {
+       } elsif (is_fast_fwd($dsc_hash,$upload_hash)) {
            print STDERR <<END or die $!;
 
 Git commit in archive is behind the last version allegedly pushed/uploaded.
@@ -674,6 +677,9 @@ Last allegedly pushed/uploaded: $upload_hash
 $later_warning_msg
 END
            $hash = $upload_hash;
+       } else {
+           fail "archive's .dsc refers to ".$dsc_hash.
+               " but this is an ancestor of ".$upload_hash;
        }
     } else {
        $hash = generate_commit_from_dsc();
@@ -936,6 +942,9 @@ sub cmd_push {
     } else {
        badusage "incorrect arguments to dgit push";
     }
+    if (check_for_git()) {
+       git_fetch_us();
+    }
     if (fetch_from_archive()) {
        is_fast_fwd(lrref(), 'HEAD') or die;
     } else {
@@ -970,10 +979,22 @@ sub cmd_sbuild {
     $package = getfield $clogp, 'Source';
     my $isuite = getfield $clogp, 'Distribution';
     my $version = getfield $clogp, 'Version';
-    runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S));
-    chdir ".." or die $!;
     my $sourcechanges = "${package}_${version}_source.changes";
     my $dscfn = dscfn($version);
+    if ($build_use_dpkgbuildpackage) {
+       runcmd_ordryrun (@dpkgbuildpackage, qw(-us -uc -S));
+    } else {
+       my $pwd = cmdoutput qw(env - pwd);
+       my $leafdir = basename $pwd;
+       chdir ".." or die $!;
+       runcmd_ordryrun @dpkgsource, qw(-b --), $leafdir;
+       chdir $pwd or die $!;
+       runcmd_ordryrun qw(sh -ec),
+           'exec >$1; shift; exec "$@"','x',
+           $sourcechanges,
+           qw(dpkg-genchanges -S);
+    }
+    chdir ".." or die $!;
     my $pat = "${package}_${version}_*.changes";
     if (!$dryrun) {
        stat $dscfn or fail "$dscfn (in parent directory): $!";