You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ne...@apache.org on 2011/08/25 01:34:56 UTC

svn commit: r1161317 - /subversion/trunk/notes/hold

Author: neels
Date: Wed Aug 24 23:34:56 2011
New Revision: 1161317

URL: http://svn.apache.org/viewvc?rev=1161317&view=rev
Log:
* notes/hold: (1/2) This is what julianfoad had to say...

Modified:
    subversion/trunk/notes/hold

Modified: subversion/trunk/notes/hold
URL: http://svn.apache.org/viewvc/subversion/trunk/notes/hold?rev=1161317&r1=1161316&r2=1161317&view=diff
==============================================================================
--- subversion/trunk/notes/hold (original)
+++ subversion/trunk/notes/hold Wed Aug 24 23:34:56 2011
@@ -16,25 +16,43 @@ USE CASES
 Do not commit modifications on selected files, which do have to be versioned,
 because...
 
-(1) CONVENIENCE
-File 'foo' is modified with every click made in my IDE. I want 'foo' to be
-skipped on commits unless I explicitly ask svn to commit it. (Instead of
-having to take explicit care on every commit to omit the file.)
-
-(2) LOCAL/GLOBAL
-Since all other developers use the same IDE, I want to have the option to tell
-all other working copies to hold back 'foo' as well -- but only if all agreed
-to that. Else I want to just hold locally.
-
-(3) SECRET
-Every user must locally add their passwords and PIN numbers to file 'foo'.
-By default, every working copy should exclude 'foo' from commits. We don't
-want any user's mods of 'foo' to even go over the wire (ruling out hooks).
+(UC1) IDE CONFIG FILE, LOCAL
+  File 'foo' is modified with every click made in my IDE: it updates a time
+  stamp. I want 'foo' to be skipped on commits unless I explicitly ask svn
+  to commit it. (Instead of having to take explicit care on every commit to
+  omit the file.)
+
+(UC2) IDE CONFIG FILE, GLOBAL
+  Building on [1].  Since all other developers use the same IDE, I want to
+  tell all other working copies to hold back 'foo' as well, if they all
+  agree to that.
+
+(UC3) IDE CONFIG FILE, GLOBAL AND SECRET
+  Building on [2].  Every user must locally add their passwords and PIN
+  numbers to file 'foo'.  By default, every working copy should exclude
+  'foo' from commits.  We don't want any user's mods of 'foo' to even go
+  over the wire.  (This last point rules out hooks.)
+
+(UC4) - Eclipse directory, from issue #3028.
+  "We have a complete Eclipse instance in our svn repository and we want
+  to ignore every change in its directory and below. Because Eclipse
+  more or less at random creates and deletes file from its own directory
+  we have no way of knowing which individual files may be change or
+  deleted by starting Eclipse."  An update should not re-create files
+  that were deleted from disk by Eclipse.  Let's say a 'global' hold is
+  required as in [UC2].
 
 
-LEGEND:
+LEGEND
+======
+
   'held-back file': A file that's excluded from a commit by svn:hold.
 
+  'overridden': The effect of the 'hold' may be overridden by telling
+      Subversion not to ignore the modifications on a held-back file that it
+      otherwise would have ignored. The syntax and scope (per file, per
+      command or per user) of the override is described in [8].
+
 
 DETAILS
 =======
@@ -46,6 +64,7 @@ DETAILS
 (5a) BOOLEAN
      A file is held-back iff it has an svn:hold property, with whichever
      value, even empty. A fixed set of subcommands heeds svn:hold.
+     ### JAF: As specified under SUBCOMMANDS, below.
  OR
 (5b) LIST OF STRINGS
      The value of 'svn:hold' determines which subcommands hold the file:
@@ -65,12 +84,25 @@ should not be allowed to be set on direc
 put on hold, users can do 'svn propset -R'. Such a recursive propset should
 not error out on the first dir encountered, but instead print a warning that
 svn:hold was only added to the files, ignoring the dirs.
+  ### JAF: So this rules out use case [UC4].
+  ### JAF: A recursive propset should warn or not warn in exactly the same
+      way as a recursive propset of any other file-only property, whatever
+      that way is, if those are already self-consistent, unless there is a
+      good reason to do otherwise.
 
 (7) LOCAL HOLD
 The svn:hold property already acts when it is added locally. This provides a
 way to hold back files in only the local working copy, no other users nor the
 repository is affected. See [2].
 
+    ### JAF: Specifically, a file is held back iff the 'svn:hold' property
+      as described in [5] is set on the working version in the WC,
+      regardless whether it's set on the WC base version. One consequence is
+      that a file scheduled for delete is no longer held back from commit.
+
+    ### JAF: It seems the principle is that the hold applies only to text
+        and property modifications, not to tree changes.
+
 (8) GLOBAL HOLD
 There must be a --do-not-hold option to 'svn commit'. This allows committing
 the 'svn:hold' propadd to the repository, so that it is added to every other
@@ -81,6 +113,14 @@ could mean "ignore the held-back files" 
 or even "commit everything except the svn:hold propadd". --do-not-hold and
 --disable-hold are the only ones I found that aren't ambiguous like that.
 
