##// END OF EJS Templates
dirstate: ignore sub-second component when either is zero in mtime...
dirstate: ignore sub-second component when either is zero in mtime When comparing mtimes for equality. Some APIs simply return zero when more precision is not available. When comparing values from different sources, if only one is truncated in that way, doing a simple comparison would cause many false negatives. Differential Revision: https://phab.mercurial-scm.org/D11701

File last commit:

r49080:9205d9be default
r49081:68bb472a default
Show More
util.h
92 lines | 3.0 KiB | text/x-c | CLexer
Yuya Nishihara
cext: move util.h to cext tree...
r32384 /*
util.h - utility functions for interfacing with the various python APIs.
This software may be used and distributed according to the terms of
the GNU General Public License, incorporated herein by reference.
*/
#ifndef _HG_UTIL_H_
#define _HG_UTIL_H_
#include "compat.h"
#if PY_MAJOR_VERSION >= 3
#define IS_PY3K
#endif
Yuya Nishihara
py3: add PY23() macro to switch string literal depending on python version...
r36636 /* helper to switch things like string literal depending on Python version */
#ifdef IS_PY3K
#define PY23(py2, py3) py3
#else
#define PY23(py2, py3) py2
#endif
Augie Fackler
util: add clang-format control comment around struct and format macro...
r34636 /* clang-format off */
Yuya Nishihara
cext: move util.h to cext tree...
r32384 typedef struct {
PyObject_HEAD
Simon Sapin
dirstate-v2: adds a flag to mark a file as modified...
r49066 int flags;
Yuya Nishihara
cext: move util.h to cext tree...
r32384 int mode;
int size;
Simon Sapin
dirstate: store mtimes with nanosecond precision in memory...
r49079 int mtime_s;
int mtime_ns;
dirstate-item: rename the class to DirstateItem...
r48328 } dirstateItemObject;
Augie Fackler
util: add clang-format control comment around struct and format macro...
r34636 /* clang-format on */
Yuya Nishihara
cext: move util.h to cext tree...
r32384
Simon Sapin
dirstate-v2: adds a flag to mark a file as modified...
r49066 static const int dirstate_flag_wc_tracked = 1;
static const int dirstate_flag_p1_tracked = 1 << 1;
static const int dirstate_flag_p2_info = 1 << 2;
static const int dirstate_flag_has_meaningful_data = 1 << 3;
static const int dirstate_flag_has_file_mtime = 1 << 4;
static const int dirstate_flag_has_directory_mtime = 1 << 5;
static const int dirstate_flag_mode_exec_perm = 1 << 6;
static const int dirstate_flag_mode_is_symlink = 1 << 7;
static const int dirstate_flag_expected_state_is_modified = 1 << 8;
dirstate-v2: adds two flag to track the presence of some unrecorded files...
r49067 static const int dirstate_flag_all_unknown_recorded = 1 << 9;
static const int dirstate_flag_all_ignored_recorded = 1 << 10;
dirstate: add a concept of "fallback" flags to dirstate item...
r49068 static const int dirstate_flag_fallback_exec = 1 << 11;
static const int dirstate_flag_has_fallback_exec = 1 << 12;
static const int dirstate_flag_fallback_symlink = 1 << 13;
static const int dirstate_flag_has_fallback_symlink = 1 << 14;
dirstate-v2: add a new MTIME_SECOND_AMBIGUOUS flags...
r49080 static const int dirstate_flag_mtime_second_ambiguous = 1 << 15;
dirstate-item: move the C implementation to the same logic...
r48760
dirstate-item: rename the class to DirstateItem...
r48328 extern PyTypeObject dirstateItemType;
#define dirstate_tuple_check(op) (Py_TYPE(op) == &dirstateItemType)
Yuya Nishihara
cext: move util.h to cext tree...
r32384
André Sintzoff
cext: define MIN macro only if it is not yet defined...
r35793 #ifndef MIN
Augie Fackler
util: add clang-format control comment around struct and format macro...
r34636 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
André Sintzoff
cext: define MIN macro only if it is not yet defined...
r35793 #endif
Yuya Nishihara
cext: move util.h to cext tree...
r32384 /* VC9 doesn't include bool and lacks stdbool.h based on my searching */
#if defined(_MSC_VER) || __STDC_VERSION__ < 199901L
#define true 1
#define false 0
typedef unsigned char bool;
#else
#include <stdbool.h>
#endif
Yuya Nishihara
cext: move _dict_new_presized() to header...
r33751 static inline PyObject *_dict_new_presized(Py_ssize_t expected_size)
{
/* _PyDict_NewPresized expects a minused parameter, but it actually
creates a dictionary that's the nearest power of two bigger than the
parameter. For example, with the initial minused = 1000, the
dictionary created has size 1024. Of course in a lot of cases that
can be greater than the maximum load factor Python's dict object
expects (= 2/3), so as soon as we cross the threshold we'll resize
anyway. So create a dictionary that's at least 3/2 the size. */
return _PyDict_NewPresized(((1 + expected_size) / 2) * 3);
}
Augie Fackler
revlog: replace PyInt_AS_LONG with a more portable helper function...
r40634 /* Convert a PyInt or PyLong to a long. Returns false if there is an
error, in which case an exception will already have been set. */
static inline bool pylong_to_long(PyObject *pylong, long *out)
{
*out = PyLong_AsLong(pylong);
/* Fast path to avoid hitting PyErr_Occurred if the value was obviously
* not an error. */
if (*out != -1) {
return true;
}
return PyErr_Occurred() == NULL;
}
Yuya Nishihara
cext: move util.h to cext tree...
r32384 #endif /* _HG_UTIL_H_ */