Bug#753838: patch for git pushurl support in devscripts

Andreas Henriksson andreas at fatal.se
Sun Nov 9 02:43:45 UTC 2014


Control: tags -1 + patch

Hello!

Please see attached patch for implementing usage of pushurl
for git checkouts in devscripts.

Please review carefully as I'm no perl expert.

(Please reindent as needed, I couldn't make sense of the mixed tab/space...)

Once this is merged, it might be a good idea to consider making
auth the default for all git checkouts.

Regards,
Andreas Henriksson
-------------- next part --------------
diff -Nru devscripts-2.14.10/debian/changelog devscripts-2.14.10+nmu1/debian/changelog
--- devscripts-2.14.10/debian/changelog	2014-10-14 04:35:45.000000000 +0200
+++ devscripts-2.14.10+nmu1/debian/changelog	2014-11-09 02:07:58.000000000 +0100
@@ -1,3 +1,10 @@
+devscripts (2.14.10+nmu1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Add git pushurl support for authenticated checkouts.
+
+ -- Andreas Henriksson <andreas at fatal.se>  Sun, 09 Nov 2014 02:07:00 +0100
+
 devscripts (2.14.10) unstable; urgency=medium
 
   * Fix all the other calls to dpkg-architecture in devscripts.
diff -Nru devscripts-2.14.10/scripts/debcheckout.pl devscripts-2.14.10+nmu1/scripts/debcheckout.pl
--- devscripts-2.14.10/scripts/debcheckout.pl	2014-10-14 04:35:45.000000000 +0200
+++ devscripts-2.14.10+nmu1/scripts/debcheckout.pl	2014-11-09 03:27:21.000000000 +0100
@@ -519,9 +519,9 @@
 }
 
 # Checkout a given repository in a given destination directory.
-sub checkout_repo($$$) {
-    my ($repo_type, $repo_url, $destdir) = @_;
-    my @cmd;
+sub checkout_repo($$$;$) {
+    my ($repo_type, $repo_url, $destdir, $anon_repo_url) = @_;
+    my (@cmd, @extracmd);
 
     given ($repo_type) {
 	when ("arch") { @cmd = ("tla", "grab", $repo_url); }  # XXX ???
@@ -534,11 +534,28 @@
 	}
 	when ("darcs") { @cmd = ("darcs", "get", $repo_url); }
 	when ("git") {
+            my $pushurl;
+
+            if (defined $anon_repo_url and length $anon_repo_url) {
+              if ($repo_url =~ m|(.*)\s+-b\s+(.*)|) {
+                $pushurl = $1;
+              } else {
+                $pushurl = $repo_url;
+              }
+
+              $repo_url = $anon_repo_url;
+            }
+
 	    if ($repo_url =~ m|(.*)\s+-b\s+(.*)|) {
 	      @cmd = ("git", "clone", $1, "-b", $2);
 	    } else {
 	      @cmd = ("git", "clone", $repo_url);
 	    }
+
+            if ($pushurl) {
+              @extracmd = ("git", "remote", "set-url", "--push", "origin",
+                           $pushurl);
+            }
 	}
 	when ("hg") { @cmd = ("hg", "clone", $repo_url); }
 	when ("svn") { @cmd = ("svn", "co", $repo_url); }
@@ -548,6 +565,25 @@
     print "@cmd ...\n";
     system @cmd;
     my $rc = $? >> 8;
+
+    if ($rc == 0 && @extracmd) {
+      my $oldcwd = getcwd();
+      my $checkoutdir;
+
+      print "@extracmd ...\n";
+
+      if (length $destdir) {
+        $checkoutdir = $destdir;
+      } else {
+        ($checkoutdir = $repo_url) =~ s|.*/(.*)(.git?)|$1|;
+      }
+
+      chdir($checkoutdir);
+      system @extracmd;
+      $rc = $? >> 8;
+      chdir($oldcwd);
+    }
+
     return $rc;
 }
 
@@ -988,6 +1024,7 @@
     my $use_package = ''; # use this package instead of guessing from the URL
     my $repo_type = "svn";  # default repo typo, overridden by '-t'
     my $repo_url = "";	  # repository URL
+    my $anon_repo_url;	  # repository URL (pre-auth mangling)
     my $user = "";	  # login name (authenticated mode only)
     my $browse_url = "";    # online browsable repository URL
     my $git_track = "";     # list of remote GIT branches to --track
@@ -1073,8 +1110,10 @@
     }
 
     $repo_url = munge_url($repo_type, $repo_url);
-    $repo_url = set_auth($repo_type, $repo_url, $user, $dont_act)
-	if $auth and not @files;
+    if ($auth and not @files) {
+      $anon_repo_url = $repo_url;
+      $repo_url = set_auth($repo_type, $repo_url, $user, $dont_act);
+    }
     print_repo($repo_type, $repo_url) if $print_mode;		# ... then quit
     print_details($repo_type, $repo_url) if $details_mode;	# ... then quit
     if (length $pkg) {
@@ -1085,7 +1124,7 @@
     if (@files) {
 	$rc = checkout_files($repo_type, $repo_url, $destdir, $browse_url);
     } else {
-	$rc = checkout_repo($repo_type, $repo_url, $destdir);
+	$rc = checkout_repo($repo_type, $repo_url, $destdir, $anon_repo_url);
     }   # XXX: there is no way to know for sure what is the destdir :-(
     die "checkout failed (the command above returned a non-zero exit code)\n"
 	if $rc != 0;


More information about the devscripts-devel mailing list