thirdparty/vcs-load-dirs/vcs_support/util.py
author Pawel Solyga <Pawel.Solyga@gmail.com>
Tue, 12 May 2009 15:52:53 +0200
changeset 2311 e8262ca32109
permissions -rw-r--r--
Add vcs-load-dirs project to thirdparty directory. vcs-load-dirs project contains load-dir scripts for different version control sysystems including git, hg, darcs, bazaar. More information about the project: http://software.complete.org/software/wiki/vcs-load-dirs/ http://software.complete.org/static/vcs-load-dirs/doc//hg_load_dirs.1.html
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2311
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     1
# Copyright (C) 2003-2007 John Goerzen
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     2
# <jgoerzen@complete.org>
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     3
#
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     4
#    This program is free software; you can redistribute it and/or modify
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     5
#    it under the terms of the GNU General Public License as published by
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     6
#    the Free Software Foundation; either version 2 of the License, or
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     7
#    (at your option) any later version.
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     8
#
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
     9
#    This program is distributed in the hope that it will be useful,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    10
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    11
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    12
#    GNU General Public License for more details.
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    13
#
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    14
#    You should have received a copy of the GNU General Public License
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    15
#    along with this program; if not, write to the Free Software
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    16
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    17
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    18
import os, sys, re
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    19
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    20
nulldev = None
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    21
verbose = 0
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    22
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    23
class ExecProblem(Exception):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    24
    pass
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    25
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    26
def mainexec(program, args = [], child_stdout = None,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    27
             child_stdin = None, child_stderr = None, wait = 1, closefds = []):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    28
    """Runs the program as a sub-process, passing to it args if specified.
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    29
    The sub-process has its file descriptors adjusted as per the arguments.
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    30
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    31
    If wait is 1, wait until the child exits, then return the result code from
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    32
    os.waitpid().
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    33
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    34
    If wait is 0, return the PID immediately."""
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    35
    global verbose
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    36
    def setfds(source, dest):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    37
        if source != None:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    38
            if hasattr(source, 'fileno'):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    39
                source = source.fileno()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    40
            os.dup2(source, dest)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    41
            
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    42
    pid = os.fork()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    43
    if not pid:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    44
        if verbose:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    45
            print "Running: ", program, args
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    46
        setfds(child_stdin, 0)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    47
        setfds(child_stdout, 1)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    48
        setfds(child_stderr, 2)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    49
        for fd in closefds:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    50
            os.close(fd)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    51
        os.execvp(program, (program,) + tuple(args))
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    52
        sys.exit(255)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    53
    else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    54
        if wait:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    55
            return os.waitpid(pid, 0)[1]
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    56
        else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    57
            return pid
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    58
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    59
def safeexec(program, args = [], child_stdout = None,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    60
             child_stdin = None, child_stderr = None,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    61
             expected = 0):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    62
    """Calls mainexec() with the appropriate arguments, and raises
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    63
    an exception if the program died with a signal or returned an
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    64
    error code other than expected.  This function will always wait."""
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    65
    result = mainexec(program, args, child_stdout, child_stdin, child_stderr)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    66
    return checkresult(result, expected)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    67
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    68
def getstdoutsafeexec(program, args, expected = 0):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    69
    pipes = os.pipe()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    70
    pid = mainexec(program, args, child_stdout = pipes[1], wait  = 0)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    71
    os.close(pipes[1])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    72
    fd = os.fdopen(pipes[0], 'r')
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    73
    retval = fd.readlines()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    74
    checkpid(pid, expected)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    75
    os.close(pipes[0])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    76
    return retval
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    77
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    78
def silentsafeexec(program, args, expected = 0):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    79
    """Silently runs the specified program."""
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    80
    null = getnull()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    81
    result = mainexec(program, args, null, null, null)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    82
    return checkresult(result, expected)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    83
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    84
def checkresult(result, expected):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    85
    info = []
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    86
    if os.WIFSIGNALED(result):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    87
        info.append("got signal %d" % os.WTERMSIG(result))
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    88
    if os.WIFEXITED(result):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    89
        info.append("exited with code %d" % os.WEXITSTATUS(result))
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    90
    info = ",".join(info)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    91
    if not os.WIFEXITED(result):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    92
        raise ExecProblem, info
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    93
    if os.WEXITSTATUS(result) != expected:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    94
        raise ExecProblem, info + " (expected exit code %d)" % expected
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    95
    return result
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    96
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    97
def checkpid(pid, expected):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    98
    return checkresult(os.waitpid(pid, 0)[1], expected)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
    99
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   100
def getnull():
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   101
    global nulldev
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   102
    if not nulldev:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   103
        nulldev = open("/dev/null", "w+")
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   104
    return nulldev
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   105
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   106
def chdircmd(newdir, func, *args, **kwargs):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   107
    cwd = os.getcwd()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   108
    os.chdir(newdir)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   109
    try:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   110
        return apply(func, args, kwargs)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   111
    finally:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   112
        os.chdir(cwd)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   113
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   114
def maketree(path, addpath = None, ignore = [], res = None):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   115
    thisdir = os.listdir(path)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   116
    retval = []
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   117
    others = []
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   118
    if res == None:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   119
        res = [re.compile(x) for x in ignore]
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   120
    for item in thisdir:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   121
        skip = 0
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   122
        for retest in res:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   123
            if retest.search(item):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   124
                skip = 1
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   125
                break
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   126
        if skip:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   127
            continue
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   128
        dirname = os.path.join(path, item)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   129
        if os.path.isdir(dirname) and not os.path.islink(dirname):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   130
            if addpath:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   131
                retval.append(os.path.join(addpath, item) + '/')
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   132
            else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   133
                retval.append(item + '/')
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   134
            if addpath:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   135
                newaddpath = os.path.join(addpath, item)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   136
            else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   137
                newaddpath = item
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   138
            others.extend(maketree(dirname, newaddpath, res = res))
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   139
        else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   140
            if addpath:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   141
                retval.append(os.path.join(addpath, item))
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   142
            else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   143
                retval.append(item)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   144
    return sorttree(retval + others)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   145
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   146
def sorttree(srctree, filesfirst = False):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   147
    retval = []
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   148
    dirs = [x for x in srctree if x.endswith('/')]
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   149
    files = [x for x in srctree if not x.endswith('/')]
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   150
    dirs.sort()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   151
    files.sort()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   152
    if filesfirst:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   153
        return files + dirs
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   154
    else:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   155
        return dirs + files
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   156
    
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   157
        
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   158
def copyfrom(srcdir, destdir):
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   159
    pipes = os.pipe()
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   160
    verbargs = []
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   161
    #if verbose:
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   162
    #    verbargs.append('-v')
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   163
    readerpid = chdircmd(srcdir, mainexec, "tar", ["-cSpf", "-", "."],
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   164
                         child_stdout = pipes[1], wait = 0,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   165
                         closefds = [pipes[0]])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   166
    writerpid = chdircmd(destdir, mainexec, "tar", ["-xSpf", "-"] + verbargs,
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   167
                         child_stdin = pipes[0], wait = 0, closefds = [pipes[1]])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   168
    os.close(pipes[0])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   169
    os.close(pipes[1])
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   170
    checkpid(readerpid, 0)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   171
    checkpid(writerpid, 0)
e8262ca32109 Add vcs-load-dirs project to thirdparty directory.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents:
diff changeset
   172