mercurial/cext/parsers.c
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 24 Nov 2021 04:43:57 +0100
changeset 48450 be2317167a9b
parent 48448 0b3f3a3ca50a
child 48819 9bb700223f00
child 48901 ed03fffaac30
permissions -rw-r--r--
dirstate-item: make sure we load `mtime-second-ambiguous` from disk Now that we support the associated logic, we can safely load it from it. It is no longer necessary to ignore the stored mtime when the flag is encountered. Differential Revision: https://phab.mercurial-scm.org/D11846
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     1
/*
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     2
 parsers.c - efficient content parsing
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     3
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 46721
diff changeset
     4
 Copyright 2008 Olivia Mackall <olivia@selenic.com> and others
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     5
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     6
 This software may be used and distributed according to the terms of
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     7
 the GNU General Public License, incorporated herein by reference.
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     8
*/
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
     9
42068
896b19d12c08 cext: make parsers.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41361
diff changeset
    10
#define PY_SSIZE_T_CLEAN
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    11
#include <Python.h>
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    12
#include <ctype.h>
17356
511dfb34b412 parsers: fix an integer size warning issued by clang
Bryan O'Sullivan <bryano@fb.com>
parents: 17353
diff changeset
    13
#include <stddef.h>
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    14
#include <string.h>
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
    15
34439
b90e8da190da cext: reorder #include
Gregory Szorc <gregory.szorc@gmail.com>
parents: 33944
diff changeset
    16
#include "bitmanipulation.h"
33779
0f4ac3b6dee4 cext: factor out header for charencode.c
Yuya Nishihara <yuya@tcha.org>
parents: 33778
diff changeset
    17
#include "charencode.h"
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
    18
#include "util.h"
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
    19
30112
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    20
#ifdef IS_PY3K
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    21
/* The mapping of Python types is meant to be temporary to get Python
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    22
 * 3 to compile. We should remove this once Python 3 support is fully
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    23
 * supported and proper types are used in the extensions themselves. */
30169
5f7151e6de85 parsers: alias more PyInt* symbols on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30112
diff changeset
    24
#define PyInt_Check PyLong_Check
30112
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    25
#define PyInt_FromLong PyLong_FromLong
30169
5f7151e6de85 parsers: alias more PyInt* symbols on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30112
diff changeset
    26
#define PyInt_FromSsize_t PyLong_FromSsize_t
30112
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    27
#define PyInt_AsLong PyLong_AsLong
48325
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    28
#else
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    29
/* Windows on Python 2.7 doesn't define S_IFLNK. Python 3+ defines via
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    30
 * pyport.h. */
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    31
#ifndef S_IFLNK
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    32
#define S_IFLNK 0120000
3620ab28882d cext: define S_IFLNK on Python 2.7 and Windows
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48284
diff changeset
    33
#endif
30112
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    34
#endif
9b6ff0f940ed parsers: move PyInt aliasing out of util.h
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30103
diff changeset
    35
32424
7640584e697c cext: mark constant variables
Yuya Nishihara <yuya@tcha.org>
parents: 32422
diff changeset
    36
static const char *const versionerrortext = "Python minor version mismatch";
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
    37
47514
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
    38
static const int dirstate_v1_from_p2 = -2;
47516
b8ffe85e399b dirstate-entry: `merged_removed` and `from_p2_removed` properties
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47515
diff changeset
    39
static const int dirstate_v1_nonnormal = -1;
47666
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
    40
static const int ambiguous_time = -1;
47514
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
    41
25584
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    42
static PyObject *dict_new_presized(PyObject *self, PyObject *args)
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    43
{
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    44
	Py_ssize_t expected_size;
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    45
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
    46
	if (!PyArg_ParseTuple(args, "n:make_presized_dict", &expected_size)) {
25584
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    47
		return NULL;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
    48
	}
25584
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    49
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    50
	return _dict_new_presized(expected_size);
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    51
}
72b2711f12ea parsers: add an API to create a new presized dict
Siddharth Agarwal <sid0@fb.com>
parents: 25583
diff changeset
    52
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
    53
static PyObject *dirstate_item_new(PyTypeObject *subtype, PyObject *args,
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
    54
                                   PyObject *kwds)
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
    55
{
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
    56
	/* We do all the initialization here and not a tp_init function because
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
    57
	 * dirstate_item is immutable. */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
    58
	dirstateItemObject *t;
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    59
	int wc_tracked;
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    60
	int p1_tracked;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    61
	int p2_info;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    62
	int has_meaningful_data;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    63
	int has_meaningful_mtime;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
    64
	int mtime_second_ambiguous;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    65
	int mode;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    66
	int size;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
    67
	int mtime_s;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
    68
	int mtime_ns;
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    69
	PyObject *parentfiledata;
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
    70
	PyObject *mtime;
48264
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    71
	PyObject *fallback_exec;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    72
	PyObject *fallback_symlink;
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    73
	static char *keywords_name[] = {
48264
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    74
	    "wc_tracked",          "p1_tracked",           "p2_info",
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    75
	    "has_meaningful_data", "has_meaningful_mtime", "parentfiledata",
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    76
	    "fallback_exec",       "fallback_symlink",     NULL,
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    77
	};
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    78
	wc_tracked = 0;
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    79
	p1_tracked = 0;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    80
	p2_info = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    81
	has_meaningful_mtime = 1;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
    82
	has_meaningful_data = 1;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
    83
	mtime_second_ambiguous = 0;
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    84
	parentfiledata = Py_None;
48264
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    85
	fallback_exec = Py_None;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    86
	fallback_symlink = Py_None;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    87
	if (!PyArg_ParseTupleAndKeywords(args, kwds, "|iiiiiOOO", keywords_name,
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    88
	                                 &wc_tracked, &p1_tracked, &p2_info,
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    89
	                                 &has_meaningful_data,
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    90
	                                 &has_meaningful_mtime, &parentfiledata,
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
    91
	                                 &fallback_exec, &fallback_symlink)) {
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    92
		return NULL;
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
    93
	}
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
    94
	t = (dirstateItemObject *)subtype->tp_alloc(subtype, 1);
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
    95
	if (!t) {
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
    96
		return NULL;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
    97
	}
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
    98
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
    99
	t->flags = 0;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   100
	if (wc_tracked) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   101
		t->flags |= dirstate_flag_wc_tracked;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   102
	}
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   103
	if (p1_tracked) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   104
		t->flags |= dirstate_flag_p1_tracked;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   105
	}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   106
	if (p2_info) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   107
		t->flags |= dirstate_flag_p2_info;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   108
	}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   109
48264
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   110
	if (fallback_exec != Py_None) {
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   111
		t->flags |= dirstate_flag_has_fallback_exec;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   112
		if (PyObject_IsTrue(fallback_exec)) {
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   113
			t->flags |= dirstate_flag_fallback_exec;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   114
		}
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   115
	}
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   116
	if (fallback_symlink != Py_None) {
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   117
		t->flags |= dirstate_flag_has_fallback_symlink;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   118
		if (PyObject_IsTrue(fallback_symlink)) {
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   119
			t->flags |= dirstate_flag_fallback_symlink;
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   120
		}
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   121
	}
