* git reset --hard not removing some files
@ 2006-06-01 16:00 Martin Waitz
[not found] ` <20060601121304.9bae1806.seanlkml@sympatico.ca>
2006-06-01 16:21 ` Linus Torvalds
0 siblings, 2 replies; 14+ messages in thread
From: Martin Waitz @ 2006-06-01 16:00 UTC (permalink / raw
To: git
[-- Attachment #1: Type: text/plain, Size: 855 bytes --]
hoi :)
I have the following problem:
nbg1l001:~/src/git > git branch
* master
next
origin
nbg1l001:~/src/git > git checkout -b test
nbg1l001:~/src/git > git status
# On branch refs/heads/test
nothing to commit
zsh: exit 1 git status
nbg1l001:~/src/git > git reset --hard v1.3.3
nbg1l001:~/src/git > git status
# On branch refs/heads/test
#
# Untracked files:
# (use "git add" to add to commit)
#
# git-quiltimport
# git-upload-tar
nothing to commit
zsh: exit 1 git status
nbg1l001:~/src/git > git reset --hard master
nbg1l001:~/src/git > git status
# On branch refs/heads/test
nothing to commit
zsh: exit 1 git status
nbg1l001:~/src/git > git --version
git version 1.3.3.g0825d
However, the complete test suite and especially t7101-reset.sh succeed.
Any ideas?
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
[not found] ` <20060601121304.9bae1806.seanlkml@sympatico.ca>
@ 2006-06-01 16:13 ` Sean
2006-06-01 17:21 ` Jakub Narebski
0 siblings, 1 reply; 14+ messages in thread
From: Sean @ 2006-06-01 16:13 UTC (permalink / raw
To: Martin Waitz; +Cc: git
On Thu, 1 Jun 2006 18:00:52 +0200
Martin Waitz <tali@admingilde.org> wrote:
Removed your prompt just to make it a bit more readable:
> $ git branch
> * master
> next
> origin
>
> $ git checkout -b test
>
> $ git status
> # On branch refs/heads/test
> nothing to commit
The generated files "git-quiltimport" and "git-upload-tar" exist at
this point. They are both untracked files and aren't listed because
they have entries in the .gitignore file.
> $ git reset --hard v1.3.3
>
> $ git status
> # On branch refs/heads/test
> #
> # Untracked files:
> # (use "git add" to add to commit)
> #
> # git-quiltimport
> # git-upload-tar
> nothing to commit
Resetting to version 1.3.3 gets you an old version of the .gitignore
file which doesn't ignore these two untracked files. Reset --hard
doesn't remove them because it only deals with tracked files. Thus,
they show up in your status report.
> $ git reset --hard master
> $ git status
> # On branch refs/heads/test
> nothing to commit
Returning to the current version gets you an updated .gitignore and the
two files are no longer listed even though they still exist.
> $ git --version
> git version 1.3.3.g0825d
This is the expected behavior regardless of version.
Sean
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-01 16:00 git reset --hard not removing some files Martin Waitz
[not found] ` <20060601121304.9bae1806.seanlkml@sympatico.ca>
@ 2006-06-01 16:21 ` Linus Torvalds
2006-06-02 9:37 ` Martin Waitz
2006-06-02 14:57 ` Junio C Hamano
1 sibling, 2 replies; 14+ messages in thread
From: Linus Torvalds @ 2006-06-01 16:21 UTC (permalink / raw
To: Martin Waitz; +Cc: git
On Thu, 1 Jun 2006, Martin Waitz wrote:
>
> I have the following problem:
It's not a problem, it's a feature.
> nbg1l001:~/src/git > git branch
> * master
> next
> origin
> nbg1l001:~/src/git > git checkout -b test
> nbg1l001:~/src/git > git status
> # On branch refs/heads/test
> nothing to commit
> zsh: exit 1 git status
> nbg1l001:~/src/git > git reset --hard v1.3.3
> nbg1l001:~/src/git > git status
> # On branch refs/heads/test
> #
> # Untracked files:
> # (use "git add" to add to commit)
> #
> # git-quiltimport
> # git-upload-tar
Those files were _never_ tracked.
What happened is that when you switched to an earlier version, you _also_
switched the ".gitignore" file to the earlier version, and that older
.gitignore file doesn't have those two (newer) binaries listed as being
ignored.
And "git reset" won't be deleting files it doesn't track (it had _better_
not touch them), even more so when it has been told to ignore them, so it
makes total sense to _not_ delete them when doing that reset.
Linus
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-01 16:13 ` Sean
@ 2006-06-01 17:21 ` Jakub Narebski
[not found] ` <20060601152152.35ce04a5.seanlkml@sympatico.ca>
0 siblings, 1 reply; 14+ messages in thread
From: Jakub Narebski @ 2006-06-01 17:21 UTC (permalink / raw
To: git
Sean wrote:
> On Thu, 1 Jun 2006 18:00:52 +0200
> Martin Waitz <tali@admingilde.org> wrote:
>
>> $ git reset --hard v1.3.3
>>
>> $ git status
>> # On branch refs/heads/test
>> #
>> # Untracked files:
>> # (use "git add" to add to commit)
>> #
>> # git-quiltimport
>> # git-upload-tar
>> nothing to commit
>
> Resetting to version 1.3.3 gets you an old version of the .gitignore
> file which doesn't ignore these two untracked files. Reset --hard
> doesn't remove them because it only deals with tracked files. Thus,
> they show up in your status report.
Do you think it is _frequently_ asked question, worth adding
to http://git.or.cz/gitwiki/GitFaq ?
--
Jakub Narebski
Warsaw, Poland
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
[not found] ` <20060601152152.35ce04a5.seanlkml@sympatico.ca>
@ 2006-06-01 19:21 ` Sean
2006-06-02 8:16 ` Jakub Narebski
0 siblings, 1 reply; 14+ messages in thread
From: Sean @ 2006-06-01 19:21 UTC (permalink / raw
To: Jakub Narebski; +Cc: git
On Thu, 01 Jun 2006 19:21:19 +0200
Jakub Narebski <jnareb@gmail.com> wrote:
> Do you think it is _frequently_ asked question, worth adding
> to http://git.or.cz/gitwiki/GitFaq ?
Hi Jakub,
Not sure if it needs to be in the FAQ at this point, but i guess it couldn't
hurt either. The man page actually mentions that --hard deals with tracked
files. An extra example or a more explicit notice about untracked files
might be helpful though.
Sean
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-01 19:21 ` Sean
@ 2006-06-02 8:16 ` Jakub Narebski
0 siblings, 0 replies; 14+ messages in thread
From: Jakub Narebski @ 2006-06-02 8:16 UTC (permalink / raw
To: git
Sean wrote:
> On Thu, 01 Jun 2006 19:21:19 +0200
> Jakub Narebski <jnareb@gmail.com> wrote:
>
>> Do you think it is _frequently_ asked question, worth adding
>> to http://git.or.cz/gitwiki/GitFaq ?
>
> Not sure if it needs to be in the FAQ at this point, but i guess it couldn't
> hurt either.
Added. See: http://git.or.cz/gitwiki/GitFaq#reset-hard-leaving-files
Feel free to add examples, correct information, rework it etc.
--
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-01 16:21 ` Linus Torvalds
@ 2006-06-02 9:37 ` Martin Waitz
[not found] ` <20060602060820.8eebe391.seanlkml@sympatico.ca>
2006-06-02 14:57 ` Junio C Hamano
1 sibling, 1 reply; 14+ messages in thread
From: Martin Waitz @ 2006-06-02 9:37 UTC (permalink / raw
To: Linus Torvalds; +Cc: git
[-- Attachment #1: Type: text/plain, Size: 1294 bytes --]
hoi :)
On Thu, Jun 01, 2006 at 09:21:38AM -0700, Linus Torvalds wrote:
> Those files were _never_ tracked.
You are right, I used the wrong demonstration to show my problem.
I had one problem like this in the linux-kernel and tried to
reproduce them in the git repository but did it wrong...
GIT reset seems to have a problem when a file is tracked and ignored
at the same time.
This fails:
diff --git a/t/t7101-reset.sh b/t/t7101-reset.sh
index a919140..865e0f6 100755
--- a/t/t7101-reset.sh
+++ b/t/t7101-reset.sh
@@ -21,10 +21,12 @@ test_expect_success \
cp ../../COPYING path1/COPYING &&
cp ../../COPYING COPYING &&
cp ../../COPYING path0/COPYING-TOO &&
+ echo COPYING > .gitignore &&
git-add path1/path2/COPYING &&
git-add path1/COPYING &&
git-add COPYING &&
git-add path0/COPYING-TOO &&
+ git-add .gitignore &&
git-commit -m change -a'
test_expect_success \
This hit me as the Linux kernel .gitignore includes ".*" which matches
all the .gitignore files and so they are not removed when you go
back to 2.6.13. But with the new git checks regarding files in
the working dir, git then refuses to pull in newer Linux versions
because it would overwrite ".gitignore".
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
[not found] ` <20060602060820.8eebe391.seanlkml@sympatico.ca>
@ 2006-06-02 10:08 ` Sean
2006-06-02 14:17 ` Martin Waitz
1 sibling, 0 replies; 14+ messages in thread
From: Sean @ 2006-06-02 10:08 UTC (permalink / raw
To: Martin Waitz; +Cc: torvalds, git
On Fri, 2 Jun 2006 11:37:36 +0200
Martin Waitz <tali@admingilde.org> wrote:
Hi Martin,
> GIT reset seems to have a problem when a file is tracked and ignored
> at the same time.
I tried to reproduce this problem, but couldn't.
> This fails:
>
> diff --git a/t/t7101-reset.sh b/t/t7101-reset.sh
> index a919140..865e0f6 100755
> --- a/t/t7101-reset.sh
> +++ b/t/t7101-reset.sh
> @@ -21,10 +21,12 @@ test_expect_success \
> cp ../../COPYING path1/COPYING &&
> cp ../../COPYING COPYING &&
> cp ../../COPYING path0/COPYING-TOO &&
> + echo COPYING > .gitignore &&
> git-add path1/path2/COPYING &&
> git-add path1/COPYING &&
> git-add COPYING &&
> git-add path0/COPYING-TOO &&
> + git-add .gitignore &&
> git-commit -m change -a'
>
> test_expect_success \
This fails because git-add refuses to mark an ignored file as tracked.
So in your altered test above the COPYING file is never tracked.
git-reset then does the proper thing and refuses to remove it. So it's
still not demonstrating the case you mention below.
> This hit me as the Linux kernel .gitignore includes ".*" which matches
> all the .gitignore files and so they are not removed when you go
> back to 2.6.13. But with the new git checks regarding files in
> the working dir, git then refuses to pull in newer Linux versions
> because it would overwrite ".gitignore".
Strange.. this little test shows that tracked files that are ignored
do get removed when resetting --hard...
$ mkdir tryit ; cd tryit
$ git init-db
defaulting to local storage area
$ touch one ; git add one
$ git commit -a -m"Initial"
Committing initial tree 5fcffbd6e4c5c5b8d81f5e9314b20e338e3ffff5
$ touch .gitignore
$ git add .gitignore
$ git commit -a -m"now we have gitignore"
$ echo '.*' >> .gitignore
$ git commit -a -m'now git ignores all .* files'
$ ls -l .gitignore
-rw-r--r-- 1 sean sean 3 Jun 2 06:01 .gitignore
$ git reset --hard master~2
$ ls -l .gitignore
ls: .gitignore: No such file or directory
Sean
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
[not found] ` <20060602060820.8eebe391.seanlkml@sympatico.ca>
2006-06-02 10:08 ` Sean
@ 2006-06-02 14:17 ` Martin Waitz
1 sibling, 0 replies; 14+ messages in thread
From: Martin Waitz @ 2006-06-02 14:17 UTC (permalink / raw
To: Sean; +Cc: torvalds, git
[-- Attachment #1: Type: text/plain, Size: 326 bytes --]
hoi :)
On Fri, Jun 02, 2006 at 06:08:20AM -0400, Sean wrote:
> Strange.. this little test shows that tracked files that are ignored
> do get removed when resetting --hard...
ok, git must be behaving correctly then, I don't know what problem I ran into.
Must have been some kind of user error...
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-01 16:21 ` Linus Torvalds
2006-06-02 9:37 ` Martin Waitz
@ 2006-06-02 14:57 ` Junio C Hamano
2006-06-03 8:48 ` Junio C Hamano
2006-06-04 9:16 ` Martin Waitz
1 sibling, 2 replies; 14+ messages in thread
From: Junio C Hamano @ 2006-06-02 14:57 UTC (permalink / raw
To: Linus Torvalds; +Cc: git, Martin Waitz
Linus Torvalds <torvalds@osdl.org> writes:
> On Thu, 1 Jun 2006, Martin Waitz wrote:
>>
>> I have the following problem:
>
> It's not a problem, it's a feature.
>...
> Those files were _never_ tracked.
I would agree in the reproduction recipe Martin gave there is no
problem but feature, but at the same time I suspect the recent
"reset --hard simplification" has introduced a true regression.
$ mkdir test || exit
$ cd test || exit
$ git init-db
defaulting to local storage area
$ echo init >file0
$ echo init >file1
$ git add file0 file1
$ git commit -m initial
Committing initial tree de84dc367842fdbbb3acad3b3ed252f8c984296f
$ git branch side
$ rm -f file1
$ echo second >file2
$ git add file2
$ git commit -a -m 'master adds file2 and deletes file1'
$ git checkout side
$ echo modified >file1
$ git commit -a -m 'side edits file1'
$ git checkout master
$ ls
file0 file2
$ git pull . side
Trying really trivial in-index merge...
fatal: Merge requires file-level merging
Nope.
Merging HEAD with 7934c9c383f611cf2b9895a46cf95b815569beef
Merging:
b684570dc1141552d0da950a18f2d84a3ffadbc1 master adds file2 and deletes file1
7934c9c383f611cf2b9895a46cf95b815569beef side edits file1
found 1 common ancestor(s):
598d6491f72b6057ca87683d43cf64b08d90ddaf initial
CONFLICT (delete/modify): file1 deleted in HEAD and modified in 7934c9c383f611cf2b9895a46cf95b815569beef. Version 7934c9c383f611cf2b9895a46cf95b815569beef of file1 left in tree.
Automatic merge failed; fix conflicts and then commit the result.
$ git ls-files -u
100644 b1b716105590454bfc4c0247f193a04088f39c7f 1 file1
100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 3 file1
$ ls
file0 file1 file2
$ git reset --hard
$ ls
file0 file1 file2
We used to remove file1 from the working tree in this case. One
of the most important reason to use "git reset --hard" is to
recover from a conflicted, failed merge.
Leaving file1 in the working tree around in this case has
unpleasant consequences. After the above:
$ git checkout side
fatal: Untracked working tree file 'file1' would be overwritten by merge.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-02 14:57 ` Junio C Hamano
@ 2006-06-03 8:48 ` Junio C Hamano
2006-06-03 15:11 ` Linus Torvalds
2006-06-04 9:16 ` Martin Waitz
1 sibling, 1 reply; 14+ messages in thread
From: Junio C Hamano @ 2006-06-03 8:48 UTC (permalink / raw
To: Linus Torvalds; +Cc: git, Martin Waitz
Junio C Hamano <junkio@cox.net> writes:
> I would agree in the reproduction recipe Martin gave there is no
> problem but feature, but at the same time I suspect the recent
> "reset --hard simplification" has introduced a true regression.
> ...
> $ git ls-files -u
> 100644 b1b716105590454bfc4c0247f193a04088f39c7f 1 file1
> 100644 2e0996000b7e9019eabcad29391bf0f5c7702f0b 3 file1
> $ ls
> file0 file1 file2
> $ git reset --hard
> $ ls
> file0 file1 file2
>
> We used to remove file1 from the working tree in this case. One
> of the most important reason to use "git reset --hard" is to
> recover from a conflicted, failed merge.
I think this patch fixes the regression. Comments?
-- >8 --
read-tree --reset: update working tree file for conflicted paths.
The earlier "git reset --hard" simplification stopped removing
leftover working tree files from a failed automerge, when
switching back to the HEAD version that does not have the
paths.
This patch, instead of removing the unmerged paths from the
index, drops them down to stage#0 but marks them with mode=0
(the same "to be deleted" marker we internally use for paths
deleted by the merge). one_way_merge() function and the
functions it calls already know what to do with them -- if the
tree we are reading has the path the working tree file is
overwritten, and if it doesn't the working tree file is
removed.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
builtin-read-tree.c | 19 +++++++++++++++----
1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/builtin-read-tree.c b/builtin-read-tree.c
index 716f792..71edaf6 100644
--- a/builtin-read-tree.c
+++ b/builtin-read-tree.c
@@ -753,6 +753,8 @@ static int read_cache_unmerged(void)
{
int i, deleted;
struct cache_entry **dst;
+ int unmerged = 0;
+ struct cache_entry *last = NULL;
read_cache();
dst = active_cache;
@@ -760,16 +762,22 @@ static int read_cache_unmerged(void)
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];
if (ce_stage(ce)) {
- deleted++;
+ unmerged++;
+ if (last && !strcmp(ce->name, last->name)) {
+ deleted++;
+ continue;
+ }
invalidate_ce_path(ce);
- continue;
+ last = ce;
+ ce->ce_mode = 0;
+ ce->ce_flags &= ~htons(CE_STAGEMASK);
}
if (deleted)
*dst = ce;
dst++;
}
active_nr -= deleted;
- return deleted;
+ return unmerged;
}
static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
@@ -850,7 +858,10 @@ int cmd_read_tree(int argc, const char *
continue;
}
- /* This differs from "-m" in that we'll silently ignore unmerged entries */
+ /* This differs from "-m" in that we'll silently ignore
+ * unmerged entries and overwrite working tree files that
+ * correspond to them.
+ */
if (!strcmp(arg, "--reset")) {
if (stage || merge)
usage(read_tree_usage);
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-03 8:48 ` Junio C Hamano
@ 2006-06-03 15:11 ` Linus Torvalds
0 siblings, 0 replies; 14+ messages in thread
From: Linus Torvalds @ 2006-06-03 15:11 UTC (permalink / raw
To: Junio C Hamano; +Cc: git, Martin Waitz
On Sat, 3 Jun 2006, Junio C Hamano wrote:
>
> I think this patch fixes the regression. Comments?
The approach looks fine, but with your changes, the "deleted" flag makes
no sense any more and looks redundant. It's not actually used for anything
except deciding if we need to re-write the active_cache[] thing, and you
migth as well use either "last" or "unmerged" for that.
(yeah, "last" and "unmerged" becomes non-null one entry earlier than
"deleted", but that's actually just confusing, I think, and now depends on
the fact that we don't have to re-write the first entry).
The whole "*dst++ = ce" _could_ be unconditional, the only reason I made
it conditional at all is to avoid dirtying the mmap when not necessary (ie
it's a performance optimization, and it's not one where that off-by-one
matters).
So I think you could make it clearer by dropping "deleted" entirely, and
just making the store be conditional on "last".
Linus
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-02 14:57 ` Junio C Hamano
2006-06-03 8:48 ` Junio C Hamano
@ 2006-06-04 9:16 ` Martin Waitz
2006-06-04 9:31 ` Junio C Hamano
1 sibling, 1 reply; 14+ messages in thread
From: Martin Waitz @ 2006-06-04 9:16 UTC (permalink / raw
To: Junio C Hamano; +Cc: Linus Torvalds, git
[-- Attachment #1: Type: text/plain, Size: 411 bytes --]
hoi :)
On Fri, Jun 02, 2006 at 07:57:57AM -0700, Junio C Hamano wrote:
> I would agree in the reproduction recipe Martin gave there is no
> problem but feature, but at the same time I suspect the recent
> "reset --hard simplification" has introduced a true regression.
This may have been the bug that bit me.
Thanks for finding it although I was not able to reproduce it myself!
--
Martin Waitz
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: git reset --hard not removing some files
2006-06-04 9:16 ` Martin Waitz
@ 2006-06-04 9:31 ` Junio C Hamano
0 siblings, 0 replies; 14+ messages in thread
From: Junio C Hamano @ 2006-06-04 9:31 UTC (permalink / raw
To: Martin Waitz; +Cc: git
Martin Waitz <tali@admingilde.org> writes:
> hoi :)
>
> On Fri, Jun 02, 2006 at 07:57:57AM -0700, Junio C Hamano wrote:
>> I would agree in the reproduction recipe Martin gave there is no
>> problem but feature, but at the same time I suspect the recent
>> "reset --hard simplification" has introduced a true regression.
>
> This may have been the bug that bit me.
> Thanks for finding it although I was not able to reproduce it myself!
I found this somewhat the hard way myself. I have:
[pull]
twohead = resolve
in my .git/config -- IOW, I usually do not use recursive
strategy myself. When a merge with resolve strategy fails (and
with recent trend to busyboxify git commands, many merges
between my topics and "next" and/or "master" do), I relied on
"reset --hard" followed by the same merge of the topic using
"pull -s recursive" to recover things, but it didn't. When
pulling a branch with builtin-*.c names into another branch with
older names, regressed "reset --hard" left builtin-*.c files
behind, and then the next merge attempt complained by saying my
untracked working tree files would be overwritten X-<.
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2006-06-04 9:31 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-01 16:00 git reset --hard not removing some files Martin Waitz
[not found] ` <20060601121304.9bae1806.seanlkml@sympatico.ca>
2006-06-01 16:13 ` Sean
2006-06-01 17:21 ` Jakub Narebski
[not found] ` <20060601152152.35ce04a5.seanlkml@sympatico.ca>
2006-06-01 19:21 ` Sean
2006-06-02 8:16 ` Jakub Narebski
2006-06-01 16:21 ` Linus Torvalds
2006-06-02 9:37 ` Martin Waitz
[not found] ` <20060602060820.8eebe391.seanlkml@sympatico.ca>
2006-06-02 10:08 ` Sean
2006-06-02 14:17 ` Martin Waitz
2006-06-02 14:57 ` Junio C Hamano
2006-06-03 8:48 ` Junio C Hamano
2006-06-03 15:11 ` Linus Torvalds
2006-06-04 9:16 ` Martin Waitz
2006-06-04 9:31 ` Junio C Hamano
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).