Mercurial > hg
annotate mercurial/cext/dirs.c @ 36809:3c15b84ab66c
hgweb: teach WSGI parser about query strings
Currently, req.form uses cgi.parse() to populate form data. Depending
on the request, form data can come from POST multipart/form-data,
application/x-www-form-urlencoded, or the URL query string.
Putting all these things into one data structure makes it difficult
to reason about how exactly parameters got to the request. It can
lead to wonkiness such as pulling parameters from both the URL and
POST data.
This commit teaches our WSGI request parser about argument data
in query strings. We populate fields containing the query string
data and only the query string data so it can't be confused with
POST data.
Differential Revision: https://phab.mercurial-scm.org/D2737
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 08 Mar 2018 11:21:46 -0800 |
parents | b90e8da190da |
children | d8e55c0c642c |
rev | line source |
---|---|
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
1 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
2 dirs.c - dynamic directory diddling for dirstates |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
3 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
4 Copyright 2013 Facebook |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
5 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
6 This software may be used and distributed according to the terms of |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
7 the GNU General Public License, incorporated herein by reference. |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
8 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
9 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
10 #define PY_SSIZE_T_CLEAN |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
11 #include <Python.h> |
34438
b90e8da190da
cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32372
diff
changeset
|
12 |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
13 #include "util.h" |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
14 |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
15 #ifdef IS_PY3K |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
16 #define PYLONG_VALUE(o) ((PyLongObject *)o)->ob_digit[1] |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
17 #else |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
18 #define PYLONG_VALUE(o) PyInt_AS_LONG(o) |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
19 #endif |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
20 |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
21 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
22 * This is a multiset of directory names, built from the files that |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
23 * appear in a dirstate or manifest. |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
24 * |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
25 * A few implementation notes: |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
26 * |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
27 * We modify Python integers for refcounting, but those integers are |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
28 * never visible to Python code. |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
29 * |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
30 * We mutate strings in-place, but leave them immutable once they can |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
31 * be seen by Python code. |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
32 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
33 typedef struct { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
34 PyObject_HEAD |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
35 PyObject *dict; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
36 } dirsObject; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
37 |
25093
fe3a72a3e7ca
dirs.c: pass C string, not Python string, to _finddir()
Martin von Zweigbergk <martinvonz@google.com>
parents:
25092
diff
changeset
|
38 static inline Py_ssize_t _finddir(const char *path, Py_ssize_t pos) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
39 { |
25015
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
40 while (pos != -1) { |
25093
fe3a72a3e7ca
dirs.c: pass C string, not Python string, to _finddir()
Martin von Zweigbergk <martinvonz@google.com>
parents:
25092
diff
changeset
|
41 if (path[pos] == '/') |
25015
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
42 break; |
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
43 pos -= 1; |
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
44 } |
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
45 |
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
46 return pos; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
47 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
48 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
49 static int _addpath(PyObject *dirs, PyObject *path) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
50 { |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
51 const char *cpath = PyBytes_AS_STRING(path); |
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
52 Py_ssize_t pos = PyBytes_GET_SIZE(path); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
53 PyObject *key = NULL; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
54 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
55 |
30107
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
56 /* This loop is super critical for performance. That's why we inline |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
57 * access to Python structs instead of going through a supported API. |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
58 * The implementation, therefore, is heavily dependent on CPython |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
59 * implementation details. We also commit violations of the Python |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
60 * "protocol" such as mutating immutable objects. But since we only |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
61 * mutate objects created in this function or in other well-defined |
da08f4707282
dirs: document performance reasons for bypassing Python C API
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30106
diff
changeset
|
62 * locations, the references are known so these violations should go |
30139
27e00e6352ce
dirs: add comment about _PyBytes_Resize
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30107
diff
changeset
|
63 * unnoticed. The code for adjusting the length of a PyBytesObject is |
27e00e6352ce
dirs: add comment about _PyBytes_Resize
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30107
diff
changeset
|
64 * essentially a minimal version of _PyBytes_Resize. */ |
25093
fe3a72a3e7ca
dirs.c: pass C string, not Python string, to _finddir()
Martin von Zweigbergk <martinvonz@google.com>
parents:
25092
diff
changeset
|
65 while ((pos = _finddir(cpath, pos - 1)) != -1) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
66 PyObject *val; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
67 |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
68 /* It's likely that every prefix already has an entry |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
69 in our dict. Try to avoid allocating and |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
70 deallocating a string for each prefix we check. */ |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
71 if (key != NULL) |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
72 ((PyBytesObject *)key)->ob_shash = -1; |
25015
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
73 else { |
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
74 /* Force Python to not reuse a small shared string. */ |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
75 key = PyBytes_FromStringAndSize(cpath, |
25015
b3a68fb8b859
dirs: back out forward-searching in finddirs()
Martin von Zweigbergk <martinvonz@google.com>
parents:
24651
diff
changeset
|
76 pos < 2 ? 2 : pos); |
18902
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
77 if (key == NULL) |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
78 goto bail; |
8c0a7eeda06d
dirs: use mutable strings internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18901
diff
changeset
|
79 } |
30159
fb5504d7b2c9
dirs: document Py_SIZE weirdness
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30139
diff
changeset
|
80 /* Py_SIZE(o) refers to the ob_size member of the struct. Yes, |
fb5504d7b2c9
dirs: document Py_SIZE weirdness
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30139
diff
changeset
|
81 * assigning to what looks like a function seems wrong. */ |
30104
63e1dca2d6a4
dirs: inline string macros
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25093
diff
changeset
|
82 Py_SIZE(key) = pos; |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
83 ((PyBytesObject *)key)->ob_sval[pos] = '\0'; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
84 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
85 val = PyDict_GetItem(dirs, key); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
86 if (val != NULL) { |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
87 PYLONG_VALUE(val) += 1; |
25016
42e89b87ca79
dirs: speed up by storing number of direct children per dir
Martin von Zweigbergk <martinvonz@google.com>
parents:
25015
diff
changeset
|
88 break; |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
89 } |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
90 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
91 /* Force Python to not reuse a small shared int. */ |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
92 #ifdef IS_PY3K |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
93 val = PyLong_FromLong(0x1eadbeef); |
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
94 #else |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
95 val = PyInt_FromLong(0x1eadbeef); |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
96 #endif |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
97 |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
98 if (val == NULL) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
99 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
100 |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
101 PYLONG_VALUE(val) = 1; |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
102 ret = PyDict_SetItem(dirs, key, val); |
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
103 Py_DECREF(val); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
104 if (ret == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
105 goto bail; |
24651
67241ee427cf
dirs._addpath: reinstate use of Py_CLEAR
Siddharth Agarwal <sid0@fb.com>
parents:
24624
diff
changeset
|
106 Py_CLEAR(key); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
107 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
108 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
109 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
110 bail: |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
111 Py_XDECREF(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
112 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
113 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
114 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
115 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
116 static int _delpath(PyObject *dirs, PyObject *path) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
117 { |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
118 char *cpath = PyBytes_AS_STRING(path); |
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
119 Py_ssize_t pos = PyBytes_GET_SIZE(path); |
18901
66d3aebe2d95
dirs: use mutable integers internally
Bryan O'Sullivan <bryano@fb.com>
parents:
18900
diff
changeset
|
120 PyObject *key = NULL; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
121 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
122 |
25093
fe3a72a3e7ca
dirs.c: pass C string, not Python string, to _finddir()
Martin von Zweigbergk <martinvonz@google.com>
parents:
25092
diff
changeset
|
123 while ((pos = _finddir(cpath, pos - 1)) != -1) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
124 PyObject *val; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
125 |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
126 key = PyBytes_FromStringAndSize(cpath, pos); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
127 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
128 if (key == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
129 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
130 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
131 val = PyDict_GetItem(dirs, key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
132 if (val == NULL) { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
133 PyErr_SetString(PyExc_ValueError, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
134 "expected a value, found none"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
135 goto bail; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
136 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
137 |
30106
cb3048746dae
dirs: port PyInt code to work on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30105
diff
changeset
|
138 if (--PYLONG_VALUE(val) <= 0) { |
25016
42e89b87ca79
dirs: speed up by storing number of direct children per dir
Martin von Zweigbergk <martinvonz@google.com>
parents:
25015
diff
changeset
|
139 if (PyDict_DelItem(dirs, key) == -1) |
42e89b87ca79
dirs: speed up by storing number of direct children per dir
Martin von Zweigbergk <martinvonz@google.com>
parents:
25015
diff
changeset
|
140 goto bail; |
42e89b87ca79
dirs: speed up by storing number of direct children per dir
Martin von Zweigbergk <martinvonz@google.com>
parents:
25015
diff
changeset
|
141 } else |
42e89b87ca79
dirs: speed up by storing number of direct children per dir
Martin von Zweigbergk <martinvonz@google.com>
parents:
25015
diff
changeset
|
142 break; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
143 Py_CLEAR(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
144 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
145 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
146 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
147 bail: |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
148 Py_XDECREF(key); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
149 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
150 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
151 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
152 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
153 static int dirs_fromdict(PyObject *dirs, PyObject *source, char skipchar) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
154 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
155 PyObject *key, *value; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
156 Py_ssize_t pos = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
157 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
158 while (PyDict_Next(source, &pos, &key, &value)) { |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
159 if (!PyBytes_Check(key)) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
160 PyErr_SetString(PyExc_TypeError, "expected string key"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
161 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
162 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
163 if (skipchar) { |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
164 if (!dirstate_tuple_check(value)) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
165 PyErr_SetString(PyExc_TypeError, |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
166 "expected a dirstate tuple"); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
167 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
168 } |
21809
e250b8300e6e
parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents:
18902
diff
changeset
|
169 if (((dirstateTupleObject *)value)->state == skipchar) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
170 continue; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
171 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
172 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
173 if (_addpath(dirs, key) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
174 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
175 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
176 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
177 return 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
178 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
179 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
180 static int dirs_fromiter(PyObject *dirs, PyObject *source) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
181 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
182 PyObject *iter, *item = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
183 int ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
184 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
185 iter = PyObject_GetIter(source); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
186 if (iter == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
187 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
188 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
189 while ((item = PyIter_Next(iter)) != NULL) { |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
190 if (!PyBytes_Check(item)) { |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
191 PyErr_SetString(PyExc_TypeError, "expected string"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
192 break; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
193 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
194 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
195 if (_addpath(dirs, item) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
196 break; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
197 Py_CLEAR(item); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
198 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
199 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
200 ret = PyErr_Occurred() ? -1 : 0; |
23960
bca4b6f126f2
dirs: fix leak of iterator in dirs_fromiter
Augie Fackler <augie@google.com>
parents:
21809
diff
changeset
|
201 Py_DECREF(iter); |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
202 Py_XDECREF(item); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
203 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
204 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
205 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
206 /* |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
207 * Calculate a refcounted set of directory names for the files in a |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
208 * dirstate. |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
209 */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
210 static int dirs_init(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
211 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
212 PyObject *dirs = NULL, *source = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
213 char skipchar = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
214 int ret = -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
215 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
216 self->dict = NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
217 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
218 if (!PyArg_ParseTuple(args, "|Oc:__init__", &source, &skipchar)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
219 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
220 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
221 dirs = PyDict_New(); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
222 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
223 if (dirs == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
224 return -1; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
225 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
226 if (source == NULL) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
227 ret = 0; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
228 else if (PyDict_Check(source)) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
229 ret = dirs_fromdict(dirs, source, skipchar); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
230 else if (skipchar) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
231 PyErr_SetString(PyExc_ValueError, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
232 "skip character is only supported " |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
233 "with a dict source"); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
234 else |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
235 ret = dirs_fromiter(dirs, source); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
236 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
237 if (ret == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
238 Py_XDECREF(dirs); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
239 else |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
240 self->dict = dirs; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
241 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
242 return ret; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
243 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
244 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
245 PyObject *dirs_addpath(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
246 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
247 PyObject *path; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
248 |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
249 if (!PyArg_ParseTuple(args, "O!:addpath", &PyBytes_Type, &path)) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
250 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
251 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
252 if (_addpath(self->dict, path) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
253 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
254 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
255 Py_RETURN_NONE; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
256 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
257 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
258 static PyObject *dirs_delpath(dirsObject *self, PyObject *args) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
259 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
260 PyObject *path; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
261 |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
262 if (!PyArg_ParseTuple(args, "O!:delpath", &PyBytes_Type, &path)) |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
263 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
264 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
265 if (_delpath(self->dict, path) == -1) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
266 return NULL; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
267 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
268 Py_RETURN_NONE; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
269 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
270 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
271 static int dirs_contains(dirsObject *self, PyObject *value) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
272 { |
30105
b2f90d8878ac
dirs: convert PyString to PyBytes
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30104
diff
changeset
|
273 return PyBytes_Check(value) ? PyDict_Contains(self->dict, value) : 0; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
274 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
275 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
276 static void dirs_dealloc(dirsObject *self) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
277 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
278 Py_XDECREF(self->dict); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
279 PyObject_Del(self); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
280 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
281 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
282 static PyObject *dirs_iter(dirsObject *self) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
283 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
284 return PyObject_GetIter(self->dict); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
285 } |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
286 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
287 static PySequenceMethods dirs_sequence_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
288 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
289 static PyMethodDef dirs_methods[] = { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
290 {"addpath", (PyCFunction)dirs_addpath, METH_VARARGS, "add a path"}, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
291 {"delpath", (PyCFunction)dirs_delpath, METH_VARARGS, "remove a path"}, |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
292 {NULL} /* Sentinel */ |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
293 }; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
294 |
30167
1e5ff5ae1d2b
dirs: use PyVarObject_HEAD_INIT
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30159
diff
changeset
|
295 static PyTypeObject dirsType = { PyVarObject_HEAD_INIT(NULL, 0) }; |
18900
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
296 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
297 void dirs_module_init(PyObject *mod) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
298 { |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
299 dirs_sequence_methods.sq_contains = (objobjproc)dirs_contains; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
300 dirsType.tp_name = "parsers.dirs"; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
301 dirsType.tp_new = PyType_GenericNew; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
302 dirsType.tp_basicsize = sizeof(dirsObject); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
303 dirsType.tp_dealloc = (destructor)dirs_dealloc; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
304 dirsType.tp_as_sequence = &dirs_sequence_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
305 dirsType.tp_flags = Py_TPFLAGS_DEFAULT; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
306 dirsType.tp_doc = "dirs"; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
307 dirsType.tp_iter = (getiterfunc)dirs_iter; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
308 dirsType.tp_methods = dirs_methods; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
309 dirsType.tp_init = (initproc)dirs_init; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
310 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
311 if (PyType_Ready(&dirsType) < 0) |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
312 return; |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
313 Py_INCREF(&dirsType); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
314 |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
315 PyModule_AddObject(mod, "dirs", (PyObject *)&dirsType); |
02ee846b246a
scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
316 } |