subwrap 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'facets/more/filelist' if !defined?(FileList)
3
+
4
+ module Project
5
+ PrettyName = "Subwrap: Enhanced Subversion Command"
6
+ Name = "subwrap"
7
+ RubyForgeName = "subwrap"
8
+ Version = "0.3.5"
9
+ Specification = Gem::Specification.new do |s|
10
+ s.name = Project::Name
11
+ s.summary = "A nifty wrapper command for Subversion's command-line svn client"
12
+ s.version = Project::Version
13
+ s.author = 'Tyler Rick'
14
+ s.description = <<-EOF
15
+ This is a wrapper command for Subversion's command-line svn client that adds a few new subcommands.
16
+ EOF
17
+ s.email = "rubyforge.org@tylerrick.com"
18
+ s.homepage = "http://#{Project::RubyForgeName}.rubyforge.org/"
19
+ s.rubyforge_project = Project::Name
20
+ s.platform = Gem::Platform::RUBY
21
+ s.add_dependency("colored")
22
+ s.add_dependency("escape")
23
+ s.add_dependency("facets")
24
+ s.add_dependency("quality_extensions")
25
+ s.add_dependency("rscm")
26
+ s.post_install_message = <<-End
27
+ ---------------------------------------------------------------------------------------------------
28
+ IMPORTANT: If you want Please run sudo _subwrap_post_install to finalize the installation.
29
+
30
+ Also, it is recommended that you install the termios gem so that you don't have to press enter
31
+ after selecting an option from the menu, but it will work without it.
32
+ ---------------------------------------------------------------------------------------------------
33
+ End
34
+
35
+ # Documentation
36
+ s.has_rdoc = true
37
+ s.extra_rdoc_files = ['Readme']
38
+ s.rdoc_options << '--title' << Project::Name << '--main' << 'Readme' << '--line-numbers'
39
+
40
+ # Files
41
+ s.files = FileList[
42
+ '{lib,test,examples}/**/*.rb',
43
+ 'bin/*',
44
+ 'ProjectInfo.rb',
45
+ 'Readme'
46
+ ].to_a
47
+ s.test_files = Dir.glob('test/*.rb')
48
+ s.require_path = "lib"
49
+ s.executables = ['command_completion_for_subwrap', '_subwrap_post_install', 'subwrap']
50
+ #s.executables = "svn" # Doing this actually causes RubyGems to override the existing /usr/bin/svn during install. Not good!
51
+ end
52
+ end
53
+
54
+
data/Readme ADDED
@@ -0,0 +1,458 @@
1
+ = <i>Enhanced Subversion command</i> -- an +svn+ command wrapper
2
+
3
+ [<b>Environment</b>:] Command line (text based)
4
+ [<b>Home page</b>:] http://subwrap.rubyforge.org/
5
+ [<b>Project site</b>:] http://rubyforge.org/projects/subwrap
6
+ [<b>Gem install</b>:] <tt>gem install subwrap</tt>
7
+ [<b>Author</b>:] Tyler Rick
8
+ [<b>Copyright</b>:] 2007 QualitySmith, Inc.
9
+ [<b>License</b>:] {GNU General Public License}[http://www.gnu.org/copyleft/gpl.html]
10
+
11
+ == What is it?
12
+
13
+ This is a replacement <b><tt>svn</tt> command-line client</b> meant to be used instead of the standard +svn+ command. (Actually, it's a _wrapper_, not a strict replacement, because it still uses <tt>/usr/bin/svn</tt> to do all the dirty work.)
14
+
15
+ == Installation
16
+
17
+ === Dependencies
18
+
19
+ * colored
20
+ * escape
21
+ * facets
22
+ * extensions
23
+ * quality_extensions
24
+ * rscm
25
+ * termios (recommended, but no longer required)
26
+ * win32console (Windows only, required for colored to work)
27
+
28
+ === Installation: Once per _system_
29
+
30
+ * Install the gem (with dependencies):
31
+
32
+ sudo gem install subwrap --include-dependencies
33
+
34
+ This command will be available immediately by typing +subwrap+ instead of +svn+. If you'd like to actually _replace_ the standard +svn+ command (that
35
+ is, if you'd like to be able to run it simply by typing +svn+), then you you will also need to run <tt>sudo _subwrap_post_install</tt>, which will
36
+ attempt to do the following (or you can do this manually):
37
+
38
+ * (POSIX only:) Make the svn wrapper command *executable*:
39
+
40
+ sudo chmod a+x /usr/lib/ruby/gems/1.8/gems/subwrap*/bin/*
41
+
42
+ (Note: We can't just set <tt>executables = "svn"</tt> in the gemspec and have it automatically install it to /usr/bin because that would cause it to <b>wipe out</b> the existing executable at <tt>/usr/bin/svn</tt>! If you know of a better, more automatic solution to this, please let the developers know!)
43
+
44
+ === Installation: Per user
45
+
46
+ *Important*: You need the gem's +bin+ directory to be added to the <b><i>front</i></b> of your path. You may run <tt>_subwrap_post_install</tt>, which will attempt to do this for you, or you can do it manually:
47
+
48
+ * (POSIT only:) Add a <tt>PATH=</tt> command to your <tt>~/.bash_profile</tt> (or equivalent). For example:
49
+
50
+ export PATH=`ls -dt --color=never /usr/lib/ruby/gems/1.8/gems/subwrap* | head -n1`/bin:$PATH"
51
+
52
+ (You will need to source your <tt>~/.bash_profile</tt> after modifying it in order for bash to detect the new path to the svn command.)
53
+
54
+ * (Windows only:) Make sure <tt>C:\ruby\bin</tt> (or wherever rubygems installs executables for gems) appears in the path before
55
+ <tt>C:\Program Files\Subversion\bin</tt> (or wherever your svn binary is).
56
+
57
+ _subwrap_post_install will copy 'c:/ruby/bin/subwrap.cmd' to 'c:/ruby/bin/svn.cmd' so that when you type svn from the command line, it will actually
58
+ run <tt>c:/ruby/bin/svn.cmd</tt>.
59
+
60
+ === Check to see if it's working
61
+
62
+ You'll know it's working by way of two signs:
63
+ * Your +svn+ command will be noticeably slower
64
+ * When you type svn <tt>help</tt>, it will say:
65
+ You are using subwrap, a replacement/wrapper for the standard svn command.
66
+
67
+ == Features
68
+
69
+ Changes to existing subcommands:
70
+ * <b><tt>svn diff</tt></b>
71
+ * output is in _color_* (requires +colordiff+, see below)
72
+ * <tt>svn diff</tt> includes the differences from your *externals* too (consistent with how <tt>svn status</tt> includes them) so that you don't forget to commit those changes too! (pass <tt>--ignore-externals</tt> if you _don't_ want a diff of externals)
73
+ * <b><tt>svn status</tt></b>
74
+ * filters out distracting, useless output about externals (don't worry -- it still shows which files were _modified_)
75
+ * the flags (?, M, C, etc.) are in *color*!
76
+ * <b><tt>svn move</tt></b> it will let you move multiple source files to a destination directory with a single command
77
+
78
+ (* You can pass --no-color to disable colors for a single command...useful if you want to pipe the output to another command or something. Eventually maybe we could make this a per-user option via .subwrap?)
79
+
80
+ New subcommands:
81
+ * <b><tt>svn each_unadded</tt></b> (+eu+, +unadded+) -- goes through each unadded (<tt>?</tt>) file reported by <tt>svn status</tt> and asks you what to do with them (add, delete, ignore).
82
+ * <b><tt>svn revisions</tt></b> -- lists all revisions with log messages and lets you browse through them interactively
83
+ * <b><tt>svn externals</tt></b> -- lists all externals
84
+ * <b><tt>svn edit_externals</tt></b> (+ee+)
85
+ * <b><tt>svn externalize</tt></b>
86
+ * <b><tt>svn set_message</tt></b> / <tt>svn get_message</tt> / <tt>svn edit_message</tt> -- shortcuts for accessing <tt>--revprop svn:log</tt>
87
+ * <b><tt>svn ignore</tt></b> -- shortcut for accessing <tt>svn:ignore</tt> property
88
+ * <b><tt>svn view_commits</tt></b> -- gives you output from both <tt>svn log</tt> and from <tt>svn diff</tt> for the given changesets (useful for code reviews)
89
+ * <b><tt>svn url</tt></b> -- prints out the URL of the given working copy path or the curretn working copy
90
+ * <b><tt>svn repository_root</tt></b> -- prints out the root repository URL of the working copy you are in
91
+ * <b><tt>svn delete_svn</tt></b> -- causes the current directory (recursively) to no longer be a working copy
92
+
93
+ (RDoc question: how do I make the identifiers like Subversion::SvnCommand#externalize into links??)
94
+
95
+ = Usage / Examples
96
+
97
+ == <tt>svn each_unadded</tt>
98
+
99
+ My personal favorite. This command is useful for keeping your working copies clean -- getting rid of all those accumulated temp files (or *ignoring* or *adding* them if they're something that _all_ users of this repository should be aware of).
100
+
101
+ It simply goes through each "unadded" file (each file reporting a status of <tt>?</tt>) reported by <tt>svn status</tt> and asks you what you want to do with them -- *add*, *delete*, or *ignore*.
102
+
103
+ > svn each_unadded
104
+
105
+ What do you want to do with plugins/database_log4r/doc?
106
+ (shows preview)
107
+ (a)dd, (d)elete, add to svn:(i)ignore property, or [Enter] to do nothing > i
108
+ Ignoring...
109
+
110
+ What do you want to do with applications/underlord/db/schema.rb?
111
+ (shows preview)
112
+ (a)dd, (d)elete, add to svn:(i)ignore property, or [Enter] to do nothing > a
113
+ Adding...
114
+
115
+ What do you want to do with applications/underlord/vendor/plugins/exception_notification?
116
+ (shows preview)
117
+ (a)dd, (d)elete, add to svn:(i)ignore property, or [Enter] to do nothing > d
118
+ Are you pretty much *SURE* you want to 'rm -rf applications/underlord/vendor/plugins/exception_notification'? (y)es, (n)o > y
119
+ Deleting...
120
+
121
+ For *files*, it will show a preview of the _contents_ of that file (limited to the first 55 lines); for *directories*, it will show a _directory_ _listing_. By looking at the preview, you should hopefully be able to decide whether you want to _keep_ the file or _junk_ it.
122
+
123
+ == <tt>svn revisions</tt> (revisions browser)
124
+
125
+ Lets you interactively browse through all revisions of a file/directory/repository (one at a time). For each revision, it will ask you what you want to do with it (view the changeset, edit revision properties, etc.).
126
+
127
+ Screenshot:
128
+ link:include/svn_revisions.png
129
+
130
+ It's sort of like <tt>svn log | less</tt>, only it's interactive, it's in color, and it's just plain more useful!
131
+
132
+ You can step through the revisions using the arrow keys or Enter.
133
+
134
+ Here are a couple things you might use it for:
135
+ * <b>View the history of a certain file</b>.
136
+ * Rather than looking at <tt>svn log -v</tt> (which can be _huge_) directly and then manually calculating revision numbers and doing things like <tt>svn diff -r1492:1493</tt> over and over, you can simply start up <tt>svn revisions</tt>, browse to the revision you're interested in using the Up/Down arrow keys, and press D to get a diff for the selected changeset.
137
+ * <b>See what's been committed since the last public release</b>. So that you can list it in your release notes, for example...
138
+ * <b>Review other people's code</b>. (There's even a mark-as-reviewed feature*, if you want to keep track of which revisions have been reviewed...)
139
+ * <b>Search for a change you know you've _made_</b> but just don't remember what revision it was in. (Hint: Use the "grep this changeset" feature.)
140
+ * Figure out what the <b>difference is between two branches</b>.
141
+
142
+ Defaults to latest-first, but you can pass it the <tt>--forwards</tt> flag to browse from the other direction (start at the <i>oldest revision</i> and step forwards through time).
143
+
144
+ (*The mark-as-reviewed feature requires the modification of your repository's pre-revprop-change hook.)
145
+
146
+ == <tt>svn status</tt>
147
+
148
+ _Without_ this gem installed (really long):
149
+
150
+ ? gemables/subversion/ruby_subversion.rb
151
+ M gemables/subversion
152
+ M gemables/subversion/lib/subversion.rb
153
+ A gemables/subversion/bin
154
+ A gemables/subversion/bin/svn
155
+ X plugins/database_log4r/tasks/shared
156
+ X plugins/surveys/doc/template
157
+ X plugins/surveys/tasks/shared
158
+ X gemables/dev_scripts/tasks/shared
159
+ X gemables/dev_scripts/lib/subversion
160
+
161
+ Performing status on external item at 'plugins/database_log4r/tasks/shared'
162
+
163
+ Performing status on external item at 'plugins/surveys/tasks/shared'
164
+
165
+ Performing status on external item at 'gemables/subversion/doc_include/template'
166
+
167
+ Performing status on external item at 'gemables/dev_scripts/tasks/shared'
168
+
169
+ Performing status on external item at 'applications/underlord/vendor/plugins/rails_smith'
170
+ X applications/underlord/vendor/plugins/rails_smith/tasks/shared
171
+ X applications/underlord/vendor/plugins/rails_smith/lib/subversion
172
+ X applications/underlord/vendor/plugins/rails_smith/doc_include/template
173
+
174
+ Performing status on external item at 'applications/underlord/vendor/plugins/rails_smith/tasks/shared'
175
+ M applications/underlord/vendor/plugins/rails_smith/tasks/shared/base.rake
176
+
177
+ <b>_With_</b> this gem installed (_much_ shorter and sweeter):
178
+
179
+ ? gemables/subversion/ruby_subversion.rb
180
+ M gemables/subversion
181
+ M gemables/subversion/lib/subversion.rb
182
+ A gemables/subversion/bin
183
+ A gemables/subversion/bin/svn
184
+ M applications/underlord/vendor/plugins/rails_smith/tasks/shared/base.rake
185
+
186
+ ==<tt>svn externalize</tt> / <tt>externals</tt> / <tt>edit_externals</tt>
187
+
188
+ Shortcut for creating an svn:external...
189
+
190
+ your_project/vendor/ > svn externalize http://code.qualitysmith.com/gemables/subwrap --as svn
191
+
192
+ Between that and externals / edit_externals, that's all you ever really need! (?)
193
+
194
+ > svn externals
195
+ /home/tyler/code/plugins/rails_smith/tasks
196
+ * shared http://code.qualitysmith.com/gemables/shared_tasks/tasks
197
+ /home/tyler/code/plugins/rails_smith/doc_include
198
+ * template http://code.qualitysmith.com/gemables/template/doc/template
199
+ /home/tyler/code/plugins/rails_smith
200
+ * subwrap http://code.qualitysmith.com/gemables/subwrap
201
+
202
+ Oops, I externalled it in the wrong place!
203
+
204
+ > svn edit_externals
205
+ /home/tyler/code/plugins/rails_smith/tasks
206
+ * shared http://code.qualitysmith.com/gemables/shared_tasks/tasks
207
+ Do you want to edit svn:externals for this directory? y/N > [Enter]
208
+
209
+ /home/tyler/code/plugins/rails_smith/doc_include
210
+ * template http://code.qualitysmith.com/gemables/template/doc/template
211
+ Do you want to edit svn:externals for this directory? y/N > [Enter]
212
+
213
+ /home/tyler/code/plugins/rails_smith
214
+ * subwrap http://code.qualitysmith.com/gemables/subwrap
215
+ Do you want to edit svn:externals for this directory? y/N > [y]
216
+ (remove that line using your favorite editor (which of course is +vim+), save, quit)
217
+
218
+ You can also pass a directory name to edit_externals to edit the svn:externals property for that directory:
219
+
220
+ > svn edit-externals vendor/plugins
221
+
222
+ ==<tt>svn get_message</tt> / <tt>set_message</tt> / <tt>edit_message</tt>
223
+
224
+ <b>Pre-requisite for set_message/edit_message</b>: Your repository must have a <tt>pre-revprop-change</tt> hook file.
225
+
226
+ Useful if you made a mistake or forgot something in your commit message and want to edit it...
227
+
228
+ For example, maybe you tried to do a multi-line commit message with -m but it didn't interpret your "\n"s as newline characters. Just run svn edit_message and fix it interactively!
229
+
230
+ svn get_message -r 2325
231
+ is the same as:
232
+ svn propget -r 2325 --revprop svn:log
233
+
234
+ If you *just* committed it and you want to edit the message for the most-recently committed revision ("head"), there is an even quicker way to do it:
235
+
236
+ You can do this:
237
+ svn edit_message -r head
238
+ or just this:
239
+ svn edit_message
240
+
241
+ == <tt>svn ignore</tt>
242
+
243
+ If you want to add '*' to the list of ignored files for a directory, be sure to enclose the argument in single quotes (<tt>'</tt>) so that the shell doesn't expand the <tt>*</tt> symbol for you.
244
+
245
+ Example:
246
+
247
+ svn ignore 'tmp/sessions/*'
248
+
249
+ == <tt>svn move</tt>
250
+
251
+ You can now do commands like this:
252
+
253
+ svn mv file1 file2 dir
254
+ svn mv dir1/* dir
255
+
256
+ (The _standard_ +svn+ command only accepts a _single_ source and a _single_ destination!)
257
+
258
+ == <tt>svn commit</tt>
259
+
260
+ === --skip-notification / --covert
261
+
262
+ Added a --skip-notification / --covert option which (assuming you have your post-commit hook set up to do this), will suppress the sending out of a commit notification e-mail.
263
+
264
+ This is useful if you're committing large/binary files that would normally cause the commit mailer to hang. (True, the commit mailer script should really be smart enough not to hang in the first place, but let's assume we don't have the luxury of being able to fix it...)
265
+
266
+ For this option to have any effect, you will need to set up your repository similar to this:
267
+
268
+ /var/www/svn/code/hooks/pre-revprop-change
269
+
270
+ REPOS="$1"
271
+ REV="$2"
272
+ USER="$3"
273
+ PROPNAME="$4"
274
+ ACTION="$5"
275
+
276
+ if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
277
+ if [ "$PROPNAME" = "svn:skip_commit_notification_for_next_commit" ]; then exit 0; fi
278
+
279
+ echo "Changing revision properties other than those listed in $0 is prohibited" >&2
280
+ exit 1
281
+
282
+ /var/www/svn/code/hooks/post-commit
283
+
284
+ #!/bin/bash
285
+
286
+ REPOS="$1"
287
+ REV="$2"
288
+
289
+ previous_revision=`expr $REV - 1`
290
+ skip_commit_notification=`svnlook propget $REPOS --revprop svn:skip_commit_notification_for_next_commit -r $previous_revision`
291
+
292
+ if [[ $skip_commit_notification == 'true' ]]; then
293
+ # Skipping
294
+ else
295
+ svnnotify \
296
+ --repos-path $REPOS \
297
+ --revision $REV \
298
+ --subject-prefix "[your repository name]" \
299
+ --revision-url 'http://code/?rev=%s' \
300
+ --to code-commit-watchers@yourdomain.com \
301
+ --handler HTML::ColorDiff \
302
+ --subject-cx \
303
+ --with-diff \
304
+ --author-url 'mailto:%s' \
305
+ --footer "Powered by SVN-Notify <http://search.cpan.org/~dwheeler/SVN-Notify-2.62/lib/SVN/Notify.pm>" \
306
+ --max-diff-length 1000
307
+ fi
308
+
309
+
310
+
311
+ ==Help
312
+
313
+ You can, of course, get a lits of the custom commands that have been added by using <tt>svn help</tt>. They will be listed at the end.
314
+
315
+ ==Global options
316
+
317
+ * --no-color (since color is on by default)
318
+ * --dry-run (see what /usr/bin/svn command it _would_ have executed if you weren't just doing a dry run -- useful for debugging if nothing else)
319
+ * --print-commands (prints out the /usr/bin/svn commands before executing them)
320
+ * --debug (sets $debug = true)
321
+
322
+ ==Requirement: <tt>colordiff</tt>
323
+
324
+ +colordiff+ is used to colorize <tt>svn diff</tt> commands (+ lines are blue; - lines are red)
325
+
326
+ Found at:
327
+ * http://www.pjhyett.com/articles/2006/06/16/colored-svn-diff
328
+ * http://colordiff.sourceforge.net/
329
+
330
+ Suggestion: change the colors in <tt>/etc/colordiffrc</tt> to be more readable:
331
+ plain=white
332
+ newtext=green
333
+ oldtext=red
334
+ diffstuff=cyan
335
+ cvsstuff=magenta
336
+
337
+ ==A workaround for the <tt>Commit failed; Your file or directory 'some file' is probably out-of-date</tt> problem==
338
+
339
+ svn: Commit failed (details follow):
340
+ svn: Your file or directory 'some file' is probably out-of-date
341
+ svn: The version resource does not correspond to the resource within the transaction. Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit).
342
+ Sending some file
343
+ (Doesn't actually finish the commit)
344
+
345
+ I'm still not sure what causes it (I didn't think I was doing anything _that_ out of the ordinary...) or how to _prevent_ it, because it keep happening to me (maybe I'm the only one?)... but I've at least automated the "fix" for this state somewhat.
346
+
347
+ The only way I've found to resolve this problem is to delete the entire directory and restore it (with svn update).
348
+
349
+ It must have something to do with something in the .svn directories not matching up the way that svn expects.
350
+
351
+ Anyway, the <tt>svn fix_out_of_date_commit_state</tt> command attempts to automate most of that process for you.
352
+
353
+
354
+ ==Bash command completion
355
+
356
+ If you want command completion for the svn subcommands (and I don't blame you if you don't -- the default command completion is <i>much faster</i> and already gives you completion for filenames!), just add this line to your <tt>~/.bashrc</tt> :
357
+
358
+ complete -C /usr/bin/command_completion_for_subwrap -o default svn
359
+
360
+ It's really rudimentary right now and could be much improved, but at least it's a start.
361
+
362
+ ==Support for code reviews, commit notification, and continuous integration systems
363
+
364
+ The <tt>svn revisions</tt> command lets you browse through recent changes to a project or directory and then, for each revision that you review, you can simply press R and it will mark that revision as reviewed.
365
+
366
+ <tt>svn commit</tt> accepts two custom flags, <tt>--skip-notification / --covert</tt> (don't send commit notification) and <tt>--broken</tt> (tell the continuous integration system to expect failure).
367
+
368
+ =Other
369
+
370
+ ==Known problems
371
+
372
+ It doesn't support options that are given in this format:
373
+ --diff-cmd=colordiff
374
+ only this format:
375
+ --diff-cmd colordiff
376
+ This is a limitation of Console::Command.
377
+
378
+ Fix: Show the whole thing, including this line:
379
+ Fetching external item into 'glass/rails_backend/vendor/plugins/our_extensions'
380
+
381
+
382
+ This doesn't work:
383
+ svn propget svn:skip_commit_notification_for_next_commit --revprop -r 2498 http://code.qualitysmith.com/ --dry-run
384
+ In execute(). Was about to execute this command via method :exec:
385
+ "/usr/bin/svn propget --revprop -r 2498 http://code.qualitysmith.com/ svn:skip_commit_notification_for_next_commit"
386
+
387
+ > svn propget svn:skip_commit_notification_for_next_commit --revprop -r 2498 http://code.qualitysmith.com/
388
+ svn: Either a URL or versioned item is required
389
+
390
+ Have to do:
391
+ svn propget svn:skip_commit_notification_for_next_commit http://code.qualitysmith.com/applications/profiler_test --revprop -r 2498
392
+
393
+ or
394
+ > /usr/bin/svn propget svn:skip_commit_notification_for_next_commit --revprop -r 2498 http://code.qualitysmith.com/
395
+
396
+
397
+ === Slowness
398
+
399
+ Is it slower than just running /usr/bin/svn directly? You betcha it is!
400
+
401
+ > time svn foo
402
+ real 0m0.493s
403
+
404
+ > time /usr/bin/svn foo
405
+ real 0m0.019s
406
+
407
+ But... as with most things written in Ruby, it's all more about *productivity* than raw execution speed. _Hopefully_ the productivity gains you get from using this wrapper will more than make up for the 0.5 s extra you have to wait for the svn command. :-) If not, I guess it's not for you.
408
+
409
+ ==To do
410
+
411
+ Calling "Extensions.anything" is stupid. Can't we just merge/extend/include the methods from Extensions into the Subversion module itself?
412
+
413
+ Say you just did `svn mv base-suffix base-new_suffix`. Now say you want to commit that move without committing anything else in that dir.
414
+ You'd think you could just do `svn ci base-*`, but no. That doesn't get base-suffix because it has been removed from the file system (and scheduled for deletion).
415
+ Can we make it so a '*' (or any glob) (escaped so shell doesn't get it) actually looks at all files returned by `svn st` (which includes those scheduled for deletion, D) that match that glob rather than all files, rather than the glob that the *shell* would do?
416
+
417
+ Say you cp'd a file A to B. You make some modifications to it and later decide to add it. Wouldn't it be nice if you could retroactively cause B to inherit the ancestry of A (as if you had svn cp'd it instead of cp'd it to begin with)?
418
+ I propose a copy_ancestry_from / imbue_with_ancestry_from command, so that you can do svn copy_ancestry_from B A that does just that.
419
+ Then you could also svn rm A and it would be (I think) completely equivalent to having done an svn mv A B in the first place.
420
+
421
+ svn list_conflicts instead of:
422
+ svn st --no-color | grep "^C"
423
+
424
+ Take the best ideas from these and incorporate:
425
+ * /usr/lib/ruby/gems/1.8/gems/rscm-0.5.1/lib/rscm/scm/subversion.rb
426
+ * /usr/lib/ruby/gems/1.8/gems/lazysvn-0.1.3/lib/subversion.rb
427
+
428
+ Possibly switch to LazySvn.
429
+
430
+ After you save/edit/set an svn:externals, it should try to automatically pretty up the margins/alignment for you.
431
+
432
+ /usr/lib/ruby/gems/1.8/gems/piston-1.3.3/lib/piston/commands/import.rb has interesting way of parsing output from `svn info`
433
+ my_info = YAML::load(svn(:info, File.join(dir, '..')))
434
+ my_revision = YAML::load(svn(:info, my_info['URL']))['Revision']
435
+
436
+ More at: http://wiki.qualitysmith.com/subwrap
437
+
438
+ ===Ideas from TortoiseSvn
439
+
440
+ When you drag and drop one or more files to a WC directory, it prompts you with a context menu with these options:
441
+ * svn move versioned files here
442
+ * svn copy versioned files here
443
+ * svn copy and rename versioned files here
444
+ * svn add files to this WC
445
+ * svn export to here
446
+ * svn export all to here
447
+
448
+ ===Name ideas
449
+
450
+ Word ideas to possibly incorporate:
451
+ * improved
452
+ * enhanced
453
+ * wrapper
454
+ * color
455
+ * plus
456
+ * more
457
+
458
+ * 'subwrap'? Short for "Subversion wrapper". Also, a play on the words sub and wrap -- both of which are also food items.