Mon, 15 Oct 2012 23:28:45 +0200 tests: inform on Windows about unnecessary glob lines stable
Simon Heimberg <simohe@besonet.ch> [Mon, 15 Oct 2012 23:28:45 +0200] rev 1216
tests: inform on Windows about unnecessary glob lines When glob lines directly match on windows, "/" (and not "\") was output in the path on the line. No glob matching is necessary in this case. The test output will look like this (when 5 tests have passed and no 4 has an unnecessary glob): ... Info, unnecessary glob: info about some/thing (glob) .. [ original upstream message ]
Wed, 13 Feb 2013 21:58:52 +0100 tests: quickly check if the glob line already matches the output stable
Simon Heimberg <simohe@besonet.ch> [Wed, 13 Feb 2013 21:58:52 +0100] rev 1215
tests: quickly check if the glob line already matches the output This happens when a path with "/" as only glob char is matched on a non windows platform. (Currently one third of all glob matches.) The slowdown on windows and the speedup on other os are neglectable. [ original upstream message ]
Fri, 08 Feb 2013 22:54:17 +0100 export: show 'Date' header in a format that also is readable for humans stable
Mads Kiilerich <mads@kiilerich.com> [Fri, 08 Feb 2013 22:54:17 +0100] rev 1214
export: show 'Date' header in a format that also is readable for humans 'export' is the official export format and used by patchbomb, but it would only show date as a timestamp that most humans might find it hard to relate to. It would be very convenient when reviewing a patch to be able to see what timestamp the patch will end up with. Mercurial has always used util.parsedate for parsing these headers. It can handle 'all' date formats, so we could just as well use a readable one. 'export' will now use the format used by 'log' - which is the format described as 'Unix date format' in the templating help. We assume that all parsers of '# HG changeset patch'es can handle that. [ original upstream message ]
Sun, 10 Feb 2013 01:51:28 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Sun, 10 Feb 2013 01:51:28 +0000] rev 1213
Merge with stable
Wed, 30 Jan 2013 01:24:04 +0100 test: display used python hash seed stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Wed, 30 Jan 2013 01:24:04 +0100] rev 1212
test: display used python hash seed We keep using a random seed for each run, but we "compute" it ourself to be able to reproduce a failed test run. [ original upstream message ]
Fri, 08 Feb 2013 12:11:51 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Fri, 08 Feb 2013 12:11:51 +0000] rev 1211
Merge with stable
Wed, 24 Oct 2012 23:09:31 +0200 run-tests: do not fail on empty tsttest file stable
Simon Heimberg <simohe@besonet.ch> [Wed, 24 Oct 2012 23:09:31 +0200] rev 1210
run-tests: do not fail on empty tsttest file Initialize n for not failing on empty tsttest files. [ original upstream message ]
Tue, 29 Jan 2013 22:19:10 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Tue, 29 Jan 2013 22:19:10 +0000] rev 1209
Merge with stable
Tue, 29 Jan 2013 20:03:51 +0100 run-tests.py: inherit PYTHONHASHSEED from environment if set stable
Mads Kiilerich <madski@unity3d.com> [Tue, 29 Jan 2013 20:03:51 +0100] rev 1208
run-tests.py: inherit PYTHONHASHSEED from environment if set This makes it possible to fix the seed by using for instance PYTHONHASHSEED=7 ./run-tests.py ... This can be very convenient when trying to debug problems that are influenced by hash values. Try different seed values until you find one that triggers the bad behaviour and then keep that while debugging. The value 0 will restore default Python behavior and disable randomization. [ original upstream message ]
Wed, 23 Jan 2013 22:30:58 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Wed, 23 Jan 2013 22:30:58 +0000] rev 1207
Merge with stable
Mon, 21 Jan 2013 19:40:15 +0100 documentation: update to new filter names stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Mon, 21 Jan 2013 19:40:15 +0100] rev 1206
documentation: update to new filter names Changeset f3b21beb9802 change filter names but forgot some documentation updates. [ original upstream description ]
Sat, 19 Jan 2013 09:40:50 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Sat, 19 Jan 2013 09:40:50 +0000] rev 1205
Merge with stable
Fri, 18 Jan 2013 01:23:51 +0100 run-tests.py: don't let hg run interactively in debug mode stable
Mads Kiilerich <madski@unity3d.com> [Fri, 18 Jan 2013 01:23:51 +0100] rev 1204
run-tests.py: don't let hg run interactively in debug mode In normal test mode stdin is closed and hg is thus not interactive. In --debug mode stdin is inherited from the running console and to the tests, and hg could thus wait in prompts when running on Windows. See http://selenic.com/pipermail/mercurial-devel/2013-January/047548.html . Instead set ui.interactive=False to make Mercurial non-interactive. Other commands might still work differently in the --debug environment. This should solve the problem with hg waiting for input but still make it possible to add --debugger to hg in a test and run run-tests.py with --debug. [ original upstream message ]
Fri, 18 Jan 2013 01:16:16 +0100 run-tests.py: backout "don't use console for stdin when running in debug mode" stable
Mads Kiilerich <madski@unity3d.com> [Fri, 18 Jan 2013 01:16:16 +0100] rev 1203
run-tests.py: backout "don't use console for stdin when running in debug mode" f5842787a958 caused that some kind of interactive debugging no longer was possible - such as running hg with --debugger in a test run with run-tests.py --debug . [ original upstream message ]
Wed, 16 Jan 2013 20:56:02 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Wed, 16 Jan 2013 20:56:02 +0000] rev 1202
Merge with stable
Wed, 16 Jan 2013 14:26:19 +0100 get-with-headers: add a --headeronly switch stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Wed, 16 Jan 2013 14:26:19 +0100] rev 1201
get-with-headers: add a --headeronly switch In some case we do not care about the actual rendering. [ original upstream message ]
Wed, 16 Jan 2013 02:01:11 +0100 tests: make test-hgweb.t output stable stable
Mads Kiilerich <madski@unity3d.com> [Wed, 16 Jan 2013 02:01:11 +0100] rev 1200
tests: make test-hgweb.t output stable Instability introduced in combination of a4d7fd7ad1f7 and e389a25e7e60. [ original upstream message ]
Tue, 15 Jan 2013 20:54:57 +0100 serve: don't send any content headers with 304 responses stable
Mads Kiilerich <madski@unity3d.com> [Tue, 15 Jan 2013 20:54:57 +0100] rev 1199
serve: don't send any content headers with 304 responses Fixes HTTP protocol violation introduced in cf5c76017e11. 'hg serve' would show a stacktrace when loading pages that not had been modified. There was test coverage for this, but the wrong response headers wasn't shown and thus not detected. [ original upstream message ]
Wed, 16 Jan 2013 00:09:26 +0100 destroyed: drop complex branchcache rebuilt logic stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 16 Jan 2013 00:09:26 +0100] rev 1198
destroyed: drop complex branchcache rebuilt logic The strip code used a trick to lower the cost of branchcache update after a strip. However is less necessary since we have branchcache collaboration. Invalid branchcache are likely to be cheaply rebuilt again a near subset of the repo. Moreover, this trick would need update to be relevant in the now filtered repository world. It currently update the unfiltered branchcache that few people cares about. Make it smarter on that aspect would need complexes update of the calling logic So this mechanism is: - Arguably needed, - Currently irrelevant, - Hard to update and I'm dropping it. We now update the branchcache in all case by courtesy of the read only reader. This changeset have a few expected impact on the testsuite are different cache are updated. [ original upstream message ]
Wed, 16 Jan 2013 00:08:08 +0100 branchmap: update cache of 'unserved' filter on new changesets stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 16 Jan 2013 00:08:08 +0100] rev 1197
branchmap: update cache of 'unserved' filter on new changesets The `commitctx` and `addchangegroup` methods of repo upgrade branchcache after completion. This behavior aims to keep the branchcache in sync for read only process as hgweb. See ee317dbfb9d0 for details. Since changelog filtering is used, those calls only update the cache for unfiltered repo. One of no interest for typical read only process like hgweb. Note: By chance in basic case, `repo.unfiltered() == repo.filtered('unserved')` This changesets have the "unserved" cache updated instead. I think this is the only cache that matter for hgweb. We could imagine updating all possible branchcaches instead but: - I'm not sure it would have any benefit impact. It may even increase the odd of all cache being invalidated. - This is more complicated change. So I'm going for updating a single cache only which is already better that updating a cache nobody cares about. This changeset have a few expected impact on the testsuite are different cache are updated. [ original upstream message ]
Tue, 15 Jan 2013 23:30:10 +0100 tests: run with PYTHONHASHSEED=random stable
Mads Kiilerich <madski@unity3d.com> [Tue, 15 Jan 2013 23:30:10 +0100] rev 1196
tests: run with PYTHONHASHSEED=random Python set and dict iteration order is in principle undefined but usually 'quite stable'. Setting PYTHONHASHSEED=random will make the iteration order more random in Python 2.6.8 and 2.7.3 and where it has been backported. This can thus help spot dependencies on undefined behaviour and prevent future problems. [ original upstream message ]
Tue, 15 Jan 2013 13:33:28 -0800 run-tests: exit cleanly if parallel run is interrupted stable
Bryan O'Sullivan <bryano@fb.com> [Tue, 15 Jan 2013 13:33:28 -0800] rev 1195
run-tests: exit cleanly if parallel run is interrupted If interrupted while running with "--jobs N", run-tests asynchronously spewed a bunch of output and backtraces from both the master and slave processes, leaving the terminal full of goop. This patch makes it behave more sensibly. [ original upstream message ]
Sun, 13 Jan 2013 01:39:16 -0600 filtering: rename filters to their antonyms stable
Kevin Bullock <kbullock@ringworld.org> [Sun, 13 Jan 2013 01:39:16 -0600] rev 1194
filtering: rename filters to their antonyms Now that changelog filtering is in place, it's become evident that naming the filters according to the set of revs _not_ included in the filtered changelog is confusing. This is especially evident in the collaborative branch cache scheme. This changes the names of the filters to reflect the revs that _are_ included: hidden -> visible unserved -> served mutable -> immutable impactable -> base repoview.filteredrevs is renamed to filterrevs, so that callers read a bit more sensibly, e.g.: filterrevs('visible') # filter revs according to what's visible [ original upstream message ]
Fri, 11 Jan 2013 18:33:15 +0000 Merge with default stable
Christian Ebert <blacktrash@gmx.net> [Fri, 11 Jan 2013 18:33:15 +0000] rev 1193
Merge with default
Thu, 10 Jan 2013 16:25:06 +0000 test: improve grammar and spelling in branchcache note
Christian Ebert <blacktrash@gmx.net> [Thu, 10 Jan 2013 16:25:06 +0000] rev 1192
test: improve grammar and spelling in branchcache note See: 769eb1b179b5
Thu, 10 Jan 2013 16:02:08 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Thu, 10 Jan 2013 16:02:08 +0000] rev 1191
Merge with stable
Wed, 09 Jan 2013 13:16:54 -0800 hghave: introduce a test (unused) for cvs >= 1.12 stable
Bryan O'Sullivan <bryano@fb.com> [Wed, 09 Jan 2013 13:16:54 -0800] rev 1190
hghave: introduce a test (unused) for cvs >= 1.12 [ original upstream message ]
Tue, 08 Jan 2013 20:37:37 +0100 clfilter: enforce hidden changeset globally stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 08 Jan 2013 20:37:37 +0100] rev 1189
clfilter: enforce hidden changeset globally The dispatch code now enables filtering of "hidden" changesets globally. The filter is installed before command and extension invocation. The `--hidden` switch is now global and disables this filtering for any command. Code in log dedicated to changeset exclusion is removed as this global filtering has the same effect. [ original upstream message ]
Tue, 08 Jan 2013 12:41:51 +0100 branchcache: add note about cache invalidation to test-keyword.t stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 08 Jan 2013 12:41:51 +0100] rev 1188
branchcache: add note about cache invalidation to test-keyword.t [Should've been included in aff706b3a21c.] --Kevin Bullock <kbullock@ringworld.org> [ original upstream message ]
Wed, 02 Jan 2013 01:57:46 +0100 clfilter: add mutable filtering stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Wed, 02 Jan 2013 01:57:46 +0100] rev 1187
clfilter: add mutable filtering It filters all mutable changesets, leaving only public changeset unfiltered. This filtering set is expected to be much more stable that the previous one as public changeset are unlikely to disapear. The only official use of this filter is for branchcache. [ original upstream message ]
Mon, 07 Jan 2013 02:14:41 +0100 run-tests.py: fix handling of symlink to the right python stable
Mads Kiilerich <mads@kiilerich.com> [Mon, 07 Jan 2013 02:14:41 +0100] rev 1186
run-tests.py: fix handling of symlink to the right python Before: a symlink for python in BINDIR was sometimes created, but it was never updated when a different Python was used and it was never removed. An invalid python could thus be left around and used when testing with --local. Now: the symlink is removed when wrong and created when necessary. The mechanism for finding the right name (python or python.exe) also had to be simplified and made more explicit. [ original upstream message ]
Mon, 07 Jan 2013 23:30:00 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Mon, 07 Jan 2013 23:30:00 +0000] rev 1185
Merge with stable
Mon, 07 Jan 2013 17:23:25 +0100 branchmap: allow to use cache of subset stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 07 Jan 2013 17:23:25 +0100] rev 1184
branchmap: allow to use cache of subset Filtered repository are *subset* of unfiltered repository. This means that a filtered branchmap could be use to compute the unfiltered version. And filtered version happen to be subset of each other: - "all() - unserved()" is a subset of "all() - hidden()" - "all() - hidden()" is a subset of "all()" This means that branchmap with "unfiltered" filter can be used as a base for "hidden" branchmap that itself could be used as a base for unfiltered branchmap. unserved < hidden < None This changeset implements this mechanism. If the on disk branchcache is not valid we use the branchcache of the nearest subset as base instead of computing it from scratch. Such fallback can be cascaded multiple time is necessary. Note that both "hidden" and "unserved" set are a bit volatile. We will add more stable filtering in next changesets. This changeset enables collaboration between no filtering and "unserved" filtering. Fixing performance regression introduced by 47f00b0de337 [ original upstream message ]
Mon, 07 Jan 2013 02:00:43 +0100 run-tests.py: don't use console for stdin when running in debug mode stable
Mads Kiilerich <mads@kiilerich.com> [Mon, 07 Jan 2013 02:00:43 +0100] rev 1183
run-tests.py: don't use console for stdin when running in debug mode Tests would wait for input instead of using non-interactive mode. [ original upstream message ]
Mon, 07 Jan 2013 02:00:43 +0100 tests: make hghave and run-tests exit on unknown feature requirements stable
Mads Kiilerich <mads@kiilerich.com> [Mon, 07 Jan 2013 02:00:43 +0100] rev 1182
tests: make hghave and run-tests exit on unknown feature requirements [ original upstream message ]
Fri, 04 Jan 2013 20:12:31 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Fri, 04 Jan 2013 20:12:31 +0000] rev 1181
Merge with stable
Fri, 21 Dec 2012 17:19:52 +0100 localrepo: filter unknown nodes from the phasecache on destroyed stable
Idan Kamara <idankk86@gmail.com> [Fri, 21 Dec 2012 17:19:52 +0100] rev 1180
localrepo: filter unknown nodes from the phasecache on destroyed When commit is followed by strip (qrefresh), phasecache contains nodes that were removed from the changelog. Since phasecache is filecached with .hg/store/phaseroots which doesn't change as a result of stripping, we have to filter it manually. If we don't write it immediately, the next time it is read from disk the nodes will be filtered again. That's what happened before, but there's no reason not to write it immediately. The change in test-keyword.t is caused by the above. [ original upstream message ]
Sat, 29 Dec 2012 02:35:54 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Sat, 29 Dec 2012 02:35:54 +0000] rev 1179
Merge with stable
Fri, 28 Dec 2012 00:02:40 +0100 strip: do not update branchcache during strip (issue3745) stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Fri, 28 Dec 2012 00:02:40 +0100] rev 1178
strip: do not update branchcache during strip (issue3745) At this moment, the cache is invalid, and will be thrown away. Later the strip function will call the `localrepo.destroyed` method that will update the branchmap cache. [ original upstream message ]
Mon, 24 Dec 2012 02:49:59 +0100 branchmap: move validity logic in the object itself stable
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Mon, 24 Dec 2012 02:49:59 +0100] rev 1177
branchmap: move validity logic in the object itself In several place, We check if a branchcache is still valid regarding the current state of the repository. This changeset puts this logic in a method of the object that can be reused when necessary. A branch map is considered valid whenever it is up to date or a strict subset of the repository state. The change will help making branchcache aware of filtered revision. The change in keyword is expected. the branch cache is actually invalid after the amend. The previous check did not detected it. [ original upstream message ]
Fri, 21 Dec 2012 15:21:55 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Fri, 21 Dec 2012 15:21:55 +0000] rev 1176
Merge with stable
Wed, 12 Dec 2012 15:17:18 -0800 run-tests: fix whitespace nonsense stable
Bryan O'Sullivan <bos@serpentine.com> [Wed, 12 Dec 2012 15:17:18 -0800] rev 1175
run-tests: fix whitespace nonsense [ original upstream message ]
Wed, 12 Dec 2012 14:52:58 -0800 run-tests: on windows, put correct python at front of PATH stable
Bryan O'Sullivan <bryano@fb.com> [Wed, 12 Dec 2012 14:52:58 -0800] rev 1174
run-tests: on windows, put correct python at front of PATH The older approach of trying to copy the python executable into the test directory was doomed to fail. There remains one weakness with this approach: if you've run "make local", tests may pick up the wrong extension DLLs from inside the source tree. I don't know why this happens. A reasonable workaround for now is to test either using --local or with a working directory that does not contain built DLLs. [ original upstream message ]
Sun, 09 Dec 2012 23:33:16 +0100 tests: kill daemons early, making breaking at "Accept" prompt safe stable
Mads Kiilerich <madski@unity3d.com> [Sun, 09 Dec 2012 23:33:16 +0100] rev 1173
tests: kill daemons early, making breaking at "Accept" prompt safe [ original upstream message ]
Tue, 11 Dec 2012 15:38:42 -0800 run-tests: fix exename on Windows stable
Siddharth Agarwal <sid0@fb.com> [Tue, 11 Dec 2012 15:38:42 -0800] rev 1172
run-tests: fix exename on Windows [ original upstream message ]
Tue, 11 Dec 2012 15:13:23 -0800 run-tests: support running tests in parallel on windows stable
Bryan O'Sullivan <bryano@fb.com> [Tue, 11 Dec 2012 15:13:23 -0800] rev 1171
run-tests: support running tests in parallel on windows Previously, we used os.spawnvp, which doesn't exist on Windows, and isn't needed anyway (the command line begins with an absolute path). We also need a slightly more convoluted way to wait for processes without specifying an order on Windows, as it lacks os.wait. [ original upstream message ]
Mon, 10 Dec 2012 12:14:55 -0800 run-tests: use correct python safely under --jobs stable
Bryan O'Sullivan <bryano@fb.com> [Mon, 10 Dec 2012 12:14:55 -0800] rev 1170
run-tests: use correct python safely under --jobs [ original upstream message ]
Mon, 10 Dec 2012 12:09:02 -0800 run-tests: check for the correct python when starting stable
Bryan O'Sullivan <bryano@fb.com> [Mon, 10 Dec 2012 12:09:02 -0800] rev 1169
run-tests: check for the correct python when starting [ original upstream message ]
Mon, 10 Dec 2012 12:07:42 -0800 run-tests: use correct python when run with --local stable
Bryan O'Sullivan <bryano@fb.com> [Mon, 10 Dec 2012 12:07:42 -0800] rev 1168
run-tests: use correct python when run with --local [ original upstream message ]
Wed, 28 Nov 2012 23:59:39 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Wed, 28 Nov 2012 23:59:39 +0000] rev 1167
Merge with stable
Tue, 27 Nov 2012 13:09:05 -0800 run-tests: fix an unnoticed check-code violation stable
Bryan O'Sullivan <bryano@fb.com> [Tue, 27 Nov 2012 13:09:05 -0800] rev 1166
run-tests: fix an unnoticed check-code violation [ original upstream message ]
Tue, 27 Nov 2012 11:18:33 -0800 run-tests: add a --compiler option stable
Bryan O'Sullivan <bryano@fb.com> [Tue, 27 Nov 2012 11:18:33 -0800] rev 1165
run-tests: add a --compiler option Without this option, it is not possible to run the test suite on Windows using mingw's gcc as the compiler. [ original upstream message ]
Tue, 27 Nov 2012 11:18:31 -0800 run-tests: make build command line less intimidating stable
Bryan O'Sullivan <bryano@fb.com> [Tue, 27 Nov 2012 11:18:31 -0800] rev 1164
run-tests: make build command line less intimidating Use a dict for parameters to the format string, instead of a ridiculous number of positional parameters. [ original upstream message ]
Wed, 14 Nov 2012 18:08:39 -0600 run-tests: backout 4a4173519b63 stable
Matt Mackall <mpm@selenic.com> [Wed, 14 Nov 2012 18:08:39 -0600] rev 1163
run-tests: backout 4a4173519b63 This deleted work in progress to eliminate child processes for -j. [ original upstream message ]
Wed, 14 Nov 2012 13:25:00 +0000 Merge with stable
Christian Ebert <blacktrash@gmx.net> [Wed, 14 Nov 2012 13:25:00 +0000] rev 1162
Merge with stable
Thu, 08 Nov 2012 14:10:04 -0800 run-tests.py: remove runqueue's results parameter since it is now a global stable
Siddharth Agarwal <sid0@fb.com> [Thu, 08 Nov 2012 14:10:04 -0800] rev 1161
run-tests.py: remove runqueue's results parameter since it is now a global [ original upstream message ]
Sat, 10 Nov 2012 11:37:41 -0800 run-tests: open child-parent pipes in binary mode stable
Siddharth Agarwal <sid0@fb.com> [Sat, 10 Nov 2012 11:37:41 -0800] rev 1160
run-tests: open child-parent pipes in binary mode Python's pickle is a binary format. [ original upstream message ]
Fri, 09 Nov 2012 14:49:30 -0800 run-tests: add --time option to log times for each test stable
Siddharth Agarwal <sid0@fb.com> [Fri, 09 Nov 2012 14:49:30 -0800] rev 1159
run-tests: add --time option to log times for each test --time also prints out the wall-clock time each test takes in descending order. [ original upstream message ]
Fri, 09 Nov 2012 15:09:35 -0800 run-tests: remove resultslock since it serves no useful purpose stable
Siddharth Agarwal <sid0@fb.com> [Fri, 09 Nov 2012 15:09:35 -0800] rev 1158
run-tests: remove resultslock since it serves no useful purpose Each child process has its own copy of the results dict, so all access to the results dict is serial. [ original upstream message ]
Fri, 09 Nov 2012 14:42:36 -0800 run-tests: use pickle to send results from children to parent stable
Siddharth Agarwal <sid0@fb.com> [Fri, 09 Nov 2012 14:42:36 -0800] rev 1157
run-tests: use pickle to send results from children to parent JSON would probably be preferable, but it isn't available for Python 2.4 or 2.5. [ original upstream message ]
(0) -1000 -300 -100 -60 +60 +100 tip