.issues/c568146d3275c22b/new/1208380912.M308451P23014Q10.metatron
author Dmitriy Morozov <morozov@cs.duke.edu>
Wed, 16 Apr 2008 17:22:20 -0400 (2008-04-16)
changeset 22 88f126b2dd08
permissions -rwxr-xr-x
Converted issues from mbox to maildir mailboxes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     1
Return-Path: <mirko@friedenhagen.de>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     2
X-Spam-Checker-Version: SpamAssassin 3.2.2 (2007-07-23) on one.cs.duke.edu
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     3
X-Spam-Level: 
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     4
X-Spam-Status: No, score=-0.7 required=5.0 tests=AWL,BAYES_50 autolearn=ham
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     5
	version=3.2.2
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     6
Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.188])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     7
	by one.cs.duke.edu (8.14.0/8.14.0) with ESMTP id m05LI8r8027688
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     8
	for <morozov@cs.duke.edu>; Sat, 5 Jan 2008 16:18:08 -0500 (EST)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
     9
Received: from borg.local (HSI-KBW-085-216-123-176.hsi.kabelbw.de [85.216.123.176])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    10
	by mrelayeu.kundenserver.de (node=mrelayeu7) with ESMTP (Nemesis)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    11
	id 0ML2xA-1JBGP22KSu-0000u0; Sat, 05 Jan 2008 22:18:02 +0100
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    12
Message-Id: <8B223BED-8A46-4129-A4F3-76B50A890874@friedenhagen.de>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    13
From: Mirko Friedenhagen <mirko@friedenhagen.de>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    14
To: Dmitriy Morozov <morozov@cs.duke.edu>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    15
In-Reply-To: <20080105124708.GA7043@cs.duke.edu>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    16
Content-Type: multipart/mixed; boundary=Apple-Mail-27-69865486
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    17
Mime-Version: 1.0 (Apple Message framework v915)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    18
Subject: Re: hg ishow fails in clone of Artemis-repo
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    19
Date: Sat, 05 Jan 2008 22:18:01 +0100
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    20
References: <D08973FE-D4D3-471D-A0E3-4CE2C4C4677F@friedenhagen.de> <20080104233436.GA1930@cs.duke.edu> <312C0172-3EF2-488A-A993-CF56C183F9A0@friedenhagen.de> <20080105124708.GA7043@cs.duke.edu>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    21
X-Mailer: Apple Mail (2.915)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    22
X-Provags-ID: V01U2FsdGVkX18U2SPmtxdIc/97m419K3u6bNHAGoJX7Zg8bRM
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    23
 nhGQpakEwacktoI+iKEBCOeJWa/w25yyJDtlt4rvwcfLwDf3SB
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    24
 BTBFcyJEMtRpthNwJH//w==
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    25
Status: RO
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    26
X-Status: A
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    27
Content-Length: 57277
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    28
Lines: 1782
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    29
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    30
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    31
--Apple-Mail-27-69865486
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    32
Content-Type: text/plain;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    33
	charset=US-ASCII;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    34
	format=flowed;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    35
	delsp=yes
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    36
Content-Transfer-Encoding: 7bit
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    37
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    38
Am 05.01.2008 um 13:47 schrieb Dmitriy Morozov:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    39
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    40
> Hi, Mirko,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    41
>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    42
> I'm unable to replicate the problem with mercrial/crew. Can you send
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    43
> me util.py (i.e., mercurial/util.py) from the repository that you are
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    44
> actually using?
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    45
I did not alter anything in it, see the diff between my local branch  
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    46
and default:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    47
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    48
[mirko@borg mercurial-crew]$ hg diff -rdefault
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    49
diff -r d852151fb8d4 hgext/convert/cvs.py
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    50
--- a/hgext/convert/cvs.py	Fri Jan 04 13:56:31 2008 -0800
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    51
+++ b/hgext/convert/cvs.py	Sat Jan 05 22:16:04 2008 +0100
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    52
@@ -255,6 +255,12 @@ class convert_cvs(converter_source):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    53
                      return (data, "x" in mode and "x" or "")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    54
                  elif line.startswith("E "):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    55
                      self.ui.warn("cvs server: %s\n" % line[2:])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    56
+                elif line.endswith("- ignored\n"):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    57
+                    self.ui.warn("cvs server: %s\n" % line)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    58
+                    self.readp.readline()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    59
+                    l = self.readp.readline()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    60
+                    if l != "error\n":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    61
+                        raise util.Abort("unknown CVS response: %s" %  
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    62
l)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    63
                  elif line.startswith("Remove"):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    64
                      l = self.readp.readline()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    65
                      l = self.readp.readline()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    66
diff -r d852151fb8d4 templates/gitweb/summary.tmpl
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    67
--- a/templates/gitweb/summary.tmpl	Fri Jan 04 13:56:31 2008 -0800
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    68
+++ b/templates/gitweb/summary.tmpl	Sat Jan 05 22:16:05 2008 +0100
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    69
@@ -7,6 +7,7 @@
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    70
  </head>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    71
  <body>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    72
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    73
+<a href="/">^ Repositories List</a>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    74
  <div class="page_header">
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    75
  <a href="http://www.selenic.com/mercurial/" title="Mercurial"><div  
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    76
style="float:right;">Mercurial</div></a><a  
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    77
href="{url}summary{sessionvars%urlparameter}">#repo|escape#</a> /  
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    78
summary
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    79
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    80
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    81
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    82
--Apple-Mail-27-69865486
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    83
Content-Disposition: attachment;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    84
	filename=util.py
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    85
Content-Type: text/x-python-script;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    86
	x-unix-mode=0644;
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    87
	name="util.py"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    88
Content-Transfer-Encoding: 7bit
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    89
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    90
"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    91
util.py - Mercurial utility functions and platform specfic implementations
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    92
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    93
 Copyright 2005 K. Thananchayan <thananck@yahoo.com>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    94
 Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    95
 Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    96
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    97
This software may be used and distributed according to the terms
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    98
of the GNU General Public License, incorporated herein by reference.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
    99
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   100
This contains helper routines that are independent of the SCM core and hide
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   101
platform-specific details from the core.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   102
"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   103
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   104
from i18n import _
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   105
import cStringIO, errno, getpass, popen2, re, shutil, sys, tempfile, strutil
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   106
import os, stat, threading, time, calendar, ConfigParser, locale, glob, osutil
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   107
import re, urlparse
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   108
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   109
try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   110
    set = set
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   111
    frozenset = frozenset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   112
except NameError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   113
    from sets import Set as set, ImmutableSet as frozenset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   114
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   115
try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   116
    _encoding = os.environ.get("HGENCODING")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   117
    if sys.platform == 'darwin' and not _encoding:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   118
        # On darwin, getpreferredencoding ignores the locale environment and
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   119
        # always returns mac-roman. We override this if the environment is
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   120
        # not C (has been customized by the user).
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   121
        locale.setlocale(locale.LC_CTYPE, '')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   122
        _encoding = locale.getlocale()[1]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   123
    if not _encoding:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   124
        _encoding = locale.getpreferredencoding() or 'ascii'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   125
except locale.Error:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   126
    _encoding = 'ascii'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   127
