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 |
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-- |