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/21 01:33:37 UTC
svn commit: r1159924 - /subversion/trunk/notes/hold
Author: neels
Date: Sat Aug 20 23:33:37 2011
New Revision: 1159924
URL: http://svn.apache.org/viewvc?rev=1159924&view=rev
Log:
* notes/hold: New file; about what's currently going on on the 'hold' branch.
Added:
subversion/trunk/notes/hold (with props)
Added: subversion/trunk/notes/hold
URL: http://svn.apache.org/viewvc/subversion/trunk/notes/hold?rev=1159924&view=auto
==============================================================================
--- subversion/trunk/notes/hold (added)
+++ subversion/trunk/notes/hold Sat Aug 20 23:33:37 2011
@@ -0,0 +1,186 @@
+Feature Outline: Issue #2858 / svn:hold
+=======================================
+
+This text describes plans and concerns about creating an svn:hold property that
+automatically omits paths from commits that have this property set. WIP.
+$Date$
+
+When there are multiple options, I made my preferred solution the a) option,
+and the less preferred one the b) option. This is just my personal opinion.
+Actually, at the time of writing, this whole file is ;)
+
+
+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).
+
+
+LEGEND:
+ 'held-back file': A file that's excluded from a commit by svn:hold.
+
+
+DETAILS
+=======
+
+(4) NAME
+ The property is called "svn:hold".
+
+(5) VALUE
+(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.
+ OR
+(5b) LIST OF STRINGS
+ The value of 'svn:hold' determines which subcommands hold the file:
+ - commit: holding back upon commit is *always* implied.
+ - diff: Omit local mods of held-back files from diff.
+ - status: Entirely omit the file from 'svn status' output.
+ - copy: The file should only be copied without the local modifications.
+ - merge: Don't merge onto the file.
+ - update: Don't update the file, and, in consequence, don't commit it.
+ - ...?
+
+
+(6) NODE KINDS
+Only files should be held-back. 'svn:hold' should not act recursively (for
+performance and implementation complexity reasons?), and actually, 'svn:hold'
+should not be allowed to be set on directories. If an entire subtree should be
+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.
+
+(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].
+
+(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
+working copy, resulting in a global hold-by-default.
+NOTE: My preferred option names would have been --ignore-hold or --no-hold,
+but unfortunately, both are ambiguous. Depending on the user's intuition, they
+could mean "ignore the held-back files" or "ignore that files are held-back"
+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.
+
+
+SUBCOMMANDS
+So far, no real point has been made to justify ignoring file mods on any other
+command except 'commit'. I am adding some as I type:
+
+ (10) DIFF: if local modifications don't get committed, then there's no need
+ to read about them in a diff of local mods. (Held-back files should *not*
+ omit already-committed modifications.)
+
+ (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
+ (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
+ the held-back file should indeed be added. Omitting the held-back file
+ 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.
+ (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.
+
+ (15) STATUS:
+ (15a) 'svn status' should show mods on held-back files iff they are
+ modified, with an added status indicator like 'H'.
+ OR
+ (15b) 'svn status' should omit held-back files even if modified,
+ unless --show-hold is supplied.
+
+ (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]!
+
+ (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
+ locally held-back file, the merge result for it will not be committed --
+ even if there had not been any local modifications on the held-back file.
+ 'svn merge' should issue a warning that it has merged files that (now) have
+ 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]!
+
+ (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]!
+
+ (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].
+
+
+PERFORMANCE DURING COMMIT
+ (20) USUALLY FAST:
+ In the current trial implementation on the 'hold' branch, the 'svn:hold'
+ property is evaluated only on the files that have made it all the way
+ through harvest_committables() with a modified status. Usually, only very
+ few files compared to the entire WC tree get committed, and this feature
+ only adds CPU time for those very few files that are modified.
+
+ (21) NON-USUALLY O(n):
+ When merging, or sometimes anyway, it can happen that up to *all* files of a
+ WC are modified and would be committed. This would add a little propget CPU
+ time to every file walked over. (Perf-loss is linear to the amount of files)
+
+ (22) WORK AROUND PERF LOSS:
+ Issuing --do-not-hold on the commit commandline makes commit
+ as fast as it was before svn:hold. Could make sense if a lot of files are
+ modified and none of them are / need to be held-back.
+
+ (23) OPTIMIZATION:
+ Assuming props will always be stored as a skeld BLOB in wc.db, and assuming
+ users get noticeable slowness from svn:hold, a column could be added to
+ the NODES table indicating presence of an 'svn:hold' prop per node.
+ - (24) A commit could quickly scan if there are any nodes on hold in the WC
+ at all and pass --do-not-hold implicitly to obtain [22].
+ - (25) A commit would already get a held-back flag during read_info, making
+ the propget superfluous if [5a] svn:hold is a boolean, and even in [5b]
+ (list-of-strings), as hold-back on commit would always be implied.
+
+
+PERFORMANCE DURING OTHER SUBCOMMANDS
+ (30) PERF LOSS BY CHECKS
+ There are additional checks added to merge, switch and update by [19].
+ All those checks are still O(n), and checks can be skipped by certain
+ already-known indicators (like no local mods, no propchanges, ...).
+
+ (31) WORK AROUND PERF LOSS
+ A --no-hold-warnings option for update/merge/switch could disable above
+ checks. Useful if the user knows there are no local mods that need hold
+ protection and wants speedup, or even just nonverbosity.
+ Note that a step like [24] won't work here, as update/merge/switch may bring
+ in new svn:hold properties.
+
+ (32) STATUS
+ 'svn status' has to evaluate one more prop per modified file.
+
Propchange: subversion/trunk/notes/hold
------------------------------------------------------------------------------
svn:keywords = Date