+### JAF: Alternatively we could say that files are not held back if they are
+    explicitly named targets to the 'commit' (or other) command.  That has
+    the advantages of consistency with the way svn:ignore and depth behave,
+    and of avoiding another command-line option.  It does not provide an
+    easy way to specify all the files in a subtree, but the feature is not
+    suited to ignoring a whole subtree [UC4] so this is not really a
+    disadvantage.
+
 
 SUBCOMMANDS
 So far, no real point has been made to justify ignoring file mods on any other
@@ -90,12 +130,31 @@ command except 'commit'. I am adding som
   to read about them in a diff of local mods. (Held-back files should *not*
   omit already-committed modifications.)
 
+  ### JAF: What do you mean by 'omit already-committed modifications'? Do
+      you mean a repos-repos or repos-WC diff should always show all
+      differences, or do you mean a repos-WC diff should always diff to
+      the WC base rather than the working version, or something else?
+
+  ### JAF: So, what's the exact behavioural spec? A repos-repos diff shall
+      show all changes as usual. Unless overridden, a WC-WC diff shall omit
+      local mods on a held-back file. Unless overridden, a repos-WC diff
+      shall omit local mods on a held-back file, by diffing against the base
+      version even if the working version is requested. Diff shall display
+      an added/deleted/replaced file in the usual way, including any
+      modifications against the copy-from source, regardless of the
+      held-back status.
+
   (11) COPY:
     (12) WC-TO-URL: Copying locally added secrets [3] to a URL is fatal. Any
     WC-to-URL copy of held-back files should
       (12a) exclude local mods, or
+            ### JAF: No, don't silently ignore local mods: they might be
+                intentional and important. The behaviour of copies is well
+                established: if you request -rBASE as the source, you copy
+                the base, else you copy the working version. Instead: [12b].
       (12b) just bail if there are local mods, unless they get a --do-not-hold
             option. (probably easier to do, until [12a] gets implemented)
+
     (13) WC-TO-WC: A WC copy or move will also copy the svn:hold property, and
     thus isn't that dangerous for [3]. But when a WC-to-WC copy of a subtree
     that has a held-back file inside is finally committed, the BASE node of
@@ -103,24 +162,42 @@ command except 'commit'. I am adding som
     completely would imply a delete within the added tree. So a commit
     should take care to add files that are held-back, but skip all local
     modifications.
+    ### JAF: No, don't silently ignore local mods: they might be intentional
+        and important. Instead:
+        (13b) Error out if the commit includes a held-back copied file with
+              local mods and does not specify the do-not-hold option.
+
     (14a) Committing BASE nodes for added held-back files should be limited to
           copied/moved files, i.e. where the BASE is nonempty. Simply-added
           held-back files should not be added to the repos at all.
      OR
     (14b) If a held-back file is simply-added (not copied/moved), just add an
           empty file with no props except svn:hold to the repository.
+    ### JAF: No, don't silently omit the file or commit an empty file.
+        That's stepping outside the territory that this feature should be
+        involved in. Instead:
+        (14c) Error out if the commit includes a held-back added file and does
+              not specify the do-not-hold option.
 
   (15) STATUS:
   (15a) 'svn status' should show mods on held-back files iff they are
         modified, with an added status indicator like 'H'.
+        ### JAF: (And show added/deleted/replaced held-back files as usual.)
    OR
   (15b) 'svn status' should omit held-back files even if modified,
         unless --show-hold is supplied.
+        ### JAF: (And show added/deleted/replaced held-back files as usual.)
 
   (16) UPDATE: Holding off updates from a file could be desirable, but I can't
   think of any real situation that needs this. If holding back updates is ever
   implemented, it should definitely be optional, as in [5b]. See also [19]!
 
+  ### JAF: No known use case => no special behaviour except [19]; enough said.
+      So: Update shall issue a warning if it removes the held-back status
+      from a file. In all other respects, update shall act as usual: for
+      example, if update deletes a held-back file with local mods, it shall
+      raise a tree conflict in the usual way.
+
   (17) MERGE: Holding off merges from single files is pure madness. Alas, the
   whole topic of svn:hold is a nightmare in merge land. Users have to take
   great care to do The Right Thing: If you merge committed modifications on a
@@ -130,14 +207,24 @@ command except 'commit'. I am adding som
   the 'svn:hold' property in the local working copy, and that, for basic
   sanity, --do-not-hold should be supplied at commit time. See also [19]!
 
+  ### JAF: So: Merge shall issue a warning if it modifies, adds, deletes or
+      replaces a held-back file (one that is/was held back before and/or
+      after the merge). Merge shall issue a warning if it changes the
+      held-back status of a file that has local mods.
+
   (18) SWITCH: Switch should go ahead as always. All it does is pull other
   BASE nodes in under the local mods, so there is no danger of anything
   leaking around. But see [19]!
 
+  ### JAF: Switch is very similar to update, so see [16].
+
   (19) UPSTREAM REMOVES 'svn:hold': Users must be warned when update, switch
   or merge remove the 'svn:hold' property from a file that had local mods.
   They should maybe even flag some (new??) kind of conflict. See also [31].
 
+  ### JAF: This is a principle of the design. Maybe you could move all the
+  principles to a section before this SUBCOMMANDS section.
+
 
 PERFORMANCE DURING COMMIT
   (20) USUALLY FAST: