| Oh Most High and Puissant Emacs, please be in -*- outline -*- mode! | |
| Some ideas for the future. | |
| (Please use outline-mode format for this file.) | |
| * todo: move the ideas in doc/future.texi to here | |
| Because plaintext/outline is less of a barrier to adding new ideas | |
| than texinfo format; this should be a pretty informal file. | |
| * Write platform neutral parsing of diff output to fill in enough | |
| data structures in order to drive UI dependant rendering of a visual | |
| diff very similar to xxdiff. | |
| * shell-like interactive mode for client (like ftp) | |
| From: John P Cavanaugh <cavanaug@soco.agilent.com> | |
| Subject: A feature request for command line client | |
| To: dev@subversion.tigris.org | |
| Date: Tue, 17 Oct 2000 09:46:58 -0700 | |
| I know people are beginning to work on the command line client, so I | |
| hope Im not too late with this request. | |
| Basically I would like svn to behave like ftp (actually more like lftp | |
| or ncftp). | |
| What this means is that if you type just "svn<return>" you get dropped | |
| into an interactive svn shell where you can type a litany of commands. | |
| Preferably this happens without relogging into the server etc. | |
| Example: | |
| cavanaug@lajolla ~ 1% svn | |
| svn> status foo.c | |
| output of command | |
| svn> commit bar.h | |
| output of command | |
| svn> cd subdir | |
| svn> status README | |
| output of command | |
| svn> quit | |
| cavanaug@lajolla ~ 2% svn | |
| Personally I think this is a really convenient way to operate | |
| interactively on a directory without having to continually re-run the | |
| svn client. | |
| Plus this is method is a godsend if you want to write scripts that | |
| automate svn. (ie. Perhaps like the cvs2svn or xxx2svn) | |
| John Cavanaugh Agilent Technologies | |
| R&D Program Manager 1400 Fountaingrove Pkwy | |
| CAD Data Store Santa Rosa, CA 95403-1799 | |
| Email: cavanaug@soco.agilent.com Phone: 707-577-4780 | |
| 707-577-3948 (Fax) | |
| ** Command-line editing libraries with more liberal licenses | |
| From: Dave Glowacki <dglo@ssec.wisc.edu> | |
| <snip> | |
| There's 'getline', which doesn't have all of readline's features, | |
| but which does basic editing. ncftp and tin can be built with | |
| getline instead of readline, so it does a decent enough job. | |
| You can find it at ftp://ftp.sco.com/skunkware/src/lib/getline-39-src.tar.gz | |
| getline.c says: | |
| /* | |
| * Copyright (C) 1991, 1992, 1993 by Chris Thewalt (thewalt@ce.berkeley.edu) | |
| * | |
| * Permission to use, copy, modify, and distribute this software | |
| * for any purpose and without fee is hereby granted, provided | |
| * that the above copyright notices appear in all copies and that both the | |
| * copyright notice and this permission notice appear in supporting | |
| * documentation. This software is provided "as is" without express or | |
| * implied warranty. | |
| * | |
| <names snipped> | |
| ** Useful for integration with Emacs, etc. | |
| When integrating Subversion support into Emacs vc-mode, using the | |
| interactive mode wold avoid having to start a new process for each | |
| operation. This wold be useful even without readline or getline. | |
| -- Brane Cibej <brane@xbc.nu> | |
| * possible cvs-compatibility wrapper for svn | |
| Daniel Stenberg <daniel@haxx.se> wrote: | |
| ... no matter how the command line interface for SVN ends up like, it | |
| would still be cool to offer a 'stealth-mode' SVN client that would | |
| look and feel exactly (well, as similar as it can) like a cvs | |
| client... | |
| "Jonathan S. Shapiro" <shap@eros-os.org> replied: | |
| Wouldn't Perl be good for this? | |
| Why crud up the new system with compatibility code? | |
| Dave Glowacki <dglo@ssec.wisc.edu> further opined: | |
| I agree, and I also support Jonathan Shapiro's idea that a | |
| cvs-compatibility wrapper could be written in Perl and would simply | |
| map the CVS options to the Subversion options (and maybe echo the | |
| proper 'svn' options back so that it'd serve as a learning tool as | |
| well.) | |
| That way, Subversion can have its own options (-r instead of -R) | |
| and not have to worry about the CVS cruft like '-d' meaning one | |
| thing as a global option and another thing as a command option. | |
| * svndiff encoders/decoders | |
| A shell script or elisp to encode/decode/view base64-svndiff data? | |
| For example: "make-svndiff.pl SRCFILE TARGETFILE > blah.svndiff" | |
| "read-svndiff.pl SRCFILE blah.svndiff > TARGETFILE" | |
| "M-x svn-decode-region" (displays the data and opcodes) | |
| etc | |
| Not crucial, just development and debugging help. | |
| * split libsvn_WC into two components | |
| split into: one for managing the metadata (the stuff in ./SVN/), and one | |
| for the rest of the WC functionality (crawling and updating). This would | |
| provide a way to use multiple metadata storage and management options, | |
| possibly optimized for the platform at hand. | |
| Alternate storage options: separate file streams (NTFS streams, MacOS | |
| resource forks), a single database of data (rather than per-dir), or | |
| server-based storage (via DeltaV) | |
| Benefit of a single database: apps/systems that nuke a directory and | |
| rewrite it will no longer "unhook" the working copy from SVN (since | |
| the data is stored elsewhere). Fred Sanchez has pointed out this | |
| could be important for MacOS Bundles (the OS nukes and rebuilds | |
| subdirs, taking the CVS/ or SVN/ subdir with it) | |
| Benefit of a "true" database: there is a lot of effort expended in | |
| the current libsvn_wc to transact the changes, record logs of | |
| changes, and to perform them in an atomic manner. A transacted | |
| database on the client side could potentially simplify much of that | |
| work (and the corresponding I/O to track it). | |
| * Server side project policy enforcement | |
| From: Branko Cibej <brane@xbc.nu> | |
| Date: Mon, 23 Oct 2000 18:37:49 +0200 | |
| I'd be quite happy if we could "promise" that someday it'll be possible | |
| to write a script on the SVN server side to, e.g., reject an export | |
| if an explicit tag wasn't supplied; or reject a commit if there were | |
| merge conflicts; etc., etc. Then all of this boils down to putting | |
| examples into contrib/ (once we have it). | |
| * svn sync | |
| Imagine an intelligent update that knows to add new files and remove | |
| files that you've removed, and all recursively (without having to svn | |
| add, svn rm, ad nauseam). | |
| So, for example, you've got: | |
| $ ls -1 | |
| foo.c | |
| bar.c | |
| $ touch qux | |
| $ touch qux/fizzle | |
| $ touch qux/smootch | |
| $svn up | |
| ? qux | |
| M foo.c | |
| $ rm bar.c | |
| * | |
| $ svn sync | |
| A qux | |
| A qux/fizzle | |
| A qux/smootch | |
| M foo.c | |
| R bar.c | |
| $ svn ci -m "Boy have I been busy." | |
| ... | |
| * Note, that if you were to do an update at this point, bar.c would be | |
| pulled from the repository | |
| -Fitz | |
| * Reserved and unreserved checkouts | |
| From Karl Fogel <kfogel@collab.net> | |
| Brian Behlendorf <brian@collab.net> writes: | |
| > I would also ask that reserved checkouts not be made impossible to | |
| > do, for the same reasons. | |
| Oh, not to worry -- nothing in the current design makes them | |
| impossible to implement later. It's a matter of the repository | |
| keeping records about who has checked out what, that's all. | |
| To prove that it's not a problem, here's an implementation: | |
| 1. Client A requests a reserved checkout of tree T | |
| 2. Server sets a non-historical property on T noting that client | |
| has reserved it and sends T to client. | |
| 3. Client B tries to commit to T, the commit fails because the | |
| repository notices the property. | |
| 4. Client A releases the reservation. Server removes the | |
| non-historical property. | |
| 5. Client B commits and succeeds. | |
| With a flexible server-side hook interface, such as Subversion will | |
| have, you don't even need much (any?) extra code in Subversion itself | |
| to support this. | |
| From Branko Cibej <brane@xbc.nu> | |
| Jim Blandy wrote: | |
| > I think the most interesting issues here are in the human interface | |
| > side of things. I designed `cvs watch' and `cvs edit', and they suck | |
| > rocks. Nobody can remember how you're supposed to do things. Perhaps | |
| > someone on the list could describe a reserved checkout interface they | |
| > enjoyed using... | |
| [snip] | |
| As for user interface thingies ... Off the top of my head I'd propose | |
| something like this, given the following commands: get, update, commit | |
| checkout, checkin: | |
| get: | |
| create working copy, making files writable or not depending | |
| on each file's reserved-checkout policy; | |
| update: | |
| update the WC, with same behaviour WRT file flags; | |
| commit: | |
| commit changes in the usual way, /without/ changing | |
| file flags or lock status; | |
| checkout: | |
| update, and for files with unreserved checkout policy, | |
| lock it and make it writable; With appropriate permissions, | |
| can override the file's checkout policy (with a flag) until | |
| the next checkin; | |
| checkin: | |
| commit, and if it was locked, unlock it and set the file | |
| flag according to the file's checkout policy (meaning that | |
| it might become readonly, or it might not). | |
| Note that when I say "file", I should in fact say "object version". | |
| You might want to allow unreserved checkouts on files, for instance, | |
| but require reserved checkouts for directories when adding new | |
| objects. | |
| Notice that we get paired commands: `update' vs. `checkout', `commit' | |
| vs. `checkin'. This means that `checkout' and `checkin' should behave | |
| like `update' and `commit', respectively, on files with unreserved | |
| checkout policy. Maybe we don't even need pairs of commands, just a | |
| flag for `update' to change the checkout policy for the current update? | |
| Maybe `status' should show locks on files? Perhaps another command | |
| would be better for that, so as not to slow down `status'. Should | |
| show a) locks on working-copy branch; b) locks on all branches. | |
| Users with appropriate privileges would be allowed to break locks. | |
| -- Brane Cibej <brane@xbc.nu> | |
| * Handling conflicts in the client and working copy | |
| From Branko Cibej <brane@xbc.nu> | |
| Ben Collins-Sussman wrote: | |
| > | |
| > > Branko =?iso-8859-2?Q?=C8ibej?= <brane@xbc.nu> writes: | |
| > > | |
| > > I thought it should be possible for status to report that a file is | |
| > > currently in conflict? After an update, of course. Oh, that would be | |
| > > nice! Let's not have any ">>>>>>"'s in working copy files, let's not | |
| > > have to update to see conflicts ... | |
| > | |
| > | |
| > Sounds like some bells and whistles -- a good idea, but of course this | |
| > goes beyond what CVS does, which is all we're trying to do at this | |
| > moment. | |
| > | |
| > Right now, the `status' command just grabs a version number | |
| > from the repository. Perhaps we can eventually pass an extra flag | |
| > which makes it fetch the *entire* repos file and attempt to merge it | |
| > in a scratch area. | |
| > | |
| > Of course, this starts to blur the line between `status' and `update'. | |
| Notice what I said above: "After an update, of course." | |
| I see it working like this: when update detects a conflict, it stores | |
| the current repository version of the file somewhere in the admin | |
| directory, probably near the stored original version. Status would | |
| just look if that locally stored version exists, and subsequent | |
| updates would pull in a new version, or remove it if the conflict goes | |
| away. Extra bonus: you can do a three-way merge locally. | |
| > Suppose the status command tells you that your locally modified file | |
| > is currently in conflict. What then? What are you going to do about | |
| > it? Do you expect to see the conflict in a scratch area? Are you | |
| > going to update that one file to see the conflict? I'm not sure I | |
| > understand what itch is being scratched. | |
| a) You don't have to do an update to check if you currently have any | |
| conflics; b) you can still compile in the local copy without tripping | |
| over those wakas; c) works well for binary files that can have special | |
| merge tools; d) etcetera ad nauseam. | |
| Here's how `update', `status' and `commit' could cooperate: | |
| update: | |
| If there is a conflict, put the text of the current repository | |
| version into SVN/conflicts. Could also store a diff against | |
| the pristine copy in SVN/text-base, instead. | |
| If a conflict is resolved by a later update, remove the entry | |
| in SVN/conflicts. | |
| status: | |
| Report `C' instead of `M' if the entry in SVN/conflicts | |
| exists. This operation is completely local. | |
| commit: | |
| Refuse commit if there is a conflict. Should not do only a | |
| local check, as the user may have resolved the conflict in | |
| the meantime. If successful, remove the entry in | |
| SVN/conflicts. | |
| Could have a --force flag to force the commit anyway; could | |
| allow or forbid --force based on user privileges or repository | |
| policy. | |
| Declaring a "pure" merge (see list archives, can't find that thread | |
| right now) could remove the entry in SVN/conflicts, too. | |
| * convert functionality (JimB's idea) | |
| provide a svn command to add versioning metadata (SVN directories | |
| and whatnot) to a local directory tree that is (presumably) the | |
| equivalent of a working copy without the SVN directories. | |
| svn convert local-dir repository | |
| Did I get that right? -Fitz | |
| * repository commands | |
| the ability to do repository operations from the client via the 'svn | |
| repo' subcommand. | |
| * use a format string to construct ``svn status'' output | |
| Because `svn status' seems like a very convenient vehicle for | |
| supplying arbitrary information that a script may wish to extract. | |
| What if `svn status' had a standard, default display that was | |
| configured with a format string. That format string could be | |
| over-ridden with an option (``--format=....'') and we made an | |
| option alias or two for formats that were likely to be commonly | |
| used? Here is an approximation that would likely be abbreviated: | |
| --format="%{obj-name}: %{ver=TAG} vs. %{local-ver} is %{mod-state}\n" | |
| So, if TAG were associated with the 1234 version of object mumble, | |
| but the local copy were version 1222 but unchanged, you get: | |
| mumble: 1234 vs. 1222 is unchanged | |
| - Bruce | |
| * Interoperate with CVS servers | |
| Create libsvn_ra_cvs (client mode only, maybe just :pserver: and :ext:, | |
| and possibly :fork: for accessing local repositories). | |
| This will let a Subversion client pull modules directly out of CVS | |
| repositories. Could be very interesting in combination with | |
| configuration nodes in the SVN filesystem. | |
| Rationale: Don't expect all the world to switch to SVN after 1.0. And | |
| we'll still want to pull APR into the SVN working copy, so this would | |
| be a direct benefit to the project (once /we/ switch). | |
| Question; Would it be better to pull the code out of the CVS sources, | |
| or write it to the CVSclient spec? | |
| Brane Cibej <brane@xbc.nu> | |
| * Random access to delta-encoded files | |
| Several features collude to produce a challenge: | |
| - HTTP provides the ability to fetch substrings of files. | |
| - Subversion provides a uniform interface for reading both old and new | |
| versions of nodes. | |
| - Subversion wants to use deltas to store multiple versions of a file | |
| in a compact way. | |
| So, suppose an HTTP request comes in for bytes 1,000,000,000 through | |
| 1,000,004,000 of a two-gigabyte file, which happens to be stored in | |
| the repository as the result of applying ten deltas to another | |
| two-gigabyte file which is stored in fulltext. It would be nice if it | |
| were possible to extract the requested bytes without reconstructing | |
| the full text of the file. | |
| In other words, we'd like random access to the result of applying a | |
| text delta to some source string. | |
| I was thinking of extending the svndelta format with a hierarchical | |
| index, a B+tree of delta windows: after every tenth window, store a | |
| little table of pointers to the windows. After every tenth little | |
| table, store a little table of pointers to little tables of pointers | |
| to windows. After every tenth... you see what I mean. Then you can | |
| start at the end of the file and find any window in logarithmic time. | |
| That procedure always emits balanced trees. Use 100 instead of ten, | |
| and your tree has 1/100th the number of nodes as your file has | |
| windows, and is very shallow. | |
| * Removing obsolete versions to archive | |
| A project repository can grow huge over several years. Would be nice | |
| to have a way to move obsolete data to archive or offline | |
| storage. Some possibilities: | |
| - Move just the file text offline (e.g., support "offline" file | |
| nodes in addition to full-text and delta storage), but keep | |
| history and filesystem metadata intact. We can do this with the | |
| current filesystem design. | |
| - Remove whole branches or parts of branches (this could mean whole | |
| nodes) from the filesystem. The current filesystem design does not | |
| support this; right now we could do that by copying part of the | |
| repository (via xml export?) to a new database and removing the | |
| old one, but that would change node numbers and filesystem | |
| revision numbers, which we probably don't want. | |
| Brane Cibej <brane@xbc.nu> | |
| * Revise the editor interface to use paths rather than components? | |
| Either revise the interface itself to pass around complete paths [from | |
| the root], or possibly have a "wrapping editor" that assembles paths | |
| and calls a secondary editor interface which uses the path-style | |
| API. The wrapping editor would have something like: | |
| struct dir_baton { | |
| svn_string_t *path; | |
| void *user_dir_baton; | |
| struct edit_baton *edit_baton; | |
| } | |
| change_dir_prop(void *baton, ...) | |
| { | |
| struct dir_baton *my_baton = baton; | |
| delta_fns_t editor = my_baton->edit_baton->editor; | |
| (*editor->change_dir_prop)(my_baton->user_dir_baton, ...); | |
| } | |
| This idea is premised on the number of editors that compose the | |
| components into larger paths before working on them. Depending on | |
| whether that is "typical", switching the interface might be | |
| interesting. |