#! /usr/bin/perl -w
# File: clone_repo
# Copyright ┬ę 2009 by Manoj Srivastava
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
# Description:
# A wrapper around git-clone that recursively populates submodules.
# Download here.

use warnings;
use strict;
use IO::File;

=head1 NAME

clone_repo - like git-clone, but aware of submodules



 usage: clone_repo <repository> [<directory>]



Clones a repository into a newly created directory, just like
C<git-clone>, but it also recursively initializes and updates any
submodules. For each repository, this creates remote-tracking branches
for each branch in the cloned repository (visible using git branch
-r), and creates and checks out an initial branch equal to the cloned
repository┬┤s currently active branch.


sub find_submodules () {
  if (-f  ".gitmodules") {
    my @modules=();
    my $fh = new IO::File;
    if ($fh->open("< .gitmodules")) {
      while (<$fh>) {
        next unless /^\s*path\s*=\s*(\S*)/;
        push @modules, $1;
    foreach my $name (@modules) {
      chdir $name;
      chdir "..";

sub populate_submodules () {
  if (-f ".gitmodules") {
    system("git submodule init") == 0 or die "submodule init in: `pwd`: $?";
    system("git submodule update") == 0 or die "submodule update in `pwd`: $?";
    find_submodules ();

sub main () {
  my $repo = $ARGV[0];
  my $name;

  if ($#ARGV > 0) {
    $name = $ARGV[1];
  else {
    $name = $ARGV[0];
    $name =~ s,/$,,;
    $name =~ s,\.git$,,;
    $name =~ s,/$,,;
    $name =~ s,^.*/,,g;

  # Clone the directory here
  system("git clone $repo $name") == 0 or die "Could not clone $repo: $?";
  chdir $name;
  # Process any submodules, recursively.
  populate_submodules() if -f ".gitmodules";


=head1 B<SEE ALSO>



=head1 BUGS

None known so far.


=head1 AUTHOR

This  was  written by Manoj Srivastava <srivasta@debian.org>.


exit 0;