# HG changeset patch # User Robin Farine # Date 1140277079 28800 # Node ID 91c56c427171638597aaf8680884c30debc8b545 # Parent 299c3e26ee45dd88df3345119767a2e5e7ca60de transitive copy/rename Add support for transitive copy or rename operations, e.g. hg rename a b ... (possibly edit b) hg rename b c hg commit ... by actually renaming "b" as "c" while recording a copy of "a" to "c" and a removal of "a". diff -r 299c3e26ee45 -r 91c56c427171 mercurial/commands.py --- a/mercurial/commands.py Sat Feb 18 16:31:02 2006 +0100 +++ b/mercurial/commands.py Sat Feb 18 07:37:59 2006 -0800 @@ -818,14 +818,19 @@ reasons = {'?': _('is not managed'), 'a': _('has been marked for add'), 'r': _('has been marked for remove')} - reason = reasons.get(repo.dirstate.state(abs)) + state = repo.dirstate.state(abs) + reason = reasons.get(state) if reason: + if state == 'a': + origsrc = repo.dirstate.copied(abs) + if origsrc is not None: + return origsrc if exact: ui.warn(_('%s: not copying - file %s\n') % (rel, reason)) else: - return True - - def copy(abssrc, relsrc, target, exact): + return abs + + def copy(origsrc, abssrc, relsrc, target, exact): abstarget = util.canonpath(repo.root, cwd, target) reltarget = util.pathto(cwd, abstarget) prevsrc = targets.get(abstarget) @@ -864,7 +869,7 @@ if ui.verbose or not exact: ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) targets[abstarget] = abssrc - repo.copy(abssrc, abstarget) + repo.copy(origsrc, abstarget) copied.append((abssrc, relsrc, exact)) def targetpathfn(pat, dest, srcs): @@ -938,8 +943,9 @@ for pat in pats: srcs = [] for tag, abssrc, relsrc, exact in walk(repo, [pat], opts): - if okaytocopy(abssrc, relsrc, exact): - srcs.append((abssrc, relsrc, exact)) + origsrc = okaytocopy(abssrc, relsrc, exact) + if origsrc: + srcs.append((origsrc, abssrc, relsrc, exact)) if not srcs: continue copylist.append((tfn(pat, dest, srcs), srcs)) @@ -947,8 +953,8 @@ raise util.Abort(_('no files to copy')) for targetpath, srcs in copylist: - for abssrc, relsrc, exact in srcs: - copy(abssrc, relsrc, targetpath(abssrc), exact) + for origsrc, abssrc, relsrc, exact in srcs: + copy(origsrc, abssrc, relsrc, targetpath(abssrc), exact) if errors: ui.warn(_('(consider using --after)\n')) diff -r 299c3e26ee45 -r 91c56c427171 mercurial/localrepo.py --- a/mercurial/localrepo.py Sat Feb 18 16:31:02 2006 +0100 +++ b/mercurial/localrepo.py Sat Feb 18 07:37:59 2006 -0800 @@ -597,7 +597,6 @@ if os.path.exists(p): self.ui.warn(_("%s still exists!\n") % f) elif self.dirstate.state(f) == 'a': - self.ui.warn(_("%s never committed!\n") % f) self.dirstate.forget([f]) elif f not in self.dirstate: self.ui.warn(_("%s not tracked!\n") % f) diff -r 299c3e26ee45 -r 91c56c427171 tests/test-merge3.out --- a/tests/test-merge3.out Sat Feb 18 16:31:02 2006 +0100 +++ b/tests/test-merge3.out Sat Feb 18 07:37:59 2006 -0800 @@ -1,3 +1,2 @@ removing b -b never committed! nothing changed diff -r 299c3e26ee45 -r 91c56c427171 tests/test-rename --- a/tests/test-rename Sat Feb 18 16:31:02 2006 +0100 +++ b/tests/test-rename Sat Feb 18 07:37:59 2006 -0800 @@ -158,3 +158,16 @@ hg rename d1 d3 hg status hg update -C + +echo "# transitive rename" +hg rename d1/b d1/bb +hg rename d1/bb d1/bc +hg status +hg update -C + +echo "# transitive rename --after" +hg rename d1/b d1/bb +mv d1/bb d1/bc +hg rename --after d1/bb d1/bc +hg status +hg update -C diff -r 299c3e26ee45 -r 91c56c427171 tests/test-rename.out --- a/tests/test-rename.out Sat Feb 18 16:31:02 2006 +0100 +++ b/tests/test-rename.out Sat Feb 18 07:37:59 2006 -0800 @@ -246,3 +246,9 @@ R d1/b R d1/ba R d1/d11/a1 +# transitive rename +A d1/bc +R d1/b +# transitive rename --after +A d1/bc +R d1/b