tests/test-push-checkheads-pruned-B8.t
author Martin von Zweigbergk <martinvonz@google.com>
Mon, 06 Dec 2021 23:17:43 -0800
changeset 48507 58a3be48ddd2
parent 42893 34a46d48d24e
child 49168 5996640fc6fe
permissions -rw-r--r--
simplemerge: stop merging file flags As 384df4db6520 (merge: merge file flags together with file content, 2013-01-09) explains, we shouldn't do a 3-way merge of the symlink. However, since 84614212ae39 (flags: actually merge flags in simplemerge, 2020-05-16), we do that in `simplemerge.simplemerge()`. What's more, the merging of the executable flag there isn't actually necessary; it was made a no-op by the very next commit, i.e. 4234c9af515d (flags: read flag from dirstate/disk for workingcopyctx (issue5743), 2020-05-16). I found the overall flag-merging code (not the bit in `simplemerge.py`) very hard to follow, but I think I now finally understand how it works. `mergestate.resolve()` calculates the merged file flags and sets them on the local side of the merge (confusingly by calling `_restore_backup()`). Then it calls `filemerge.filemerge()`, which in turn calls `simplemerge.simplemerge()` (if premerge is enabled). That means that the flags on the local side `fcs.flags()` are already correct when the flag-merging code in `simplemerge.simplemerge()` runs. Interestingly, that code still works when the local side already has the merged value, it just doesn't change the value. Here's a truth table to explain why: ``` BLOMCAR 0000000 0011111 0101011 0111111 1000000 1010000 1100000 1111101 ``` B: Base L: Local O: Other M: Merged flags from `mergestate.resolve()`, i.e. what's called "local" when we get to `simplemerge.simplemerge()` C: `commonflags` in `simplemerge.simplemerge()`, i.e. `M & O` A: `addedflags` in `simplemerge.simplemerge()`, i.e. `(M ^ O) - B` R: Re-merged flags `simplemerge.simplemerge()`, i.e. `C | A` As you can see, the re-merged flags are always unchanged compared to the initial merged flags (R equals M). Therefore, this patch effectively backs out 84614212ae39. (I might later refactor this code to have the flags explicitly passed in.) `simplemerge.simplemerge()` is also called from `contrib/simplemerge.py`, but that code never passes any flags. Differential Revision: https://phab.mercurial-scm.org/D11879
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
====================================
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
Testing head checking code: Case B-2
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
====================================
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
Mercurial checks for the introduction of new heads on push. Evolution comes
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
into play to detect if existing branches on the server are being replaced by
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
some of the new one we push.
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     9
This case is part of a series of tests checking this behavior.
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    10
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    11
Category B: simple case involving pruned changesets
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    12
TestCase 2: multi-changeset branch, head is pruned, rest is superceeded, through other
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    13
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    14
.. old-state:
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    15
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
.. * 2 changeset branch
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
.. new-state:
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
.. * old head is rewritten then pruned
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
.. * 1 new branch succeeding to the other changeset in the old branch (through another obsolete branch)
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
.. expected-result:
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
.. * push allowed
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    27
.. graph-summary:
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    28
..
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    29
..   B ø⇠⊗ B'
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    30
..     | | A'
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    31
..   A ø⇠ø⇠◔ A''
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
..     |/ /
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
..     | /
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    34
..     |/
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
..     ●
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    36
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
  $ . $TESTDIR/testlib/push-checkheads-util.sh
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    38
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    39
Test setup
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    40
----------
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    41
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    42
  $ mkdir B8
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    43
  $ cd B8
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    44
  $ setuprepos
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    45
  creating basic server and client repo
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    46
  updating to branch default
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    47
  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    48
  $ cd server
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    49
  $ mkcommit B0
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    50
  $ cd ../client
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    51
  $ hg pull
35393
4441705b7111 tests: remove (glob) annotations that were only for '\' matches
Matt Harbison <matt_harbison@yahoo.com>
parents: 34661
diff changeset
    52
  pulling from $TESTTMP/B8/server
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    53
  searching for changes
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    54
  adding changesets
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    55
  adding manifests
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    56
  adding file changes
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    57
  added 1 changesets with 1 changes to 1 files
39480
89630d0b3e23 phase: report number of non-public changeset alongside the new range
Boris Feld <boris.feld@octobus.net>
parents: 35709
diff changeset
    58
  new changesets d73caddc5533 (1 drafts)
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
  (run 'hg update' to get a working copy)
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    60
  $ hg up 0
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    61
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    62
  $ mkcommit A1
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    63
  created new head
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    64
  $ mkcommit B1
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    65
  $ hg up 0
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    66
  0 files updated, 0 files merged, 2 files removed, 0 files unresolved
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    67
  $ mkcommit A2
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    68
  created new head
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    69
  $ hg debugobsolete `getid "desc(A0)" ` `getid "desc(A1)"`
42893
34a46d48d24e debugobsolete: also issue the "new obsmarkers" messsage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39480
diff changeset
    70
  1 new obsolescence markers
33542
b11e8c67fb0f debugobsolete: also report the number of obsoleted changesets
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
    71
  obsoleted 1 changesets
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35393
diff changeset
    72
  1 new orphan changesets
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    73
  $ hg debugobsolete `getid "desc(B0)" ` `getid "desc(B1)"`
42893
34a46d48d24e debugobsolete: also issue the "new obsmarkers" messsage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39480
diff changeset
    74
  1 new obsolescence markers
33542
b11e8c67fb0f debugobsolete: also report the number of obsoleted changesets
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
    75
  obsoleted 1 changesets
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    76
  $ hg debugobsolete --record-parents `getid "desc(B1)"`
42893
34a46d48d24e debugobsolete: also issue the "new obsmarkers" messsage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39480
diff changeset
    77
  1 new obsolescence markers
33542
b11e8c67fb0f debugobsolete: also report the number of obsoleted changesets
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
    78
  obsoleted 1 changesets
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    79
  $ hg debugobsolete `getid "desc(A1)" ` `getid "desc(A2)"`
42893
34a46d48d24e debugobsolete: also issue the "new obsmarkers" messsage
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39480
diff changeset
    80
  1 new obsolescence markers
33542
b11e8c67fb0f debugobsolete: also report the number of obsoleted changesets
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
    81
  obsoleted 1 changesets
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    82
  $ hg log -G --hidden
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    83
  @  c1f8d089020f (draft): A2
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    84
  |
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    85
  | x  262c8c798096 (draft): B1
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    86
  | |
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    87
  | x  f6082bc4ffef (draft): A1
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    88
  |/
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    89
  | x  d73caddc5533 (draft): B0
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    90
  | |
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    91
  | x  8aaa48160adc (draft): A0
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    92
  |/
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    93
  o  1e4be0697311 (public): root
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    94
  
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    95
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    96
Actual testing
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    97
--------------
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    98
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    99
  $ hg push
35393
4441705b7111 tests: remove (glob) annotations that were only for '\' matches
Matt Harbison <matt_harbison@yahoo.com>
parents: 34661
diff changeset
   100
  pushing to $TESTTMP/B8/server
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   101
  searching for changes
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   102
  adding changesets
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   103
  adding manifests
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   104
  adding file changes
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   105
  added 1 changesets with 1 changes to 1 files (+1 heads)
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   106
  4 new obsolescence markers
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32015
diff changeset
   107
  obsoleted 2 changesets
32015
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   108
605c38105950 obsolescence: add test for the "branch replacement" logic during push, case B8
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   109
  $ cd ../..