diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -162,8 +162,12 @@ class dirstate(object): else: return fallback + @propertycache + def _cwd(self): + return os.getcwd() + def getcwd(self): - cwd = os.getcwd() + cwd = self._cwd if cwd == self._root: return '' # self._root ends with a path separator if self._root is '/' or 'C:\' diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t --- a/tests/test-rebase-scenario-global.t +++ b/tests/test-rebase-scenario-global.t @@ -649,3 +649,28 @@ each root have a different common ancest |/ o 0: 'A' + +Test that rebase is not confused by $CWD disapearing during rebase (issue 4121) + + $ cd .. + $ hg init cwd-vanish + $ cd cwd-vanish + $ touch initial-file + $ hg add initial-file + $ hg commit -m 'initial commit' + $ touch dest-file + $ hg add dest-file + $ hg commit -m 'dest commit' + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ touch other-file + $ hg add other-file + $ hg commit -m 'first source commit' + created new head + $ mkdir subdir + $ cd subdir + $ touch subfile + $ hg add subfile + $ hg commit -m 'second source with subdir' + $ hg rebase -b . -d 1 --traceback + saved backup bundle to $TESTTMP/cwd-vanish/.hg/strip-backup/779a07b1b7a0-backup.hg (glob)