948570aa7630 dirstate: make DirstateItem constructor accept fallback value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48263
diff changeset
   122
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   123
	if (parentfiledata != Py_None) {
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   124
		if (!PyArg_ParseTuple(parentfiledata, "iiO", &mode, &size,
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   125
		                      &mtime)) {
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
   126
			return NULL;
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
   127
		}
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   128
		if (mtime != Py_None) {
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   129
			if (!PyArg_ParseTuple(mtime, "iii", &mtime_s, &mtime_ns,
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   130
			                      &mtime_second_ambiguous)) {
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   131
				return NULL;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   132
			}
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   133
		} else {
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   134
			has_meaningful_mtime = 0;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   135
		}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   136
	} else {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   137
		has_meaningful_data = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   138
		has_meaningful_mtime = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   139
	}
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   140
	if (has_meaningful_data) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   141
		t->flags |= dirstate_flag_has_meaningful_data;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   142
		t->mode = mode;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   143
		t->size = size;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   144
		if (mtime_second_ambiguous) {
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   145
			t->flags |= dirstate_flag_mtime_second_ambiguous;
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   146
		}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   147
	} else {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   148
		t->mode = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   149
		t->size = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   150
	}
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   151
	if (has_meaningful_mtime) {
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   152
		t->flags |= dirstate_flag_has_mtime;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   153
		t->mtime_s = mtime_s;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   154
		t->mtime_ns = mtime_ns;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   155
	} else {
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   156
		t->mtime_s = 0;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   157
		t->mtime_ns = 0;
47926
22c39f8acf78 dirstate-item: feed more information to `__init__`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47923
diff changeset
   158
	}
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   159
	return (PyObject *)t;
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   160
}
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   161
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   162
static void dirstate_item_dealloc(PyObject *o)
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   163
{
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   164
	PyObject_Del(o);
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   165
}
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   166
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   167
static inline bool dirstate_item_c_tracked(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   168
{
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   169
	return (self->flags & dirstate_flag_wc_tracked);
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   170
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   171
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   172
static inline bool dirstate_item_c_any_tracked(dirstateItemObject *self)
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   173
{
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   174
	const int mask = dirstate_flag_wc_tracked | dirstate_flag_p1_tracked |
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   175
	                 dirstate_flag_p2_info;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   176
	return (self->flags & mask);
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   177
}
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   178
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   179
static inline bool dirstate_item_c_added(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   180
{
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   181
	const int mask = (dirstate_flag_wc_tracked | dirstate_flag_p1_tracked |
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   182
	                  dirstate_flag_p2_info);
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   183
	const int target = dirstate_flag_wc_tracked;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   184
	return (self->flags & mask) == target;
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   185
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   186
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   187
static inline bool dirstate_item_c_removed(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   188
{
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   189
	if (self->flags & dirstate_flag_wc_tracked) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   190
		return false;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   191
	}
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   192
	return (self->flags &
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   193
	        (dirstate_flag_p1_tracked | dirstate_flag_p2_info));
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   194
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   195
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   196
static inline bool dirstate_item_c_merged(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   197
{
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   198
	return ((self->flags & dirstate_flag_wc_tracked) &&
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   199
	        (self->flags & dirstate_flag_p1_tracked) &&
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   200
	        (self->flags & dirstate_flag_p2_info));
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   201
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   202
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   203
static inline bool dirstate_item_c_from_p2(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   204
{
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   205
	return ((self->flags & dirstate_flag_wc_tracked) &&
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   206
	        !(self->flags & dirstate_flag_p1_tracked) &&
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   207
	        (self->flags & dirstate_flag_p2_info));
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   208
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   209
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   210
static inline char dirstate_item_c_v1_state(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   211
{
48047
631f6b445a77 dirstate: Remove the `state == ' '` special case
Simon Sapin <simon.sapin@octobus.net>
parents: 48014
diff changeset
   212
	if (dirstate_item_c_removed(self)) {
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   213
		return 'r';
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   214
	} else if (dirstate_item_c_merged(self)) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   215
		return 'm';
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   216
	} else if (dirstate_item_c_added(self)) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   217
		return 'a';
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   218
	} else {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   219
		return 'n';
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   220
	}
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   221
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   222
48263
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   223
static inline bool dirstate_item_c_has_fallback_exec(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   224
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   225
	return (bool)self->flags & dirstate_flag_has_fallback_exec;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   226
}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   227
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   228
static inline bool
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   229
dirstate_item_c_has_fallback_symlink(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   230
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   231
	return (bool)self->flags & dirstate_flag_has_fallback_symlink;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   232
}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   233
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   234
static inline int dirstate_item_c_v1_mode(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   235
{
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   236
	if (self->flags & dirstate_flag_has_meaningful_data) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   237
		return self->mode;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   238
	} else {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   239
		return 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   240
	}
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   241
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   242
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   243
static inline int dirstate_item_c_v1_size(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   244
{
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   245
	if (!(self->flags & dirstate_flag_wc_tracked) &&
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   246
	    (self->flags & dirstate_flag_p2_info)) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   247
		if (self->flags & dirstate_flag_p1_tracked) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   248
			return dirstate_v1_nonnormal;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   249
		} else {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   250
			return dirstate_v1_from_p2;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   251
		}
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   252
	} else if (dirstate_item_c_removed(self)) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   253
		return 0;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   254
	} else if (self->flags & dirstate_flag_p2_info) {
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   255
		return dirstate_v1_from_p2;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   256
	} else if (dirstate_item_c_added(self)) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   257
		return dirstate_v1_nonnormal;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   258
	} else if (self->flags & dirstate_flag_has_meaningful_data) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   259
		return self->size;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   260
	} else {
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   261
		return dirstate_v1_nonnormal;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   262
	}
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   263
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   264
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   265
static inline int dirstate_item_c_v1_mtime(dirstateItemObject *self)
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   266
{
48047
631f6b445a77 dirstate: Remove the `state == ' '` special case
Simon Sapin <simon.sapin@octobus.net>
parents: 48014
diff changeset
   267
	if (dirstate_item_c_removed(self)) {
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   268
		return 0;
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   269
	} else if (!(self->flags & dirstate_flag_has_mtime) ||
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   270
	           !(self->flags & dirstate_flag_p1_tracked) ||
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   271
	           !(self->flags & dirstate_flag_wc_tracked) ||
48448
0b3f3a3ca50a dirstate-item: ignore mtime to write v1 when `mtime-second-ambiguous` is set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48447
diff changeset
   272
	           (self->flags & dirstate_flag_p2_info) ||
0b3f3a3ca50a dirstate-item: ignore mtime to write v1 when `mtime-second-ambiguous` is set
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48447
diff changeset
   273
	           (self->flags & dirstate_flag_mtime_second_ambiguous)) {
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   274
		return ambiguous_time;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   275
	} else {
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   276
		return self->mtime_s;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   277
	}
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   278
}
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   279
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   280
static PyObject *dirstate_item_v2_data(dirstateItemObject *self)
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   281
{
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   282
	int flags = self->flags;
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   283
	int mode = dirstate_item_c_v1_mode(self);
48283
249d1888e9d8 parsers: don't ask about the exec bit on platforms that don't have it
Raphaël Gomès <rgomes@octobus.net>
parents: 48275
diff changeset
   284
#ifdef S_IXUSR
249d1888e9d8 parsers: don't ask about the exec bit on platforms that don't have it
Raphaël Gomès <rgomes@octobus.net>
parents: 48275
diff changeset
   285
	/* This is for platforms with an exec bit */
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   286
	if ((mode & S_IXUSR) != 0) {
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   287
		flags |= dirstate_flag_mode_exec_perm;
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   288
	} else {
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   289
		flags &= ~dirstate_flag_mode_exec_perm;
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   290
	}
48283
249d1888e9d8 parsers: don't ask about the exec bit on platforms that don't have it
Raphaël Gomès <rgomes@octobus.net>
parents: 48275
diff changeset
   291
#else
249d1888e9d8 parsers: don't ask about the exec bit on platforms that don't have it
Raphaël Gomès <rgomes@octobus.net>
parents: 48275
diff changeset
   292
	flags &= ~dirstate_flag_mode_exec_perm;
249d1888e9d8 parsers: don't ask about the exec bit on platforms that don't have it
Raphaël Gomès <rgomes@octobus.net>
parents: 48275
diff changeset
   293
#endif
48284
126feb805247 parsers: don't ask about symlinks on platforms that don't support them
Raphaël Gomès <rgomes@octobus.net>
parents: 48283
diff changeset
   294
#ifdef S_ISLNK
126feb805247 parsers: don't ask about symlinks on platforms that don't support them
Raphaël Gomès <rgomes@octobus.net>
parents: 48283
diff changeset
   295
	/* This is for platforms with support for symlinks */
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   296
	if (S_ISLNK(mode)) {
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   297
		flags |= dirstate_flag_mode_is_symlink;
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   298
	} else {
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   299
		flags &= ~dirstate_flag_mode_is_symlink;
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   300
	}
48284
126feb805247 parsers: don't ask about symlinks on platforms that don't support them
Raphaël Gomès <rgomes@octobus.net>
parents: 48283
diff changeset
   301
#else
126feb805247 parsers: don't ask about symlinks on platforms that don't support them
Raphaël Gomès <rgomes@octobus.net>
parents: 48283
diff changeset
   302
	flags &= ~dirstate_flag_mode_is_symlink;
126feb805247 parsers: don't ask about symlinks on platforms that don't support them
Raphaël Gomès <rgomes@octobus.net>
parents: 48283
diff changeset
   303
#endif
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   304
	return Py_BuildValue("iiii", flags, self->size, self->mtime_s,
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   305
	                     self->mtime_ns);
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   306
};
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   307
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   308
static PyObject *dirstate_item_v1_state(dirstateItemObject *self)
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   309
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   310
	char state = dirstate_item_c_v1_state(self);
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   311
	return PyBytes_FromStringAndSize(&state, 1);
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   312
};
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   313
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   314
static PyObject *dirstate_item_v1_mode(dirstateItemObject *self)
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   315
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   316
	return PyInt_FromLong(dirstate_item_c_v1_mode(self));
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   317
};
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   318
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   319
static PyObject *dirstate_item_v1_size(dirstateItemObject *self)
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   320
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   321
	return PyInt_FromLong(dirstate_item_c_v1_size(self));
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   322
};
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   323
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   324
static PyObject *dirstate_item_v1_mtime(dirstateItemObject *self)
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   325
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   326
	return PyInt_FromLong(dirstate_item_c_v1_mtime(self));
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   327
};
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   328
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   329
static PyObject *dirstate_item_mtime_likely_equal_to(dirstateItemObject *self,
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   330
                                                     PyObject *other)
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   331
{
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   332
	int other_s;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   333
	int other_ns;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   334
	int other_second_ambiguous;
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   335
	if (!PyArg_ParseTuple(other, "iii", &other_s, &other_ns,
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   336
	                      &other_second_ambiguous)) {
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   337
		return NULL;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   338
	}
48447
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   339
	if (!(self->flags & dirstate_flag_has_mtime)) {
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   340
		Py_RETURN_FALSE;
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   341
	}
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   342
	if (self->mtime_s != other_s) {
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   343
		Py_RETURN_FALSE;
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   344
	}
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   345
	if (self->mtime_ns == 0 || other_ns == 0) {
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   346
		if (self->flags & dirstate_flag_mtime_second_ambiguous) {
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   347
			Py_RETURN_FALSE;
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   348
		} else {
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   349
			Py_RETURN_TRUE;
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   350
		}
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   351
	}
af303ae33cd7 dirstate-item: implement the comparison logic for mtime-second-ambiguous
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48446
diff changeset
   352
	if (self->mtime_ns == other_ns) {
47532
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   353
		Py_RETURN_TRUE;
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   354
	} else {
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   355
		Py_RETURN_FALSE;
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   356
	}
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   357
};
ccbabaee5c36 dirstate-entry: add a `need_delay` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47531
diff changeset
   358
47973
3337eec29d5b dirstate-item: `dirstate_item_from_v1_data` replaces make_dirstate_item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47956
diff changeset
   359
/* This will never change since it's bound to V1
47665
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   360
 */
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   361
static inline dirstateItemObject *
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   362
dirstate_item_from_v1_data(char state, int mode, int size, int mtime)
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   363
{
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   364
	dirstateItemObject *t =
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   365
	    PyObject_New(dirstateItemObject, &dirstateItemType);
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   366
	if (!t) {
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   367
		return NULL;
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   368
	}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   369
	t->flags = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   370
	t->mode = 0;
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   371
	t->size = 0;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   372
	t->mtime_s = 0;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   373
	t->mtime_ns = 0;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   374
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   375
	if (state == 'm') {
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   376
		t->flags = (dirstate_flag_wc_tracked |
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   377
		            dirstate_flag_p1_tracked | dirstate_flag_p2_info);
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   378
	} else if (state == 'a') {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   379
		t->flags = dirstate_flag_wc_tracked;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   380
	} else if (state == 'r') {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   381
		if (size == dirstate_v1_nonnormal) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   382
			t->flags =
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   383
			    dirstate_flag_p1_tracked | dirstate_flag_p2_info;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   384
		} else if (size == dirstate_v1_from_p2) {
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   385
			t->flags = dirstate_flag_p2_info;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   386
		} else {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   387
			t->flags = dirstate_flag_p1_tracked;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   388
		}
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   389
	} else if (state == 'n') {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   390
		if (size == dirstate_v1_from_p2) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   391
			t->flags =
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   392
			    dirstate_flag_wc_tracked | dirstate_flag_p2_info;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   393
		} else if (size == dirstate_v1_nonnormal) {
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   394
			t->flags =
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   395
			    dirstate_flag_wc_tracked | dirstate_flag_p1_tracked;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   396
		} else if (mtime == ambiguous_time) {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   397
			t->flags = (dirstate_flag_wc_tracked |
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   398
			            dirstate_flag_p1_tracked |
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   399
			            dirstate_flag_has_meaningful_data);
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   400
			t->mode = mode;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   401
			t->size = size;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   402
		} else {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   403
			t->flags = (dirstate_flag_wc_tracked |
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   404
			            dirstate_flag_p1_tracked |
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   405
			            dirstate_flag_has_meaningful_data |
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   406
			            dirstate_flag_has_mtime);
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   407
			t->mode = mode;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   408
			t->size = size;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   409
			t->mtime_s = mtime;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   410
		}
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   411
	} else {
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   412
		PyErr_Format(PyExc_RuntimeError,
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   413
		             "unknown state: `%c` (%d, %d, %d)", state, mode,
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   414
		             size, mtime, NULL);
48050
448aff4e8dd4 dirstate: fix leak of entry object in dirstate_item_from_v1_data()
Yuya Nishihara <yuya@tcha.org>
parents: 48049
diff changeset
   415
		Py_DECREF(t);
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   416
		return NULL;
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   417
	}
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   418
47665
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   419
	return t;
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   420
}
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   421
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   422
/* This will never change since it's bound to V1, unlike `dirstate_item_new` */
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   423
static PyObject *dirstate_item_from_v1_meth(PyTypeObject *subtype,
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   424
                                            PyObject *args)
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   425
{
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   426
	/* We do all the initialization here and not a tp_init function because
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   427
	 * dirstate_item is immutable. */
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   428
	char state;
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   429
	int size, mode, mtime;
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   430
	if (!PyArg_ParseTuple(args, "ciii", &state, &mode, &size, &mtime)) {
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   431
		return NULL;
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   432
	}
47974
0919d66e279a dirstate-item: factor some code in the C implementation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47973
diff changeset
   433
	return (PyObject *)dirstate_item_from_v1_data(state, mode, size, mtime);
47665
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   434
};
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   435
48233
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   436
static PyObject *dirstate_item_from_v2_meth(PyTypeObject *subtype,
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   437
                                            PyObject *args)
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   438
{
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   439
	dirstateItemObject *t =
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   440
	    PyObject_New(dirstateItemObject, &dirstateItemType);
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   441
	if (!t) {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   442
		return NULL;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   443
	}
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   444
	if (!PyArg_ParseTuple(args, "iiii", &t->flags, &t->size, &t->mtime_s,
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   445
	                      &t->mtime_ns)) {
48233
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   446
		return NULL;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   447
	}
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   448
	if (t->flags & dirstate_flag_expected_state_is_modified) {
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   449
		t->flags &= ~(dirstate_flag_expected_state_is_modified |
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   450
		              dirstate_flag_has_meaningful_data |
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   451
		              dirstate_flag_has_mtime);
48261
1730b2fceaa1 dirstate-v2: adds a flag to mark a file as modified
Simon Sapin <simon.sapin@octobus.net>
parents: 48244
diff changeset
   452
	}
48233
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   453
	t->mode = 0;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   454
	if (t->flags & dirstate_flag_has_meaningful_data) {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   455
		if (t->flags & dirstate_flag_mode_exec_perm) {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   456
			t->mode = 0755;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   457
		} else {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   458
			t->mode = 0644;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   459
		}
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   460
		if (t->flags & dirstate_flag_mode_is_symlink) {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   461
			t->mode |= S_IFLNK;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   462
		} else {
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   463
			t->mode |= S_IFREG;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   464
		}
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   465
	}
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   466
	return (PyObject *)t;
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   467
};
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   468
47666
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   469
/* This means the next status call will have to actually check its content
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   470
   to make sure it is correct. */
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   471
static PyObject *dirstate_item_set_possibly_dirty(dirstateItemObject *self)
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   472
{
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   473
	self->flags &= ~dirstate_flag_has_mtime;
48004
2018753014be dirstate: fix compilation warnings in `dirstate_item_set_possibly_dirty()`
Martin von Zweigbergk <martinvonz@google.com>
parents: 48003
diff changeset
   474
	Py_RETURN_NONE;
47666
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   475
}
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   476
48002
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   477
/* See docstring of the python implementation for details */
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   478
static PyObject *dirstate_item_set_clean(dirstateItemObject *self,
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   479
                                         PyObject *args)
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   480
{
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   481
	int size, mode, mtime_s, mtime_ns, mtime_second_ambiguous;
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   482
	PyObject *mtime;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   483
	mtime_s = 0;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   484
	mtime_ns = 0;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   485
	mtime_second_ambiguous = 0;
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   486
	if (!PyArg_ParseTuple(args, "iiO", &mode, &size, &mtime)) {
48002
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   487
		return NULL;
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   488
	}
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   489
	if (mtime != Py_None) {
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   490
		if (!PyArg_ParseTuple(mtime, "iii", &mtime_s, &mtime_ns,
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   491
		                      &mtime_second_ambiguous)) {
48426
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   492
			return NULL;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   493
		}
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   494
	} else {
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   495
		self->flags &= ~dirstate_flag_has_mtime;
3d6eb119200d dirstate-item: allow mtime to be None in "parentdata"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48325
diff changeset
   496
	}
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   497
	self->flags = dirstate_flag_wc_tracked | dirstate_flag_p1_tracked |
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   498
	              dirstate_flag_has_meaningful_data |
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   499
	              dirstate_flag_has_mtime;
48446
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   500
	if (mtime_second_ambiguous) {
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   501
		self->flags |= dirstate_flag_mtime_second_ambiguous;
111098af6356 dirstate-item: add a "second_ambiguous` flag in the mtime tuple
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48440
diff changeset
   502
	}
48002
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   503
	self->mode = mode;
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   504
	self->size = size;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   505
	self->mtime_s = mtime_s;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   506
	self->mtime_ns = mtime_ns;
48002
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   507
	Py_RETURN_NONE;
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   508
}
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   509
48014
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   510
static PyObject *dirstate_item_set_tracked(dirstateItemObject *self)
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   511
{
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   512
	self->flags |= dirstate_flag_wc_tracked;
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   513
	self->flags &= ~dirstate_flag_has_mtime;
48014
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   514
	Py_RETURN_NONE;
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   515
}
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   516
47921
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   517
static PyObject *dirstate_item_set_untracked(dirstateItemObject *self)
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   518
{
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   519
	self->flags &= ~dirstate_flag_wc_tracked;
47921
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   520
	self->mode = 0;
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   521
	self->size = 0;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   522
	self->mtime_s = 0;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   523
	self->mtime_ns = 0;
47921
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   524
	Py_RETURN_NONE;
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   525
}
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   526
48075
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   527
static PyObject *dirstate_item_drop_merge_data(dirstateItemObject *self)
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   528
{
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   529
	if (self->flags & dirstate_flag_p2_info) {
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   530
		self->flags &= ~(dirstate_flag_p2_info |
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   531
		                 dirstate_flag_has_meaningful_data |
48275
bb240915f69f dirstate-v2: adjust the meaning of directory flags
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48273
diff changeset
   532
		                 dirstate_flag_has_mtime);
48075
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   533
		self->mode = 0;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   534
		self->size = 0;
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   535
		self->mtime_s = 0;
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   536
		self->mtime_ns = 0;
48075
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   537
	}
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   538
	Py_RETURN_NONE;
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   539
}
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   540
static PyMethodDef dirstate_item_methods[] = {
48234
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   541
    {"v2_data", (PyCFunction)dirstate_item_v2_data, METH_NOARGS,
7e78c72ee3ea dirstate-v2: Initial Python serializer
Raphaël Gomès <rgomes@octobus.net>
parents: 48233
diff changeset
   542
     "return data suitable for v2 serialization"},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   543
    {"v1_state", (PyCFunction)dirstate_item_v1_state, METH_NOARGS,
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   544
     "return a \"state\" suitable for v1 serialization"},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   545
    {"v1_mode", (PyCFunction)dirstate_item_v1_mode, METH_NOARGS,
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   546
     "return a \"mode\" suitable for v1 serialization"},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   547
    {"v1_size", (PyCFunction)dirstate_item_v1_size, METH_NOARGS,
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   548
     "return a \"size\" suitable for v1 serialization"},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   549
    {"v1_mtime", (PyCFunction)dirstate_item_v1_mtime, METH_NOARGS,
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   550
     "return a \"mtime\" suitable for v1 serialization"},
48271
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   551
    {"mtime_likely_equal_to", (PyCFunction)dirstate_item_mtime_likely_equal_to,
269ff8978086 dirstate: store mtimes with nanosecond precision in memory
Simon Sapin <simon.sapin@octobus.net>
parents: 48264
diff changeset
   552
     METH_O, "True if the stored mtime is likely equal to the given mtime"},
47923
32aa80a8d162 dirstate-item: fix the declaration of the Cext `from_v1_meth`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47922
diff changeset
   553
    {"from_v1_data", (PyCFunction)dirstate_item_from_v1_meth,
32aa80a8d162 dirstate-item: fix the declaration of the Cext `from_v1_meth`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47922
diff changeset
   554
     METH_VARARGS | METH_CLASS, "build a new DirstateItem object from V1 data"},
48233
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   555
    {"from_v2_data", (PyCFunction)dirstate_item_from_v2_meth,
a32a96079e2d dirstate-v2: initial Python parser
Simon Sapin <simon.sapin@octobus.net>
parents: 48176
diff changeset
   556
     METH_VARARGS | METH_CLASS, "build a new DirstateItem object from V2 data"},
47666
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   557
    {"set_possibly_dirty", (PyCFunction)dirstate_item_set_possibly_dirty,
e53256a9f9c5 dirstate-item: add a `set_possibly_dirty` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47665
diff changeset
   558
     METH_NOARGS, "mark a file as \"possibly dirty\""},
48002
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   559
    {"set_clean", (PyCFunction)dirstate_item_set_clean, METH_VARARGS,
4e6f27230aee dirstate: introduce a `set_clean` method on dirstate's map and items
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47976
diff changeset
   560
     "mark a file as \"clean\""},
48014
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   561
    {"set_tracked", (PyCFunction)dirstate_item_set_tracked, METH_NOARGS,
0d2a404f1932 dirstate: introduce a set_tracked method on "map" and "item"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48004
diff changeset
   562
     "mark a file as \"tracked\""},
47921
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   563
    {"set_untracked", (PyCFunction)dirstate_item_set_untracked, METH_NOARGS,
3853e6ee160d dirstatemap: replace `removefile` by an explicit `entry.set_untracked()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47686
diff changeset
   564
     "mark a file as \"untracked\""},
48075
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   565
    {"drop_merge_data", (PyCFunction)dirstate_item_drop_merge_data, METH_NOARGS,
a660d8a53267 dirstate: use a new `drop_merge_data` in `setparent`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48059
diff changeset
   566
     "remove all \"merge-only\" from a DirstateItem"},
47509
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   567
    {NULL} /* Sentinel */
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   568
};
80dc1d452993 dirstate-entry: introduce dedicated accessors for v1 serialization
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47279
diff changeset
   569
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   570
static PyObject *dirstate_item_get_mode(dirstateItemObject *self)
47536
8e4b9fe31334 dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
   571
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   572
	return PyInt_FromLong(dirstate_item_c_v1_mode(self));
47536
8e4b9fe31334 dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
   573
};
8e4b9fe31334 dirstate-entry: add a `mode` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47532
diff changeset
   574
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   575
static PyObject *dirstate_item_get_size(dirstateItemObject *self)
47537
0e5800c88eb4 dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47536
diff changeset
   576
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   577
	return PyInt_FromLong(dirstate_item_c_v1_size(self));
47537
0e5800c88eb4 dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47536
diff changeset
   578
};
0e5800c88eb4 dirstate-entry: add a `size` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47536
diff changeset
   579
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   580
static PyObject *dirstate_item_get_mtime(dirstateItemObject *self)
47538
77fce401a2bb dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47537
diff changeset
   581
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   582
	return PyInt_FromLong(dirstate_item_c_v1_mtime(self));
47538
77fce401a2bb dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47537
diff changeset
   583
};
77fce401a2bb dirstate-entry: add a `mtime` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47537
diff changeset
   584
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   585
static PyObject *dirstate_item_get_state(dirstateItemObject *self)
47512
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   586
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   587
	char state = dirstate_item_c_v1_state(self);
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   588
	return PyBytes_FromStringAndSize(&state, 1);
47512
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   589
};
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   590
48263
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   591
static PyObject *dirstate_item_get_has_fallback_exec(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   592
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   593
	if (dirstate_item_c_has_fallback_exec(self)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   594
		Py_RETURN_TRUE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   595
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   596
		Py_RETURN_FALSE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   597
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   598
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   599
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   600
static PyObject *dirstate_item_get_fallback_exec(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   601
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   602
	if (dirstate_item_c_has_fallback_exec(self)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   603
		if (self->flags & dirstate_flag_fallback_exec) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   604
			Py_RETURN_TRUE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   605
		} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   606
			Py_RETURN_FALSE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   607
		}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   608
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   609
		Py_RETURN_NONE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   610
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   611
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   612
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   613
static int dirstate_item_set_fallback_exec(dirstateItemObject *self,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   614
                                           PyObject *value)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   615
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   616
	if ((value == Py_None) || (value == NULL)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   617
		self->flags &= ~dirstate_flag_has_fallback_exec;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   618
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   619
		self->flags |= dirstate_flag_has_fallback_exec;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   620
		if (PyObject_IsTrue(value)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   621
			self->flags |= dirstate_flag_fallback_exec;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   622
		} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   623
			self->flags &= ~dirstate_flag_fallback_exec;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   624
		}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   625
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   626
	return 0;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   627
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   628
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   629
static PyObject *
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   630
dirstate_item_get_has_fallback_symlink(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   631
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   632
	if (dirstate_item_c_has_fallback_symlink(self)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   633
		Py_RETURN_TRUE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   634
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   635
		Py_RETURN_FALSE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   636
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   637
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   638
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   639
static PyObject *dirstate_item_get_fallback_symlink(dirstateItemObject *self)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   640
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   641
	if (dirstate_item_c_has_fallback_symlink(self)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   642
		if (self->flags & dirstate_flag_fallback_symlink) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   643
			Py_RETURN_TRUE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   644
		} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   645
			Py_RETURN_FALSE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   646
		}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   647
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   648
		Py_RETURN_NONE;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   649
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   650
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   651
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   652
static int dirstate_item_set_fallback_symlink(dirstateItemObject *self,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   653
                                              PyObject *value)
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   654
{
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   655
	if ((value == Py_None) || (value == NULL)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   656
		self->flags &= ~dirstate_flag_has_fallback_symlink;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   657
	} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   658
		self->flags |= dirstate_flag_has_fallback_symlink;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   659
		if (PyObject_IsTrue(value)) {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   660
			self->flags |= dirstate_flag_fallback_symlink;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   661
		} else {
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   662
			self->flags &= ~dirstate_flag_fallback_symlink;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   663
		}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   664
	}
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   665
	return 0;
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   666
};
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   667
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   668
static PyObject *dirstate_item_get_tracked(dirstateItemObject *self)
47531
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   669
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   670
	if (dirstate_item_c_tracked(self)) {
47531
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   671
		Py_RETURN_TRUE;
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   672
	} else {
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   673
		Py_RETURN_FALSE;
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   674
	}
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   675
};
48155
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   676
static PyObject *dirstate_item_get_p1_tracked(dirstateItemObject *self)
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   677
{
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   678
	if (self->flags & dirstate_flag_p1_tracked) {
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   679
		Py_RETURN_TRUE;
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   680
	} else {
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   681
		Py_RETURN_FALSE;
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   682
	}
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   683
};
47531
f5b8f0b9c129 dirstate-entry: add a `tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47526
diff changeset
   684
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   685
static PyObject *dirstate_item_get_added(dirstateItemObject *self)
47526
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   686
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   687
	if (dirstate_item_c_added(self)) {
47526
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   688
		Py_RETURN_TRUE;
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   689
	} else {
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   690
		Py_RETURN_FALSE;
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   691
	}
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   692
};
8bcae9bf9e8d dirstate-entry: add a `added` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47517
diff changeset
   693
48154
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   694
static PyObject *dirstate_item_get_p2_info(dirstateItemObject *self)
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   695
{
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   696
	if (self->flags & dirstate_flag_wc_tracked &&
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   697
	    self->flags & dirstate_flag_p2_info) {
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   698
		Py_RETURN_TRUE;
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   699
	} else {
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   700
		Py_RETURN_FALSE;
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   701
	}
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   702
};
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   703
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   704
static PyObject *dirstate_item_get_merged(dirstateItemObject *self)
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   705
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   706
	if (dirstate_item_c_merged(self)) {
47513
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   707
		Py_RETURN_TRUE;
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   708
	} else {
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   709
		Py_RETURN_FALSE;
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   710
	}
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   711
};
10e740292dff dirstate-entry: add a `merged` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47512
diff changeset
   712
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   713
static PyObject *dirstate_item_get_from_p2(dirstateItemObject *self)
47514
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   714
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   715
	if (dirstate_item_c_from_p2(self)) {
47514
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   716
		Py_RETURN_TRUE;
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   717
	} else {
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   718
		Py_RETURN_FALSE;
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   719
	}
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   720
};
559aee84b889 dirstate-entry: add a `from_p2` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47513
diff changeset
   721
