monotone-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Monotone-devel] [PATCH] parent selector 'p:xxx'


From: Ralf S. Engelschall
Subject: Re: [Monotone-devel] [PATCH] parent selector 'p:xxx'
Date: Wed, 10 Oct 2007 18:03:04 +0200
User-agent: Mutt/1.5.16 OpenPKG/CURRENT (2007-06-09)

On Sat, Oct 06, 2007, Ralf S. Engelschall wrote:

> This afternoon I finally got really nerved having to type
>
>     $ mtn diff -r `mtn automate parent <rev>` -r <rev>
>
> or the rather ugly, unhandy and partly unrecognizeable
>
>     $ mtn log --diffs --no-graph --brief --from <rev> --to <rev>
>
> just to get the diff output which has lead to a particular revision
> <rev> (which in turn I usually figure out via "mtn annotate"
> beforehand).
>
> I don't know whether it is just me, but I rather often need the _parent_
> of a revision (if more parents exists, I'm out of luck doing an easy
> diff anyway) and especially -- even if a command can figure it out --
> want to avoid even having to copy & paste it more revision ids than
> necessary.
>
> So, find appended a small patch against h:n.v.m which implements a
> "p:<rev>" selector. With this I now can finally use short commands like:
>
>     $ mtn diff -r p:<rev> -r <rev>
>
> The <rev> here can be an appreviated revision, too.
>
> In case others find this additional selector also handy, are there any
> objections if I commit this to n.v.m? Else I will include this stuff
> just into the patchset I maintain for OpenPKG's "monotone" package...
> [...]

Ok, here is the final patch which includes the documentation update
and a little corresponding test for "make check". Any objections for
comitting this?
                                       Ralf S. Engelschall
                                       address@hidden
                                       www.engelschall.com

===================================================================
Index: selectors.hh
--- selectors.hh        a580067010375b01e72094ebc255e26da4894384
+++ selectors.hh        04a1e8390e95624c89c100fd14de9157f5309dc1
@@ -30,6 +30,7 @@ namespace selectors
       sel_cert,
       sel_earlier,
       sel_later,
+      sel_parent,
       sel_unknown
     }
   selector_type;
===================================================================
Index: selectors.cc
--- selectors.cc        87df1393159bdc637059d9dfa9dfc52d50236326
+++ selectors.cc        1f5468137482871fb0c6b418357caa93eed01201
@@ -79,6 +79,9 @@ namespace selectors
           case 'e':
             type = sel_earlier;
             break;
+          case 'p':
+            type = sel_parent;
+            break;
           default:
             W(F("unknown selector type: %c") % sel[0]);
             break;
===================================================================
Index: database.cc
--- database.cc 4ae4c79a2a7fba4f39b072de6edc52625e1f69c0
+++ database.cc b37f89c9d264b674728fda144360e30d5d3b6397
@@ -2874,6 +2874,7 @@ static void selector_to_certname(selecto
     case selectors::sel_ident:
     case selectors::sel_cert:
     case selectors::sel_unknown:
+    case selectors::sel_parent:
       I(false); // don't do this.
       break;
     }
@@ -2914,6 +2915,11 @@ void database::complete(selector_type ty
               lim.sql_cmd += "SELECT id FROM revision_certs WHERE id GLOB ?";
               lim % text(i->second + "*");
             }
+          else if (i->first == selectors::sel_parent)
+            {
+              lim.sql_cmd += "SELECT parent AS id FROM revision_ancestry WHERE 
child GLOB ?";
+              lim % text(i->second + "*");
+            }
           else if (i->first == selectors::sel_cert)
             {
               if (i->second.length() > 0)
@@ -3033,7 +3039,7 @@ void database::complete(selector_type ty
   // will complete either some idents, or cert values, or "unknown"
   // which generally means "author, tag or branch"

-  if (ty == selectors::sel_ident)
+  if (ty == selectors::sel_ident || ty == selectors::sel_parent)
     {
       lim.sql_cmd = "SELECT id FROM " + lim.sql_cmd;
     }
===================================================================
Index: monotone.texi
--- monotone.texi       ba3e94933926c735fe99c81024701beaaef7203a
+++ monotone.texi       9bdc10fe42bccd03dae526214854bc4d08f863b5
@@ -2765,6 +2765,10 @@ @heading Selectors in detail
 @item Identifier selection
 Uses selector type @code{i}. For example, @code{i:0f3a} matches
 revision IDs which begin with @code{0f3a}.
address@hidden Parent selection
+Uses selector type @code{p}. For example, @code{p:0f3a} matches the
+revision IDs which are the parent of the revision ID which begins with
address@hidden
 @item Tag selection
 Uses selector type @code{t}. For example, @code{t:monotone-0.11} matches
 @code{tag} certs where the cert value begins with @code{monotone-0.11}.
===================================================================
Index: tests/parent_revision_selector/__driver__.lua
--- tests/parent_revision_selector/__driver__.lua       
9b3fb350caf11956ba9ee62f74e967d83bbd2dc1
+++ tests/parent_revision_selector/__driver__.lua       
9b3fb350caf11956ba9ee62f74e967d83bbd2dc1
@@ -0,0 +1,36 @@
+
+--  setup workspace
+mtn_setup()
+revs = {}
+
+--  commit a revision #1
+addfile("testfile", "this is just a test file")
+commit()
+revs[1] = base_revision()
+
+--  commit a revision #2
+writefile("testfile", "now we change the content")
+commit()
+revs[2] = base_revision()
+
+--  commit a revision #3
+writefile("testfile", "now we change the content again")
+commit()
+revs[3] = base_revision()
+
+--  make sure that revision #3 is the head now
+check(mtn("automate", "select", "h:"), 0, true, false)
+check(trim(readfile("stdout")) == revs[3])
+
+--  select the parent of revision #3 (== revision #2)
+check(mtn("automate", "select", "p:" .. revs[3]), 0, true, false)
+check(trim(readfile("stdout")) == revs[2])
+
+--  select the parent of revision #2 (== revision #1)
+check(mtn("automate", "select", "p:" .. revs[2]), 0, true, false)
+check(trim(readfile("stdout")) == revs[1])
+
+--  select the parent of revision #1 (== none)
+check(mtn("automate", "select", "p:" .. revs[1]), 0, true, false)
+check(trim(readfile("stdout")) == "")
+





reply via email to

[Prev in Thread] Current Thread [Next in Thread]