Commits

Matt Mackall committed 17f1798 Merge

merge with stable

Comments (0)

Files changed (8)

contrib/win32/mercurial.ini

 ;cmd.bc3diff = C:\Program Files\Beyond Compare 3\BCompare.exe
 ;cmd.vdiff = C:\Progra~1\TortoiseSVN\bin\TortoiseMerge.exe
 ;cmd.vimdiff = gvim.exe
-;opts.vimdiff = -f '+next' '+execute "DirDiff ".argv(0)." ".argv(1)'
+;opts.vimdiff = -f "+next" "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
 
 
 [hgk]
   # (see http://www.vim.org/scripts/script.php?script_id=102) Non
   # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
   # your .vimrc
-  vimdiff = gvim -f '+next' '+execute "DirDiff" argv(0) argv(1)'
+  vimdiff = gvim -f "+next" \\
+            "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
 
 Tool arguments can include variables that are expanded at runtime::
 
                 hg.clean(repo, urev)
                 repo.dirstate.write()
 
-            for rev in revs:
-                repair.strip(self.ui, repo, rev, backup)
+            repair.strip(self.ui, repo, revs, backup)
         finally:
             release(lock, wlock)
 

mercurial/help/phases.txt

 These phases are ordered (public < draft < secret) and no changeset
 can be in a lower phase than its ancestors. For instance, if a
 changeset is public, all its ancestors are also public. Lastly,
-changeset phases only be changed towards the public phase.
+changeset phases should only be changed towards the public phase.
 
 How are phases managed?
 -----------------------

mercurial/localrepo.py

         self.opener.write("journal.desc",
                           "%d\n%s\n" % (len(self), desc))
 
-        bkname = self.join('bookmarks')
-        if os.path.exists(bkname):
-            util.copyfile(bkname, self.join('journal.bookmarks'))
-        else:
-            self.opener.write('journal.bookmarks', '')
+        try:
+            bk = self.opener.read("bookmarks")
+        except IOError:
+            bk = ""
+        self.opener.write("journal.bookmarks", bk)
+
         phasesname = self.sjoin('phaseroots')
         if os.path.exists(phasesname):
             util.copyfile(phasesname, self.sjoin('journal.phaseroots'))

mercurial/repair.py

 
     return s
 
-def strip(ui, repo, node, backup="all"):
+def strip(ui, repo, nodelist, backup="all"):
     cl = repo.changelog
     # TODO handle undo of merge sets
-    striprev = cl.rev(node)
+    if isinstance(nodelist, str):
+        nodelist = [nodelist]
+    striplist = [cl.rev(node) for node in nodelist]
+    striprev = min(striplist)
 
     keeppartialbundle = backup == 'strip'
 
     # the list of heads and bases of the set of interesting revisions.
     # (head = revision in the set that has no descendant in the set;
     #  base = revision in the set that has no ancestor in the set)
-    tostrip = set(cl.descendants(striprev))
-    tostrip.add(striprev)
+    tostrip = set(striplist)
+    for rev in striplist:
+        for desc in cl.descendants(rev):
+            tostrip.add(desc)
 
     files = _collectfiles(repo, striprev)
     saverevs = _collectbrokencsets(repo, files, striprev)
         descendants = set(cl.descendants(*saverevs))
         saverevs.difference_update(descendants)
     savebases = [cl.node(r) for r in saverevs]
+    stripbases = [cl.node(r) for r in tostrip]
 
     bm = repo._bookmarks
     updatebm = []
     # create a changegroup for all the branches we need to keep
     backupfile = None
     if backup == "all":
-        backupfile = _bundle(repo, [node], cl.heads(), node, 'backup')
+        backupfile = _bundle(repo, stripbases, cl.heads(), node, 'backup')
         repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
     if saveheads or savebases:
         # do not compress partial bundle if we remove it from disk later

tests/test-extension.t

     # (see http://www.vim.org/scripts/script.php?script_id=102) Non
     # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
     # your .vimrc
-    vimdiff = gvim -f '+next' '+execute "DirDiff" argv(0) argv(1)'
+    vimdiff = gvim -f "+next" \
+              "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
   
   Tool arguments can include variables that are expanded at runtime:
   

tests/test-mq-strip.t

   $ hg strip 2 4
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
   saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
-  saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
   $ hg glog
   @  changeset:   2:65bd5f99a4a3
   |  tag:         tip
   $ hg status
   M bar
   ? b
+  $ cd ..
+
+stripping many nodes on a complex graph (issue3299)
+
+  $ hg init issue3299
+  $ cd issue3299
+  $ hg debugbuilddag '@a.:a@b.:b.:x<a@a.:a<b@b.:b<a@a.:a'
+  $ hg strip 'not ancestors(x)'
+  saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob)
+