<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="vestabot.xsl"?>
<irclog>
<join channel="#revctrl" nick="ddaa" time="2005-07-29T07:13:20Z"></join>
<join channel="#revctrl" nick="lelit" time="2005-07-29T07:40:03Z"></join>
<join channel="#revctrl" nick="njs" time="2005-07-29T07:40:30Z"></join>
<join channel="#revctrl" nick="njs``" time="2005-07-29T07:46:05Z"></join>
<join channel="#revctrl" nick="lelit" time="2005-07-29T08:50:41Z"></join>
<join channel="#revctrl" nick="timlarson_" time="2005-07-29T12:37:53Z"></join>
<join channel="#revctrl" nick="spoofer" time="2005-07-29T13:34:31Z"></join>
<join channel="#revctrl" nick="lelix" time="2005-07-29T14:23:46Z"></join>
<join channel="#revctrl" nick="lorentey" time="2005-07-29T14:33:20Z"></join>
<join channel="#revctrl" nick="zooko" time="2005-07-29T15:17:18Z"></join>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:18:05Z">I&apos;m disturbed to realize that darcs&apos;s Achille&apos;s Heel -- nested merger lockup -- is hit by long-lived branches as well as by doppleganger patches.</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T15:19:20Z">what do you mean with the former? when you do not exchange patches between two repos/branches for a long time?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:30Z">I mean repeated merge.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:36Z">I have some cleanup patches on a branch of mine.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:42Z">My boss Jim continues to change that code.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:51Z">Whenever there is a conflict I merge his latest changes with my cleanups.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:55Z">But now darcs has begun locking up.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T15:20:57Z">Very disappointing.</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T15:22:45Z">yep</msg>
<join channel="#revctrl" nick="pperez" time="2005-07-29T15:22:49Z"></join>
<join channel="#revctrl" nick="pperez" time="2005-07-29T15:58:52Z"></join>
<join channel="#revctrl" nick="lifeless" time="2005-07-29T16:22:36Z"></join>
<join channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:25:20Z"></join>
<join channel="#revctrl" nick="olczyk" time="2005-07-29T16:34:06Z"></join>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:34:28Z">Which distributed SCms maintain local branches?</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:35:43Z">olczyk: Mercurial and Codeville can, surely others, too</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:35:53Z">olczyk: What do you mean by &quot;maintain&quot;?  Do you mean &quot;allow&quot;?  surely you don&apos;t mean &quot;force to remain local&quot;?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:36:13Z">MT has a strong local/remote distinction, too.</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:36:30Z">ah, local == private?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:37:45Z">Basically I mean that a single repository contains branches, that you can check out two different branches from the same repository, and that you can tell there was a branch by examining the history.</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:38:30Z">olczyk: then my first answer is correct. Both call them heads</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:38:58Z">olczyk: Vesta can do that too.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:38:58Z">For example, darcs does not support local branches. Only global ones.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:39:10Z">Vesta is distributed?</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:40:58Z">olczyk: Yes.  At Intel we use it at sites on both the east and west coasts of the US and in India.  They all inter-operate quite happily and seamlessly with local operations taking place at each and eplication between.  <link>http://wiki.vestasys.org/VestaFAQ/GeneralQuestions#distributed</link></msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:41:12Z">s/eplication/replication/</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:42:15Z">So these are systems in which branches that want to interact must be in the same location?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:42:55Z">And then there are tools to add data from other locations?</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:43:44Z">abentley: If they&apos;re never in the same location, how could they interact?  I mean, you can&apos;t merge with something you don&apos;t have.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:43:46Z">Hmm. The way Vesta talks about branches and the way I do local and global are exchanged.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:44:03Z">xorian: By patches.</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:44:10Z">abentley: uhm, same location? This doesn&apos;t sound very distributed. What do you mean?</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:45:01Z">abentley: If that question was specifically about Vesta, then yes, you can have branches that are local to any of those three and which then get replicated to one of the others on request/demand.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:45:38Z">In one case the SCM allows interaction through commands (my local) and in the other allows interactions through some sort of patch system ( my global).</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:45:46Z">ThomasAH: In these systems, everyone has their own copy of the project, and in order to merge you have to pull the remote data first.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:46:21Z">olczyk: OK, sure, but you still need to move the patches.  And to have a reasonable chance of correctly applying them, you probably need the history of the other branch too.</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:46:23Z">abentley: yes, though Mercurial allows merging completely unrelated repositories, too</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:46:44Z">abentley: but after this the repo will contain both complete histories</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:47:56Z">So it is distributed, but not as aggressively as, say Arch or bzr.  In Arch, you can&apos;t pull another archive&apos;s data into your own (you just mirror).  In Bzr, you can, but you don&apos;t have to.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:48:02Z">olczyk: I don&apos;t see how command maps to local and patch maps to global.  I mean, a command is some operation that manipulates some state the VCS is storing for you.  Whether or not that state remains local or gets propagated somewhere else seems orthogonal</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:49:40Z">abentley: Mercurial will warn you if you do this, so you have one chance to use the undo feature :)</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:49:42Z">abentley: In Vesta you can replicate as much or as little as you like.  The objects that you replicate are immutable versions.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:50:00Z">I mean a system where you have a type of branch which can interact with other branches must be in the same location and other branches which can interact through tools.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:50:02Z">abentley: Close but I don&apos;t like the &quot;must&quot;.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:50:15Z">Sorry got those two lines backwards.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:50:49Z">abentley: Also, a Vesta repository holds multiple &quot;packages&quot;, and each package is a separately version/branchable thing.  So you could replicate someone else&apos;s unrelated package intoyour repository and have a copy of it, and this would have no effect on the versions of your package.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:51:24Z">Now I know why I pased on Vespa. No WIndows.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:52:00Z">olczyk: Yeah, none of the contributors do Windows :/</msg>
<msg channel="#revctrl" nick="ThomasAH" time="2005-07-29T16:52:48Z">xorian: this has good sides, too :)</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:52:54Z">And also it would be challenging to get Vesta&apos;s big win (complete versioning of every file used by a build) on Windows, as the UNIX method of chroot-ing into a temporary filesystem isn&apos;t an option.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:55:50Z">So let me pick an example of a project, the Linux kernel.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:55:52Z">So you create two &quot;my local&quot; branches, 2.4 bugfixes and 2.6 development.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:56:56Z">But some guy wants to write a new driver. So he creates a &quot;my global&quot; branch off of 2.6 to build the driver.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T16:57:00Z">xorian: So that would include system headers?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:58:31Z">you want in either 2.4 bugfixes and 2.6 development, visible to everyone. </msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T16:58:35Z">abentley: Yup.  Builds can only use wahat&apos;s in the chroot, and that&apos;s populated exclusively from what&apos;s under revision control in the repository.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:58:44Z">Sorry.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:58:51Z">The official changes to the kernel, you want in either 2.4 bugfixes and 2.6 development, visible to everyone. </msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T16:59:48Z">Until  the driver is near release you don&apos;t want eveyone to know about the changes.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:01:25Z">The history of 2.4 bugfixes and 2.6 development are in the same repository, but the history of the driver is not.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:02:03Z">What I weant to know is which SCMs support the first type of branch?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:02:52Z">All distributed scms.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:03:25Z">You just use a second repository for private stuff.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:04:38Z">Private stuff that may in the future become public.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:04:39Z">olczyk: Yeah, this sounds pretty simple.  You&apos;re just saying that you have private &quot;2.4 bugfixes&quot; and &quot;2.6 development&quot; branches which are separate from the public ones and may contain stuff you don&apos;t want published.  I&apos;d be surprised if any modern system didn&apos;t support that.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:05:41Z">Well let me give you an example of an SCM that doesn&apos;t: darcs.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:06:24Z">To branch in darcs you create a copy of the repository.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:06:26Z">olczyk: Not even with a separate Darcs repository?  I mean, isn&apos;t that the way Darcs manages branches, by reating a new repository?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:06:42Z">So there is never a public record of a branch. Even if you want one.</msg>
<join channel="#revctrl" nick="tomlord" time="2005-07-29T17:07:00Z"></join>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:07:20Z">Exactly and for that reason no repository can ever know of any branches.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:07:44Z">In darcs a history is always mostly linear.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:07:49Z">olczyk: Well... why do you need a public record of a branch whose contents aren&apos;t made public?  Incidentally, Vesta *can* do exactly that: publicize the existence of a branch which you only selectively publicize certain version of.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:07:53Z">The changes appear in a line.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:09:04Z">xorian: That&apos;s the point. Sometimes you want branches that are public and sometimes you want branches that are private. Darcs only supports private branches.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:09:46Z">BVecause in darcs there is a one to one relationship between branches and repositories.</msg>
<join channel="#revctrl" nick="mffpasky" time="2005-07-29T17:10:13Z"></join>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:11:02Z">In CVS you have branches within the same repository. CVS only supports public branches.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:11:25Z">olczyk: Well, not that I&apos;m a Darcs user, but to make a public branch don&apos;t you just publicize you branched repository?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:11:49Z">How? </msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:12:14Z">olczyk: Um... however you make a Darcs repository available to others over the net?</msg>
<emote channel="#revctrl" nick="xorian" time="2005-07-29T17:12:31Z">&lt;- still not a Darcs user :)</emote>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:13:25Z">The is a one ot one correspondence between branches and repositories, so you have to make two repositories available.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:13:38Z">Plus some description.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:14:11Z">olczyk: So, what you want is an index of the different public/private branches that&apos;s publicly accessible?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:14:39Z">In other words all the mechanisms for handling branches in CVS you have to implement by yourself in darcs.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:15:41Z">zooko: Wake up already</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:16:39Z">Not quite. Imagine a graphics program that takes the history of a tree and draws a tree. In CVS that history will look like a tree. In Darcs it will look like a straight line.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:17:46Z">In darcs any branch will be &quot;invisible&quot; with no possibility of making it visible.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:18:31Z">olczyk: Other than having an index of branches, how does that matter in practice?  I mean, you could reconstruct that tree by finding the common parts of the histories in the different repositories, and I&apos;m sure Darcs must do something like that in its patch algebra engine.</msg>
<join channel="#revctrl" nick="zooko" time="2005-07-29T17:18:41Z"></join>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:21:05Z">In practice, In CVS I am working on bugfixes for 2.4: command &quot;cvs -branch &apos;2.4bugfixes&apos;&quot;, for 2.6 development &quot;cvs -branch &apos;2.6development&apos;&quot;</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:21:11Z">olczyk: When the private stuff becomes public, you pull it into your public repository.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:21:38Z">In darcs, &quot;darcs url of 2.4bugfixes&quot; and &quot;dars url of 2.6 development&quot;.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:22:50Z">If I forget what the branches are in CVS I ask for a history, in darcs I have to look through my notes.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:23:11Z">Darcs does not have the machinery for handling the branches, I have to provide it.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:23:21Z">abentley: Exactly.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:24:44Z">In a distributed SCM you cannot avoid private branches. Because private branches are just mirrors of your repository.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:24:47Z">So bzr also doesn&apos;t have a built-in branch directory service (atm), and Arch does.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:25:29Z">I&apos;m not that familiar with bzr. I believe arch does, unless I am misreading documents.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:26:03Z">olczyk: If you wanted to avoid private branches, you just ensure that the repository is public.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:26:23Z">There may be bandwith considerations, but there&apos;s no technical barrier.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:26:51Z">I like the &quot;graphical history&quot; analogy because that makes it clear. A SCM with a &quot;branch directory service&quot; will have a tree for it&apos;s history. One without will have a line.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:27:14Z">olczyk: This is not true.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:27:34Z">the directory service provides the locations of branches.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:28:08Z">But without the directory service, you can still see a branching history, you just can&apos;t access the original branches.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:28:51Z">abentley: But there is no way to prevent a preson from replicating your repository. Which is a way of creating branches ( ala darcs).</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:29:34Z">Only if you require that replications are recorded in the history.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T17:29:35Z">True, no distributed SCM prevents people from branching from public repositories.</msg>
<join channel="#revctrl" nick="zooko" time="2005-07-29T17:30:32Z"></join>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:30:38Z">replication doesn&apos;t necessarily mean branching.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:31:30Z">In essence, I&apos;m looking for a SCM that can hold two branches in the same repository.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:32:08Z">xorian: How can replication not mean branching?</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:32:22Z">olczyk: That still seems more like nomenclature than functionality.  But Vesta can hold innumerable branches in a single repository!  :)</msg>
<join channel="#revctrl" nick="graydon" time="2005-07-29T17:32:32Z"></join>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:33:04Z">olczyk: What if you replicate but never modify locally?  Like you just want to get a read-only copy of the source and its history?  Maybe for auditing or building purposes.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:33:34Z">olczyk: you could take a SCM that holds one branch in each repository, and then &quot;mkdir orepo ; mv darcsrepo1 orepo ; mv darcsrepo2 orepo ; cd orepo ; echo &quot;darcsrepo1 contains the this and that as of now&quot; &gt; darcsrepo1.txt ; echo &quot;darcsrepo2 contains so-and-so&apos;s such-and-such&quot; &gt; darcsrepo2.txt&quot;.</msg>
<join channel="#revctrl" nick="timlarson_" time="2005-07-29T17:34:22Z"></join>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:37:13Z">zokoo: In other words you can use use an SCM that holds one branch in each repoitory, and then replicate all the machinery by hand that an SCM that holds multiple branches in one repository gives you.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:39:35Z">What is &quot;all the machinery&quot;?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:39:42Z">The suggestion I gave was a .txt file per branch.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:39:44Z">What else do you want?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:40:08Z">I&apos;ve been seriously considering something like this myself, as I use darcs, and I find myself putting long directory names.</msg>
<emote channel="#revctrl" nick="lelix" time="2005-07-29T17:40:43Z">wrote a silly tool to simplify this kindothings :)</emote>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:40:50Z">Here are the names of a set of darcs repos that are in a certain directory on my system: beta1  d2s  d2sb  dw  dw1182  dwex  findnestedmergers  justzookopatches  like-beta1  subset  tailorizer  tailorizerd2s  working</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:41:07Z">sometimes I forget what meaning I have encoded into them.  &quot;dwex&quot;? Was that &quot;darcs world excluding&quot; something?  I forget.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:41:13Z">So I&apos;ve been thinking maybe I should take notes.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:41:24Z">Although in practice what I do is throw away all but seven plus or minus two of my darcs repos.  :-)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:41:41Z">lelix: what tool is that?</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:43:09Z">it&apos;s incomplete, but basically &quot;literate repositoring&quot; :-) using ReST as a storage system</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:43:13Z">:-)</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T17:44:20Z">zooko: It sounds to me like you&apos;re making his case for him about the user having to do the book-keeping.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:44:53Z">zooko: I don&apos;t want to specifiy &quot;all the machinery &quot; for two reasons, 1) Because I will forget something, 2) because I won&apos;t specify a set of orthogonal actions.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:45:15Z">Well, I am agreeing with olczyk that something more is needed.  Although </msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:45:30Z">(a) it isn&apos;t needed so strongly that I&apos;ve actually bothered to &quot;vi notes.txt&quot; or to scribble on a piece of paper, and</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:45:53Z">(b) I&apos;m not sure what would be useful beyond a couple of hundred bytes of scratch space to write notes about a repo.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:46:18Z">There might be some really useful things that a tool could do by managing multiple darcs repos (i.e. managing multiple branches).  I&apos;d like to think of some.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:46:27Z">I want something to tell me what branch I am working on. I want the ability to create new branches with one command. I want to be able to switch branches seamlessly. I want to be able to create a list of branches.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:46:39Z">Note that currently I *am*  using a couple dozen bytes of scratch space by encoding things into my directory names.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:47:01Z">olczyk: all of the four things you just stated already work for me when I use darcs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:47:17Z">What branch am I working on?  pwd -&gt; /mnt/hdc1/zooko/work/newnewtailorfrom770/findnestedmergers/working-subset1</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:47:34Z">create new branch with one command: &quot;darcs get working-subset1 working-subset1-newbranch&quot;</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:47:43Z">switch branches seamlessly: &quot;cd ../otherbranch&quot;</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:47:48Z">create a list of branches: &quot;ls&quot;</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:48:19Z">olczyk, what you should really explain is: what actions do you wanna perform interbranch? </msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:48:22Z">I agree with you that these are absolutely necessary actions to have if you are going to be using a multibranch system.</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:48:47Z">sharing patches? obtaining diffs?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:49:14Z">Here are some interbranch things that can be done only painfully with current darcs:</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:49:20Z">I also want the ability to noninvasively find out some of the new branches I create.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:49:27Z">1.  get a list of patches which *are* in A and are *not* in B</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:49:34Z">this can be done only with manual effort or bizarre bash scripts</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:49:59Z">Although I guess I have to admit that I&apos;ve used a bizarre perl script that does exactly this by interactively poking at the text-based interactive darcs UI...</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:50:35Z">2.  Tell darcs: &quot;pull all patches from that branch to this one&quot; (darcs already does this) &quot;... EXCEPT for any patches that are over in that one&quot; (darcs doesn&apos;t currently do this without aforementioned hassle)</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:51:17Z">zooko, what do you mean with &quot;that are over in that one&quot;?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:51:18Z">3.  Um..  Actually I can&apos;t think of any more at the moment.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:51:38Z">lelix: I mean I have patches in A, B, and C, and I want to pull everything from A to B *except* for patches that are also in C.</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:51:47Z">oh</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:51:50Z">I want to create a clean audit trail of all the publicly announced branches.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:51:54Z">This is a frequently requested issue nowadays.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:52:08Z">olczyk: I haven&apos;t understood what you meant by &quot;find out some of the new branches I create&quot;.</msg>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:52:12Z">yes, I see</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T17:52:25Z">olczyk: what do you mean by &quot;create a clean audit trail&quot;?</msg>
<emote channel="#revctrl" nick="lelix" time="2005-07-29T17:52:37Z">is going home, will follow from there</emote>
<msg channel="#revctrl" nick="lelix" time="2005-07-29T17:52:46Z">later all</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:53:04Z">Back to my kernel example: </msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:53:06Z">I&apos;m Linus in hiding. We&apos;ve just created 2.4bugfixes and 2.6development.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:53:22Z">I want both of these branches to be publicly announced.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:55:15Z">For &quot;create audit trails&quot;, Linux has just died. I am a manager in RedHat. I hire Deloitte and Touche to examine the code history and tell me what the public branches are and what the status of each is.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T17:56:25Z">Where the branches were created. What exactly they incorporate. If there has been interaction between the two.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:01:33Z">olczyk: In a distributed system, you can only do that if people cooperate.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:01:45Z">Or better yet an example where I would use such an audit history:</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:01:46Z">I work for Lucent, We are working on 5ESS Sri Lanka, Version 6 SR3. Sri Lanka has just passed telcom laws requiring the same kind of functionality in my version of 5ESS as in India Version 4 SR7. I want to find and incorporate all those changes between that and India Version4 SR6.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:02:55Z">abentley: that is true, but i would submit that people are not looking for truely distributed SCMs. Just semidistributed ones.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:02:56Z">In fact, you can&apos;t even do that with CVS, because people make their own clones of the repository every now and then.  Hell, canonical is importing projects from CVS to Arch all the time, without needing the projects&apos; consent.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:03:36Z">Can you name one serious project that doesn&apos;t have a &quot;main &quot; repository?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:04:23Z">probably not.  But there&apos;s no way you can prevent people from copying a public repository and doing their own thing with it, no matter what the SCM.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:05:51Z">Well with CVS it would be hard to grab the whole history if you don&apos;t have the repoitory :)</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:06:09Z">If the repository&apos;s public, you have it.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:06:36Z">Only if you have access to the filesystem.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:07:18Z">Canonical doesn&apos;t need access to the filesystem for their imports.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:07:38Z">yes but it&apos;s hard to grab the whole history if you don&apos;t.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:08:29Z">Besides I&apos;m not saying that I want to stop people from copying a repoitory.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:08:47Z">it&apos;s fair to say that semi-distributed systems might be more what users want. unfortunately they&apos;re not quite what most of us have gone off and *built* :)</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:09:02Z">perhaps we&apos;ve built what users don&apos;t want. time will tell.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:10:14Z">What I am saying is that on any project, there is the concept of a &quot;main&quot; repository and people want &quot;official&quot; branches and the machinery to mainipulate those branches.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:10:37Z">Some people don&apos;t want &quot;unofficial&quot; branches. They&apos;re called managers.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:11:23Z">I agree with both these points. I also wish to point out that neither of them featured prominently in the design of some (all?) of the distributed systems recently assembled.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:11:50Z">Others do, and in a distributed or semi distributed system it is impossible to prevent it.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:12:20Z">some people want these things. perhaps some of them will be let down, when evaluating each candidate system. there are many tasks VC systems are designed for: communication, synchronization, record-keeping, resource-controlling, simple backups...</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:13:28Z">olczyk: it still appears to me that the things that you want to do are fairly easy to do with darcs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:13:39Z">Perhaps I don&apos;t appreciate some particular subleties about it.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:13:54Z">Sigh. So much to discuss and I have to go...</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:13:59Z">:-)</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:14:46Z">zooko: Well for one thing, can you gaurantee that each person on a project does it the same way?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:15:33Z">olczyk: regardless of the revision control software that you are using, to guarantee that all the participants conform to certain behavior requires management, contract, peer pressure, police, or something else.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:15:39Z">I know that sounds trite.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:15:50Z">But I honestly don&apos;t see how your objection applies to darcs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:16:20Z">By the way, I, like Canonical, have been slurping entire histories of open source projects from their CVS servers, without their permission or knowledge.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:16:28Z">Do you trust that idiot who when using RCS would go on vacation and leaves his file locked is going to create a branch adhering to the prescribed protocol?</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:16:52Z">s/file/files/</msg>
<emote channel="#revctrl" nick="zooko" time="2005-07-29T18:16:54Z">thinks.</emote>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:17:08Z">I think I understand your objection.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:17:42Z">The thing about cooperation with strangers in the world today is that using a tool which constrains you in a certain way doesn&apos;t constrain *them*.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:17:52Z">I can name numerous widely used open source projects which currently use CVS or else SVN.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:18:12Z">Perhaps they do so in part because they wish to deter people from making branches without their knowledge or consent, to prevent people from forking willy nilly, etc.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:18:32Z">Or more to the point, can you guarantee that the guy who wants to unlock his files but gets distracted by something and forgets, is going to type the same three commands in the correct order each time, or is he more likely to type the one command?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:18:32Z">However, I and others *have* done so -- have created branches willy nilly without their consent, using tools like tailor.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:19:09Z">So I guess the point isn&apos;t that you need to choose a tool that doesn&apos;t facilitate this, and give that tool to your developers, but in addition you also have to make sure that your developers don&apos;t find tailor.py and start using it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:19:21Z">Which is easy if they are under employment contract to you and work in the same building and all that.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:19:36Z">But in that case, the easy case, then you might be able to give them the more powerful tool while also managing their use of it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:19:41Z">But I agree that this is a grey area.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:20:44Z">Here&apos;s my menagerie of open source projects which I have unilaterally and cruelly forked without their permission: <link>https://yumyum.zooko.com</link>:19144/cgi-bin/darcs.cgi</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:20:56Z">for most of them I&apos;ve made little or no change to their actual source code.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:21:08Z">For at least one I&apos;ve extensively updated it for my own amusement.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:21:09Z">(crawl)</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:21:29Z">I believe really you are talking about somewhat fundamentally-different families of work when you consider open vs. non-open source programming.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:21:45Z">free stuff embraces copying. copying is a virtue; we try to find ways of making ourselves powerful through use of copying.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:22:03Z">the natural corollary of copying is &quot;divergence of the copies&quot;.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:23:26Z">tools founded from this stance will have a different set of things they&apos;re good and bad at than things founded from the stance that copying must be controlled, minimized, or eliminated.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:23:58Z">(not making a moral judgement on either stance mind you; I&apos;d be happy if we could control copies of flu viruses for example...)</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:25:12Z">graydon, that&apos;s not what I said. In fact I just said what you are saying. But I am also saying that at times everyone wants some control. If they didn&apos;t SCMs would not exist.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:26:03Z">olczyk: some people want control over their own copies, their own histories, etc.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:26:16Z">Others want to control the way other people use their copies, etc.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:26:25Z">Like Graydon, I&apos;m not saying that the latter is necessarily bad.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:26:36Z">It obviously has a lot of use, for example in commercial software development.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:26:39Z">&quot;that&apos;s not what I said&quot; &lt;-- what&apos;s not what you said? I didn&apos;t think I was attributing any stance or statement to you.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:26:39Z">Which I do, by the way.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:27:20Z">so do I! I even do development where we keep some stuff secret. and other stuff which we need to keep 10-years+ of bit-for-bit-reproducible history</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:27:30Z">What I&apos;m saying isn&apos;t that you should want to lose control over other people&apos;s use of their copies.  What I&apos;m saying is that if you want that control, you aren&apos;t going to get it solely by using a revision control tool which facilitates it.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:28:10Z">Like I said there are two types of guys. The guy who leaves his files locked and doesn&apos;t, and the guy who wants to unlock his files but just as he is going to unlock them another developer comes over with a question about the design and he forgets.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:28:14Z">That developer wants a tool that will help him remember.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:28:14Z">(in the latter case my recommendation is to archive the entire system state, plus a hardware simiulator for the known-runnable state, and make dozens of copies of it all over the planet, and forget about VC tools *entirely*)</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:29:27Z">That developer doesn&apos;t mind doing three things in the same way to create a branch-- he probably agreed when they discussed it.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:29:35Z">But he would rather have one command.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:29:59Z">graydon: have you gotten the Vesta spiel from xorian or from other sources?  I like it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:30:05Z">(re: bit-for-bit history)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:30:28Z">olczyk: I strongly agree that minimal &quot;hassle&quot; is an important value.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:30:40Z">I agree that a first-class &quot;branch&quot; formalism is helpful, simply for *communicating* your intention; I disagree that most of these tools will actually enforce the formalism. they might, at best, &quot;remind you of it&quot; (in your terms). monotone will remind you of the notion of a branch, for example. but you&apos;re free to ignore what it says.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:30:43Z">If I have to type two separate things when every time I do it I only mean a single thing, then that bothers me.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:31:38Z">zooko: I&apos;m familiar with vesta, if that&apos;s what you mean; I&apos;m not sure if the xorian-provided spiel has any special parts I would not have gleaned from the documentation. </msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:32:04Z">Okay.</msg>
<msg channel="#revctrl" nick="olczyk" time="2005-07-29T18:32:04Z">Well I&apos;ve got to go now. Bye</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:32:08Z">Bye olczyk!</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:32:38Z">zooko: I did actually recommend we use vesta for the long-term-archival needs. and this suggestion was ignored, alas, like every context I&apos;ve ever suggested either aegis or vesta for.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:33:13Z">Hm.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:33:14Z">people don&apos;t accept process suggestions unless they come from above. it&apos;s weird. it&apos;s like nobody&apos;s aware of the improvement in systemic function when everyone uses a codified and predictable process (*any* process)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T18:34:28Z">Perhaps there&apos;s a coordination issue.  No sense in adopting vesta unless all of your co-workers are doing so.  It&apos;s hard to get everyone to agree on when and how to do such a thing.  Also to decide on where to go for lunch.  If it comes from above, everyone knows that everyone else will do it, so each is happy to do it.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:35:35Z">yes, of course. I don&apos;t mean it&apos;s &quot;bad&quot;, just noteworthy. there&apos;s also a curious unix tradition of respecting a tool-preference boundary for each user. perhaps this is actually at the root of the &quot;small tools&quot; aesthetic: the sense in which each hacker&apos;s unique pickyness can be accommodated by letting them write their own (or choose their own) idiosyncratic tool.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:37:01Z">the need to communicate seems to be the only thing forcing users to use the same VC tool, otherwise I suspect they&apos;d all manually implement something like quilt and rsync-backup..</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:37:52Z">it&apos;s especially odd considering that it&apos;s so much cheaper to force users to adapt than to produce a program which adapts to users in their natural state</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:40:12Z">I guess economics is against it though. it&apos;s cheaper only when you can control the users; when they have choice and disposable income they pay a premium to have the program adapt to them, and the zero-cost-per-unit makes this a plausible way of making money writing intuitive programs.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T18:55:54Z">graydon: interestingly, I was wondering yesterday about the feasability of other VCSes as &apos;foreign branches&apos; in bzr, such that you could merge from them as they were updated.  Contributing work back would be a problem, though.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:57:01Z">we have an experimental monotone branch which does this. tracking a CVS branch as external to monotone, pushing and pulling versions back and forth.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T18:57:07Z">I&apos;ve not tried it. the author says it works.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T19:05:35Z">I wouldn&apos;t think CVS held enough state for that to be useful.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T19:06:32Z">many people prefer using CVS, or like CVS as a &quot;backup&quot; format, or want to keep using CVS while tinkering with new systems..</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T19:07:06Z">We certainly didn&apos;t want to drop CVS before we were confident in ARch.</msg>
<join channel="#revctrl" nick="timlarson_" time="2005-07-29T19:08:59Z"></join>
<join channel="#revctrl" nick="spoofer" time="2005-07-29T19:15:38Z"></join>
<join channel="#revctrl" nick="mass" time="2005-07-29T19:17:20Z"></join>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T19:26:13Z">graydon, abentley: I&apos;ve been doing a *lot* of that kind of stuff with the tailor tool.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T19:26:20Z">So far darcs has always been one of the sides. </msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T19:26:24Z">The other side has always been either CVS or SVN.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T19:26:43Z">It&apos;s not perfect, but it works, and it appears to me that tailor is destined to grow more and more useful and to interop with more and more revision control tools.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T19:27:02Z">^-- the &quot;only darcs, only SVN/CVS&quot; stuff is my personal use.  tailor already supports far more than those 3.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:07:19Z">Do you guys thing a unified changeset format is desirable or even possible?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:07:28Z">s/thing/think</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:24:09Z">The big question is what information goes in.  The small question is how to encode the information.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:24:45Z">darcs requires strictly more information than codeville-new/monotone-new which requires strictly more information than arch/monotone-old/etc.etc which requires strictly more information than cvs/svn, IIUC.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:28:24Z">zooko: I agree, that&apos;s the big question.  Would SCMs that didn&apos;t need/want the extra info be willing to go along with it, and would they support the more demanding SCMs?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:28:46Z">I&apos;</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:29:15Z">I&apos;m not sure we even agree on what changesets are for.  In bzr, they&apos;re for transmitting a revision cheaply.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:29:18Z">So *currently* as far as I understand it darcs requires *live* interactive access between the source and target darcs repos.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:29:18Z">what do you mean by &quot;changeset&quot; abentley?  what is the ... uh... ontology of revision control implicit in that?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:29:59Z">In fact, the current monotone does as well, AFAIK.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:30:24Z">So there is no way that those two could currently export a single static object that another system could reliably interpret, AFAIU.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:30:29Z">tomlord: well, I personally think of changesets the way Arch 1.0 had them.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:31:07Z">zooko: after seeing git, i&apos;ve started to think that &quot;repository&quot; shouldn&apos;t really be part of the revctl world.    Sure, there are places where revisions get stored and those can be called repositories --- but I don&apos;t like, anymore, the idea that a particular revision &quot;lives in&quot; or is somehow tied to some specific repository.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:31:28Z">OTOH, tailor.py already has an abstract notion of changeset and it already maps many systems onto it.  However, that abstraction is tied to a full local system state -- can&apos;t easily be serialized (Except via the obvious kludge of serializing the full local repo and its history.  :-))</msg>
<emote channel="#revctrl" nick="zooko" time="2005-07-29T20:31:44Z">nods.</emote>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:32:12Z">Though bzr&apos;s changesets are designed to be as close to patch as we can make &apos;em.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:32:25Z">As close to unified diffs, I mean.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:32:26Z">tomlord: yes, what you envision is, I guess, exactly the thing that I just said that darcs doesn&apos;t have: &quot;exportable&quot;, atomic, self-sufficient format.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:33:03Z">(that&apos;s what arch 2.0 has, btw.   new release today or this weekend.)</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:33:06Z">monotone&apos;s changesets are just a bit of extra context connecting the pre-state manifest to the post-state (noting which of the observable changes meant add, del, or rename)</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:34:05Z">i&apos;m not sure rename has any proper role there.   it&apos;s important for some cases of merging, sure, but that&apos;s different from just shipping around the trees.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:34:08Z">we didn&apos;t think we&apos;d need this context at first, but tomlord was right, it is too ugly (or you lose too much of the user&apos;s intent) without.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:34:40Z">well, it has no role if you have some sort of file GUIDs. since we don&apos;t, it has a role!</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:34:52Z">that&apos;s funny.  it sounds like we switched sides, partly by convincing each other that the other was right in the first place :-)</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:34:52Z">(rename tracking, that is)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:34:53Z">Oh, so I am wrong about monotone.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:34:56Z">tomlord: I like &quot;patch pools&quot;, btw.  Centralized collections of revisions with no directory service.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:35:11Z">tomlord: yeah, probably something like that happened. you know, grass being greener at a distance :)</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:35:26Z">zooko: wrong about it? how so?</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:35:43Z">linus found the low note: it&apos;s a distributed filename first and everything else layered on that.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:35:50Z">I was wrong to think that monotone requires a live connection to another live monotone in order to exchange a patch.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:35:52Z">darcs does.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:36:03Z">live connection?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:36:38Z">In order for a darcs executable to know how to apply a patch P to a repo R, where that patch P is currently in a repo S, the darcs executable needs to examine (parts of) both R and S.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:36:51Z">If R and S are on separate machines, it requires a darcs executable running on each machine and talking to the other one.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:37:31Z">tomlord: perhaps. I&apos;m still not sure whether there&apos;s a single perfect substrate for VC systems. there are always questions about identity and copying; what to unify and what to allow to diverge; I don&apos;t think any of us -- nor git -- got it &quot;right&quot; or &quot;wrong&quot; universally</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:38:15Z">zooko: Could a person creating changeset P&apos; determine in advance what would be needed to apply it to S?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:38:35Z">Err, R?</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:38:38Z">zooko: ah. there&apos;s no facility in monotone to apply a patch without its ancestor on hand, at the moment, at all. you would need to have fetched it first.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:39:52Z">graydon: In bzr, the changeset-basis can vary-- using the direct ancestor as a changeset basis is just a convention.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:40:02Z">it&apos;s not just that you have to *examine* the predecessor; you have to have the predecessor. the database doesn&apos;t let you write revisions without their predecessors.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:40:27Z">you could detach a changeset from the revision and apply it in a new context, but we currently have no commands which deal in changesets independently of revisions.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:40:36Z">graydon: identity (if i take your meaning right) should be a user-assigned name plus a very hard to forge signature, in a system where *usually* just the user-name, as a short-hand, is unambiguous enough.   linus didn&apos;t get that quite right and didn&apos;t think hard enough about distribution.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:40:57Z">graydon: Ah.  We require that the changeset-basis already be stored in the target branch.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:41:18Z">graydon: okay, so I am sort of right about the current state of monotone.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:41:24Z">Because for us, the sole purpose of a changeset is to reproduce a revision.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:41:47Z">But darcs is even a step more complicated, in that it doesn&apos;t know in advance which parts of the source repo and the target repo it is going to have to examine.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:41:51Z">abentley: arch family is f&apos;ed up because it conflates the logical history of the tree with the set of prerequisits for building a given revision -- the thing that archive-caching etc. tries to compensate for.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:41:58Z">There&apos;s no inexact patching, but you can merge a changeset.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:42:09Z">abentley: actually it could in theory, there is even a little practice in which people do that.  But it isn&apos;t the main stream yet.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:42:24Z">could determine in advance the context state necessary for transmit the patch, that is.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:42:40Z">tomlord: I can&apos;t really make strong statements about what &quot;should&quot; be. I don&apos;t really know. the way users turn out to like or dislike things, and the way tools turn out to be stable or fragile, has surprised me too much to take such clear positions.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:43:08Z">tomlord: You don&apos;t have to tell me, after our endless skip-delta discussions!</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:43:27Z">graydon: i know what you mean and often feel that way too but to embrace that too far is to throw up ones arms and just give up.   one has to risk making informed guesses at some point.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:43:59Z">abentley: maybe i&apos;m just reporting that &quot;i finally get&quot; what you and others were pointing at.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:44:12Z">tomlord: of course. but my informed guesses are, well, I find most usefully expressed in working code rather than english. I often find I only discover what I mean by a statement when I try to implement it; and I only discover what&apos;s wrong with it then as well :)</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:44:15Z">tomlord: Cool.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:44:16Z">Speaking as not-a-developer but only a user of these systems, my primary current desire is that someone else learns from darcs so that I can have more than one system in the darcs space.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:44:39Z">I don&apos;t mean to say that others haven&apos;t already &quot;learned from&quot; darcs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:44:54Z">But there are currently no others available that have the same commutation magic.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:45:05Z">Perhaps cdv/monotone-new-merge-algorithm will be a good alternative.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:45:23Z">mpool refereced Darcs a lot when we were first talking about bzr.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:45:30Z">it doesn&apos;t really disturb me any more that we&apos;ve got 20 or so systems in this space; it seems actually to be a natural product of a bunch of people thinking through technical problems which are too subtle to be worked out in english. you need reference code to be able to see when something does or does not work</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:46:33Z">I think a lot of people see loss of history as too great a price for any merging improvements.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:46:40Z">abentley: I noticed that!  It was encouraging, but it turns out bzr didn&apos;t decide to go for the whole commutation magic, which is quite reasonable for a conservative design.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:47:01Z">graydon: (re working code) you can see my latest tonight or by monday at the latest.  (release bundling/publication is way too tedious :-)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:47:08Z">abentley: I think this is an unfortunate myth.  Darcs does not inherently lose history any more than the other distributed systems do.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:47:29Z">I said &quot;inherently&quot; meaning the fundamental concept of commutation/etc., which another system might wish to use.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:47:54Z">The current implementation and the way it is currently used is somewhat susceptible to history loss, but the prevalence of that is probably overestimated by people who haven&apos;t tried it.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:48:09Z">My understanding was that commutation necessarily involved rewriting history.  I&apos;m happy to be corrected.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:48:10Z">tomlord: Looking forward to arch 2.0!</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:48:35Z">abentley: consider a minimal example of commutation: there are two repos, R and S.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:48:44Z">in each there is a patch P0 which creates a 100-line file.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:49:16Z">in R there is a patch P1 which replaces line 99 of the file like this: &quot;-hello world\n+yellow whirled&quot;.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:49:34Z">in S there is a patch P2 which inserts 50 lines into the file like this:</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:50:13Z">&quot;@@ -0,1 +0,50 @@\n-whateverthefirstlinewas\n+... 50 lines&quot;</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:50:17Z">With me so far?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:50:27Z">Sure.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:50:47Z">you&apos;re going to assert that there&apos;s a Right Merge here but that&apos;s a stretch.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:51:02Z">Now commutation in this context means that when you move patch P1 from R to S, that it applies to line 149 of the file.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:51:23Z">I do assert that this is almost always what the users want, and can almost never be a silent mistake.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:51:28Z">And that&apos;s it. That&apos;s the magic of darcs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:52:01Z">I think it is unfortunate that this magic is explained in the darcs docs in terms of quantum mechanics and sophisticated algebra -- an explanation which I personally have never yet understood.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:52:03Z">i dunno, if files diverged that much --- i think the Right Merge might be one that signals a conflict and asks for human review.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:52:26Z">tomlord: you would be right to think that if the darcs algorithm were using only the current state of R and S.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:52:36Z">but since the darcs algorithm has more information it can make this inference more reliably.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:52:53Z">Namely, it knows that no other patches have been recorded in either repository which would have changed the position of line 99.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:52:57Z">zooko: i&apos;m just a lot more conservative than a lot of the FOSS community about source management.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:53:53Z">That&apos;s why darcs can do this stuff that other systems can&apos;t -- it is *not* using a more clever heuristic to make a better guess where things should go -- instead it is using more information than merely the two pieces of &quot;current state here, current state there&quot;, and it is also using more information than the three pieces of &quot;current state here, current state there, some particular ancestor&quot;.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:53:56Z">you&apos;re getting a little too fancy for my tastes there.   i don&apos;t believe in magic, i just don&apos;t want surprises, and yadda yadda.    the main point being that such a merge is a great tool in the toolbox but nothing to architect an entire system around.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:54:13Z">We don&apos;</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:54:16Z">tomlord: That&apos;s ironic-- I was just reading &apos;undiagnosing subversion&apos;, which called you anything but conservative...</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:54:17Z">t use darcs in my workplace yet.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:54:31Z">The reason we don&apos;t is a good one -- the other developers at my workplace do not yet understand how the merge algorithm works.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:54:40Z">I hope to change this by writing up and posting an explanation.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:54:48Z">What I wrote above is a rehearsal for that.</msg>
<emote channel="#revctrl" nick="tomlord" time="2005-07-29T20:54:56Z">mumbles unkind words about MIT undergrads in abentley&apos;s direction :-)</emote>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:55:08Z">I strongly agree with you that I don&apos;t want magic, sophisticated heuristics, etc, etc, in my revision control system.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:55:31Z">So given the minimal situation that I&apos;ve described, the options are:</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:55:35Z">so you should give a better example thanthat, because that&apos;s the kind of info that is present in other SCMs.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:55:42Z">1.  Raise it up to the user and ask them to determine where patch P1 should be applied.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:55:53Z">2.  Do a guess, such as patch&apos;s &quot;fuzzy matching&quot;</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:56:06Z">3.  Use the complete revision history to determine where patch P1 should be applied.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:56:34Z">In this minimal case, #3 -- which darcs does -- consists of observing that there is a patch P2 which inserted 50 lines at the beginning of the file, therefore -- without guessing -- patch P1 clearly should be inserted at line 149 instead of line 99.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:56:42Z">I strongly agree with you that #2 is a bad idea.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T20:57:58Z">#3 is bogus because the &quot;complete history&quot; is about the history of text lines, not the history of what the changes to those lines *means*.   taken to an extreme, this is an argument against patching at all, which is obviously too far.   i dunno.   some kind of balance is needed.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:58:50Z">tomlord: That&apos;s an interesting argument.  Can you give me a small example where this approach would go wrong?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:58:58Z">I can think of one myself, but I&apos;d like to hear others.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T20:59:15Z">zooko: I believe the fundamental issue you&apos;re complaining about is that most diff3 application involves inferring &quot;line identity&quot; and then synthesizing identity-respecting line-edit history; darcs (and perhaps codeville) record line identity on a commit-by-commit basis and try to preserve the identity when composing long ancestry-graph edges</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T20:59:30Z">This may actually relate to what Tom was just saying about separating revision construction from history.  You can refer to each tree state as a composite of several patches, and then record every tree state through history.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T20:59:52Z">graydon: I&apos;m not sure if what you&apos;ve said accurately reflects my position.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:00:22Z">I think that approach #2 is to use incomplete information in order to &quot;guess&quot;, heuristically, where the patch should be applied.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:00:44Z">I suspect that many people who rightly oppose automated, silent application of approach #2 are incorrectly believing that darcs does this.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:01:13Z">Where as, in fact I think darcs solves the problem by using more historical information so that its algorithm is not a &quot;guess&quot;.</msg>
<emote channel="#revctrl" nick="tomlord" time="2005-07-29T21:01:26Z">is procrastenating and should get back to work, having muddied the waters here :-)   </emote>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:01:27Z">zooko: It&apos;s still a guess.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:01:33Z">It&apos;s just a better one.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:01:47Z">zooko: well, I am refining what you mean by &quot;guess&quot; and &quot;complete history&quot; in cases 2 and 3</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:01:50Z">I hope that my minimal example can serve as a basic for discussing these things concretely.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:01:54Z">You need AI to do perfect merging.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:02:26Z">Applying patch P1 to line 149, *because* of the existence of P2, seems to be qualitatively different than</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:02:32Z">Or mind-reading.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:02:44Z">any possible algorithm which might decide where to apply patch P1 given only the current states plus an optional ancestor.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:02:46Z">Does that make sense?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:02:53Z">But the patches themselves are produced by text analysis.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:03:08Z">What you guys have said, such as that an AI is needed to figure out where to apply a patch, makes perfect sense to me for any possible algorithm which uses those limited inputs,</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:03:22Z">They&apos;re not produced through any understanding of what the changes mean.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:03:37Z">but does not makes sense to me in this context: where the presence of P2 obviously and uncontroversially implies that patch P1 needs to be applied 50 lines further down.</msg>
<emote channel="#revctrl" nick="zooko" time="2005-07-29T21:03:45Z">thinks about what abentley said.</emote>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:03:47Z">abently: each patch is produced by text analysis, yes. a question, though, is whether you try to maintain line-identitiy between edges.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:04:15Z">zooko: when you commit a single patch, a-&gt;b, your VC system looks at the pre-state of that patch and the current state and infers a set of line edits. darcs does this too.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:04:26Z">abentley: can you suggest an example case like my minimal example where it would be wrong for the system to silently translate patch P1 50 lines further down?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:04:27Z">graydon: newlines are only a hint as to statement boundaries.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:04:35Z">I can think of one, but I&apos;m not sure if it is an example or a counter-example.  ;-)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:04:43Z">graydon: right.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:05:02Z">the question is whether the VC system then knits those line edits together, by identifying lines and saying &quot;line A in rev X goes to line B in rev Y&quot;, step-by-step</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:05:04Z">zooko: P1 changes the arguments that a function takes.  P2 invokes the function using its old signature.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:05:32Z">abentley: that is a good example.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:05:40Z">or whether it jumps up a level, finds (ancestor,left,right), and then re-calculates (without respect to history) the supposed line-edit relationships between ancestor-&gt;left and ancestor-&gt;right</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:05:45Z">It is *not* an example of darcs commutation going wrong, though.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:05:57Z">It is an example of there being a semantic dependency between patches that textual analysis can&apos;t catch.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:06:11Z">I don&apos;t think that darcs patch commutation increases the dangers of those, does it?</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:06:28Z">It increases the dangers of those being committed.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:06:28Z">That is to say: how does any other system, current or imagined, do better than darcs does on that example?</msg>
<emote channel="#revctrl" nick="zooko" time="2005-07-29T21:06:35Z">thinks about that.</emote>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:07:10Z">AIUI, Darcs will auto-commit that.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:07:17Z">abentley: Okay, I see an example of what you are saying.</msg>
<msg channel="#revctrl" nick="graydon" time="2005-07-29T21:07:36Z">lunch time for me</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:07:50Z">If P1 invokes the function, and P1 applies to line 99 of the file, and P!</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:07:56Z">darn.  by graydon.  by tomlord</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:07:57Z">bye</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:08:09Z">graydon: see ya.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:08:15Z">if P1 invokes the function, and P1 applies to line 99 of the file, and P2 changes the signature of the function, and P2 inserts 50 lines at the beginning of the file,</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:08:27Z">then a system like SVN will object that P1 and P2 conflict.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:08:40Z">Not because of their semantic dependency, which is of course invisible to the revctrl system,</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:08:47Z">but because it doesn&apos;t know where P1 should be applied.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:08:57Z">If P2 changed the signature of the function without changing the number of lines in the file,</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:09:14Z">or if P1 and P2 applied to different files, then svn and, I assume, every other revctrl system in existence, including darcs, </msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:09:19Z">zooko: But even if the patches did not conflict, SVN would still treat the results of a merge as an edit.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:09:22Z">would silently allow the semantically incorrect merge.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:09:45Z">Good point.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:09:57Z">For SVN, every merge requires a user to review before committing.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:10:00Z">And if there were procedures in place to catch incorrect edits, you wouldn&apos;t get a bad commit</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:10:14Z">Although in practice this means that users commit merges without actually reviewing them.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T21:10:21Z">oh... just thought of something..... i&apos;ll bet that assembly language programs provide many excellent examples of the pitfalls of merge algorithms that usually work just great for, say, C.   at the opposite end of the spectrum, given how code is formatted, lisp is probably another source of examples.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:10:51Z">tomlord: interesting.  I would welcome any minimal example case you can think of, as fuel for my nascent &quot;darcs magic demystified by example&quot; doc.</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T21:11:10Z">oh, c&apos;mon.... that&apos;s your work to do :-)</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:11:11Z">tomlord: I think this is just a difference in how you break up units.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:12:01Z">abentley: so as far as I understand from your conversation here, darcs patch commutation does not actually increase the chance of a semantically incorrect merge, except inasmuch as a semantically incorrect merge might also accidentally be a &quot;the location moved&quot; situation.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:12:08Z">There&apos;s nothing especially magic about \n-- it&apos;s just that it&apos;s conventionally used as a statement separator.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:12:32Z">The point about SVN is an excellent one: SVN treats every merge as a potential conflict and requires user approval.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:13:03Z">zooko: It depends on what you consider to be a merge.  I consider the human intervention to be part of it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:13:08Z">arch and monotone (if I understand correctly...) treat textually &quot;unclean&quot; merges as a potential conflict, but silently process textually clean merges.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:13:37Z">darcs treats merges which involve conflicting changes as conflicts, but silently processes merges which don&apos;t involve conflicting changes.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T21:13:41Z">zooko: In Arch, they&apos;re still treated as edits-- they&apos;re not auto-commited.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:13:51Z">I see.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:14:17Z">I do a lot of work in security, and a lesson we have learned is &quot;the boy who cried wolf&quot; lesson.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:14:26Z">If the alarm goes off every time, it is the same as if the alarm goes off never.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:14:40Z">In fact, it doesn&apos;t need to be anywhere near *every* time before people stop responding to it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:15:20Z">The analogy that I wish to draw is that saying &quot;We require the user to manually acknowledge every single merge.&quot; doesn&apos;t mean that in practice your users are going to inspect every merge.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:15:49Z">We use SVN in my work, and I have observed that 99% of merges made by any of our four programmers get committed automatically unless there were conflict markers.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:16:19Z">In contrast, darcs never raises the &quot;conflict alarm&quot; unless there is something which is unambiguously a conflict.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:16:48Z">Well, my son is calling me to dinner!</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:17:03Z">Thanks very much for the conversation abentley, tomlord, graydon!</msg>
<msg channel="#revctrl" nick="tomlord" time="2005-07-29T21:17:13Z">thank you too, zooko.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:39:59Z">I thought about it during dinner.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:40:15Z">The issue of &quot;when to raise the alarm&quot; is separable from the question of commutation.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:40:28Z">Suppose you work on arch, and suppose arch treats every merge as an edit and requires the user to approve it.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:40:40Z">Fine.  Now in the minimal case above, what edit should arch suggest to the user?</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:40:57Z">I propose that it is clearly better for arch to suggest that P1 be applied to line 149 than to suggest that P1 be applied to line 99.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:41:28Z">Now I twice offered to give counter-examples and nobody took me up on so I&apos;ll do it anyway.  ;-)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:41:54Z">I can think of two counter-examples where the simple commutation described above could be wrong, but both of them are pretty weird.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:42:14Z">One is sort of the &quot;Go&quot;del&quot; issue: suppose patch P1 replaces line 99 like this:</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:42:40Z">&quot;-hello world\n+if $line != 99: release missile&quot;</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:43:20Z">Then if arch suggests that P1 appear in repository S as an edit to line 149, and if the user commits  the suggested edit without examining it, then the missile goes off.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:44:03Z">The second example is similar: suppose the new line says &quot;If the text &apos;xyz&apos; doesn&apos;t appear within the previous 50 lines of this file, then release the missile&quot;.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:44:29Z">Again, if patch P2 does an &quot;insertion&quot; operation which causes there to be more than 50 lines between &quot;xyz&quot; and line 99, there is a problem.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:44:43Z">However, I find it hard to think of more &quot;realistic&quot; examples in the realm of software development.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:45:02Z">Okay, but if we switch from &quot;line number&quot; commutation to &quot;directory structure&quot; commutation then maybe it is a bigger issue.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:45:45Z">In darcs, a patch that mvs a file from ./subdirA/filename to ./subdirB/newfilename can be automatically merged with a patch that edits the contents of the file.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:46:17Z">Suppose you have an executable that says &quot;if sys.argv[0] != &apos;filename&apos;: missile.launch()&quot;.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:46:35Z">In reality, executables *do* sometimes inspect their filenames and switch on them, so this one isn&apos;t as far-fetched as the others.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:47:17Z">However, by giving some examples of how it can go wrong, I hope I&apos;ve challenged you to think of more common examples of how it can go wrong.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:48:14Z">My current hypothesis is that only these &quot;self-referential&quot; examples can cause the darcs commutation algorithm to suggest bad merges, and that the other 99.9% of merges that working programmers do are better served by darcs commutation than by algorithms which use less of the relevant history.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:48:31Z">Okay I&apos;ll shut up now and I&apos;ll write a web page if I want to write so much.  :-)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:49:26Z">Okay, no I won&apos;t.  I&apos;m still excited about this.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:50:09Z">Suppose you say that darcs commutation which merges a file-rename with a file-contents-change is dangerous, because of, for example, the &quot;if sys.argv[0] == &apos;myrightname&apos;:&quot; problem.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:50:32Z">However, for *any* possible merge algorithm, I can construct a Go&quot;delish example in which that merge algorithm will cause the missile to go off.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:51:07Z">So I think that we either have to accept a small possibility of bad merges or else we have to instruct the user to go off and do the merging herself and come back when she&apos;s done!</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:51:10Z">(Which is what Vesta does...)</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:51:46Z">So for practical purposes, what is most important is the trade-off between false alarms and false non-alarms.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:52:47Z">I submit that darcs patch commutationo *both* reduces the frequency with which the user is required to approve a merge that is &quot;obviously&quot; (to the user) done a certain way, *and* it reduces the frequency with which an unlucky merge can result in a &quot;clean&quot; but semantically wrong state.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:53:54Z">Along the lines of the simple example above, suppose that in repo S, which has patch P0 and patch P2 but not yet patch P1, line 99 happens to be &quot;hello world&quot;, but it is a *different* hello world than the one which is changed by patch P1 over in repo S.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:54:28Z">Then a simple textual merge which takes into account only the current working states of S and R will *appear* clean.  It will not insert any conflict markers, will not send output to the user warning him to look at this one more carefully, etc.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:54:36Z">But it will almost always be semantically wrong.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:55:18Z">Likewise, an example that I learned from reading an Arch document, suppose there is a ./somedir/Makefile in R, and in repo S it gets mv&apos;ed into ./somedir/somesubdir/Makefile and a *new* file ./somedir/Makefile gets created.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:55:27Z">Meanwhile, in R, the contents of ./somedir/Makefile gets changed.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:55:46Z">Please observe that darcs patch commutation does the right thing here, where a more naive algorithm would apply the change to the wrong file.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:56:12Z">I&apos;m aware of the issue of fileIds, but I prefer to contrast two algorithms here: no-file-Id-simple-textual-merge, and no-file-Id-darcs-commutation-merge.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:56:33Z">In this simple of example of &quot;The Moved Makefile&quot; it is clear that the naive algorithm is more dangerous than the commutation algorithm.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T21:56:40Z">Geez, I hope somebody reads this.  :-)</msg>
<join channel="#revctrl" nick="jrosdahl" time="2005-07-29T22:09:42Z"></join>
<join channel="#revctrl" nick="tbrownaw" time="2005-07-29T22:11:35Z"></join>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:19:42Z">zooko: here&apos;s a real world example that actually happened.  I created a patch that made &apos;bzr merge&apos;  check whether there were local modifications, and abort if there were.  I also created a pull command that used the merge function to apply changes to the local tree.  I submitted these as separate patches.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:20:39Z">In &apos;pull&apos;, the branch revision was modified before merge was invoked.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:20:58Z">This made the tree look like it had local modifications.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:21:17Z">Since the default was to check for local modifications, pull was now broken.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:25:49Z">zooko: I agree with the core of what you&apos;re saying.  I don&apos;t believe that there is any merge algorithm which can be free of semantic conflicts.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:26:38Z">Well, you could elevate every change merged in to the user as a conflict, but I wouldn&apos;t really call that a &quot;merge algorithm&quot;.  I mean, that&apos;s basically ediff/tkdiff.  Not that it&apos;s a bad way to do things.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:27:19Z">I am paranoid, and habitually read diffs before committing, even when I haven&apos;t done a merge.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:29:57Z">The possibility of semantic conflicts from parallel edits is one of the main themes in the comparison to CVS that the original Vesta developers wrote long ago: <link>http://www.vestasys.org/doc/comparison.html#CVS</link></msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:31:47Z">However, it&apos;s clear that you need to allow for parallel edits.  Any time you do that, there must be some process of merging them.  No matter how automated or manual that process is, semantic conflicts can go un-noticed.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:32:53Z">Also, zooko, there are degrees of merging.  I always run the smoke test of compiling.  The baz team runs the test suite for each merge.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:33:14Z">Not everyone just merges and commits.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:33:35Z">My personal belief is that the best way to deal with them is: 1. Always read the diff before comitting (though not all users will do this), 2. Read the diffs other people commit (i.e. peer review), 3. Have an automated test suite (though it&apos;s often difficult to achieve good coverage).</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:34:17Z">Sorry, I guess that should also include: 0. Always build before committing, and never commit something that doesn&apos;t build.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:34:23Z">xorian: I just realized that the ability to uncommit might be handy.  Commit, have that trigger the test suite, if the test suite fails, uncommit.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:34:48Z">xorian: Sensible advice.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:36:00Z">abentley: I could go on at length about automating the integration of parallel changes made by multiple users (we do this at Intel with hundresd of peopl constantly working), but instead I will simply mention Fowler&apos;s Continuous integration: <link>http://www.martinfowler.com/articles/continuousIntegration.html</link></msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:36:46Z">...and the free implementation of the idea: <link>http://cruisecontrol.sourceforge.net/</link></msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:39:05Z">zooko: Anyhow, if you now understand why patch commutation is a heuristic, that&apos;s great.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:40:25Z">Of course our automated integrations of parallel changes (on microprocessor projects at Intel) don&apos;t involve merging.  Users are always invovled in that, and sanity-checking the result.  It only automatically integrates parallel changes to different files (actually packages, but that&apos;s Vesta-ese).  But of course there can be semantic conflicts that cross file boundaries, which is exactly what that tests for.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:41:39Z">I also don&apos;t understand the Makefile example.  Wouldn&apos;t the wrong makefile have the wrong contents too, and therefore fail on a textual basis?</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:43:14Z">abentley: Any time you take changes made in parallel and combine them, it&apos;s a heuristic and can get semantic conflicts without syntactic conflicts.  A good merge algorithm (and I would put Darcs&apos; patch commutation in that category) simply reduces the number of syntactic conflicts which the user has to be involved in resolving.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:44:18Z">xorian: agreed.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:48:54Z">If anyone would like to suggest improvements to the description of criss-cross merge here, I would appreciate it: <link>http://wiki.vestasys.org/MergingFuture/Food4Thought/TrickyCases</link></msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:50:23Z">I&apos;ve been trying to document some of what I&apos;ve learned over the last 6 months (largely from this channel in one way or another) for people who haven&apos;t thought about this at all to help in the formulation of future development plans for Vesta.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:51:01Z">This particular subject came up at work a couple days ago, so that prodded me to get around to writing it up.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:52:16Z">Basically though this is just an expansion on the post Bram made to the git list with full text for the states in that example to make it easier to see.  (I went through the example myself a while back, and it really helped me understand it.)</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:54:47Z">&apos;history-aware merging&apos; seems too vague to me.  That could describe the process of selecting a BASE using history data.</msg>
<msg channel="#revctrl" nick="xorian" time="2005-07-29T22:55:42Z">abently: A valid criticism.  I don&apos;t recall where I got that phrase from.  I don&apos;t suppose you&apos;d care to suggest an alternative?</msg>
<emote channel="#revctrl" nick="xorian" time="2005-07-29T22:56:17Z">is going AFK for a while now, will read any comments when he returns</emote>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:56:30Z">You might also be interested to read David Allouche&apos;s description: <link>http://lists.gnu.org/archive/html/gnu-arch-users/2004-09/msg00279.html</link></msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-29T22:58:46Z">I dunno, it&apos;s something like &apos;block-identity&apos; merging.</msg>
<emote channel="#revctrl" nick="zooko" time="2005-07-29T23:14:16Z">is reading abentley real-world example.</emote>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T23:15:20Z">abentley: if I understand correctly, your real-world example is a case where there were two changes, syntactically separate (so that syntactic detection of dependency won&apos;t work), but semantically related, so that applying both of the changes together resulted in a broken system.</msg>
<msg channel="#revctrl" nick="zooko" time="2005-07-29T23:17:24Z">I&apos;m not going to write another monologue, so I&apos;ll just wait patiently and see if abentley wants to confirm my understanding or else further enlightenme. :-)</msg>
<emote channel="#revctrl" nick="lelit" time="2005-07-29T23:17:50Z">thanks zooko for the monologue :)</emote>
<join channel="#revctrl" nick="spoofer" time="2005-07-29T23:49:49Z"></join>
<msg channel="#revctrl" nick="abentley" time="2005-07-30T00:00:19Z">zooko: correct.  You said:  However, I find it hard to think of more &quot;realistic&quot; examples in the realm of software development.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-30T00:00:42Z">So this was a more realistic example.</msg>
<msg channel="#revctrl" nick="abentley" time="2005-07-30T00:00:48Z">As in real :-)</msg>
<msg channel="#revctrl" nick="zookofamilytime" time="2005-07-30T00:17:35Z">Okay, I&apos;ve understood your example.</msg>
<join channel="#revctrl" nick="njs" time="2005-07-30T00:27:30Z"></join>
<join channel="#revctrl" nick="pperez" time="2005-07-30T00:32:27Z"></join>
<part channel="#revctrl" nick="graydon" time="2005-07-30T02:36:50Z"></part>
<join channel="#revctrl" nick="mass" time="2005-07-30T03:34:55Z"></join>
<join channel="#revctrl" nick="rcohen" time="2005-07-30T04:02:45Z"></join>
<join channel="#revctrl" nick="graydon" time="2005-07-30T04:03:16Z"></join>
<join channel="#revctrl" nick="zookofamilytime" time="2005-07-30T04:21:50Z"></join>
<join channel="#revctrl" nick="pperez" time="2005-07-30T04:21:56Z"></join>
<join channel="#revctrl" nick="njs`" time="2005-07-30T04:22:45Z"></join>
<join channel="#revctrl" nick="mass" time="2005-07-30T04:22:53Z"></join>
<join channel="#revctrl" nick="graydon" time="2005-07-30T04:24:34Z"></join>
</irclog>