_encodingmode = os.environ.get("HGENCODINGMODE", "strict")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   128
_fallbackencoding = 'ISO-8859-1'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   129
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   130
def tolocal(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   131
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   132
    Convert a string from internal UTF-8 to local encoding
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   133
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   134
    All internal strings should be UTF-8 but some repos before the
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   135
    implementation of locale support may contain latin1 or possibly
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   136
    other character sets. We attempt to decode everything strictly
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   137
    using UTF-8, then Latin-1, and failing that, we use UTF-8 and
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   138
    replace unknown characters.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   139
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   140
    for e in ('UTF-8', _fallbackencoding):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   141
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   142
            u = s.decode(e) # attempt strict decoding
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   143
            return u.encode(_encoding, "replace")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   144
        except LookupError, k:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   145
            raise Abort(_("%s, please check your locale settings") % k)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   146
        except UnicodeDecodeError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   147
            pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   148
    u = s.decode("utf-8", "replace") # last ditch
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   149
    return u.encode(_encoding, "replace")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   150
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   151
def fromlocal(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   152
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   153
    Convert a string from the local character encoding to UTF-8
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   154
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   155
    We attempt to decode strings using the encoding mode set by
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   156
    HGENCODINGMODE, which defaults to 'strict'. In this mode, unknown
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   157
    characters will cause an error message. Other modes include
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   158
    'replace', which replaces unknown characters with a special
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   159
    Unicode character, and 'ignore', which drops the character.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   160
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   161
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   162
        return s.decode(_encoding, _encodingmode).encode("utf-8")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   163
    except UnicodeDecodeError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   164
        sub = s[max(0, inst.start-10):inst.start+10]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   165
        raise Abort("decoding near '%s': %s!" % (sub, inst))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   166
    except LookupError, k:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   167
        raise Abort(_("%s, please check your locale settings") % k)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   168
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   169
def locallen(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   170
    """Find the length in characters of a local string"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   171
    return len(s.decode(_encoding, "replace"))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   172
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   173
# used by parsedate
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   174
defaultdateformats = (
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   175
    '%Y-%m-%d %H:%M:%S',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   176
    '%Y-%m-%d %I:%M:%S%p',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   177
    '%Y-%m-%d %H:%M',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   178
    '%Y-%m-%d %I:%M%p',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   179
    '%Y-%m-%d',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   180
    '%m-%d',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   181
    '%m/%d',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   182
    '%m/%d/%y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   183
    '%m/%d/%Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   184
    '%a %b %d %H:%M:%S %Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   185
    '%a %b %d %I:%M:%S%p %Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   186
    '%a, %d %b %Y %H:%M:%S',        #  GNU coreutils "/bin/date --rfc-2822"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   187
    '%b %d %H:%M:%S %Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   188
    '%b %d %I:%M:%S%p %Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   189
    '%b %d %H:%M:%S',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   190
    '%b %d %I:%M:%S%p',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   191
    '%b %d %H:%M',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   192
    '%b %d %I:%M%p',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   193
    '%b %d %Y',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   194
    '%b %d',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   195
    '%H:%M:%S',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   196
    '%I:%M:%SP',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   197
    '%H:%M',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   198
    '%I:%M%p',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   199
)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   200
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   201
extendeddateformats = defaultdateformats + (
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   202
    "%Y",
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   203
    "%Y-%m",
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   204
    "%b",
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   205
    "%b %Y",
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   206
    )
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   207
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   208
class SignalInterrupt(Exception):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   209
    """Exception raised on SIGTERM and SIGHUP."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   210
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   211
# differences from SafeConfigParser:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   212
# - case-sensitive keys
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   213
# - allows values that are not strings (this means that you may not
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   214
#   be able to save the configuration to a file)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   215
class configparser(ConfigParser.SafeConfigParser):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   216
    def optionxform(self, optionstr):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   217
        return optionstr
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   218
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   219
    def set(self, section, option, value):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   220
        return ConfigParser.ConfigParser.set(self, section, option, value)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   221
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   222
    def _interpolate(self, section, option, rawval, vars):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   223
        if not isinstance(rawval, basestring):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   224
            return rawval
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   225
        return ConfigParser.SafeConfigParser._interpolate(self, section,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   226
                                                          option, rawval, vars)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   227
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   228
def cachefunc(func):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   229
    '''cache the result of function calls'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   230
    # XXX doesn't handle keywords args
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   231
    cache = {}
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   232
    if func.func_code.co_argcount == 1:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   233
        # we gain a small amount of time because
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   234
        # we don't need to pack/unpack the list
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   235
        def f(arg):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   236
            if arg not in cache:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   237
                cache[arg] = func(arg)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   238
            return cache[arg]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   239
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   240
        def f(*args):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   241
            if args not in cache:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   242
                cache[args] = func(*args)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   243
            return cache[args]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   244
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   245
    return f
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   246
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   247
def pipefilter(s, cmd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   248
    '''filter string S through command CMD, returning its output'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   249
    (pin, pout) = os.popen2(cmd, 'b')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   250
    def writer():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   251
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   252
            pin.write(s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   253
            pin.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   254
        except IOError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   255
            if inst.errno != errno.EPIPE:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   256
                raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   257
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   258
    # we should use select instead on UNIX, but this will work on most
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   259
    # systems, including Windows
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   260
    w = threading.Thread(target=writer)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   261
    w.start()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   262
    f = pout.read()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   263
    pout.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   264
    w.join()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   265
    return f
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   266
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   267
def tempfilter(s, cmd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   268
    '''filter string S through a pair of temporary files with CMD.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   269
    CMD is used as a template to create the real command to be run,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   270
    with the strings INFILE and OUTFILE replaced by the real names of
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   271
    the temporary files generated.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   272
    inname, outname = None, None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   273
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   274
        infd, inname = tempfile.mkstemp(prefix='hg-filter-in-')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   275
        fp = os.fdopen(infd, 'wb')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   276
        fp.write(s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   277
        fp.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   278
        outfd, outname = tempfile.mkstemp(prefix='hg-filter-out-')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   279
        os.close(outfd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   280
        cmd = cmd.replace('INFILE', inname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   281
        cmd = cmd.replace('OUTFILE', outname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   282
        code = os.system(cmd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   283
        if sys.platform == 'OpenVMS' and code & 1:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   284
            code = 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   285
        if code: raise Abort(_("command '%s' failed: %s") %
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   286
                             (cmd, explain_exit(code)))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   287
        return open(outname, 'rb').read()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   288
    finally:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   289
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   290
            if inname: os.unlink(inname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   291
        except: pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   292
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   293
            if outname: os.unlink(outname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   294
        except: pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   295
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   296
filtertable = {
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   297
    'tempfile:': tempfilter,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   298
    'pipe:': pipefilter,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   299
    }
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   300
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   301
def filter(s, cmd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   302
    "filter a string through a command that transforms its input to its output"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   303
    for name, fn in filtertable.iteritems():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   304
        if cmd.startswith(name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   305
            return fn(s, cmd[len(name):].lstrip())
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   306
    return pipefilter(s, cmd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   307
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   308
def binary(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   309
    """return true if a string is binary data using diff's heuristic"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   310
    if s and '\0' in s[:4096]:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   311
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   312
    return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   313
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   314
def unique(g):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   315
    """return the uniq elements of iterable g"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   316
    return dict.fromkeys(g).keys()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   317
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   318
class Abort(Exception):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   319
    """Raised if a command needs to print an error and exit."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   320
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   321
class UnexpectedOutput(Abort):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   322
    """Raised to print an error with part of output and exit."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   323
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   324
def always(fn): return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   325
def never(fn): return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   326
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   327
def expand_glob(pats):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   328
    '''On Windows, expand the implicit globs in a list of patterns'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   329
    if os.name != 'nt':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   330
        return list(pats)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   331
    ret = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   332
    for p in pats:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   333
        kind, name = patkind(p, None)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   334
        if kind is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   335
            globbed = glob.glob(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   336
            if globbed:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   337
                ret.extend(globbed)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   338
                continue
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   339
            # if we couldn't expand the glob, just keep it around
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   340
        ret.append(p)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   341
    return ret
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   342
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   343
def patkind(name, dflt_pat='glob'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   344
    """Split a string into an optional pattern kind prefix and the
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   345
    actual pattern."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   346
    for prefix in 're', 'glob', 'path', 'relglob', 'relpath', 'relre':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   347
        if name.startswith(prefix + ':'): return name.split(':', 1)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   348
    return dflt_pat, name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   349
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   350
def globre(pat, head='^', tail='$'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   351
    "convert a glob pattern into a regexp"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   352
    i, n = 0, len(pat)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   353
    res = ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   354
    group = False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   355
    def peek(): return i < n and pat[i]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   356
    while i < n:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   357
        c = pat[i]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   358
        i = i+1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   359
        if c == '*':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   360
            if peek() == '*':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   361
                i += 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   362
                res += '.*'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   363
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   364
                res += '[^/]*'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   365
        elif c == '?':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   366
            res += '.'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   367
        elif c == '[':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   368
            j = i
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   369
            if j < n and pat[j] in '!]':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   370
                j += 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   371
            while j < n and pat[j] != ']':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   372
                j += 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   373
            if j >= n:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   374
                res += '\\['
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   375
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   376
                stuff = pat[i:j].replace('\\','\\\\')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   377
                i = j + 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   378
                if stuff[0] == '!':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   379
                    stuff = '^' + stuff[1:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   380
                elif stuff[0] == '^':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   381
                    stuff = '\\' + stuff
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   382
                res = '%s[%s]' % (res, stuff)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   383
        elif c == '{':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   384
            group = True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   385
            res += '(?:'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   386
        elif c == '}' and group:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   387
            res += ')'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   388
            group = False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   389
        elif c == ',' and group:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   390
            res += '|'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   391
        elif c == '\\':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   392
            p = peek()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   393
            if p:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   394
                i += 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   395
                res += re.escape(p)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   396
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   397
                res += re.escape(c)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   398
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   399
            res += re.escape(c)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   400
    return head + res + tail
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   401
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   402
_globchars = {'[': 1, '{': 1, '*': 1, '?': 1}
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   403
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   404
def pathto(root, n1, n2):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   405
    '''return the relative path from one place to another.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   406
    root should use os.sep to separate directories
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   407
    n1 should use os.sep to separate directories
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   408
    n2 should use "/" to separate directories
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   409
    returns an os.sep-separated path.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   410
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   411
    If n1 is a relative path, it's assumed it's
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   412
    relative to root.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   413
    n2 should always be relative to root.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   414
    '''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   415
    if not n1: return localpath(n2)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   416
    if os.path.isabs(n1):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   417
        if os.path.splitdrive(root)[0] != os.path.splitdrive(n1)[0]:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   418
            return os.path.join(root, localpath(n2))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   419
        n2 = '/'.join((pconvert(root), n2))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   420
    a, b = n1.split(os.sep), n2.split('/')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   421
    a.reverse()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   422
    b.reverse()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   423
    while a and b and a[-1] == b[-1]:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   424
        a.pop()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   425
        b.pop()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   426
    b.reverse()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   427
    return os.sep.join((['..'] * len(a)) + b)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   428
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   429
def canonpath(root, cwd, myname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   430
    """return the canonical path of myname, given cwd and root"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   431
    if root == os.sep:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   432
        rootsep = os.sep
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   433
    elif root.endswith(os.sep):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   434
        rootsep = root
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   435
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   436
        rootsep = root + os.sep
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   437
    name = myname
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   438
    if not os.path.isabs(name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   439
        name = os.path.join(root, cwd, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   440
    name = os.path.normpath(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   441
    audit_path = path_auditor(root)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   442
    if name != rootsep and name.startswith(rootsep):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   443
        name = name[len(rootsep):]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   444
        audit_path(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   445
        return pconvert(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   446
    elif name == root:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   447
        return ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   448
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   449
        # Determine whether `name' is in the hierarchy at or beneath `root',
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   450
        # by iterating name=dirname(name) until that causes no change (can't
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   451
        # check name == '/', because that doesn't work on windows).  For each
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   452
        # `name', compare dev/inode numbers.  If they match, the list `rel'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   453
        # holds the reversed list of components making up the relative file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   454
        # name we want.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   455
        root_st = os.stat(root)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   456
        rel = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   457
        while True:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   458
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   459
                name_st = os.stat(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   460
            except OSError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   461
                break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   462
            if samestat(name_st, root_st):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   463
                if not rel:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   464
                    # name was actually the same as root (maybe a symlink)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   465
                    return ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   466
                rel.reverse()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   467
                name = os.path.join(*rel)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   468
                audit_path(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   469
                return pconvert(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   470
            dirname, basename = os.path.split(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   471
            rel.append(basename)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   472
            if dirname == name:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   473
                break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   474
            name = dirname
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   475
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   476
        raise Abort('%s not under root' % myname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   477
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   478
def matcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   479
    return _matcher(canonroot, cwd, names, inc, exc, 'glob', src)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   480
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   481
def cmdmatcher(canonroot, cwd='', names=[], inc=[], exc=[], src=None,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   482
               globbed=False, default=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   483
    default = default or 'relpath'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   484
    if default == 'relpath' and not globbed:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   485
        names = expand_glob(names)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   486
    return _matcher(canonroot, cwd, names, inc, exc, default, src)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   487
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   488
def _matcher(canonroot, cwd, names, inc, exc, dflt_pat, src):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   489
    """build a function to match a set of file patterns
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   490
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   491
    arguments:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   492
    canonroot - the canonical root of the tree you're matching against
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   493
    cwd - the current working directory, if relevant
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   494
    names - patterns to find
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   495
    inc - patterns to include
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   496
    exc - patterns to exclude
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   497
    dflt_pat - if a pattern in names has no explicit type, assume this one
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   498
    src - where these patterns came from (e.g. .hgignore)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   499
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   500
    a pattern is one of:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   501
    'glob:<glob>' - a glob relative to cwd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   502
    're:<regexp>' - a regular expression
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   503
    'path:<path>' - a path relative to canonroot
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   504
    'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   505
    'relpath:<path>' - a path relative to cwd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   506
    'relre:<regexp>' - a regexp that doesn't have to match the start of a name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   507
    '<something>' - one of the cases above, selected by the dflt_pat argument
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   508
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   509
    returns:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   510
    a 3-tuple containing
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   511
    - list of roots (places where one should start a recursive walk of the fs);
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   512
      this often matches the explicit non-pattern names passed in, but also
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   513
      includes the initial part of glob: patterns that has no glob characters
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   514
    - a bool match(filename) function
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   515
    - a bool indicating if any patterns were passed in
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   516
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   517
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   518
    # a common case: no patterns at all
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   519
    if not names and not inc and not exc:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   520
        return [], always, False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   521
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   522
    def contains_glob(name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   523
        for c in name:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   524
            if c in _globchars: return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   525
        return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   526
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   527
    def regex(kind, name, tail):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   528
        '''convert a pattern into a regular expression'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   529
        if not name:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   530
            return ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   531
        if kind == 're':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   532
            return name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   533
        elif kind == 'path':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   534
            return '^' + re.escape(name) + '(?:/|$)'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   535
        elif kind == 'relglob':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   536
            return globre(name, '(?:|.*/)', tail)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   537
        elif kind == 'relpath':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   538
            return re.escape(name) + '(?:/|$)'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   539
        elif kind == 'relre':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   540
            if name.startswith('^'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   541
                return name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   542
            return '.*' + name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   543
        return globre(name, '', tail)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   544
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   545
    def matchfn(pats, tail):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   546
        """build a matching function from a set of patterns"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   547
        if not pats:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   548
            return
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   549
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   550
            pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   551
            return re.compile(pat).match
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   552
        except OverflowError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   553
            # We're using a Python with a tiny regex engine and we
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   554
            # made it explode, so we'll divide the pattern list in two
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   555
            # until it works
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   556
            l = len(pats)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   557
            if l < 2:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   558
                raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   559
            a, b = matchfn(pats[:l//2], tail), matchfn(pats[l//2:], tail)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   560
            return lambda s: a(s) or b(s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   561
        except re.error:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   562
            for k, p in pats:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   563
                try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   564
                    re.compile('(?:%s)' % regex(k, p, tail))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   565
                except re.error:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   566
                    if src:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   567
                        raise Abort("%s: invalid pattern (%s): %s" %
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   568
                                    (src, k, p))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   569
                    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   570
                        raise Abort("invalid pattern (%s): %s" % (k, p))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   571
            raise Abort("invalid pattern")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   572
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   573
    def globprefix(pat):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   574
        '''return the non-glob prefix of a path, e.g. foo/* -> foo'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   575
        root = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   576
        for p in pat.split('/'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   577
            if contains_glob(p): break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   578
            root.append(p)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   579
        return '/'.join(root) or '.'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   580
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   581
    def normalizepats(names, default):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   582
        pats = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   583
        roots = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   584
        anypats = False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   585
        for kind, name in [patkind(p, default) for p in names]:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   586
            if kind in ('glob', 'relpath'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   587
                name = canonpath(canonroot, cwd, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   588
            elif kind in ('relglob', 'path'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   589
                name = normpath(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   590
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   591
            pats.append((kind, name))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   592
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   593
            if kind in ('glob', 're', 'relglob', 'relre'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   594
                anypats = True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   595
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   596
            if kind == 'glob':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   597
                root = globprefix(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   598
                roots.append(root)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   599
            elif kind in ('relpath', 'path'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   600
                roots.append(name or '.')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   601
            elif kind == 'relglob':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   602
                roots.append('.')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   603
        return roots, pats, anypats
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   604
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   605
    roots, pats, anypats = normalizepats(names, dflt_pat)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   606
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   607
    patmatch = matchfn(pats, '$') or always
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   608
    incmatch = always
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   609
    if inc:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   610
        dummy, inckinds, dummy = normalizepats(inc, 'glob')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   611
        incmatch = matchfn(inckinds, '(?:/|$)')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   612
    excmatch = lambda fn: False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   613
    if exc:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   614
        dummy, exckinds, dummy = normalizepats(exc, 'glob')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   615
        excmatch = matchfn(exckinds, '(?:/|$)')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   616
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   617
    if not names and inc and not exc:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   618
        # common case: hgignore patterns
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   619
        match = incmatch
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   620
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   621
        match = lambda fn: incmatch(fn) and not excmatch(fn) and patmatch(fn)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   622
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   623
    return (roots, match, (inc or exc or anypats) and True)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   624
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   625
_hgexecutable = None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   626
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   627
def hgexecutable():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   628
    """return location of the 'hg' executable.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   629
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   630
    Defaults to $HG or 'hg' in the search path.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   631
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   632
    if _hgexecutable is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   633
        set_hgexecutable(os.environ.get('HG') or find_exe('hg', 'hg'))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   634
    return _hgexecutable
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   635
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   636
def set_hgexecutable(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   637
    """set location of the 'hg' executable"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   638
    global _hgexecutable
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   639
    _hgexecutable = path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   640
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   641
def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   642
    '''enhanced shell command execution.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   643
    run with environment maybe modified, maybe in different dir.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   644
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   645
    if command fails and onerr is None, return status.  if ui object,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   646
    print error message and return status, else raise onerr object as
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   647
    exception.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   648
    def py2shell(val):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   649
        'convert python object into string that is useful to shell'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   650
        if val in (None, False):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   651
            return '0'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   652
        if val == True:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   653
            return '1'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   654
        return str(val)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   655
    oldenv = {}
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   656
    for k in environ:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   657
        oldenv[k] = os.environ.get(k)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   658
    if cwd is not None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   659
        oldcwd = os.getcwd()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   660
    origcmd = cmd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   661
    if os.name == 'nt':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   662
        cmd = '"%s"' % cmd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   663
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   664
        for k, v in environ.iteritems():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   665
            os.environ[k] = py2shell(v)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   666
        os.environ['HG'] = hgexecutable()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   667
        if cwd is not None and oldcwd != cwd:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   668
            os.chdir(cwd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   669
        rc = os.system(cmd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   670
        if sys.platform == 'OpenVMS' and rc & 1:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   671
            rc = 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   672
        if rc and onerr:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   673
            errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   674
                                explain_exit(rc)[0])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   675
            if errprefix:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   676
                errmsg = '%s: %s' % (errprefix, errmsg)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   677
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   678
                onerr.warn(errmsg + '\n')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   679
            except AttributeError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   680
                raise onerr(errmsg)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   681
        return rc
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   682
    finally:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   683
        for k, v in oldenv.iteritems():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   684
            if v is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   685
                del os.environ[k]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   686
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   687
                os.environ[k] = v
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   688
        if cwd is not None and oldcwd != cwd:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   689
            os.chdir(oldcwd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   690
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   691
# os.path.lexists is not available on python2.3
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   692
def lexists(filename):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   693
    "test whether a file with this name exists. does not follow symlinks"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   694
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   695
        os.lstat(filename)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   696
    except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   697
        return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   698
    return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   699
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   700
def rename(src, dst):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   701
    """forcibly rename a file"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   702
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   703
        os.rename(src, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   704
    except OSError, err: # FIXME: check err (EEXIST ?)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   705
        # on windows, rename to existing file is not allowed, so we
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   706
        # must delete destination first. but if file is open, unlink
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   707
        # schedules it for delete but does not delete it. rename
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   708
        # happens immediately even for open files, so we create
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   709
        # temporary file, delete it, rename destination to that name,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   710
        # then delete that. then rename is safe to do.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   711
        fd, temp = tempfile.mkstemp(dir=os.path.dirname(dst) or '.')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   712
        os.close(fd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   713
        os.unlink(temp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   714
        os.rename(dst, temp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   715
        os.unlink(temp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   716
        os.rename(src, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   717
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   718
def unlink(f):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   719
    """unlink and remove the directory if it is empty"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   720
    os.unlink(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   721
    # try removing directories that might now be empty
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   722
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   723
        os.removedirs(os.path.dirname(f))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   724
    except OSError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   725
        pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   726
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   727
def copyfile(src, dest):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   728
    "copy a file, preserving mode"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   729
    if os.path.islink(src):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   730
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   731
            os.unlink(dest)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   732
        except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   733
            pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   734
        os.symlink(os.readlink(src), dest)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   735
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   736
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   737
            shutil.copyfile(src, dest)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   738
            shutil.copymode(src, dest)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   739
        except shutil.Error, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   740
            raise Abort(str(inst))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   741
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   742
def copyfiles(src, dst, hardlink=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   743
    """Copy a directory tree using hardlinks if possible"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   744
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   745
    if hardlink is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   746
        hardlink = (os.stat(src).st_dev ==
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   747
                    os.stat(os.path.dirname(dst)).st_dev)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   748
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   749
    if os.path.isdir(src):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   750
        os.mkdir(dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   751
        for name, kind in osutil.listdir(src):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   752
            srcname = os.path.join(src, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   753
            dstname = os.path.join(dst, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   754
            copyfiles(srcname, dstname, hardlink)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   755
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   756
        if hardlink:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   757
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   758
                os_link(src, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   759
            except (IOError, OSError):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   760
                hardlink = False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   761
                shutil.copy(src, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   762
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   763
            shutil.copy(src, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   764
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   765
class path_auditor(object):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   766
    '''ensure that a filesystem path contains no banned components.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   767
    the following properties of a path are checked:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   768
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   769
    - under top-level .hg
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   770
    - starts at the root of a windows drive
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   771
    - contains ".."
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   772
    - traverses a symlink (e.g. a/symlink_here/b)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   773
    - inside a nested repository'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   774
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   775
    def __init__(self, root):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   776
        self.audited = set()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   777
        self.auditeddir = set()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   778
        self.root = root
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   779
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   780
    def __call__(self, path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   781
        if path in self.audited:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   782
            return
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   783
        normpath = os.path.normcase(path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   784
        parts = normpath.split(os.sep)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   785
        if (os.path.splitdrive(path)[0] or parts[0] in ('.hg', '')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   786
            or os.pardir in parts):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   787
            raise Abort(_("path contains illegal component: %s") % path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   788
        def check(prefix):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   789
            curpath = os.path.join(self.root, prefix)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   790
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   791
                st = os.lstat(curpath)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   792
            except OSError, err:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   793
                # EINVAL can be raised as invalid path syntax under win32.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   794
                # They must be ignored for patterns can be checked too.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   795
                if err.errno not in (errno.ENOENT, errno.ENOTDIR, errno.EINVAL):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   796
                    raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   797
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   798
                if stat.S_ISLNK(st.st_mode):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   799
                    raise Abort(_('path %r traverses symbolic link %r') %
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   800
                                (path, prefix))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   801
                elif (stat.S_ISDIR(st.st_mode) and
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   802
                      os.path.isdir(os.path.join(curpath, '.hg'))):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   803
                    raise Abort(_('path %r is inside repo %r') %
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   804
                                (path, prefix))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   805
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   806
        prefixes = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   807
        for c in strutil.rfindall(normpath, os.sep):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   808
            prefix = normpath[:c]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   809
            if prefix in self.auditeddir:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   810
                break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   811
            check(prefix)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   812
            prefixes.append(prefix)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   813
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   814
        self.audited.add(path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   815
        # only add prefixes to the cache after checking everything: we don't
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   816
        # want to add "foo/bar/baz" before checking if there's a "foo/.hg"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   817
        self.auditeddir.update(prefixes)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   818
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   819
def _makelock_file(info, pathname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   820
    ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   821
    os.write(ld, info)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   822
    os.close(ld)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   823
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   824
def _readlock_file(pathname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   825
    return posixfile(pathname).read()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   826
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   827
def nlinks(pathname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   828
    """Return number of hardlinks for the given file."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   829
    return os.lstat(pathname).st_nlink
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   830
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   831
if hasattr(os, 'link'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   832
    os_link = os.link
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   833
else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   834
    def os_link(src, dst):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   835
        raise OSError(0, _("Hardlinks not supported"))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   836
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   837
def fstat(fp):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   838
    '''stat file object that may not have fileno method.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   839
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   840
        return os.fstat(fp.fileno())
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   841
    except AttributeError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   842
        return os.stat(fp.name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   843
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   844
posixfile = file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   845
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   846
def openhardlinks():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   847
    '''return true if it is safe to hold open file handles to hardlinks'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   848
    return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   849
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   850
getuser_fallback = None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   851
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   852
def getuser():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   853
    '''return name of current user'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   854
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   855
        return getpass.getuser()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   856
    except ImportError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   857
        # import of pwd will fail on windows - try fallback
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   858
        if getuser_fallback:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   859
            return getuser_fallback()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   860
    # raised if win32api not available
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   861
    raise Abort(_('user name not available - set USERNAME '
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   862
                  'environment variable'))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   863
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   864
def username(uid=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   865
    """Return the name of the user with the given uid.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   866
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   867
    If uid is None, return the name of the current user."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   868
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   869
        import pwd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   870
        if uid is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   871
            uid = os.getuid()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   872
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   873
            return pwd.getpwuid(uid)[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   874
        except KeyError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   875
            return str(uid)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   876
    except ImportError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   877
        return None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   878
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   879
def groupname(gid=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   880
    """Return the name of the group with the given gid.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   881
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   882
    If gid is None, return the name of the current group."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   883
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   884
        import grp
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   885
        if gid is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   886
            gid = os.getgid()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   887
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   888
            return grp.getgrgid(gid)[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   889
        except KeyError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   890
            return str(gid)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   891
    except ImportError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   892
        return None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   893
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   894
# File system features
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   895
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   896
def checkfolding(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   897
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   898
    Check whether the given path is on a case-sensitive filesystem
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   899
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   900
    Requires a path (like /foo/.hg) ending with a foldable final
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   901
    directory component.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   902
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   903
    s1 = os.stat(path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   904
    d, b = os.path.split(path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   905
    p2 = os.path.join(d, b.upper())
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   906
    if path == p2:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   907
        p2 = os.path.join(d, b.lower())
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   908
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   909
        s2 = os.stat(p2)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   910
        if s2 == s1:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   911
            return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   912
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   913
    except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   914
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   915
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   916
def checkexec(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   917
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   918
    Check whether the given path is on a filesystem with UNIX-like exec flags
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   919
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   920
    Requires a directory (like /foo/.hg)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   921
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   922
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   923
    # VFAT on some Linux versions can flip mode but it doesn't persist
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   924
    # a FS remount. Frequently we can detect it if files are created
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   925
    # with exec bit on.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   926
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   927
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   928
        EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   929
        fh, fn = tempfile.mkstemp("", "", path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   930
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   931
            os.close(fh)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   932
            m = os.stat(fn).st_mode & 0777
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   933
            new_file_has_exec = m & EXECFLAGS
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   934
            os.chmod(fn, m ^ EXECFLAGS)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   935
            exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   936
        finally:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   937
            os.unlink(fn)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   938
    except (IOError, OSError):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   939
        # we don't care, the user probably won't be able to commit anyway
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   940
        return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   941
    return not (new_file_has_exec or exec_flags_cannot_flip)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   942
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   943
def execfunc(path, fallback):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   944
    '''return an is_exec() function with default to fallback'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   945
    if checkexec(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   946
        return lambda x: is_exec(os.path.join(path, x))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   947
    return fallback
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   948
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   949
def checklink(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   950
    """check whether the given path is on a symlink-capable filesystem"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   951
    # mktemp is not racy because symlink creation will fail if the
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   952
    # file already exists
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   953
    name = tempfile.mktemp(dir=path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   954
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   955
        os.symlink(".", name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   956
        os.unlink(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   957
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   958
    except (OSError, AttributeError):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   959
        return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   960
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   961
def linkfunc(path, fallback):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   962
    '''return an is_link() function with default to fallback'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   963
    if checklink(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   964
        return lambda x: os.path.islink(os.path.join(path, x))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   965
    return fallback
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   966
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   967
_umask = os.umask(0)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   968
os.umask(_umask)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   969
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   970
def needbinarypatch():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   971
    """return True if patches should be applied in binary mode by default."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   972
    return os.name == 'nt'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   973
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   974
# Platform specific variants
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   975
if os.name == 'nt':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   976
    import msvcrt
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   977
    nulldev = 'NUL:'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   978
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   979
    class winstdout:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   980
        '''stdout on windows misbehaves if sent through a pipe'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   981
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   982
        def __init__(self, fp):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   983
            self.fp = fp
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   984
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   985
        def __getattr__(self, key):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   986
            return getattr(self.fp, key)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   987
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   988
        def close(self):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   989
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   990
                self.fp.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   991
            except: pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   992
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   993
        def write(self, s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   994
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   995
                # This is workaround for "Not enough space" error on
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   996
                # writing large size of data to console.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   997
                limit = 16000
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   998
                l = len(s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
   999
                start = 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1000
                while start < l:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1001
                    end = start + limit
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1002
                    self.fp.write(s[start:end])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1003
                    start = end
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1004
            except IOError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1005
                if inst.errno != 0: raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1006
                self.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1007
                raise IOError(errno.EPIPE, 'Broken pipe')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1008
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1009
        def flush(self):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1010
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1011
                return self.fp.flush()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1012
            except IOError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1013
                if inst.errno != errno.EINVAL: raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1014
                self.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1015
                raise IOError(errno.EPIPE, 'Broken pipe')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1016
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1017
    sys.stdout = winstdout(sys.stdout)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1018
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1019
    def _is_win_9x():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1020
        '''return true if run on windows 95, 98 or me.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1021
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1022
            return sys.getwindowsversion()[3] == 1
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1023
        except AttributeError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1024
            return 'command' in os.environ.get('comspec', '')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1025
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1026
    def openhardlinks():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1027
        return not _is_win_9x and "win32api" in locals()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1028
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1029
    def system_rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1030
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1031
            return system_rcpath_win32()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1032
        except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1033
            return [r'c:\mercurial\mercurial.ini']
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1034
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1035
    def user_rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1036
        '''return os-specific hgrc search path to the user dir'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1037
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1038
            userrc = user_rcpath_win32()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1039
        except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1040
            userrc = os.path.join(os.path.expanduser('~'), 'mercurial.ini')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1041
        path = [userrc]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1042
        userprofile = os.environ.get('USERPROFILE')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1043
        if userprofile:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1044
            path.append(os.path.join(userprofile, 'mercurial.ini'))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1045
        return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1046
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1047
    def parse_patch_output(output_line):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1048
        """parses the output produced by patch and returns the file name"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1049
        pf = output_line[14:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1050
        if pf[0] == '`':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1051
            pf = pf[1:-1] # Remove the quotes
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1052
        return pf
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1053
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1054
    def sshargs(sshcmd, host, user, port):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1055
        '''Build argument list for ssh or Plink'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1056
        pflag = 'plink' in sshcmd.lower() and '-P' or '-p'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1057
        args = user and ("%s@%s" % (user, host)) or host
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1058
        return port and ("%s %s %s" % (args, pflag, port)) or args
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1059
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1060
    def testpid(pid):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1061
        '''return False if pid dead, True if running or not known'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1062
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1063
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1064
    def set_flags(f, flags):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1065
        pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1066
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1067
    def set_binary(fd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1068
        msvcrt.setmode(fd.fileno(), os.O_BINARY)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1069
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1070
    def pconvert(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1071
        return path.replace("\\", "/")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1072
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1073
    def localpath(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1074
        return path.replace('/', '\\')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1075
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1076
    def normpath(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1077
        return pconvert(os.path.normpath(path))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1078
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1079
    makelock = _makelock_file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1080
    readlock = _readlock_file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1081
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1082
    def samestat(s1, s2):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1083
        return False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1084
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1085
    # A sequence of backslashes is special iff it precedes a double quote:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1086
    # - if there's an even number of backslashes, the double quote is not
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1087
    #   quoted (i.e. it ends the quoted region)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1088
    # - if there's an odd number of backslashes, the double quote is quoted
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1089
    # - in both cases, every pair of backslashes is unquoted into a single
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1090
    #   backslash
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1091
    # (See http://msdn2.microsoft.com/en-us/library/a1y7w461.aspx )
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1092
    # So, to quote a string, we must surround it in double quotes, double
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1093
    # the number of backslashes that preceed double quotes and add another
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1094
    # backslash before every double quote (being careful with the double
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1095
    # quote we've appended to the end)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1096
    _quotere = None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1097
    def shellquote(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1098
        global _quotere
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1099
        if _quotere is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1100
            _quotere = re.compile(r'(\\*)("|\\$)')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1101
        return '"%s"' % _quotere.sub(r'\1\1\\\2', s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1102
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1103
    def quotecommand(cmd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1104
        """Build a command string suitable for os.popen* calls."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1105
        # The extra quotes are needed because popen* runs the command
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1106
        # through the current COMSPEC. cmd.exe suppress enclosing quotes.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1107
        return '"' + cmd + '"'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1108
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1109
    def popen(command):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1110
        # Work around "popen spawned process may not write to stdout
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1111
        # under windows"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1112
        # http://bugs.python.org/issue1366
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1113
        command += " 2> %s" % nulldev
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1114
        return os.popen(quotecommand(command))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1115
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1116
    def explain_exit(code):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1117
        return _("exited with status %d") % code, code
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1118
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1119
    # if you change this stub into a real check, please try to implement the
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1120
    # username and groupname functions above, too.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1121
    def isowner(fp, st=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1122
        return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1123
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1124
    def find_in_path(name, path, default=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1125
        '''find name in search path. path can be string (will be split
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1126
        with os.pathsep), or iterable thing that returns strings.  if name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1127
        found, return path to name. else return default. name is looked up
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1128
        using cmd.exe rules, using PATHEXT.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1129
        if isinstance(path, str):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1130
            path = path.split(os.pathsep)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1131
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1132
        pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1133
        pathext = pathext.lower().split(os.pathsep)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1134
        isexec = os.path.splitext(name)[1].lower() in pathext
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1135
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1136
        for p in path:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1137
            p_name = os.path.join(p, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1138
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1139
            if isexec and os.path.exists(p_name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1140
                return p_name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1141
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1142
            for ext in pathext:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1143
                p_name_ext = p_name + ext
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1144
                if os.path.exists(p_name_ext):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1145
                    return p_name_ext
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1146
        return default
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1147
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1148
    def set_signal_handler():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1149
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1150
            set_signal_handler_win32()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1151
        except NameError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1152
            pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1153
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1154
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1155
        # override functions with win32 versions if possible
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1156
        from util_win32 import *
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1157
        if not _is_win_9x():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1158
            posixfile = posixfile_nt
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1159
    except ImportError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1160
        pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1161
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1162
else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1163
    nulldev = '/dev/null'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1164
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1165
    def rcfiles(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1166
        rcs = [os.path.join(path, 'hgrc')]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1167
        rcdir = os.path.join(path, 'hgrc.d')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1168
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1169
            rcs.extend([os.path.join(rcdir, f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1170
                        for f, kind in osutil.listdir(rcdir)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1171
                        if f.endswith(".rc")])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1172
        except OSError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1173
            pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1174
        return rcs
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1175
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1176
    def system_rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1177
        path = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1178
        # old mod_python does not set sys.argv
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1179
        if len(getattr(sys, 'argv', [])) > 0:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1180
            path.extend(rcfiles(os.path.dirname(sys.argv[0]) +
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1181
                                  '/../etc/mercurial'))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1182
        path.extend(rcfiles('/etc/mercurial'))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1183
        return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1184
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1185
    def user_rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1186
        return [os.path.expanduser('~/.hgrc')]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1187
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1188
    def parse_patch_output(output_line):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1189
        """parses the output produced by patch and returns the file name"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1190
        pf = output_line[14:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1191
        if os.sys.platform == 'OpenVMS':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1192
            if pf[0] == '`':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1193
                pf = pf[1:-1] # Remove the quotes
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1194
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1195
           if pf.startswith("'") and pf.endswith("'") and " " in pf:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1196
                pf = pf[1:-1] # Remove the quotes
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1197
        return pf
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1198
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1199
    def sshargs(sshcmd, host, user, port):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1200
        '''Build argument list for ssh'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1201
        args = user and ("%s@%s" % (user, host)) or host
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1202
        return port and ("%s -p %s" % (args, port)) or args
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1203
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1204
    def is_exec(f):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1205
        """check whether a file is executable"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1206
        return (os.lstat(f).st_mode & 0100 != 0)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1207
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1208
    def set_flags(f, flags):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1209
        s = os.lstat(f).st_mode
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1210
        x = "x" in flags
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1211
        l = "l" in flags
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1212
        if l:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1213
            if not stat.S_ISLNK(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1214
                # switch file to link
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1215
                data = file(f).read()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1216
                os.unlink(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1217
                os.symlink(data, f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1218
            # no chmod needed at this point
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1219
            return
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1220
        if stat.S_ISLNK(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1221
            # switch link to file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1222
            data = os.readlink(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1223
            os.unlink(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1224
            file(f, "w").write(data)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1225
            s = 0666 & ~_umask # avoid restatting for chmod
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1226
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1227
        sx = s & 0100
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1228
        if x and not sx:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1229
            # Turn on +x for every +r bit when making a file executable
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1230
            # and obey umask.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1231
            os.chmod(f, s | (s & 0444) >> 2 & ~_umask)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1232
        elif not x and sx:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1233
            # Turn off all +x bits
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1234
            os.chmod(f, s & 0666)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1235
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1236
    def set_binary(fd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1237
        pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1238
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1239
    def pconvert(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1240
        return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1241
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1242
    def localpath(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1243
        return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1244
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1245
    normpath = os.path.normpath
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1246
    samestat = os.path.samestat
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1247
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1248
    def makelock(info, pathname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1249
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1250
            os.symlink(info, pathname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1251
        except OSError, why:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1252
            if why.errno == errno.EEXIST:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1253
                raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1254
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1255
                _makelock_file(info, pathname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1256
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1257
    def readlock(pathname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1258
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1259
            return os.readlink(pathname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1260
        except OSError, why:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1261
            if why.errno in (errno.EINVAL, errno.ENOSYS):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1262
                return _readlock_file(pathname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1263
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1264
                raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1265
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1266
    def shellquote(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1267
        if os.sys.platform == 'OpenVMS':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1268
            return '"%s"' % s
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1269
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1270
            return "'%s'" % s.replace("'", "'\\''")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1271
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1272
    def quotecommand(cmd):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1273
        return cmd
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1274
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1275
    def popen(command):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1276
        return os.popen(command)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1277
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1278
    def testpid(pid):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1279
        '''return False if pid dead, True if running or not sure'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1280
        if os.sys.platform == 'OpenVMS':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1281
            return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1282
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1283
            os.kill(pid, 0)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1284
            return True
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1285
        except OSError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1286
            return inst.errno != errno.ESRCH
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1287
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1288
    def explain_exit(code):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1289
        """return a 2-tuple (desc, code) describing a process's status"""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1290
        if os.WIFEXITED(code):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1291
            val = os.WEXITSTATUS(code)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1292
            return _("exited with status %d") % val, val
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1293
        elif os.WIFSIGNALED(code):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1294
            val = os.WTERMSIG(code)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1295
            return _("killed by signal %d") % val, val
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1296
        elif os.WIFSTOPPED(code):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1297
            val = os.WSTOPSIG(code)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1298
            return _("stopped by signal %d") % val, val
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1299
        raise ValueError(_("invalid exit code"))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1300
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1301
    def isowner(fp, st=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1302
        """Return True if the file object f belongs to the current user.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1303
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1304
        The return value of a util.fstat(f) may be passed as the st argument.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1305
        """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1306
        if st is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1307
            st = fstat(fp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1308
        return st.st_uid == os.getuid()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1309
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1310
    def find_in_path(name, path, default=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1311
        '''find name in search path. path can be string (will be split
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1312
        with os.pathsep), or iterable thing that returns strings.  if name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1313
        found, return path to name. else return default.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1314
        if isinstance(path, str):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1315
            path = path.split(os.pathsep)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1316
        for p in path:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1317
            p_name = os.path.join(p, name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1318
            if os.path.exists(p_name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1319
                return p_name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1320
        return default
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1321
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1322
    def set_signal_handler():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1323
        pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1324
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1325
def find_exe(name, default=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1326
    '''find path of an executable.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1327
    if name contains a path component, return it as is.  otherwise,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1328
    use normal executable search path.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1329
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1330
    if os.sep in name or sys.platform == 'OpenVMS':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1331
        # don't check the executable bit.  if the file isn't
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1332
        # executable, whoever tries to actually run it will give a
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1333
        # much more useful error message.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1334
        return name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1335
    return find_in_path(name, os.environ.get('PATH', ''), default=default)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1336
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1337
def _buildencodefun():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1338
    e = '_'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1339
    win_reserved = [ord(x) for x in '\\:*?"<>|']
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1340
    cmap = dict([ (chr(x), chr(x)) for x in xrange(127) ])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1341
    for x in (range(32) + range(126, 256) + win_reserved):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1342
        cmap[chr(x)] = "~%02x" % x
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1343
    for x in range(ord("A"), ord("Z")+1) + [ord(e)]:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1344
        cmap[chr(x)] = e + chr(x).lower()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1345
    dmap = {}
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1346
    for k, v in cmap.iteritems():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1347
        dmap[v] = k
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1348
    def decode(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1349
        i = 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1350
        while i < len(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1351
            for l in xrange(1, 4):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1352
                try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1353
                    yield dmap[s[i:i+l]]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1354
                    i += l
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1355
                    break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1356
                except KeyError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1357
                    pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1358
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1359
                raise KeyError
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1360
    return (lambda s: "".join([cmap[c] for c in s]),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1361
            lambda s: "".join(list(decode(s))))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1362
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1363
encodefilename, decodefilename = _buildencodefun()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1364
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1365
def encodedopener(openerfn, fn):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1366
    def o(path, *args, **kw):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1367
        return openerfn(fn(path), *args, **kw)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1368
    return o
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1369
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1370
def mktempcopy(name, emptyok=False):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1371
    """Create a temporary file with the same contents from name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1372
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1373
    The permission bits are copied from the original file.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1374
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1375
    If the temporary file is going to be truncated immediately, you
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1376
    can use emptyok=True as an optimization.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1377
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1378
    Returns the name of the temporary file.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1379
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1380
    d, fn = os.path.split(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1381
    fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1382
    os.close(fd)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1383
    # Temporary files are created with mode 0600, which is usually not
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1384
    # what we want.  If the original file already exists, just copy
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1385
    # its mode.  Otherwise, manually obey umask.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1386
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1387
        st_mode = os.lstat(name).st_mode & 0777
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1388
    except OSError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1389
        if inst.errno != errno.ENOENT:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1390
            raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1391
        st_mode = 0666 & ~_umask
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1392
    os.chmod(temp, st_mode)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1393
    if emptyok:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1394
        return temp
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1395
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1396
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1397
            ifp = posixfile(name, "rb")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1398
        except IOError, inst:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1399
            if inst.errno == errno.ENOENT:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1400
                return temp
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1401
            if not getattr(inst, 'filename', None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1402
                inst.filename = name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1403
            raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1404
        ofp = posixfile(temp, "wb")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1405
        for chunk in filechunkiter(ifp):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1406
            ofp.write(chunk)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1407
        ifp.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1408
        ofp.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1409
    except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1410
        try: os.unlink(temp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1411
        except: pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1412
        raise
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1413
    return temp
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1414
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1415
class atomictempfile(posixfile):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1416
    """file-like object that atomically updates a file
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1417
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1418
    All writes will be redirected to a temporary copy of the original
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1419
    file.  When rename is called, the copy is renamed to the original
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1420
    name, making the changes visible.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1421
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1422
    def __init__(self, name, mode):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1423
        self.__name = name
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1424
        self.temp = mktempcopy(name, emptyok=('w' in mode))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1425
        posixfile.__init__(self, self.temp, mode)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1426
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1427
    def rename(self):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1428
        if not self.closed:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1429
            posixfile.close(self)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1430
            rename(self.temp, localpath(self.__name))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1431
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1432
    def __del__(self):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1433
        if not self.closed:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1434
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1435
                os.unlink(self.temp)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1436
            except: pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1437
            posixfile.close(self)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1438
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1439
class opener(object):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1440
    """Open files relative to a base directory
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1441
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1442
    This class is used to hide the details of COW semantics and
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1443
    remote file access from higher level code.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1444
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1445
    def __init__(self, base, audit=True):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1446
        self.base = base
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1447
        if audit:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1448
            self.audit_path = path_auditor(base)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1449
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1450
            self.audit_path = always
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1451
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1452
    def __getattr__(self, name):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1453
        if name == '_can_symlink':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1454
            self._can_symlink = checklink(self.base)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1455
            return self._can_symlink
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1456
        raise AttributeError(name)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1457
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1458
    def __call__(self, path, mode="r", text=False, atomictemp=False):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1459
        self.audit_path(path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1460
        f = os.path.join(self.base, path)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1461
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1462
        if not text and "b" not in mode:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1463
            mode += "b" # for that other OS
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1464
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1465
        if mode[0] != "r":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1466
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1467
                nlink = nlinks(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1468
            except OSError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1469
                nlink = 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1470
                d = os.path.dirname(f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1471
                if not os.path.isdir(d):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1472
                    os.makedirs(d)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1473
            if atomictemp:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1474
                return atomictempfile(f, mode)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1475
            if nlink > 1:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1476
                rename(mktempcopy(f), f)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1477
        return posixfile(f, mode)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1478
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1479
    def symlink(self, src, dst):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1480
        self.audit_path(dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1481
        linkname = os.path.join(self.base, dst)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1482
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1483
            os.unlink(linkname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1484
        except OSError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1485
            pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1486
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1487
        dirname = os.path.dirname(linkname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1488
        if not os.path.exists(dirname):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1489
            os.makedirs(dirname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1490
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1491
        if self._can_symlink:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1492
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1493
                os.symlink(src, linkname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1494
            except OSError, err:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1495
                raise OSError(err.errno, _('could not symlink to %r: %s') %
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1496
                              (src, err.strerror), linkname)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1497
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1498
            f = self(dst, "w")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1499
            f.write(src)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1500
            f.close()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1501
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1502
class chunkbuffer(object):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1503
    """Allow arbitrary sized chunks of data to be efficiently read from an
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1504
    iterator over chunks of arbitrary size."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1505
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1506
    def __init__(self, in_iter):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1507
        """in_iter is the iterator that's iterating over the input chunks.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1508
        targetsize is how big a buffer to try to maintain."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1509
        self.iter = iter(in_iter)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1510
        self.buf = ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1511
        self.targetsize = 2**16
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1512
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1513
    def read(self, l):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1514
        """Read L bytes of data from the iterator of chunks of data.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1515
        Returns less than L bytes if the iterator runs dry."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1516
        if l > len(self.buf) and self.iter:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1517
            # Clamp to a multiple of self.targetsize
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1518
            targetsize = max(l, self.targetsize)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1519
            collector = cStringIO.StringIO()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1520
            collector.write(self.buf)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1521
            collected = len(self.buf)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1522
            for chunk in self.iter:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1523
                collector.write(chunk)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1524
                collected += len(chunk)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1525
                if collected >= targetsize:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1526
                    break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1527
            if collected < targetsize:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1528
                self.iter = False
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1529
            self.buf = collector.getvalue()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1530
        if len(self.buf) == l:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1531
            s, self.buf = str(self.buf), ''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1532
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1533
            s, self.buf = self.buf[:l], buffer(self.buf, l)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1534
        return s
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1535
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1536
def filechunkiter(f, size=65536, limit=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1537
    """Create a generator that produces the data in the file size
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1538
    (default 65536) bytes at a time, up to optional limit (default is
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1539
    to read all data).  Chunks may be less than size bytes if the
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1540
    chunk is the last chunk in the file, or the file is a socket or
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1541
    some other type of file that sometimes reads less data than is
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1542
    requested."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1543
    assert size >= 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1544
    assert limit is None or limit >= 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1545
    while True:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1546
        if limit is None: nbytes = size
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1547
        else: nbytes = min(limit, size)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1548
        s = nbytes and f.read(nbytes)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1549
        if not s: break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1550
        if limit: limit -= len(s)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1551
        yield s
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1552
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1553
def makedate():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1554
    lt = time.localtime()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1555
    if lt[8] == 1 and time.daylight:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1556
        tz = time.altzone
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1557
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1558
        tz = time.timezone
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1559
    return time.mktime(lt), tz
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1560
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1561
def datestr(date=None, format='%a %b %d %H:%M:%S %Y', timezone=True, timezone_format=" %+03d%02d"):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1562
    """represent a (unixtime, offset) tuple as a localized time.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1563
    unixtime is seconds since the epoch, and offset is the time zone's
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1564
    number of seconds away from UTC. if timezone is false, do not
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1565
    append time zone to string."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1566
    t, tz = date or makedate()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1567
    s = time.strftime(format, time.gmtime(float(t) - tz))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1568
    if timezone:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1569
        s += timezone_format % (-tz / 3600, ((-tz % 3600) / 60))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1570
    return s
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1571
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1572
def strdate(string, format, defaults=[]):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1573
    """parse a localized time string and return a (unixtime, offset) tuple.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1574
    if the string cannot be parsed, ValueError is raised."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1575
    def timezone(string):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1576
        tz = string.split()[-1]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1577
        if tz[0] in "+-" and len(tz) == 5 and tz[1:].isdigit():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1578
            tz = int(tz)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1579
            offset = - 3600 * (tz / 100) - 60 * (tz % 100)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1580
            return offset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1581
        if tz == "GMT" or tz == "UTC":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1582
            return 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1583
        return None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1584
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1585
    # NOTE: unixtime = localunixtime + offset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1586
    offset, date = timezone(string), string
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1587
    if offset != None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1588
        date = " ".join(string.split()[:-1])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1589
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1590
    # add missing elements from defaults
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1591
    for part in defaults:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1592
        found = [True for p in part if ("%"+p) in format]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1593
        if not found:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1594
            date += "@" + defaults[part]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1595
            format += "@%" + part[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1596
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1597
    timetuple = time.strptime(date, format)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1598
    localunixtime = int(calendar.timegm(timetuple))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1599
    if offset is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1600
        # local timezone
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1601
        unixtime = int(time.mktime(timetuple))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1602
        offset = unixtime - localunixtime
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1603
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1604
        unixtime = localunixtime + offset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1605
    return unixtime, offset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1606
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1607
def parsedate(string, formats=None, defaults=None):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1608
    """parse a localized time string and return a (unixtime, offset) tuple.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1609
    The date may be a "unixtime offset" string or in one of the specified
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1610
    formats."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1611
    if not string:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1612
        return 0, 0
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1613
    if not formats:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1614
        formats = defaultdateformats
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1615
    string = string.strip()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1616
    try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1617
        when, offset = map(int, string.split(' '))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1618
    except ValueError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1619
        # fill out defaults
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1620
        if not defaults:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1621
            defaults = {}
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1622
        now = makedate()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1623
        for part in "d mb yY HI M S".split():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1624
            if part not in defaults:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1625
                if part[0] in "HMS":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1626
                    defaults[part] = "00"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1627
                elif part[0] in "dm":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1628
                    defaults[part] = "1"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1629
                else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1630
                    defaults[part] = datestr(now, "%" + part[0], False)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1631
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1632
        for format in formats:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1633
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1634
                when, offset = strdate(string, format, defaults)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1635
            except ValueError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1636
                pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1637
            else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1638
                break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1639
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1640
            raise Abort(_('invalid date: %r ') % string)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1641
    # validate explicit (probably user-specified) date and
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1642
    # time zone offset. values must fit in signed 32 bits for
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1643
    # current 32-bit linux runtimes. timezones go from UTC-12
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1644
    # to UTC+14
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1645
    if abs(when) > 0x7fffffff:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1646
        raise Abort(_('date exceeds 32 bits: %d') % when)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1647
    if offset < -50400 or offset > 43200:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1648
        raise Abort(_('impossible time zone offset: %d') % offset)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1649
    return when, offset
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1650
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1651
def matchdate(date):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1652
    """Return a function that matches a given date match specifier
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1653
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1654
    Formats include:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1655
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1656
    '{date}' match a given date to the accuracy provided
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1657
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1658
    '<{date}' on or before a given date
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1659
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1660
    '>{date}' on or after a given date
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1661
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1662
    """
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1663
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1664
    def lower(date):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1665
        return parsedate(date, extendeddateformats)[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1666
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1667
    def upper(date):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1668
        d = dict(mb="12", HI="23", M="59", S="59")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1669
        for days in "31 30 29".split():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1670
            try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1671
                d["d"] = days
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1672
                return parsedate(date, extendeddateformats, d)[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1673
            except:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1674
                pass
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1675
        d["d"] = "28"
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1676
        return parsedate(date, extendeddateformats, d)[0]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1677
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1678
    if date[0] == "<":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1679
        when = upper(date[1:])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1680
        return lambda x: x <= when
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1681
    elif date[0] == ">":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1682
        when = lower(date[1:])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1683
        return lambda x: x >= when
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1684
    elif date[0] == "-":
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1685
        try:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1686
            days = int(date[1:])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1687
        except ValueError:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1688
            raise Abort(_("invalid day spec: %s") % date[1:])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1689
        when = makedate()[0] - days * 3600 * 24
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1690
        return lambda x: x >= when
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1691
    elif " to " in date:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1692
        a, b = date.split(" to ")
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1693
        start, stop = lower(a), upper(b)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1694
        return lambda x: x >= start and x <= stop
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1695
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1696
        start, stop = lower(date), upper(date)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1697
        return lambda x: x >= start and x <= stop
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1698
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1699
def shortuser(user):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1700
    """Return a short representation of a user name or email address."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1701
    f = user.find('@')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1702
    if f >= 0:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1703
        user = user[:f]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1704
    f = user.find('<')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1705
    if f >= 0:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1706
        user = user[f+1:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1707
    f = user.find(' ')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1708
    if f >= 0:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1709
        user = user[:f]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1710
    f = user.find('.')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1711
    if f >= 0:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1712
        user = user[:f]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1713
    return user
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1714
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1715
def ellipsis(text, maxlength=400):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1716
    """Trim string to at most maxlength (default: 400) characters."""
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1717
    if len(text) <= maxlength:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1718
        return text
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1719
    else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1720
        return "%s..." % (text[:maxlength-3])
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1721
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1722
def walkrepos(path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1723
    '''yield every hg repository under path, recursively.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1724
    def errhandler(err):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1725
        if err.filename == path:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1726
            raise err
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1727
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1728
    for root, dirs, files in os.walk(path, onerror=errhandler):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1729
        for d in dirs:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1730
            if d == '.hg':
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1731
                yield root
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1732
                dirs[:] = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1733
                break
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1734
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1735
_rcpath = None
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1736
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1737
def os_rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1738
    '''return default os-specific hgrc search path'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1739
    path = system_rcpath()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1740
    path.extend(user_rcpath())
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1741
    path = [os.path.normpath(f) for f in path]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1742
    return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1743
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1744
def rcpath():
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1745
    '''return hgrc search path. if env var HGRCPATH is set, use it.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1746
    for each item in path, if directory, use files ending in .rc,
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1747
    else use item.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1748
    make HGRCPATH empty to only look in .hg/hgrc of current repo.
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1749
    if no HGRCPATH, use default os-specific path.'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1750
    global _rcpath
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1751
    if _rcpath is None:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1752
        if 'HGRCPATH' in os.environ:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1753
            _rcpath = []
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1754
            for p in os.environ['HGRCPATH'].split(os.pathsep):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1755
                if not p: continue
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1756
                if os.path.isdir(p):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1757
                    for f, kind in osutil.listdir(p):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1758
                        if f.endswith('.rc'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1759
                            _rcpath.append(os.path.join(p, f))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1760
                else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1761
                    _rcpath.append(p)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1762
        else:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1763
            _rcpath = os_rcpath()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1764
    return _rcpath
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1765
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1766
def bytecount(nbytes):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1767
    '''return byte count formatted as readable string, with units'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1768
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1769
    units = (
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1770
        (100, 1<<30, _('%.0f GB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1771
        (10, 1<<30, _('%.1f GB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1772
        (1, 1<<30, _('%.2f GB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1773
        (100, 1<<20, _('%.0f MB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1774
        (10, 1<<20, _('%.1f MB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1775
        (1, 1<<20, _('%.2f MB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1776
        (100, 1<<10, _('%.0f KB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1777
        (10, 1<<10, _('%.1f KB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1778
        (1, 1<<10, _('%.2f KB')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1779
        (1, 1, _('%.0f bytes')),
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1780
        )
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1781
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1782
    for multiplier, divisor, format in units:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1783
        if nbytes >= divisor * multiplier:
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1784
            return format % (nbytes / float(divisor))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1785
    return units[-1][2] % nbytes
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1786
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1787
def drop_scheme(scheme, path):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1788
    sc = scheme + ':'
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1789
    if path.startswith(sc):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1790
        path = path[len(sc):]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1791
        if path.startswith('//'):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1792
            path = path[2:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1793
    return path
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1794
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1795
def uirepr(s):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1796
    # Avoid double backslash in Windows path repr()
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1797
    return repr(s).replace('\\\\', '\\')
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1798
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1799
def hidepassword(url):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1800
    '''hide user credential in a url string'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1801
    scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1802
    netloc = re.sub('([^:]*):([^@]*)@(.*)', r'\1:***@\3', netloc)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1803
    return urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1804
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1805
def removeauth(url):
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1806
    '''remove all authentication information from a url string'''
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1807
    scheme, netloc, path, params, query, fragment = urlparse.urlparse(url)
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1808
    netloc = netloc[netloc.find('@')+1:]
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1809
    return urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1810
88f126b2dd08 Converted issues from mbox to maildir mailboxes
Dmitriy Morozov <morozov@cs.duke.edu>
parents:
diff changeset
  1811
--Apple-Mail-27-69865486--