48098
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   722
static PyObject *dirstate_item_get_maybe_clean(dirstateItemObject *self)
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   723
{
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   724
	if (!(self->flags & dirstate_flag_wc_tracked)) {
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   725
		Py_RETURN_FALSE;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   726
	} else if (!(self->flags & dirstate_flag_p1_tracked)) {
48098
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   727
		Py_RETURN_FALSE;
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   728
	} else if (self->flags & dirstate_flag_p2_info) {
48098
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   729
		Py_RETURN_FALSE;
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   730
	} else {
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   731
		Py_RETURN_TRUE;
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   732
	}
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   733
};
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   734
48099
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   735
static PyObject *dirstate_item_get_any_tracked(dirstateItemObject *self)
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   736
{
48150
38488d488ec1 dirstate-item: change the internal storage and constructor value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48099
diff changeset
   737
	if (dirstate_item_c_any_tracked(self)) {
48099
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   738
		Py_RETURN_TRUE;
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   739
	} else {
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   740
		Py_RETURN_FALSE;
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   741
	}
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   742
};
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   743
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   744
static PyObject *dirstate_item_get_removed(dirstateItemObject *self)
47515
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   745
{
47975
154e4dcac68c dirstate-item: introduce low level C function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47974
diff changeset
   746
	if (dirstate_item_c_removed(self)) {
47515
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   747
		Py_RETURN_TRUE;
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   748
	} else {
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   749
		Py_RETURN_FALSE;
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   750
	}
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   751
};
c94d3ff46fd5 dirstate-entry: add a `removed` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47514
diff changeset
   752
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   753
static PyGetSetDef dirstate_item_getset[] = {
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   754
    {"mode", (getter)dirstate_item_get_mode, NULL, "mode", NULL},
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   755
    {"size", (getter)dirstate_item_get_size, NULL, "size", NULL},
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   756
    {"mtime", (getter)dirstate_item_get_mtime, NULL, "mtime", NULL},
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   757
    {"state", (getter)dirstate_item_get_state, NULL, "state", NULL},
48263
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   758
    {"has_fallback_exec", (getter)dirstate_item_get_has_fallback_exec, NULL,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   759
     "has_fallback_exec", NULL},
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   760
    {"fallback_exec", (getter)dirstate_item_get_fallback_exec,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   761
     (setter)dirstate_item_set_fallback_exec, "fallback_exec", NULL},
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   762
    {"has_fallback_symlink", (getter)dirstate_item_get_has_fallback_symlink,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   763
     NULL, "has_fallback_symlink", NULL},
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   764
    {"fallback_symlink", (getter)dirstate_item_get_fallback_symlink,
602c8e8411f5 dirstate: add a concept of "fallback" flags to dirstate item
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48261
diff changeset
   765
     (setter)dirstate_item_set_fallback_symlink, "fallback_symlink", NULL},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   766
    {"tracked", (getter)dirstate_item_get_tracked, NULL, "tracked", NULL},
48155
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   767
    {"p1_tracked", (getter)dirstate_item_get_p1_tracked, NULL, "p1_tracked",
21542d4cb568 dirstate-item: introduce a `p1_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48154
diff changeset
   768
     NULL},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   769
    {"added", (getter)dirstate_item_get_added, NULL, "added", NULL},
48154
fb3b41d583c2 dirstate-item: introduce a `p2_info` property that combine two others
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48150
diff changeset
   770
    {"p2_info", (getter)dirstate_item_get_p2_info, NULL, "p2_info", NULL},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   771
    {"merged", (getter)dirstate_item_get_merged, NULL, "merged", NULL},
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   772
    {"from_p2", (getter)dirstate_item_get_from_p2, NULL, "from_p2", NULL},
48098
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   773
    {"maybe_clean", (getter)dirstate_item_get_maybe_clean, NULL, "maybe_clean",
80783e553bd5 dirstate-item: introduce a `maybe_clean` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48096
diff changeset
   774
     NULL},
48099
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   775
    {"any_tracked", (getter)dirstate_item_get_any_tracked, NULL, "any_tracked",
79bc60ca5946 dirstate-item: introduce a `any_tracked` property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48098
diff changeset
   776
     NULL},
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   777
    {"removed", (getter)dirstate_item_get_removed, NULL, "removed", NULL},
47512
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   778
    {NULL} /* Sentinel */
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   779
};
769037a279ec dirstate-entry: add a `state` property (and use it)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47509
diff changeset
   780
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   781
PyTypeObject dirstateItemType = {
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   782
    PyVarObject_HEAD_INIT(NULL, 0)     /* header */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   783
    "dirstate_tuple",                  /* tp_name */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   784
    sizeof(dirstateItemObject),        /* tp_basicsize */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   785
    0,                                 /* tp_itemsize */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   786
    (destructor)dirstate_item_dealloc, /* tp_dealloc */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   787
    0,                                 /* tp_print */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   788
    0,                                 /* tp_getattr */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   789
    0,                                 /* tp_setattr */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   790
    0,                                 /* tp_compare */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   791
    0,                                 /* tp_repr */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   792
    0,                                 /* tp_as_number */
47956
ba9491be5e0c dirstate-item: drop the deprecated __getitem__ variante
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47936
diff changeset
   793
    0,                                 /* tp_as_sequence */
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   794
    0,                                 /* tp_as_mapping */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   795
    0,                                 /* tp_hash  */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   796
    0,                                 /* tp_call */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   797
    0,                                 /* tp_str */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   798
    0,                                 /* tp_getattro */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   799
    0,                                 /* tp_setattro */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   800
    0,                                 /* tp_as_buffer */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   801
    Py_TPFLAGS_DEFAULT,                /* tp_flags */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   802
    "dirstate tuple",                  /* tp_doc */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   803
    0,                                 /* tp_traverse */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   804
    0,                                 /* tp_clear */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   805
    0,                                 /* tp_richcompare */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   806
    0,                                 /* tp_weaklistoffset */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   807
    0,                                 /* tp_iter */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   808
    0,                                 /* tp_iternext */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   809
    dirstate_item_methods,             /* tp_methods */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   810
    0,                                 /* tp_members */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   811
    dirstate_item_getset,              /* tp_getset */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   812
    0,                                 /* tp_base */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   813
    0,                                 /* tp_dict */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   814
    0,                                 /* tp_descr_get */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   815
    0,                                 /* tp_descr_set */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   816
    0,                                 /* tp_dictoffset */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   817
    0,                                 /* tp_init */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   818
    0,                                 /* tp_alloc */
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   819
    dirstate_item_new,                 /* tp_new */
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   820
};
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   821
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   822
static PyObject *parse_dirstate(PyObject *self, PyObject *args)
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   823
{
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   824
	PyObject *dmap, *cmap, *parents = NULL, *ret = NULL;
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   825
	PyObject *fname = NULL, *cname = NULL, *entry = NULL;
20167
09e41ac6289d mpatch: rewrite pointer overflow checks
Matt Mackall <mpm@selenic.com>
parents: 20109
diff changeset
   826
	char state, *cur, *str, *cpos;
19725
5e25d71a58cc parsers: state is a char, not an int
Bryan O'Sullivan <bryano@fb.com>
parents: 19718
diff changeset
   827
	int mode, size, mtime;
42068
896b19d12c08 cext: make parsers.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41361
diff changeset
   828
	unsigned int flen, pos = 40;
896b19d12c08 cext: make parsers.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41361
diff changeset
   829
	Py_ssize_t len = 40;
896b19d12c08 cext: make parsers.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41361
diff changeset
   830
	Py_ssize_t readlen;
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   831
36649
186c6df3a373 py3: bulk-replace 'const char*' format specifier passed to PyArg_ParseTuple*()
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
   832
	if (!PyArg_ParseTuple(
186c6df3a373 py3: bulk-replace 'const char*' format specifier passed to PyArg_ParseTuple*()
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
   833
	        args, PY23("O!O!s#:parse_dirstate", "O!O!y#:parse_dirstate"),
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   834
	        &PyDict_Type, &dmap, &PyDict_Type, &cmap, &str, &readlen)) {
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   835
		goto quit;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   836
	}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   837
22403
41e9d58ec56f parsers: avoid signed/unsigned comparison mismatch
Henrik Stuart <hg@hstuart.dk>
parents: 22402
diff changeset
   838
	len = readlen;
41e9d58ec56f parsers: avoid signed/unsigned comparison mismatch
Henrik Stuart <hg@hstuart.dk>
parents: 22402
diff changeset
   839
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   840
	/* read parents */
26052
b970418bbafe parsers: set exception when there's too little string data to extract parents
Augie Fackler <augie@google.com>
parents: 26051
diff changeset
   841
	if (len < 40) {
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   842
		PyErr_SetString(PyExc_ValueError,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   843
		                "too little data for parents");
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   844
		goto quit;
26052
b970418bbafe parsers: set exception when there's too little string data to extract parents
Augie Fackler <augie@google.com>
parents: 26051
diff changeset
   845
	}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   846
42096
509a0477b3a6 cext: cast s# arguments of Py_BuildValue() to Py_ssize_t
Yuya Nishihara <yuya@tcha.org>
parents: 42068
diff changeset
   847
	parents = Py_BuildValue(PY23("s#s#", "y#y#"), str, (Py_ssize_t)20,
509a0477b3a6 cext: cast s# arguments of Py_BuildValue() to Py_ssize_t
Yuya Nishihara <yuya@tcha.org>
parents: 42068
diff changeset
   848
	                        str + 20, (Py_ssize_t)20);
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   849
	if (!parents) {
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   850
		goto quit;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   851
	}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   852
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   853
	/* read filenames */
20167
09e41ac6289d mpatch: rewrite pointer overflow checks
Matt Mackall <mpm@selenic.com>
parents: 20109
diff changeset
   854
	while (pos >= 40 && pos < len) {
27226
f5e8cb813a4d parsers: fix parse_dirstate to check len before unpacking header (issue4979)
Yuya Nishihara <yuya@tcha.org>
parents: 26872
diff changeset
   855
		if (pos + 17 > len) {
f5e8cb813a4d parsers: fix parse_dirstate to check len before unpacking header (issue4979)
Yuya Nishihara <yuya@tcha.org>
parents: 26872
diff changeset
   856
			PyErr_SetString(PyExc_ValueError,
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   857
			                "overflow in dirstate");
27226
f5e8cb813a4d parsers: fix parse_dirstate to check len before unpacking header (issue4979)
Yuya Nishihara <yuya@tcha.org>
parents: 26872
diff changeset
   858
			goto quit;
f5e8cb813a4d parsers: fix parse_dirstate to check len before unpacking header (issue4979)
Yuya Nishihara <yuya@tcha.org>
parents: 26872
diff changeset
   859
		}
20167
09e41ac6289d mpatch: rewrite pointer overflow checks
Matt Mackall <mpm@selenic.com>
parents: 20109
diff changeset
   860
		cur = str + pos;
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   861
		/* unpack header */
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   862
		state = *cur;
16437
d126a0d16856 util.h: replace ntohl/htonl with get/putbe32
Matt Mackall <mpm@selenic.com>
parents: 16414
diff changeset
   863
		mode = getbe32(cur + 1);
d126a0d16856 util.h: replace ntohl/htonl with get/putbe32
Matt Mackall <mpm@selenic.com>
parents: 16414
diff changeset
   864
		size = getbe32(cur + 5);
d126a0d16856 util.h: replace ntohl/htonl with get/putbe32
Matt Mackall <mpm@selenic.com>
parents: 16414
diff changeset
   865
		mtime = getbe32(cur + 9);
d126a0d16856 util.h: replace ntohl/htonl with get/putbe32
Matt Mackall <mpm@selenic.com>
parents: 16414
diff changeset
   866
		flen = getbe32(cur + 13);
20167
09e41ac6289d mpatch: rewrite pointer overflow checks
Matt Mackall <mpm@selenic.com>
parents: 20109
diff changeset
   867
		pos += 17;
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   868
		cur += 17;
20316
40f08c31844c parsers: fix 'unsigned expression is always true' warning (issue4142)
David Soria Parra <davidsp@fb.com>
parents: 20169
diff changeset
   869
		if (flen > len - pos) {
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   870
			PyErr_SetString(PyExc_ValueError,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   871
			                "overflow in dirstate");
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   872
			goto quit;
7174
4da87407b845 parsers.c: fix integer overflows
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7168
diff changeset
   873
		}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   874
47665
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   875
		entry = (PyObject *)dirstate_item_from_v1_data(state, mode,
a4443f66be6a dirstate-item: add a `from_v1_data` constructor
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47539
diff changeset
   876
		                                               size, mtime);
48049
13efd8fdc55f dirstate: fix parse_dirstate() to error out if NULL entry created
Yuya Nishihara <yuya@tcha.org>
parents: 48047
diff changeset
   877
		if (!entry)
13efd8fdc55f dirstate: fix parse_dirstate() to error out if NULL entry created
Yuya Nishihara <yuya@tcha.org>
parents: 48047
diff changeset
   878
			goto quit;
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   879
		cpos = memchr(cur, 0, flen);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   880
		if (cpos) {
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
   881
			fname = PyBytes_FromStringAndSize(cur, cpos - cur);
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   882
			cname = PyBytes_FromStringAndSize(
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   883
			    cpos + 1, flen - (cpos - cur) - 1);
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   884
			if (!fname || !cname ||
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   885
			    PyDict_SetItem(cmap, fname, cname) == -1 ||
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   886
			    PyDict_SetItem(dmap, fname, entry) == -1) {
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   887
				goto quit;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   888
			}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   889
			Py_DECREF(cname);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   890
		} else {
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
   891
			fname = PyBytes_FromStringAndSize(cur, flen);
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   892
			if (!fname ||
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   893
			    PyDict_SetItem(dmap, fname, entry) == -1) {
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   894
				goto quit;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   895
			}
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   896
		}
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   897
		Py_DECREF(fname);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   898
		Py_DECREF(entry);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   899
		fname = cname = entry = NULL;
20167
09e41ac6289d mpatch: rewrite pointer overflow checks
Matt Mackall <mpm@selenic.com>
parents: 20109
diff changeset
   900
		pos += flen;
7093
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   901
	}
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   902
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   903
	ret = parents;
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   904
	Py_INCREF(ret);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   905
quit:
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   906
	Py_XDECREF(fname);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   907
	Py_XDECREF(cname);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   908
	Py_XDECREF(entry);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   909
	Py_XDECREF(parents);
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   910
	return ret;
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   911
}
16bafcebd3d1 dirstate: C parsing extension
Matt Mackall <mpm@selenic.com>
parents: 7092
diff changeset
   912
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   913
/*
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   914
 * Efficiently pack a dirstate object into its on-disk format.
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   915
 */
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   916
static PyObject *pack_dirstate(PyObject *self, PyObject *args)
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   917
{
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   918
	PyObject *packobj = NULL;
21806
05bd2667df4d pack_dirstate: in C version, for invalidation set dict to what we write to disk
Siddharth Agarwal <sid0@fb.com>
parents: 21730
diff changeset
   919
	PyObject *map, *copymap, *pl, *mtime_unset = NULL;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   920
	Py_ssize_t nbytes, pos, l;
23946
f3e94aa6e182 parsers: don't leak a tuple in pack_dirstate
Augie Fackler <augie@google.com>
parents: 23945
diff changeset
   921
	PyObject *k, *v = NULL, *pn;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   922
	char *p, *s;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   923
48440
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48426
diff changeset
   924
	if (!PyArg_ParseTuple(args, "O!O!O!:pack_dirstate", &PyDict_Type, &map,
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48426
diff changeset
   925
	                      &PyDict_Type, &copymap, &PyTuple_Type, &pl)) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   926
		return NULL;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   927
	}
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   928
38785
adacefb0b7ea dirstate: use tuple interface to fix leak in pack_dirstate()
Yuya Nishihara <yuya@tcha.org>
parents: 38012
diff changeset
   929
	if (PyTuple_Size(pl) != 2) {
adacefb0b7ea dirstate: use tuple interface to fix leak in pack_dirstate()
Yuya Nishihara <yuya@tcha.org>
parents: 38012
diff changeset
   930
		PyErr_SetString(PyExc_TypeError, "expected 2-element tuple");
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   931
		return NULL;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   932
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   933
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   934
	/* Figure out how much we need to allocate. */
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   935
	for (nbytes = 40, pos = 0; PyDict_Next(map, &pos, &k, &v);) {
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   936
		PyObject *c;
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   937
		if (!PyBytes_Check(k)) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   938
			PyErr_SetString(PyExc_TypeError, "expected string key");
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   939
			goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   940
		}
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   941
		nbytes += PyBytes_GET_SIZE(k) + 17;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   942
		c = PyDict_GetItem(copymap, k);
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   943
		if (c) {
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   944
			if (!PyBytes_Check(c)) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   945
				PyErr_SetString(PyExc_TypeError,
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   946
				                "expected string key");
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   947
				goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   948
			}
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   949
			nbytes += PyBytes_GET_SIZE(c) + 1;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   950
		}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   951
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   952
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   953
	packobj = PyBytes_FromStringAndSize(NULL, nbytes);
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   954
	if (packobj == NULL) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   955
		goto bail;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
   956
	}
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   957
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   958
	p = PyBytes_AS_STRING(packobj);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   959
38785
adacefb0b7ea dirstate: use tuple interface to fix leak in pack_dirstate()
Yuya Nishihara <yuya@tcha.org>
parents: 38012
diff changeset
   960
	pn = PyTuple_GET_ITEM(pl, 0);
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   961
	if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   962
		PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash");
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   963
		goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   964
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   965
	memcpy(p, s, l);
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   966
	p += 20;
38785
adacefb0b7ea dirstate: use tuple interface to fix leak in pack_dirstate()
Yuya Nishihara <yuya@tcha.org>
parents: 38012
diff changeset
   967
	pn = PyTuple_GET_ITEM(pl, 1);
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
   968
	if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) {
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   969
		PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash");
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   970
		goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   971
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   972
	memcpy(p, s, l);
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   973
	p += 20;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   974
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   975
	for (pos = 0; PyDict_Next(map, &pos, &k, &v);) {
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   976
		dirstateItemObject *tuple;
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   977
		char state;
26774
04ab2348efd1 parsers: correct type of temporary variables for dirstate tuple fields
Yuya Nishihara <yuya@tcha.org>
parents: 26630
diff changeset
   978
		int mode, size, mtime;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   979
		Py_ssize_t len, l;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   980
		PyObject *o;
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   981
		char *t;
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   982
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   983
		if (!dirstate_tuple_check(v)) {
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   984
			PyErr_SetString(PyExc_TypeError,
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
   985
			                "expected a dirstate tuple");
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   986
			goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   987
		}
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
   988
		tuple = (dirstateItemObject *)v;
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   989
47976
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   990
		state = dirstate_item_c_v1_state(tuple);
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   991
		mode = dirstate_item_c_v1_mode(tuple);
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   992
		size = dirstate_item_c_v1_size(tuple);
83f0e93ec34b dirstate-item: move the C implementation to the same logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47975
diff changeset
   993
		mtime = dirstate_item_c_v1_mtime(tuple);
21809
e250b8300e6e parsers: inline fields of dirstate values in C version
Siddharth Agarwal <sid0@fb.com>
parents: 21807
diff changeset
   994
		*p++ = state;
26774
04ab2348efd1 parsers: correct type of temporary variables for dirstate tuple fields
Yuya Nishihara <yuya@tcha.org>
parents: 26630
diff changeset
   995
		putbe32((uint32_t)mode, p);
04ab2348efd1 parsers: correct type of temporary variables for dirstate tuple fields
Yuya Nishihara <yuya@tcha.org>
parents: 26630
diff changeset
   996
		putbe32((uint32_t)size, p + 4);
04ab2348efd1 parsers: correct type of temporary variables for dirstate tuple fields
Yuya Nishihara <yuya@tcha.org>
parents: 26630
diff changeset
   997
		putbe32((uint32_t)mtime, p + 8);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   998
		t = p + 12;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
   999
		p += 16;
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1000
		len = PyBytes_GET_SIZE(k);
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1001
		memcpy(p, PyBytes_AS_STRING(k), len);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1002
		p += len;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1003
		o = PyDict_GetItem(copymap, k);
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1004
		if (o) {
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1005
			*p++ = '\0';
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1006
			l = PyBytes_GET_SIZE(o);
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1007
			memcpy(p, PyBytes_AS_STRING(o), l);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1008
			p += l;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1009
			len += l + 1;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1010
		}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1011
		putbe32((uint32_t)len, t);
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1012
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1013
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1014
	pos = p - PyBytes_AS_STRING(packobj);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1015
	if (pos != nbytes) {
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1016
		PyErr_Format(PyExc_SystemError, "bad dirstate size: %ld != %ld",
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1017
		             (long)pos, (long)nbytes);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1018
		goto bail;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1019
	}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1020
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1021
	return packobj;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1022
bail:
21806
05bd2667df4d pack_dirstate: in C version, for invalidation set dict to what we write to disk
Siddharth Agarwal <sid0@fb.com>
parents: 21730
diff changeset
  1023
	Py_XDECREF(mtime_unset);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1024
	Py_XDECREF(packobj);
23946
f3e94aa6e182 parsers: don't leak a tuple in pack_dirstate
Augie Fackler <augie@google.com>
parents: 23945
diff changeset
  1025
	Py_XDECREF(v);
16955
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1026
	return NULL;
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1027
}
92e1c64ba0d4 parsers: add a C function to pack the dirstate
Bryan O'Sullivan <bryano@fb.com>
parents: 16863
diff changeset
  1028
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1029
#define BUMPED_FIX 1
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1030
#define USING_SHA_256 2
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1031
#define FM1_HEADER_SIZE (4 + 8 + 2 + 2 + 1 + 1 + 1)
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1032
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1033
static PyObject *readshas(const char *source, unsigned char num,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1034
                          Py_ssize_t hashwidth)
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1035
{
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1036
	int i;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1037
	PyObject *list = PyTuple_New(num);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1038
	if (list == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1039
		return NULL;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1040
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1041
	for (i = 0; i < num; i++) {
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1042
		PyObject *hash = PyBytes_FromStringAndSize(source, hashwidth);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1043
		if (hash == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1044
			Py_DECREF(list);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1045
			return NULL;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1046
		}
26213
4d6cdea33f37 parsers: use PyTuple_SET_ITEM() to fill new marker tuples
Yuya Nishihara <yuya@tcha.org>
parents: 26107
diff changeset
  1047
		PyTuple_SET_ITEM(list, i, hash);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1048
		source += hashwidth;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1049
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1050
	return list;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1051
}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1052
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1053
static PyObject *fm1readmarker(const char *databegin, const char *dataend,
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1054
                               uint32_t *msize)
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1055
{
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1056
	const char *data = databegin;
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1057
	const char *meta;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1058
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1059
	double mtime;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1060
	int16_t tz;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1061
	uint16_t flags;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1062
	unsigned char nsuccs, nparents, nmetadata;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1063
	Py_ssize_t hashwidth = 20;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1064
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1065
	PyObject *prec = NULL, *parents = NULL, *succs = NULL;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1066
	PyObject *metadata = NULL, *ret = NULL;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1067
	int i;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1068
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1069
	if (data + FM1_HEADER_SIZE > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1070
		goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1071
	}
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1072
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1073
	*msize = getbe32(data);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1074
	data += 4;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1075
	mtime = getbefloat64(data);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1076
	data += 8;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1077
	tz = getbeint16(data);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1078
	data += 2;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1079
	flags = getbeuint16(data);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1080
	data += 2;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1081
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1082
	if (flags & USING_SHA_256) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1083
		hashwidth = 32;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1084
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1085
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1086
	nsuccs = (unsigned char)(*data++);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1087
	nparents = (unsigned char)(*data++);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1088
	nmetadata = (unsigned char)(*data++);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1089
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1090
	if (databegin + *msize > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1091
		goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1092
	}
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1093
	dataend = databegin + *msize; /* narrow down to marker size */
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1094
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1095
	if (data + hashwidth > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1096
		goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1097
	}
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1098
	prec = PyBytes_FromStringAndSize(data, hashwidth);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1099
	data += hashwidth;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1100
	if (prec == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1101
		goto bail;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1102
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1103
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1104
	if (data + nsuccs * hashwidth > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1105
		goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1106
	}
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1107
	succs = readshas(data, nsuccs, hashwidth);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1108
	if (succs == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1109
		goto bail;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1110
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1111
	data += nsuccs * hashwidth;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1112
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1113
	if (nparents == 1 || nparents == 2) {
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1114
		if (data + nparents * hashwidth > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1115
			goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1116
		}
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1117
		parents = readshas(data, nparents, hashwidth);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1118
		if (parents == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1119
			goto bail;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1120
		}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1121
		data += nparents * hashwidth;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1122
	} else {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1123
		parents = Py_None;
31435
43a7dfbead0c parsers: handle refcounting of "parents" consistently
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31301
diff changeset
  1124
		Py_INCREF(parents);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1125
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1126
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1127
	if (data + 2 * nmetadata > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1128
		goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1129
	}
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1130
	meta = data + (2 * nmetadata);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1131
	metadata = PyTuple_New(nmetadata);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1132
	if (metadata == NULL) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1133
		goto bail;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1134
	}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1135
	for (i = 0; i < nmetadata; i++) {
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1136
		PyObject *tmp, *left = NULL, *right = NULL;
26590
473a63c45394 parsers: read sizes of metadata pair of obsolete marker at once
Yuya Nishihara <yuya@tcha.org>
parents: 26214
diff changeset
  1137
		Py_ssize_t leftsize = (unsigned char)(*data++);
473a63c45394 parsers: read sizes of metadata pair of obsolete marker at once
Yuya Nishihara <yuya@tcha.org>
parents: 26214
diff changeset
  1138
		Py_ssize_t rightsize = (unsigned char)(*data++);
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1139
		if (meta + leftsize + rightsize > dataend) {
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1140
			goto overflow;
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1141
		}
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1142
		left = PyBytes_FromStringAndSize(meta, leftsize);
26590
473a63c45394 parsers: read sizes of metadata pair of obsolete marker at once
Yuya Nishihara <yuya@tcha.org>
parents: 26214
diff changeset
  1143
		meta += leftsize;
30100
c5afe5531709 parsers: convert PyString* to PyBytes*
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30090
diff changeset
  1144
		right = PyBytes_FromStringAndSize(meta, rightsize);
26590
473a63c45394 parsers: read sizes of metadata pair of obsolete marker at once
Yuya Nishihara <yuya@tcha.org>
parents: 26214
diff changeset
  1145
		meta += rightsize;
26214
46605888faf3 parsers: use PyTuple_New and SET_ITEM to construct metadata pair of markers
Yuya Nishihara <yuya@tcha.org>
parents: 26213
diff changeset
  1146
		tmp = PyTuple_New(2);
46605888faf3 parsers: use PyTuple_New and SET_ITEM to construct metadata pair of markers
Yuya Nishihara <yuya@tcha.org>
parents: 26213
diff changeset
  1147
		if (!left || !right || !tmp) {
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1148
			Py_XDECREF(left);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1149
			Py_XDECREF(right);
26214
46605888faf3 parsers: use PyTuple_New and SET_ITEM to construct metadata pair of markers
Yuya Nishihara <yuya@tcha.org>
parents: 26213
diff changeset
  1150
			Py_XDECREF(tmp);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1151
			goto bail;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1152
		}
26214
46605888faf3 parsers: use PyTuple_New and SET_ITEM to construct metadata pair of markers
Yuya Nishihara <yuya@tcha.org>
parents: 26213
diff changeset
  1153
		PyTuple_SET_ITEM(tmp, 0, left);
46605888faf3 parsers: use PyTuple_New and SET_ITEM to construct metadata pair of markers
Yuya Nishihara <yuya@tcha.org>
parents: 26213
diff changeset
  1154
		PyTuple_SET_ITEM(tmp, 1, right);
26213
4d6cdea33f37 parsers: use PyTuple_SET_ITEM() to fill new marker tuples
Yuya Nishihara <yuya@tcha.org>
parents: 26107
diff changeset
  1155
		PyTuple_SET_ITEM(metadata, i, tmp);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1156
	}
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1157
	ret = Py_BuildValue("(OOHO(di)O)", prec, succs, flags, metadata, mtime,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1158
	                    (int)tz * 60, parents);
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1159
	goto bail; /* return successfully */
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1160
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1161
overflow:
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1162
	PyErr_SetString(PyExc_ValueError, "overflow in obsstore");
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1163
bail:
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1164
	Py_XDECREF(prec);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1165
	Py_XDECREF(succs);
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1166
	Py_XDECREF(metadata);
31435
43a7dfbead0c parsers: handle refcounting of "parents" consistently
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31301
diff changeset
  1167
	Py_XDECREF(parents);
24017
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1168
	return ret;
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1169
}
72c9b5ae7278 parsers: add fm1readmarker
Augie Fackler <augie@google.com>
parents: 24004
diff changeset
  1170
34441
7ed0750c71a1 cext: wrap before brace for functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34439
diff changeset
  1171
static PyObject *fm1readmarkers(PyObject *self, PyObject *args)
7ed0750c71a1 cext: wrap before brace for functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34439
diff changeset
  1172
{
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1173
	const char *data, *dataend;
42068
896b19d12c08 cext: make parsers.c PY_SSIZE_T_CLEAN
Gregory Szorc <gregory.szorc@gmail.com>
parents: 41361
diff changeset
  1174
	Py_ssize_t datalen, offset, stop;
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1175
	PyObject *markers = NULL;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1176
36649
186c6df3a373 py3: bulk-replace 'const char*' format specifier passed to PyArg_ParseTuple*()
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
  1177
	if (!PyArg_ParseTuple(args, PY23("s#nn", "y#nn"), &data, &datalen,
186c6df3a373 py3: bulk-replace 'const char*' format specifier passed to PyArg_ParseTuple*()
Yuya Nishihara <yuya@tcha.org>
parents: 36648
diff changeset
  1178
	                      &offset, &stop)) {
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1179
		return NULL;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1180
	}
41026
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1181
	if (offset < 0) {
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1182
		PyErr_SetString(PyExc_ValueError,
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1183
		                "invalid negative offset in fm1readmarkers");
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1184
		return NULL;
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1185
	}
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1186
	if (stop > datalen) {
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1187
		PyErr_SetString(
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1188
		    PyExc_ValueError,
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1189
		    "stop longer than data length in fm1readmarkers");
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1190
		return NULL;
5c68b617ba24 parsers: better bounds checking in fm1readmarkers
Augie Fackler <augie@google.com>
parents: 41021
diff changeset
  1191
	}
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1192
	dataend = data + datalen;
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1193
	data += offset;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1194
	markers = PyList_New(0);
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1195
	if (!markers) {
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1196
		return NULL;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1197
	}
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1198
	while (offset < stop) {
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1199
		uint32_t msize;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1200
		int error;
26591
042344313939 parsers: fix infinite loop or out-of-bound read in fm1readmarkers (issue4888)
Yuya Nishihara <yuya@tcha.org>
parents: 26590
diff changeset
  1201
		PyObject *record = fm1readmarker(data, dataend, &msize);
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1202
		if (!record) {
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1203
			goto bail;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1204
		}
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1205
		error = PyList_Append(markers, record);
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1206
		Py_DECREF(record);
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1207
		if (error) {
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1208
			goto bail;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1209
		}
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1210
		data += msize;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1211
		offset += msize;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1212
	}
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1213
	return markers;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1214
bail:
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1215
	Py_DECREF(markers);
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1216
	return NULL;
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1217
}
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24017
diff changeset
  1218
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1219
static char parsers_doc[] = "Efficient content parsing.";
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1220
17606
318fb32b980e pathencode: new C module with fast encodedir() function
Adrian Buehlmann <adrian@cadifra.com>
parents: 17356
diff changeset
  1221
PyObject *encodedir(PyObject *self, PyObject *args);
17616
9535a0dc41f2 store: implement fncache basic path encoding in C
Bryan O'Sullivan <bryano@fb.com>
parents: 17606
diff changeset
  1222
PyObject *pathencode(PyObject *self, PyObject *args);
18430
0459c6555f69 store: implement lowerencode in C
Bryan O'Sullivan <bryano@fb.com>
parents: 17616
diff changeset
  1223
PyObject *lowerencode(PyObject *self, PyObject *args);
46721
358737abeeef cext: add support for revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 45131
diff changeset
  1224
PyObject *parse_index2(PyObject *self, PyObject *args, PyObject *kwargs);
17606
318fb32b980e pathencode: new C module with fast encodedir() function
Adrian Buehlmann <adrian@cadifra.com>
parents: 17356
diff changeset
  1225
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1226
static PyMethodDef methods[] = {
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1227
    {"pack_dirstate", pack_dirstate, METH_VARARGS, "pack a dirstate\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1228
    {"parse_dirstate", parse_dirstate, METH_VARARGS, "parse a dirstate\n"},
46721
358737abeeef cext: add support for revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 45131
diff changeset
  1229
    {"parse_index2", (PyCFunction)parse_index2, METH_VARARGS | METH_KEYWORDS,
358737abeeef cext: add support for revlogv2
Raphaël Gomès <rgomes@octobus.net>
parents: 45131
diff changeset
  1230
     "parse a revlog index\n"},
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1231
    {"isasciistr", isasciistr, METH_VARARGS, "check if an ASCII string\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1232
    {"asciilower", asciilower, METH_VARARGS, "lowercase an ASCII string\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1233
    {"asciiupper", asciiupper, METH_VARARGS, "uppercase an ASCII string\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1234
    {"dict_new_presized", dict_new_presized, METH_VARARGS,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1235
     "construct a dict with an expected size\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1236
    {"make_file_foldmap", make_file_foldmap, METH_VARARGS,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1237
     "make file foldmap\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1238
    {"jsonescapeu8fast", jsonescapeu8fast, METH_VARARGS,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1239
     "escape a UTF-8 byte string to JSON (fast path)\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1240
    {"encodedir", encodedir, METH_VARARGS, "encodedir a path\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1241
    {"pathencode", pathencode, METH_VARARGS, "fncache-encode a path\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1242
    {"lowerencode", lowerencode, METH_VARARGS, "lower-encode a path\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1243
    {"fm1readmarkers", fm1readmarkers, METH_VARARGS,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1244
     "parse v1 obsolete markers\n"},
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1245
    {NULL, NULL}};
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1246
18900
02ee846b246a scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents: 18567
diff changeset
  1247
void dirs_module_init(PyObject *mod);
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents: 24032
diff changeset
  1248
void manifest_module_init(PyObject *mod);
32417
7d0c69505a66 cext: extract revlog/index parsing code to own C file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32411
diff changeset
  1249
void revlog_module_init(PyObject *mod);
18900
02ee846b246a scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents: 18567
diff changeset
  1250
47279
9d1a8829f959 revlog: signal which revlog index are compatible with Rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47260
diff changeset
  1251
static const int version = 20;
32399
af3ef002395d parsers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31479
diff changeset
  1252
16363
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1253
static void module_init(PyObject *mod)
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1254
{
32399
af3ef002395d parsers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31479
diff changeset
  1255
	PyModule_AddIntConstant(mod, "version", version);
af3ef002395d parsers: add version to help detect breaking binary changes
Jun Wu <quark@fb.com>
parents: 31479
diff changeset
  1256
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1257
	/* This module constant has two purposes.  First, it lets us unit test
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1258
	 * the ImportError raised without hard-coding any error text.  This
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1259
	 * means we can change the text in the future without breaking tests,
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1260
	 * even across changesets without a recompile.  Second, its presence
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1261
	 * can be used to determine whether the version-checking logic is
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1262
	 * present, which also helps in testing across changesets without a
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1263
	 * recompile.  Note that this means the pure-Python version of parsers
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1264
	 * should not have this module constant. */
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1265
	PyModule_AddStringConstant(mod, "versionerrortext", versionerrortext);
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1266
18900
02ee846b246a scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents: 18567
diff changeset
  1267
	dirs_module_init(mod);
24214
a5f1bccd2996 manifest.c: new extension code to lazily parse manifests
Augie Fackler <augie@google.com>
parents: 24032
diff changeset
  1268
	manifest_module_init(mod);
32417
7d0c69505a66 cext: extract revlog/index parsing code to own C file
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32411
diff changeset
  1269
	revlog_module_init(mod);
18900
02ee846b246a scmutil: rewrite dirs in C, use if available
Bryan O'Sullivan <bryano@fb.com>
parents: 18567
diff changeset
  1270
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
  1271
	if (PyType_Ready(&dirstateItemType) < 0) {
32422
2e5a476b2e46 cext: move back finalization of dirstateTupleType where it should be
Yuya Nishihara <yuya@tcha.org>
parents: 32417
diff changeset
  1272
		return;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1273
	}
47539
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
  1274
	Py_INCREF(&dirstateItemType);
84391ddf4c78 dirstate-item: rename the class to DirstateItem
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47538
diff changeset
  1275
	PyModule_AddObject(mod, "DirstateItem", (PyObject *)&dirstateItemType);
16363
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1276
}
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1277
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1278
static int check_python_version(void)
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1279
{
23943
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1280
	PyObject *sys = PyImport_ImportModule("sys"), *ver;
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1281
	long hexversion;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1282
	if (!sys) {
23943
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1283
		return -1;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1284
	}
23943
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1285
	ver = PyObject_GetAttrString(sys, "hexversion");
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1286
	Py_DECREF(sys);
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1287
	if (!ver) {
23943
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1288
		return -1;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1289
	}
23943
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1290
	hexversion = PyInt_AsLong(ver);
5fb44983a696 parsers: don't leak references to sys et al in check_python_version
Augie Fackler <augie@google.com>
parents: 23942
diff changeset
  1291
	Py_DECREF(ver);
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1292
	/* sys.hexversion is a 32-bit number by default, so the -1 case
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1293
	 * should only occur in unusual circumstances (e.g. if sys.hexversion
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1294
	 * is manually set to an invalid value). */
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1295
	if ((hexversion == -1) || (hexversion >> 16 != PY_VERSION_HEX >> 16)) {
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1296
		PyErr_Format(PyExc_ImportError,
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1297
		             "%s: The Mercurial extension "
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1298
		             "modules were compiled with Python " PY_VERSION
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1299
		             ", but "
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1300
		             "Mercurial is currently using Python with "
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1301
		             "sys.hexversion=%ld: "
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1302
		             "Python %s\n at: %s",
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1303
		             versionerrortext, hexversion, Py_GetVersion(),
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1304
		             Py_GetProgramFullPath());
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1305
		return -1;
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1306
	}
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1307
	return 0;
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1308
}
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1309
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1310
#ifdef IS_PY3K
34862
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1311
static struct PyModuleDef parsers_module = {PyModuleDef_HEAD_INIT, "parsers",
d92dc725223b parsers: allow clang-format here
Augie Fackler <augie@google.com>
parents: 34861
diff changeset
  1312
                                            parsers_doc, -1, methods};
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1313
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1314
PyMODINIT_FUNC PyInit_parsers(void)
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1315
{
20797
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1316
	PyObject *mod;
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1317
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1318
	if (check_python_version() == -1)
30090
8abe9264c73a parsers: return NULL from PyInit_parsers on Python 3
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29444
diff changeset
  1319
		return NULL;
20797
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1320
	mod = PyModule_Create(&parsers_module);
16363
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1321
	module_init(mod);
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1322
	return mod;
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1323
}
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1324
#else
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1325
PyMODINIT_FUNC initparsers(void)
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1326
{
20797
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1327
	PyObject *mod;
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1328
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1329
	if (check_python_version() == -1) {
20742
3681de20b0a7 parsers: fail fast if Python has wrong minor version (issue4110)
Chris Jerdonek <chris.jerdonek@gmail.com>
parents: 20555
diff changeset
  1330
		return;
41361
763b45bc4483 cleanup: use clang-tidy to add missing {} around one-line statements
Augie Fackler <augie@google.com>
parents: 41026
diff changeset
  1331
	}
20797
e286ab22e461 parsers: fix compiler errors on MSVC 2008
Matt Harbison <matt_harbison@yahoo.com>
parents: 20742
diff changeset
  1332
	mod = Py_InitModule3("parsers", methods, parsers_doc);
16363
2cdd7e63211b parsers: incrementally parse the revlog index in C
Bryan O'Sullivan <bryano@fb.com>
parents: 15033
diff changeset
  1333
	module_init(mod);
6389
0231f763ebc8 manifest: improve parsing performance by 8x via a new C extension
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
  1334
}
11361
3de3d670d2b6 parsers.c: Added support for py3k.
Renato Cunha <renatoc@gmail.com>
parents: 10449
diff changeset
  1335
#endif