Show More
@@ -6,7 +6,7 b'' | |||
|
6 | 6 | # GNU General Public License version 2 or any later version. |
|
7 | 7 | |
|
8 | 8 | import errno, os, re, xml.dom.minidom, shutil, urlparse, posixpath |
|
9 | import stat, subprocess | |
|
9 | import stat, subprocess, tarfile | |
|
10 | 10 | from i18n import _ |
|
11 | 11 | import config, util, node, error, cmdutil |
|
12 | 12 | hg = None |
@@ -613,15 +613,15 b' class gitsubrepo(object):' | |||
|
613 | 613 | self._path = ctx._repo.wjoin(path) |
|
614 | 614 | self._ui = ctx._repo.ui |
|
615 | 615 | |
|
616 | def _gitcommand(self, commands): | |
|
617 | return self._gitdir(commands)[0] | |
|
616 | def _gitcommand(self, commands, stream=False): | |
|
617 | return self._gitdir(commands, stream=stream)[0] | |
|
618 | 618 | |
|
619 | def _gitdir(self, commands): | |
|
619 | def _gitdir(self, commands, stream=False): | |
|
620 | 620 | commands = ['--no-pager', '--git-dir=%s/.git' % self._path, |
|
621 | 621 | '--work-tree=%s' % self._path] + commands |
|
622 | return self._gitnodir(commands) | |
|
622 | return self._gitnodir(commands, stream=stream) | |
|
623 | 623 | |
|
624 | def _gitnodir(self, commands): | |
|
624 | def _gitnodir(self, commands, stream=False): | |
|
625 | 625 | """Calls the git command |
|
626 | 626 | |
|
627 | 627 | The methods tries to call the git command. versions previor to 1.6.0 |
@@ -633,8 +633,11 b' class gitsubrepo(object):' | |||
|
633 | 633 | |
|
634 | 634 | # print git's stderr, which is mostly progress and useful info |
|
635 | 635 | p = subprocess.Popen(cmd, shell=True, bufsize=-1, |
|
636 |
close_fds= |
|
|
636 | close_fds=util.closefds, | |
|
637 | 637 | stdout=subprocess.PIPE) |
|
638 | if stream: | |
|
639 | return p.stdout, None | |
|
640 | ||
|
638 | 641 | retdata = p.stdout.read() |
|
639 | 642 | # wait for the child to exit to avoid race condition. |
|
640 | 643 | p.wait() |
@@ -795,6 +798,20 b' class gitsubrepo(object):' | |||
|
795 | 798 | else: |
|
796 | 799 | os.remove(path) |
|
797 | 800 | |
|
801 | def archive(self, archiver, prefix): | |
|
802 | source, revision = self._state | |
|
803 | self._fetch(source, revision) | |
|
804 | ||
|
805 | # Parse git's native archive command. | |
|
806 | # This should be much faster than manually traversing the trees | |
|
807 | # and objects with many subprocess calls. | |
|
808 | tarstream = self._gitcommand(['archive', revision], stream=True) | |
|
809 | tar = tarfile.open(fileobj=tarstream, mode='r|') | |
|
810 | for info in tar: | |
|
811 | archiver.addfile(os.path.join(prefix, self._relpath, info.name), | |
|
812 | info.mode, info.issym(), | |
|
813 | tar.extractfile(info).read()) | |
|
814 | ||
|
798 | 815 | types = { |
|
799 | 816 | 'hg': hgsubrepo, |
|
800 | 817 | 'svn': svnsubrepo, |
General Comments 0
You need to be logged in to leave comments.
Login now