[PATCH 5 of 6 OBSOLETE-MARKERS] obsolete: add proper metadata handling to obsolete marker: user and date

Pierre-Yves David pierre-yves.david at ens-lyon.org
Sat May 12 12:08:53 CDT 2012


# HG changeset patch
# User Pierre-Yves.David at ens-lyon.org
# Date 1336840751 -7200
# Node ID 09943a88d99a60e597ba7c3828612c7bec43e370
# Parent  0d39a100bf11a38b76abdc79b307c3518bd08efd
obsolete: add proper metadata handling to obsolete marker: user and date

We add "date" and "user" data. It's currently accessed very barely. metadata
will be more wrapper "later".

"date" are expected to help with garbage collection.
"user" are expected to help to solve conflicting situation.

encode and decode extra are kept in changelog because I'm not sure we want use
them as is for now.

diff -r 0d39a100bf11 -r 09943a88d99a mercurial/cmdutil.py
--- a/mercurial/cmdutil.py	Sat May 12 17:41:33 2012 +0200
+++ b/mercurial/cmdutil.py	Sat May 12 18:39:11 2012 +0200
@@ -10,7 +10,7 @@
 import os, sys, errno, re, tempfile
 import util, scmutil, templater, patch, error, templatekw, revlog, copies
 import match as matchmod
-import subrepo, context, repair, bookmarks
+import subrepo, context, repair, bookmarks, changelog
 
 def parsealiases(cmd):
     return cmd.lstrip("^").split("|")
@@ -698,8 +698,23 @@
         for parent in parents:
             self.ui.write(_("parent:      %d:%s\n") % parent,
                           label='log.parent')
-        if ctx.obsolete():
+        if util.safehasattr(ctx, 'obsolete') and ctx.obsolete():
             self.ui.write(_("obsolete:    dead\n"))
+            if self.ui.debug:
+                for marker in self.repo.obsstore.obsoleted[ctx.node()]:
+                    if marker[1]: # if replacement
+                        msg = "replaced:    %s by %s\n"
+                    else:
+                        msg = "killed:      %s by %s\n"
+                    metadata = changelog.decodeextra(marker[3])
+                    odate = metadata['date'].split(' ')
+                    odate = (float(odate[0]), int(odate[1]))
+                    odate = util.datestr(odate)
+                    self.ui.debug(msg % (odate, metadata['user']))
+                    repls = marker[1]
+                    for rpn in repls:
+                        rp = self.repo[rpn]
+                        self.ui.note(_("  by:        %d:%s\n") % (rp, rp))
 
         if self.ui.debugflag:
             mnode = ctx.manifestnode()
diff -r 0d39a100bf11 -r 09943a88d99a mercurial/commands.py
--- a/mercurial/commands.py	Sat May 12 17:41:33 2012 +0200
+++ b/mercurial/commands.py	Sat May 12 18:39:11 2012 +0200
@@ -18,6 +18,7 @@
 import dagparser, context, simplemerge
 import random, setdiscovery, treediscovery, dagutil, pvec
 import phases
+import changelog
 
 table = {}
 
@@ -4172,7 +4173,7 @@
 
 @command('obsolete',
     [('r', 'rev', [], _('mark given revision as obsolete'), _('REV')),
-    ],
+    ] + commitopts2,
     _('[--rev] REV'))
 def obsolete(ui, repo, *revs, **opts):
     """mark a changeset as obsolete (DEPRECATED)"""
@@ -4182,10 +4183,19 @@
     if not revs:
         raise util.Abort(_('no revisions specified'))
 
+    metadata = {}
+    metadata['date'] = opts['date'] or '%f %i' % util.makedate()
+    try:
+        metadata['user'] = opts['user'] or ui.username()
+    except util.Abort, e:
+        ui.write(" %s\n" % e)
+        ui.write(_(" (specify a username in your configuration file)\n"))
+    metadata = changelog.encodeextra(metadata)
+
     l = repo.lock()
     try:
         for obs in revs:
-            marker = (repo[obs].node(), (), 0, '')
+            marker = (repo[obs].node(), (), 0, metadata)
             repo.obsstore.add(marker)
     finally:
         l.release()
diff -r 0d39a100bf11 -r 09943a88d99a tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t	Sat May 12 17:41:33 2012 +0200
+++ b/tests/test-debugcomplete.t	Sat May 12 18:39:11 2012 +0200
@@ -257,7 +257,7 @@
   incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, insecure, subrepos
   locate: rev, print0, fullpath, include, exclude
   manifest: rev, all
-  obsolete: rev
+  obsolete: rev, date, user
   outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, style, template, ssh, remotecmd, insecure, subrepos
   parents: rev, style, template
   paths: 
diff -r 0d39a100bf11 -r 09943a88d99a tests/test-obsolete.t
--- a/tests/test-obsolete.t	Sat May 12 17:41:33 2012 +0200
+++ b/tests/test-obsolete.t	Sat May 12 18:39:11 2012 +0200
@@ -14,7 +14,7 @@
   $ hg obsolete
   abort: no revisions specified
   [255]
-  $ hg obsolete "desc('kill_me')"
+  $ hg obsolete -d '0 0' "desc('kill_me')" -u babar
   $ hg log -r .
   changeset:   0:97b7c2d76b18
   tag:         tip
@@ -23,3 +23,20 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     add kill_me
   
+  $ hg log --debug -r .
+  changeset:   0:97b7c2d76b1845ed3eb988cd612611e72406cef0
+  tag:         tip
+  phase:       draft
+  parent:      -1:0000000000000000000000000000000000000000
+  parent:      -1:0000000000000000000000000000000000000000
+  obsolete:    dead
+  killed:      Thu Jan 01 00:00:00 1970 +0000 by babar
+  manifest:    0:e0118fdce072635517f5b720b93e0afb30ea7a29
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  files+:      kill_me
+  extra:       branch=default
+  description:
+  add kill_me
+  
+  


More information about the Mercurial-devel mailing list