Wed, 03 Apr 2013 16:32:41 -0700 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com> [Wed, 03 Apr 2013 16:32:41 -0700] rev 19152
scmutil.addremove: factor out code to find renames This code will be used in a different context in upcoming patches.
Wed, 03 Apr 2013 15:32:15 -0700 scmutil.addremove: rename local 'copies' to 'renames'
Siddharth Agarwal <sid0@fb.com> [Wed, 03 Apr 2013 15:32:15 -0700] rev 19151
scmutil.addremove: rename local 'copies' to 'renames' An upcoming patch will refactor some code out into a method called _findrenames. Having a line saying "copies = _findrenames..." is confusing. Besides, 'renames' is a more precise name for this local anyway.
Tue, 02 Apr 2013 17:19:36 -0700 scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com> [Tue, 02 Apr 2013 17:19:36 -0700] rev 19150
scmutil.addremove: factor out dirstate walk into another function Upcoming patches will reuse and expand on this function for other purposes.
Wed, 01 May 2013 10:42:03 -0700 filecontext: use 'is not None' to check for filelog existence
Durham Goode <durham@fb.com> [Wed, 01 May 2013 10:42:03 -0700] rev 19149
filecontext: use 'is not None' to check for filelog existence Previously we used 'if filelog:' to check if the filelog existed. If the instance did exist, this pattern then calls len() on the filelog to see if it is empty. I'm developing a filelog replacement that doesn't have len() implemented, so it's better to do an explicit 'is not None' check here instead. Also change _changeid() to return the _changeid attribute if it has it. Previously it would try to obtain it from the _changectx(), and if that did not exist it would construct the _changectx() using the linkrev. In the extension I'm working on, filectx's don't have easy access to linkrevs so avoiding this when possible is better.
Wed, 01 May 2013 10:39:37 -0700 filelog: use super() for calling base functions
Durham Goode <durham@fb.com> [Wed, 01 May 2013 10:39:37 -0700] rev 19148
filelog: use super() for calling base functions filelog had some hardcoded revlog.revlog.foo() calls. This changes it to use super() instead so that extensions can replace the filelog base class.
Thu, 02 May 2013 21:28:18 -0500 bookmarks: allow bookmark command to take multiple arguments
Kevin Bullock <kbullock@ringworld.org> [Thu, 02 May 2013 21:28:18 -0500] rev 19147
bookmarks: allow bookmark command to take multiple arguments This change allows setting or deleting multiple bookmarks at once. If more than one is being set and --inactive is not given, the first one is made active.
Sun, 05 May 2013 18:51:34 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Sun, 05 May 2013 18:51:34 -0500] rev 19146
merge with stable
Fri, 03 May 2013 19:34:59 +0200 convert: fix bug of wrong CVS path parsing without port number (issue3678) stable
Blesso hrvoje1212@gmail.com [Fri, 03 May 2013 19:34:59 +0200] rev 19145
convert: fix bug of wrong CVS path parsing without port number (issue3678) The cvsps.py:getrepopath suffers from a string parsing bug (it returns "user@server/path/to/repository" if the CVSROOT is given like this: ":pserver:user@server/path/to/repository" ), which gives returnes the wrong value becouse cvsps.py fails to strip the prefix from filenames. With this patch for the same input we get the correct repo path that is: "/path/to/repository"
Fri, 03 May 2013 15:36:18 -0700 match: add comments to explain explicitdir and traversedir
Siddharth Agarwal <sid0@fb.com> [Fri, 03 May 2013 15:36:18 -0700] rev 19144
match: add comments to explain explicitdir and traversedir
Fri, 03 May 2013 14:41:58 -0700 match: make explicitdir and traversedir None by default
Siddharth Agarwal <sid0@fb.com> [Fri, 03 May 2013 14:41:58 -0700] rev 19143
match: make explicitdir and traversedir None by default With this, extensions can easily tell when traversedir and/or explicitdir don't need to be called.
Fri, 03 May 2013 14:39:28 -0700 dirstate.walk: cache match.explicitdir and traversedir locally
Siddharth Agarwal <sid0@fb.com> [Fri, 03 May 2013 14:39:28 -0700] rev 19142
dirstate.walk: cache match.explicitdir and traversedir locally
Sun, 28 Apr 2013 21:29:32 -0700 match: drop dir callback
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:29:32 -0700] rev 19141
match: drop dir callback dir has been subsumed by explicitdir and traversedir.
Sun, 28 Apr 2013 21:28:31 -0700 inotify: call match.explicitdir
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:28:31 -0700] rev 19140
inotify: call match.explicitdir inotify only returns explicit directories matched.
Sun, 28 Apr 2013 21:27:57 -0700 purge: hook into match.explicitdir and traversedir
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:27:57 -0700] rev 19139
purge: hook into match.explicitdir and traversedir
Sun, 28 Apr 2013 21:27:21 -0700 localrepo.commit: hook into match.explicitdir
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:27:21 -0700] rev 19138
localrepo.commit: hook into match.explicitdir
Sun, 28 Apr 2013 21:25:41 -0700 dirstate.walk: call match.explicitdir or traversedir as appropriate
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:25:41 -0700] rev 19137
dirstate.walk: call match.explicitdir or traversedir as appropriate
Sun, 28 Apr 2013 21:24:09 -0700 match: introduce explicitdir and traversedir
Siddharth Agarwal <sid0@fb.com> [Sun, 28 Apr 2013 21:24:09 -0700] rev 19136
match: introduce explicitdir and traversedir match.dir is currently called in two different places: (1) noting when a directory specified explicitly is visited. (2) noting when a directory is visited during a recursive walk. purge cares about both, but commit only cares about the first. Upcoming patches will split the two cases into two different callbacks. Why bother? Consider a hypothetical extension that can provide more efficient walk results, via e.g. watching the filesystem. That extension will need to fall back to a full recursive walk if a callback is set for (2), but not if a callback is only set for (1).
Sat, 04 May 2013 14:52:51 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Sat, 04 May 2013 14:52:51 -0500] rev 19135
merge with stable
Fri, 03 May 2013 15:18:21 -0700 run-tests: when running in parallel, delete tmpdirs immediately
Siddharth Agarwal <sid0@fb.com> [Fri, 03 May 2013 15:18:21 -0700] rev 19134
run-tests: when running in parallel, delete tmpdirs immediately This is especially important if extensions that use inotify are enabled, because it's very easy to hit the inotify max_user_instances limit without this.
Fri, 03 May 2013 14:19:30 -0700 tests: check path separator in moves
Brendan Cully <brendan@kublai.com> [Fri, 03 May 2013 14:19:30 -0700] rev 19133
tests: check path separator in moves
Fri, 03 May 2013 13:59:58 -0700 tests: fix test-commandserver phase . output for windows
Brendan Cully <brendan@kublai.com> [Fri, 03 May 2013 13:59:58 -0700] rev 19132
tests: fix test-commandserver phase . output for windows
Sat, 04 May 2013 14:51:21 -0500 hfs+: rewrite percent-escaper (issue3918) stable
Matt Mackall <mpm@selenic.com> [Sat, 04 May 2013 14:51:21 -0500] rev 19131
hfs+: rewrite percent-escaper (issue3918) The original code was a bit too clever and got confused by some cp949 Korean text. This rewrite bytes the bullet and manually decodes UTF-8 sequences. Adds some doctests.
Fri, 03 May 2013 15:34:18 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Fri, 03 May 2013 15:34:18 -0500] rev 19130
merge with stable
Fri, 03 May 2013 12:40:17 -0700 revert: ensure that copies and renames are honored (issue3920) stable
Bryan O'Sullivan <bryano@fb.com> [Fri, 03 May 2013 12:40:17 -0700] rev 19129
revert: ensure that copies and renames are honored (issue3920) Previously, we restored the states of files, but not the additional information the dirstate uses to track copies and renames.
Fri, 03 May 2013 09:44:50 -0700 hgignore: fix regression with hgignore directory matches (issue3921) stable
Durham Goode <durham@fb.com> [Fri, 03 May 2013 09:44:50 -0700] rev 19128
hgignore: fix regression with hgignore directory matches (issue3921) If a directory matched a regex in hgignore but the files inside the directory did not match the regex, they would appear as deleted in hg status. This change fixes them to appear normally in hg status. Removing the ignore(nf) conditional here is ok because it just means we might stat more files than we had before. My testing on a large repo shows this causes no performance regression since the only additional files being stat'd are the ones that are missing (i.e. status=!), which are generally rare.
Thu, 02 May 2013 20:41:22 -0500 templater: fix output instability from gsoc patches
Augie Fackler <raf@durin42.com> [Thu, 02 May 2013 20:41:22 -0500] rev 19127
templater: fix output instability from gsoc patches
Thu, 18 Apr 2013 22:56:57 +0300 log-style: add a log style that is default+phase (issue3436)
Iulian Stana <julian.stana@gmail.com> [Thu, 18 Apr 2013 22:56:57 +0300] rev 19126
log-style: add a log style that is default+phase (issue3436) There is a new style called phases style. Usage:: hg log --style phases Why do we need this new style - in what way is it different from or similar to existing styles? The new style is default + phases information. With the new phases feature the users exhibited their desire for a new style that could help them. Why do this need a new style - couldn't it be folded into an existing style? The default style and the new one are about the same, the difference is the phases tag. The users find both styles useful, this means that the both styles must exist.
Thu, 02 May 2013 20:23:14 -0500 templater: show the style list when I try to use a wrong one
Iulian Stana <julian.stana@gmail.com> [Thu, 02 May 2013 20:23:14 -0500] rev 19125
templater: show the style list when I try to use a wrong one When someone try to use a wrong style, a list with sugestions will appear. In the test-log.t file it's a test that prove this thing.
Sat, 27 Apr 2013 23:49:34 -0700 test-nested-repo.t: touch another file inside nested repo
Siddharth Agarwal <sid0@fb.com> [Sat, 27 Apr 2013 23:49:34 -0700] rev 19124
test-nested-repo.t: touch another file inside nested repo This helped uncover a bug in a patchset I've been writing.
Thu, 02 May 2013 15:21:47 -0500 check-code: add more path sep glob checks
Matt Mackall <mpm@selenic.com> [Thu, 02 May 2013 15:21:47 -0500] rev 19123
check-code: add more path sep glob checks
Thu, 25 Apr 2013 18:01:00 -0700 splicemap: improve error handling when source is subversion (issue2084)
Ben Goswami <bengoswami@fb.com> [Thu, 25 Apr 2013 18:01:00 -0700] rev 19122
splicemap: improve error handling when source is subversion (issue2084) Implemented error handling on splicemap file when source is subversion (This checks are similar to when source is hg or git). The revision string is expected to be of svn:<uuid><path>@<number> format. the test case has been enhanced to check this format.
Thu, 25 Apr 2013 16:02:58 -0700 splicemap: improve error handling when source is git (issue2084)
Ben Goswami <bengoswami@fb.com> [Thu, 25 Apr 2013 16:02:58 -0700] rev 19121
splicemap: improve error handling when source is git (issue2084) Implemented similar error handling that is done for hg in an earlier revision. These are: a. add checking for splicemap file format b. add checking for each revision string formats
Thu, 25 Apr 2013 11:50:26 -0700 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com> [Thu, 25 Apr 2013 11:50:26 -0700] rev 19120
splicemap: improve error handling when source is hg (issue2084) 1. Introduced 2 levels of error handling for splicemap files a. Check the splicemap file for rules which are same across different types of source repos. This is done through enhancing parsesplicemap function b. Check revision string formats. Each repo may have their own format. This is done usign checkrevformat function c. Implemented the above two for hg
Wed, 24 Apr 2013 18:26:37 -0700 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com> [Wed, 24 Apr 2013 18:26:37 -0700] rev 19119
splicemap: move parsesplicemap to convcmd.py (issue2084) parsesplicemap is only referenced from convcmd.py This move is necessary to enable other changes related to this issue
Thu, 02 May 2013 14:11:34 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Thu, 02 May 2013 14:11:34 -0500] rev 19118
merge with stable
Thu, 02 May 2013 11:26:43 -0700 tests: sprinkle globs over largefiles/subrepo tests for Windows stable
Brendan Cully <brendan@kublai.com> [Thu, 02 May 2013 11:26:43 -0700] rev 19117
tests: sprinkle globs over largefiles/subrepo tests for Windows
Thu, 02 May 2013 11:17:18 -0700 tests: skip permissions tests in test-phases-exchange when fs lacks permissions stable
Brendan Cully <brendan@kublai.com> [Thu, 02 May 2013 11:17:18 -0700] rev 19116
tests: skip permissions tests in test-phases-exchange when fs lacks permissions
Thu, 02 May 2013 12:15:41 -0500 merge with stable
Matt Mackall <mpm@selenic.com> [Thu, 02 May 2013 12:15:41 -0500] rev 19115
merge with stable
Wed, 01 May 2013 17:49:53 -0500 Added signature for changeset 23f785b38af3 stable
Matt Mackall <mpm@selenic.com> [Wed, 01 May 2013 17:49:53 -0500] rev 19114
Added signature for changeset 23f785b38af3
Wed, 01 May 2013 17:49:48 -0500 Added tag 2.6 for changeset 23f785b38af3 stable
Matt Mackall <mpm@selenic.com> [Wed, 01 May 2013 17:49:48 -0500] rev 19113
Added tag 2.6 for changeset 23f785b38af3
Wed, 01 May 2013 15:24:21 -0500 bookmarks: fix bug that activated a bookmark even with -r passed stable 2.6
Sean Farley <sean.michael.farley@gmail.com> [Wed, 01 May 2013 15:24:21 -0500] rev 19112
bookmarks: fix bug that activated a bookmark even with -r passed If the current revision was the target revision of -r, then the bookmark would be active. Test cases have been updated accordingly.
Tue, 30 Apr 2013 21:12:49 -0500 bookmarks: resolve divergent bookmark when moving across a branch stable
Sean Farley <sean.michael.farley@gmail.com> [Tue, 30 Apr 2013 21:12:49 -0500] rev 19111
bookmarks: resolve divergent bookmark when moving across a branch This patch resolves a single divergent bookmark if a divergent bookmark exists in the target revision and it current bookmark is not an ancestor of the target revision, else it would already be handled by the previous patch in this series. Test coverage is added.
Wed, 01 May 2013 15:34:45 -0500 bookmarks: resolve divergent bookmarks when moving active bookmark forward stable
Sean Farley <sean.michael.farley@gmail.com> [Wed, 01 May 2013 15:34:45 -0500] rev 19110
bookmarks: resolve divergent bookmarks when moving active bookmark forward This patch resolves divergent bookmarks between the current active bookmark MARK and the new destination. This situation can arise when pulling new changesets, abandoning your current changesets actively bookmarked with MARK via strip, and then doing a bare update. The non-divergent but active bookmark MARK is then moved to a common ancestor of the new changesets and the abandoned changesets. Test coverage is added.
Wed, 01 May 2013 15:31:39 -0500 bookmarks: resolve divergent bookmarks when fowarding bookmark to descendant stable
Sean Farley <sean.michael.farley@gmail.com> [Wed, 01 May 2013 15:31:39 -0500] rev 19109
bookmarks: resolve divergent bookmarks when fowarding bookmark to descendant This patch is a follow-up to 56dd55da2f7d that resolves divergent bookmarks between the to-be-forwarded bookmark MARK and the new descendant. This situation can happen when pulling new changesets, updating to the divergent bookmark, abandoning the previous changesets with strip, and then moving MARK to MARK@N. Test coverage is added.
Tue, 30 Apr 2013 09:02:02 +0900 tags: update tag type only if tag node is updated (issue3911) stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 30 Apr 2013 09:02:02 +0900] rev 19108
tags: update tag type only if tag node is updated (issue3911) Before this patch, tag type information is always updated, even if tag previously read in has higher priority than one newly read in. This causes that the tag type is displayed as "local", even if global tag overwrites existing local one successfully. This patch updates tag type only if tag node is updated. This patch tests overwriting local tags below: - visible one (normal case) - already removed one (recorded as null)
Tue, 30 Apr 2013 01:04:35 +0200 match: fix root calculation for combining regexps with simple paths stable
Mads Kiilerich <madski@unity3d.com> [Tue, 30 Apr 2013 01:04:35 +0200] rev 19107
match: fix root calculation for combining regexps with simple paths The fall-back root for walking is the repo root, not no root. The "roots" do however also end up in m.files() which is used in various ways, for instance to indicate whether matches are exact. The change could thus have other impacts.
Tue, 30 Apr 2013 05:01:32 +0900 icasefs: enhance test to prevent regression by changes in the future stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 30 Apr 2013 05:01:32 +0900] rev 19106
icasefs: enhance test to prevent regression by changes in the future This patch adds steps to test case-folding collision detection on the revision tree built up in the order different from the one reproducing issue3452. This may prevent regression by changes around "copy detection" and/or "case-folding collision detection" logic in the future.
Tue, 30 Apr 2013 05:01:32 +0900 icasefs: rewrite case-folding collision detection (issue3452) stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 30 Apr 2013 05:01:32 +0900] rev 19105
icasefs: rewrite case-folding collision detection (issue3452) Before this patch, case-folding collision detection uses "copies.pathcopies()" before "manifestmerge()", and is not aware of renaming in some cases. For example, in the case of issue3452, "copies.pathcopies()" can't detect renaming, if the file is renamed at the revision before common ancestor of merging. So, "hg merge" is aborted unexpectedly on case insensitive filesystem. This patch fully rewrites case-folding collision detection, and relocate it into "manifestmerge()". New implementation uses list of actions held in "actions" and "prompts" to build provisional merged manifest up. Provisional merged manifest should be correct, if actions required to build merge result up in working directory are listed up in "actions" and "prompts" correctly. This patch checks case-folding collision still before prompting for merge, to avoid aborting after some interactions with users. So, this assumes that user would choose not "deleted" but "changed". This patch also changes existing abort message, because sorting before collision detection changes order of checked files.
Tue, 30 Apr 2013 05:01:32 +0900 icasefs: refactor "test-casecollision-merge.t" to reuse in succeeding fixes stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 30 Apr 2013 05:01:32 +0900] rev 19104
icasefs: refactor "test-casecollision-merge.t" to reuse in succeeding fixes This patch refactors "test-casecollision-merge.t" to increase reusability in succeeding patches. It is confirmed that changed test also can detect issue3370.
Tue, 30 Apr 2013 05:00:48 +0900 icasefs: ignore removed files at building "dirstate._foldmap" up on icasefs stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Tue, 30 Apr 2013 05:00:48 +0900] rev 19103
icasefs: ignore removed files at building "dirstate._foldmap" up on icasefs Before this patch, all files in dirstate are used to build "_foldmap" up on case insensitive filesystem regardless of their statuses. For example, when dirstate contains both removed file 'a' and added file 'A', "_foldmap" may be updated finally by removed file 'a'. This causes unexpected status information for added file 'A' at "hg status" invocation. This patch ignores removed files at building "_foldmap" up on case insensitive filessytem. This patch doesn't add any test, because this issue is difficult to reproduce intentionally: it depends on iteration order of "dirstate._map".
Wed, 01 May 2013 11:20:16 -0300 i18n-pt_BR: synchronized with 3f5e75c22585 stable
Wagner Bruna <wbruna@yahoo.com> [Wed, 01 May 2013 11:20:16 -0300] rev 19102
i18n-pt_BR: synchronized with 3f5e75c22585
Wed, 01 May 2013 11:18:49 -0300 merge with i18n stable
Wagner Bruna <wbruna@yahoo.com> [Wed, 01 May 2013 11:18:49 -0300] rev 19101
merge with i18n
Wed, 01 May 2013 00:38:43 +0900 i18n-ja: synchronized with f01a351db791 stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Wed, 01 May 2013 00:38:43 +0900] rev 19100
i18n-ja: synchronized with f01a351db791
Mon, 29 Apr 2013 14:14:42 -0700 dispatch: add support for --option=value to _earlygetopt stable
Bryan O'Sullivan <bryano@fb.com> [Mon, 29 Apr 2013 14:14:42 -0700] rev 19099
dispatch: add support for --option=value to _earlygetopt This fixes a very confusing error message: $ hg --config=pager.enabled=off st abort: option --config may not be abbreviated!
Mon, 29 Apr 2013 14:14:41 -0700 dispatch: add doctests for _earlygetopt stable
Bryan O'Sullivan <bryano@fb.com> [Mon, 29 Apr 2013 14:14:41 -0700] rev 19098
dispatch: add doctests for _earlygetopt
Tue, 30 Apr 2013 21:19:56 +0200 push: make locking of source optional (issue3684) stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 30 Apr 2013 21:19:56 +0200] rev 19097
push: make locking of source optional (issue3684) Having the permission to lock the source repo on push is now optional. When the repo cannot be locked, phase are not changed locally. A status message is issue when some actual phase movement are skipped: cannot lock source repo, skipping local public phase update A debug message with the exact reason of the locking failure is issued in all case.
Tue, 30 Apr 2013 10:51:25 +0200 push: factorise phase movement in a simple closure stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 30 Apr 2013 10:51:25 +0200] rev 19096
push: factorise phase movement in a simple closure Having all phases movement centralised will help to handle special case when the local repo can not be locked as describe in issue 3684.
Mon, 29 Apr 2013 15:58:15 +0900 merge: increase safety of parallel updating/removing on icasefs stable
FUJIWARA Katsunori <foozy@lares.dti.ne.jp> [Mon, 29 Apr 2013 15:58:15 +0900] rev 19095
merge: increase safety of parallel updating/removing on icasefs "merge.applyupdates()" sorts "actions" in removal first order, and "workeractions" derived from it should be also sorted. If each actions in "workeractions" are executed in serial, this sorting ensures that merging/updating process is collision free, because updating the file in target context is always executed after removing the existing file which causes case-folding collision against the former. In the other hand, if each actions are executed in parallel, updating on a worker process may be executed before removing on another worker process, because "worker.partition()" partitions list of actions regardless of type of each actions. This patch divides "workeractions" into removing and updating, and executes the former first. This patch still scans "actions"/"workeractions" some times for ease of patch review, even though large list may cost much in this way. (total cost should be as same as before) This also changes some tests, because dividing "workeractions" affects progress indication.
Tue, 30 Apr 2013 13:53:49 +0200 hgweb: handle filtered "0" rev in navigation stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 30 Apr 2013 13:53:49 +0200] rev 19094
hgweb: handle filtered "0" rev in navigation Before this changeset, navigation generation crashed if revision "0" was filtered. We introduce a `_first` methods on revision navigation that return the lowest unfiltered element and use it in two place were the "0" changeset was explicitly referenced. Test case are introduced.
Tue, 30 Apr 2013 15:11:12 +0200 hgweb: fix empty navigation detection stable
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 30 Apr 2013 15:11:12 +0200] rev 19093
hgweb: fix empty navigation detection For some obscure reason, changelog.node(0) returns nullid if changelog is empty. this break empty navigation detection. We fix this code by using the length of the changelog. Using the length have some issue with revision filtering but this is a small step in the right direction. Proper fix comes in later changeset.
(0) -10000 -3000 -1000 -300 -100 -60 +60 +100 +300 +1000 +3000 +10000 +30000 tip