[PATCH 1 of 1 rfc] subrepo: make update -C for svn and git subrepos clean the working directory
Erik Zielke
ez at aragost.com
Fri Jan 7 07:35:43 CST 2011
# HG changeset patch
# User Erik Zielke <ez at aragost.com>
# Date 1294406813 -3600
# Node ID 987befbd0062b68a7b6bfd4f9e4cded63ff98d5a
# Parent f3058dd052819de75908599d93a29241ba69318f
subrepo: make update -C for svn and git subrepos clean the working directory
Makes the clean paraemter work for svn and git sub repositories.
diff -r f3058dd05281 -r 987befbd0062 mercurial/merge.py
--- a/mercurial/merge.py Fri Dec 31 17:09:38 2010 -0600
+++ b/mercurial/merge.py Fri Jan 07 14:26:53 2011 +0100
@@ -249,7 +249,7 @@
def actionkey(a):
return a[1] == 'r' and -1 or 0, a
-def applyupdates(repo, action, wctx, mctx, actx):
+def applyupdates(repo, action, wctx, mctx, actx, overwrite):
"""apply the merge action list to the working directory
wctx is the working copy context
@@ -259,7 +259,6 @@
Return a tuple of counts (updated, merged, removed, unresolved) that
describes how many files were affected by the update.
"""
-
updated, merged, removed, unresolved = 0, 0, 0, 0
ms = mergestate(repo)
ms.reset(wctx.parents()[0].node())
@@ -310,7 +309,7 @@
repo.ui.note(_("removing %s\n") % f)
audit_path(f)
if f == '.hgsubstate': # subrepo states need updating
- subrepo.submerge(repo, wctx, mctx, wctx)
+ subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
try:
util.unlink(repo.wjoin(f))
except OSError, inst:
@@ -320,7 +319,7 @@
removed += 1
elif m == "m": # merge
if f == '.hgsubstate': # subrepo states need updating
- subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx))
+ subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), overwrite)
continue
f2, fd, flags, move = a[2:]
r = ms.resolve(fd, wctx, mctx)
@@ -343,7 +342,7 @@
t = None
updated += 1
if f == '.hgsubstate': # subrepo states need updating
- subrepo.submerge(repo, wctx, mctx, wctx)
+ subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
elif m == "d": # directory rename
f2, fd, flags = a[2:]
if f:
@@ -534,7 +533,7 @@
if not partial:
repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
- stats = applyupdates(repo, action, wc, p2, pa)
+ stats = applyupdates(repo, action, wc, p2, pa, overwrite)
if not partial:
repo.dirstate.setparents(fp1, fp2)
diff -r f3058dd05281 -r 987befbd0062 mercurial/subrepo.py
--- a/mercurial/subrepo.py Fri Dec 31 17:09:38 2010 -0600
+++ b/mercurial/subrepo.py Fri Jan 07 14:26:53 2011 +0100
@@ -82,7 +82,7 @@
''.join(['%s %s\n' % (state[s][1], s)
for s in sorted(state)]), '')
-def submerge(repo, wctx, mctx, actx):
+def submerge(repo, wctx, mctx, actx, overwrite):
"""delegated from merge.applyupdates: merging of .hgsubstate file
in working context, merging context and ancestor context"""
if mctx == actx: # backwards?
@@ -114,7 +114,7 @@
continue
elif ld == a: # other side changed
debug(s, "other changed, get", r)
- wctx.sub(s).get(r)
+ wctx.sub(s).get(r, overwrite)
sm[s] = r
elif ld[0] != r[0]: # sources differ
if repo.ui.promptchoice(
@@ -123,11 +123,11 @@
% (s, l[0], r[0]),
(_('&Local'), _('&Remote')), 0):
debug(s, "prompt changed, get", r)
- wctx.sub(s).get(r)
+ wctx.sub(s).get(r, overwrite)
sm[s] = r
elif ld[1] == a[1]: # local side is unchanged
debug(s, "other side changed, get", r)
- wctx.sub(s).get(r)
+ wctx.sub(s).get(r, overwrite)
sm[s] = r
else:
debug(s, "both sides changed, merge with", r)
@@ -263,13 +263,13 @@
"""
raise NotImplementedError
- def get(self, state):
+ def get(self, state, overwrite=False):
"""run whatever commands are needed to put the subrepo into
this state
"""
raise NotImplementedError
- def merge(self, state):
+ def merge(self, state, overwrite=False):
"""merge currently-saved state with the new state."""
raise NotImplementedError
@@ -431,7 +431,7 @@
other = hg.repository(self._repo.ui, srcurl)
self._repo.pull(other)
- def get(self, state):
+ def get(self, state, overwrite=False):
self._get(state)
source, revision, kind = state
self._repo.ui.debug("getting subrepo %s\n" % self._path)
@@ -589,11 +589,13 @@
except OSError:
pass
- def get(self, state):
+ def get(self, state, overwrite=False):
status = self._svncommand(['checkout', state[0], '--revision', state[1]])
if not re.search('Checked out revision [0-9]+.', status):
raise util.Abort(status.splitlines()[-1])
self._ui.status(status)
+ if overwrite:
+ self._svncommand(['revert', '--recursive', self._path])
def merge(self, state):
old = int(self._state[1])
@@ -739,9 +741,12 @@
out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
return code == 1
- def get(self, state):
+ def get(self, state, overwrite=False):
source, revision, kind = state
self._fetch(source, revision)
+ if overwrite:
+ self._gitcommand(['reset', '--hard', 'HEAD'])
+
# if the repo was set to be bare, unbare it
if self._gitcommand(['config', '--bool', 'core.bare']) == 'true':
self._gitcommand(['config', 'core.bare', 'false'])
diff -r f3058dd05281 -r 987befbd0062 tests/test-subrepo-update-clean.t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-subrepo-update-clean.t Fri Jan 07 14:26:53 2011 +0100
@@ -0,0 +1,128 @@
+Creating git repository
+ $ git init gitrepo
+ Initialized empty Git repository in $TESTTMP/gitrepo/.git/
+ $ cd gitrepo
+ $ echo c > f0
+ $ git add f0
+ $ git commit -m0
+ [master (root-commit) *] 0 (glob)
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ create mode 100644 f0
+ $ cd ..
+
+Creating svn repository
+ $ svnadmin create svnrepo
+ $ svn co file://$TESTTMP/svnrepo svnrepoco
+ Checked out revision 0.
+ $ cd svnrepoco
+ $ echo c > f1
+ $ svn add f1
+ A f1
+ $ svn commit -m0
+ Adding f1
+ Transmitting file data .
+ Committed revision 1.
+ $ cd ..
+
+Creating hg repository
+ $ hg init hgrepo
+ $ cd hgrepo
+ $ echo c > f2
+ $ hg add f2
+ $ hg commit -m1
+ $ cd ..
+
+Creating main hg repository
+ $ hg init main
+ $ cd main
+ $ git clone ../gitrepo gitrepo
+ Initialized empty Git repository in $TESTTMP/main/gitrepo/.git/
+ $ svn co file://$TESTTMP/svnrepo svnrepo
+ A svnrepo/f1
+ Checked out revision 1.
+ $ hg clone ../hgrepo hgrepo
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo gitrepo = [git]../gitrepo >> .hgsub
+ $ echo svnrepo = [svn]file://$TESTTMP/svnrepo >> .hgsub
+ $ echo hgrepo = ../hgrepo . >> .hgsub
+ $ hg add .hgsub
+ $ hg commit -m2
+ committing subrepository gitrepo
+ committing subrepository hgrepo
+ committing subrepository svnrepo
+
+Modifying file in each subrepo
+ $ echo c1 > gitrepo/f0
+ $ echo c1 > svnrepo/f1
+ $ echo c1 > hgrepo/f2
+
+Adding tracked file in each subrepo
+ $ echo c1 > gitrepo/f3
+ $ cd gitrepo
+ $ git add f3
+ $ cd ..
+ $ cd svnrepo
+ $ echo c1 > f4
+ $ svn add f4
+ A f4
+ $ cd ..
+ $ cd hgrepo
+ $ echo c1 > f5
+ $ hg add f5
+ $ cd ..
+ $ cd svnrepo
+ $ svn status
+ M f1
+ A f4
+ $ cd ..
+ $ hg status -S
+ M gitrepo/f0
+ M hgrepo/f2
+ A gitrepo/f3
+ A hgrepo/f5
+
+Adding untracked file in each subrepo
+ $ cd gitrepo
+ $ echo c1 > f7
+ $ cd ..
+ $ cd svnrepo
+ $ echo c1 > f8
+ $ cd ..
+ $ cd hgrepo
+ $ echo c1 > f9
+ $ cd ..
+ $ cd svnrepo
+ $ svn status
+ ? f8
+ M f1
+ A f4
+ $ cd ..
+ $ hg status -S
+ M gitrepo/f0
+ M hgrepo/f2
+ A gitrepo/f3
+ A hgrepo/f5
+ ? hgrepo/f9
+
+Update clean
+ $ hg update -C
+ Checked out revision 1.
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd gitrepo
+ $ git status
+ # On branch master
+ # Untracked files:
+ # (use "git add <file>..." to include in what will be committed)
+ #
+ # f7
+ nothing added to commit but untracked files present (use "git add" to track)
+ $ cd ..
+ $ cd svnrepo
+ $ svn status
+ ? f4
+ ? f8
+ $ cd ..
+ $ hg status -S
+ ? hgrepo/f5
+ ? hgrepo/f9
More information about the Mercurial-devel
mailing list