summaryrefslogtreecommitdiffstats
path: root/emacs.d/nxhtml/nxhtml-web-vcs.el
blob: fb0fb09573411b7cb36527352d3bdb7550dfa256 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
;;; nxhtml-web-vcs.el --- nXhtml things for web-vcs.el
;;
;; Author: Lennart Borgman (lennart O borgman A gmail O com)
;; Created: 2010-01-13 Wed
;; Version:
;; Last-Updated:
;; URL:
;; Keywords:
;; Compatibility:
;;
;; Features that might be required by this library:
;;
;;   None
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;;
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Change log:
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 3, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Code:

(eval-when-compile (require 'cl))
(eval-when-compile (require 'nxhtml-base nil t))
;;(eval-when-compile (require 'nxhtmlmaint nil t))
(eval-when-compile (require 'web-vcs nil t))

(defvar nxhtml-web-vcs-file (or load-file-name
                                (when (boundp 'bytecomp-filename) bytecomp-filename)
                                buffer-file-name)
  "This file.")

(defun nxhtml-require-base ()
  (require 'nxhtml-base nil t)
  (unless (featurep 'nxhtml-base)
    ;; At startup, need to load it by hand.
    (let ((load-path load-path))
      (add-to-list 'load-path (file-name-directory nxhtml-web-vcs-file))
      (require 'nxhtml-base))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Repository URL


;;(nxhtml-default-download-directory)
(defun nxhtml-default-download-directory ()
  (let* ((ur (expand-file-name "" "~"))
         (ur-len (length ur))
         (full (if (and (boundp 'nxhtml-install-dir)
                        nxhtml-install-dir)
                   nxhtml-install-dir
                 (file-name-as-directory
                  (expand-file-name ""
                                    (web-vcs-default-download-directory)))))
         (full-len (length full)))
    (if (and (> full-len ur-len)
             (string= ur (substring full 0 ur-len)))
        (concat "~" (substring full ur-len))
      full)))


(defun nxhtml-web-vcs-read-dl-dir (prompt)
  "Return current nXhtml install dir or read dir."
  (or (and (boundp 'nxhtml-install-dir)
           nxhtml-install-dir)
      (let* ((pr (concat
                  "A directory named 'nxhtml' will be created below the root you give."
                  "\n"
                  prompt))
             (root (read-directory-name pr (nxhtml-default-download-directory))))
        (when root
          (expand-file-name "nxhtml" root)))))

;;(call-interactively 'nxhtml-setup-install)
;; (read-key "Prompt: ")
;; (y-or-n-p "Prompt")
;;;###autoload
(defun nxhtml-setup-install (way)
  "Setup and start nXhtml installation.

This is for installation and updating directly from the nXhtml
development sources.

There are two different ways to install:

  (1) Download all at once: `nxhtml-setup-download-all'
  (2) Automatically download part by part: `nxhtml-setup-auto-download'

You can convert between those ways by calling this function again.
You can also do this by setting the option `nxhtml-autoload-web' yourself.

When you have nXhtml installed you can update it:

  (3) Update new files in nXhtml: `nxhtml-update-existing-files'

To learn more about nXhtml visit its home page at URL
`http://www.emacswiki.com/NxhtmlMode/'.

If you want to test auto download \(but not use it further) there
is a special function for that, you answer T here:

   (T) Test automatic download part by part: `nxhtml-setup-test-auto-download'

======
*Note*
If you want to download a zip file with latest released version instead then
please see URL `http://ourcomments.org/Emacs/nXhtml/doc/nxhtml.html'."
  (interactive (let ((curr-cfg (current-window-configuration)))
                 (describe-function 'nxhtml-setup-install)
                 (select-window (get-buffer-window (help-buffer)))
                 (delete-other-windows)
                 (list
                  (let* ((key nil)
                         (has-nxhtml (and (boundp 'nxhtml-install-dir) nxhtml-install-dir))
                         (current-way (if has-nxhtml
                                          (if (and (boundp 'nxhtml-autoload-web)
                                                   nxhtml-autoload-web)
                                              "Your current setup is to download part by part from the web."
                                            "Your current setup it to download all of nXhtml at once.")
                                        "(You have not currently installed nXhtml.)"))
                         (prompt (concat "Setup nXhtml install."
                                         "\n" current-way
                                         "\n"
                                         "\n(1) Download whole at once, or (2) part by part as needed"
                                         (if has-nxhtml "\n(3) Update your existing nXhtml" "")
                                         "\n(T) For temporary testing downloading part by part"
                                         "\n"
                                         "\n(? for help, q to quit): "))
                         (allowed-keys (if has-nxhtml
                                           '(?1 ?2 ?3 ?T ?q 7)
                                         '(?1 ?2 ?T ?q 7)))
                         (please nil))
                    (while (not (member key allowed-keys))
                      (if (not (member key '(??)))
                          (when key
                            (unless please
                              (setq prompt (concat "Please answer with one of the alternatives.\n\n"
                                                   prompt))
                              (setq please t)))
                        (describe-function 'nxhtml-setup-install)
                        (select-window (get-buffer-window (help-buffer)))
                        (delete-other-windows))
                      (setq key (web-vcs-read-key prompt))
                      ;;(message "key = %S" key) (sit-for 1)
                      )
                    (case key
                      (7 (set-window-configuration curr-cfg)
                         nil)
                      (?1 'whole)
                      (?2 'part-by-part)
                      (?3 'update-existing)
                      (?T 'test-part-by-part)
                      )))))
  (message "")
  (case way
    (whole             (call-interactively 'nxhtml-setup-download-all))
    (part-by-part      (call-interactively 'nxhtml-setup-auto-download))
    (update-existing   (call-interactively 'nxhtml-update-existing-files))
    (test-part-by-part (call-interactively 'nxhtml-setup-test-auto-download))
    ((eq nil way) nil)
    (t (error "Unknown way = %S" way))))

(defvar nxhtml-basic-files '(
                             "nxhtml-base.el"
                             "nxhtml-loaddefs.el"
                             "web-autoload.el"
                             "etc/schema/schema-path-patch.el"
                             "nxhtml/nxhtml-autoload.el"
                             "autostart.el"
                             ))

;;;###autoload
(defun nxhtml-setup-auto-download (dl-dir)
  "Set up to autoload nXhtml files from the web.

This function will download some initial files and then setup to
download the rest when you need them.

Files will be downloaded under the directory root you specify in
DL-DIR.

Note that files will not be upgraded automatically.  The auto
downloading is just for files you are missing. (This may change a
bit in the future.) If you want to upgrade those files that you
have downloaded you can just call `nxhtml-update-existing-files'.

You can easily switch between this mode of downloading or
downloading the whole of nXhtml by once.  To switch just call the
command `nxhtml-setup-install'.

See also the command `nxhtml-setup-download-all'.

Note: If your nXhtml is to old you can't use this function
      directly.  You have to upgrade first, se the function
      above. Version 2.07 or above is good for this."
  (interactive (progn
                 (describe-function 'nxhtml-setup-auto-download)
                 (select-window (get-buffer-window (help-buffer)))
                 (delete-other-windows)
                 (nxhtml-check-convert-to-part-by-part)
                 (list
                  (progn
                    (when (and (boundp 'nxhtml-autoload-web)
                               (not nxhtml-autoload-web))
                      (unless (yes-or-no-p "Convert to updating nXhtml part by part? ")
                        (throw 'command-level nil)))
                    (nxhtml-web-vcs-read-dl-dir "Download nXhtml part by part to directory: ")))))
  (catch 'command-level
    (if (not dl-dir)
        (unless (with-no-warnings (called-interactively-p))
          (error "dl-dir should be a directory"))
      (nxhtml-check-convert-to-part-by-part)
      (when (and (boundp 'nxhtml-install-dir)
                 nxhtml-install-dir)
        (unless (string= (file-truename dl-dir)
                         (file-truename nxhtml-install-dir))
          (error "Download dir must be same as nxhtml-install-dir=%S" nxhtml-install-dir)))
      (let* (;; Need some files:
             (web-vcs-el-src (concat (file-name-sans-extension web-vcs-el-this) ".el"))
             (web-vcs-el (expand-file-name (file-name-nondirectory web-vcs-el-src)
                                           dl-dir))
             (vcs 'lp)
             (base-url (nxhtml-download-root-url nil))
             (byte-comp (if (boundp 'web-autoload-autocompile)
                            web-autoload-autocompile
                          t))
             (has-nxhtml (and (boundp 'nxhtml-install-dir)
                              nxhtml-install-dir))
             (web-vcs-folder-cache nil))
        (setq nxhtml-install-dir dl-dir)
        (let ((root (file-name-directory dl-dir)))
          (unless (file-exists-p root)
            (unless (yes-or-no-p (format "Directory %S does not exist, create it? " root))
              (error "Aborted by user"))))
        (make-directory dl-dir t)
        (setq message-log-max t)
        (view-echo-area-messages)
        (message "")
        (message "")
        (web-vcs-message-with-face 'web-vcs-green "==== Starting nXhtml part by part state ====")
        (message "has-nxhtml=%s" has-nxhtml)
        ;; Fix-me: First copy this file and web-vcs.el to its destination:
        (unless (string= (file-truename dl-dir)
                         (file-truename (file-name-directory nxhtml-web-vcs-file)))
          (dolist (f (list web-vcs-el-src nxhtml-web-vcs-file))
            (copy-file f (expand-file-name (file-name-nondirectory f) dl-dir)
                       'ok-overwrite)))
        (when byte-comp (web-vcs-byte-compile-newer-file web-vcs-el t))
        ;; Get basic file list:
        (catch 'web-autoload-comp-restart
          ;;(let ((file-mask (regexp-opt nxhtml-basic-files)))
          ;;  (web-vcs-get-missing-matching-files vcs base-url dl-dir file-mask))
          (dolist (f nxhtml-basic-files)
            (web-vcs-get-missing-matching-files vcs base-url dl-dir f))
          ;; Autostart.el has not run yet, add download dir to load-path.
          (let ((load-path (cons (file-name-directory web-vcs-el) load-path)))
            (when byte-comp
              (dolist (file nxhtml-basic-files)
                (let ((el-file (expand-file-name file dl-dir)))
                  (web-vcs-byte-compile-newer-file el-file nil)))))
          (let ((autostart-file (expand-file-name "autostart" dl-dir)))
            ;;(ad-deactivate 'require)
            (web-vcs-set&save-option 'nxhtml-autoload-web t)
            (web-vcs-log nil nil "* nXhtml: Download Part by Part as Needed\n")
            (load autostart-file)
            (unless (ad-is-active 'require) (ad-activate 'require))
            (web-vcs-log-save)
            (web-vcs-message-with-face 'web-vcs-green "==== Basic files for nXhtml part by part are now installed ====")
            (web-vcs-display-messages t)
            (unless has-nxhtml (nxhtml-add-loading-to-custom-file autostart-file t))))))))

;;(call-interactively 'nxhtml-download)
;;;###autoload
(defun nxhtml-setup-download-all (dl-dir)
  "Download or update all of nXhtml.

You can download all if nXhtml with this command.

To update existing files use `nxhtml-update-existing-files'.

If you want to download only those files you are actually using
then call `nxhtml-setup-auto-download' instead.

See the command `nxhtml-setup-install' for a convenient way to
call these commands.

For more information about auto download of nXhtml files see
`nxhtml-setup-auto-download'."
  (interactive (progn
                 (describe-function 'nxhtml-setup-auto-download)
                 (select-window (get-buffer-window (help-buffer)))
                 (delete-other-windows)
                 ;;(nxhtml-check-convert-to-part-by-part)
                 (list
                  (nxhtml-web-vcs-read-dl-dir "Download whole nXhtml to directory: "))))

  (let ((root (file-name-directory dl-dir)))
    (unless (file-exists-p root)
      (unless (yes-or-no-p (format "Directory %S does not exist, create it? " root))
        (error "Aborted by user"))))
  (make-directory dl-dir t)
  (let ((msg (concat "Downloading nXhtml through Launchpad web interface will take rather long\n"
                     "time (5-15 minutes) so you may want to do it in a separate Emacs session.\n\n"
                     "Do you want to download using this Emacs session? "
                     )))
    (if (not (y-or-n-p msg))
        (message "Aborted")
      (setq message-log-max t)
      (let ((do-byte (y-or-n-p "Do you want to byte compile the files after downloading? ")))
        (nxhtml-download-1 dl-dir nil do-byte)))))


(defun nxhtml-download-1 (dl-dir revision do-byte)
  "Download nXhtml to directory DL-DIR.
If REVISION is nil download latest revision, otherwise the
specified one.

If DO-BYTE is non-nil byte compile nXhtml after download."
  (let* ((has-nxhtml (and (boundp 'nxhtml-install-dir)
                          nxhtml-install-dir))
         (base-url nxhtml-web-vcs-base-url)
         (files-url (concat base-url "files/"))
         ;;(revs-url  (concat base-url "changes/"))
         (rev-part (if revision (number-to-string revision) "head%3A/"))
         (full-root-url (concat files-url rev-part))
         (web-vcs-folder-cache nil)
         (web-autoload-paranoid nil))
    ;;(nxhtml-require-base)
    (when (web-vcs-get-files-from-root 'lp full-root-url dl-dir)
      (web-vcs-display-messages t)
      (web-vcs-log nil nil "* nXhtml: Download All\n")
      (web-vcs-set&save-option 'nxhtml-autoload-web nil)
      (message "")
      (web-vcs-message-with-face 'web-vcs-green "==== Starting downloading whole nXhtml ====")
      (let ((autostart-file (expand-file-name "autostart" dl-dir)))
        (load autostart-file)
        (web-vcs-log-save)
        (web-vcs-message-with-face 'web-vcs-green "==== All files for nXhtml are now installed ====")
        (nxhtmlmaint-byte-recompile)
        (unless has-nxhtml (nxhtml-add-loading-to-custom-file autostart-file nil))))))

(defun nxhtml-check-convert-to-part-by-part ()
  (when (and (boundp 'nxhtml-install-dir)
             nxhtml-install-dir)
    (unless (and (boundp 'nxhtml-autoload-web)
                 nxhtml-autoload-web)
      (if (not (boundp 'nxhtml-menu:version))
          (error "nxhtml-install-dir set but no version found")
        (unless (string-match "[\.0-9]+" nxhtml-menu:version)
          (error "Can't find current version nxhtml-menu:version=%S" nxhtml-menu:version))
        (let* ((ver-str (match-string 0 nxhtml-menu:version))
               (ver-num (string-to-number ver-str)))
          (when (< ver-num 2.07)
            (web-vcs-message-with-face 'web-vcs-red "Too old nXhtml for download part by part.")
            (throw 'command-level nil)))))))


;;(directory-files default-directory nil "\\el$")
;;(directory-files default-directory nil "[^#~]$")
;;;###autoload
(defun nxhtml-update-existing-files ()
  "Update existing nXhtml files from the development sources.
Only files you already have will be updated.

Note that this works both if you have setup nXhtml to auto
download files as you need them or if you have downloaded all of
nXhtml at once.

For more information about installing and updating nXhtml see the
command `nxhtml-setup-install'."
  ;; Fix-me: download new files too if you are not auto downloading.
  (interactive)
  (when (y-or-n-p "Do you want to update your nXhtml files? ")
    (message "")
    (web-vcs-display-messages t)
    (web-vcs-message-with-face 'web-vcs-yellow "*\nStarting updating your nXhtml files.\n*\n")
    (message nil)
    (web-vcs-clear-folder-cache)
    (let ((vcs 'lp)
          (base-url (nxhtml-download-root-url nil))
          (dl-dir nxhtml-install-dir)
          web-vcs-folder-cache)
      (setq dl-dir (file-name-as-directory dl-dir))
      (web-vcs-update-existing-files vcs base-url dl-dir dl-dir)
      (web-vcs-clear-folder-cache))
    (display-buffer (get-buffer-create "*Compile-Log*"))
    (nxhtmlmaint-byte-recompile)
    (web-vcs-log-save)
    (web-vcs-message-with-face 'web-vcs-yellow "*\nFinished updating your nXhtml files.\n*\n")
    (message nil)))


;;(nxhtml-maybe-download-files (expand-file-name "nxhtml/doc/img/" nxhtml-install-dir) nil)
;;;###autoload
(defun nxhtml-get-missing-files (sub-dir file-name-list)
  (let (file-mask
        (root-url (nxhtml-download-root-url nil))
        files-regexp
        (full-dir (expand-file-name sub-dir nxhtml-install-dir))
        miss-names)
    (if file-name-list
        (progn
          (dolist (f file-name-list)
            (let ((full-f (expand-file-name f full-dir)))
              (unless (file-exists-p full-f)
                (setq miss-names (cons f miss-names)))))
          (setq files-regexp (regexp-opt miss-names)))
      (setq files-regexp ".*"))
    ;;(unless (file-exists-p full-dir) (make-directory full-dir t))
    (setq file-mask
	  (concat (file-relative-name (file-name-as-directory full-dir)
				      nxhtml-install-dir)
		  files-regexp))
    (let ((web-vcs-folder-cache nil))
      (web-vcs-get-missing-matching-files 'lp root-url nxhtml-install-dir
                                          file-mask))))

;; Fix-me: Does not work, Emacs Bug
;; Maybe use wget? http://gnuwin32.sourceforge.net/packages/wget.htm
;; http://emacsbugs.donarmstrong.com/cgi-bin/bugreport.cgi?bug=5103
;; (nxhtml-get-release-revision)
(defun nxhtml-get-release-revision ()
  "Get revision number for last release."
  (let* ((all-rev-url "http://code.launchpad.net/%7Enxhtml/nxhtml/main")
         (url-buf (url-retrieve-synchronously all-rev-url))
         (vcs-rec (or (assq 'lp web-vcs-links-regexp)
                      (error "Does not know web-vcs 'lp")))
         (rel-ver-regexp (nth 6 vcs-rec))
         )
    (message "%S" url-buf)
    (with-current-buffer url-buf
      (when (re-search-forward rel-ver-regexp nil t)
        (match-string 1)))))

;;;###autoload
(defun nxhtml-byte-compile-file (file &optional load)
  (let ((extra-load-path (when nxhtml-install-dir
                           (mapcar (lambda (p)
                                     (file-name-as-directory
                                      (expand-file-name p nxhtml-install-dir)))
                                   '("tests" "related" "nxhtml" "util" ".")))))
    ;; (message "nxhtml-byte-compile-file:extra-load-path=%s" extra-load-path)
    (web-vcs-byte-compile-file file load extra-load-path)))

;; fix-me: change web-vcs-byte-compile-file instead
;;;###autoload
(defun nxhtml-byte-recompile-file (file &optional load)
  "Byte recompile FILE file if necessary.
For more information see `nxhtml-byte-compile-file'.
Loading is done if recompiled and LOAD is t."
  (interactive (list (buffer-file-name)
                     t))
  (let ((elc-file (byte-compile-dest-file file)))
    (if (file-newer-than-file-p file elc-file)
        (nxhtml-byte-compile-file file load)
      (message "Byte compilation of this file is up to date."))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Add to custom file


(defvar nxhtml-handheld-wincfg nil)
(defun nxhtml-handheld-restore-wincg ()
  (when nxhtml-handheld-wincfg
    (set-window-configuration nxhtml-handheld-wincfg)
    (setq nxhtml-handheld-wincfg nil)))

;;(nxhtml-handheld-add-loading-to-custom-file "TEST-ME")
(defun nxhtml-handheld-add-loading-to-custom-file (file-to-load)
  (setq nxhtml-handheld-wincfg (current-window-configuration))
  (delete-other-windows)
  (let ((info-buf (get-buffer-create "Information about how to add nXhtml to (custom-file)"))
        (load-str (format "(load %S)" file-to-load)))
    (with-current-buffer info-buf
      (add-hook 'kill-buffer-hook 'nxhtml-handheld-restore-wincg nil t)
      (insert "Insert the following line to (custom-file), ie the file in the other window:\n\n")
      (let ((here (point)))
        (insert "  "
                (propertize load-str 'face 'secondary-selection)
                "\n")
        (copy-region-as-kill here (point))
        (insert "\nThe line above is in the clipboard so you can just paste it where you want it.\n")
        (insert "When ready kill this buffer.")
        (goto-char here))
      (setq buffer-read-only t)
      (set-buffer-modified-p nil))
    (set-window-buffer (selected-window) info-buf)
    (find-file-other-window (custom-file))))

;; (nxhtml-add-loading-to-custom-file "test-file")
(defun nxhtml-add-loading-to-custom-file (file-to-load part-by-part)
  (message "")
  (require 'cus-edit)
  (if (not (condition-case nil (custom-file) (error nil)))
      (progn
        (message "\n\n")
        (web-vcs-message-with-face
         'web-vcs-red
         (concat "Since you have started this Emacs session without running your init files"
                 "\nthey are unknown and the installation can not add the statement below."
                 "\nTo finish the setup of nXhtml you must add"
                 "\n\n  (load %S)"
                 "\n\nto your custom-file if you have not done it yet."
                 "\nYou must also customize the variable `nxhtml-autoload-web' to tell that"
                 (if part-by-part
                     "\nyou want to download nXhml files as you need them."
                   "\nyou do not want to allow automatic downloading of nXhtml files."
                   )
                 "\n")
         file-to-load)
        (message "")
        (web-vcs-display-messages t))
    (let ((prompt (concat "Basic setup of nXhtml is done, but it must be loaded from (custom-file)."
                          "\nShould I add loading of nXhtml to (custom-file) for you? ")))
      (if (yes-or-no-p prompt)
          (nxhtml-add-loading-to-custom-file-auto file-to-load)
        (if (yes-or-no-p "Should I guide you through how to do it? ")
            (nxhtml-handheld-add-loading-to-custom-file file-to-load)
          (web-vcs-message-with-face 'web-vcs-green
                                     "OK. You need to add (load %S) to your init file" file-to-load))))))

;; Fix-me: really do this? Is it safe enough?
(defun nxhtml-add-loading-to-custom-file-auto (file-to-load)
  (unless (file-name-absolute-p file-to-load)
    (error "nxhtml-add-loading-to-custom-file: Not abs file name: %S" file-to-load))
  (let ((old-buf (find-buffer-visiting (custom-file)))
        (full-to-load (expand-file-name file-to-load)))
    (with-current-buffer (or old-buf (find-file-noselect (custom-file)))
      (save-restriction
        (widen)
        (catch 'done
          (while (progn
                   (while (progn (skip-chars-forward " \t\n\^l")
                                 (looking-at ";"))
                     (forward-line 1))
                   (not (eobp)))
            (let ((start (point))
                  (form (read (current-buffer))))
              (when (eq (nth 0 form) 'load)
                (let* ((form-file (nth 1 form))
                       (full-form-file (expand-file-name form-file)))
                  (when (string= full-form-file full-to-load)
                    (throw 'done nil))
                  (when (and (string= (file-name-nondirectory full-form-file)
                                      (file-name-nondirectory full-to-load))
                             (not (string= full-form-file full-to-load)))
                    (if (yes-or-no-p "Replace current nXhtml loading in (custom-file)? ")
                        (progn
                          (goto-char start) ;; at form start now
                          (forward-char (length "(load "))
                          (skip-chars-forward " \t\n\^l") ;; at start of string
                          (setq start (point))
                          (setq form (read (current-buffer)))
                          (delete-region start (point))
                          (insert (format "%S" full-to-load))
                          (basic-save-buffer))
                      (web-vcs-message-with-face 'web-vcs-red "Can't continue then")
                      (web-vcs-display-messages t)
                      (throw 'command-level nil)))))))
          ;; At end of file
          (insert (format "\n(load  %S)\n" file-to-load))
          (basic-save-buffer))
        (unless old-buf (kill-buffer old-buf))))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;; Start Testing function
(defun emacs-Q-no-nxhtml (&rest args)
  (let* ((old-env-load-path (getenv "EMACSLOADPATH"))
         sub-env-load-path
         (elp-list (or (when old-env-load-path
                         ;;(split-string old-env-load-path ";"))
                         (split-string old-env-load-path path-separator))
                       load-path))
         (sub-elp-list nil)
         ret
         (this-emacs-exe (locate-file invocation-name
                                      (list invocation-directory)
                                      exec-suffixes)))
    (dolist (p elp-list)
      (when (file-exists-p p)
        (unless (string= nxhtml-install-dir p)
          (let* ((dir (file-name-directory p))
                 (last (file-name-nondirectory p))
                 (last-dir (file-name-nondirectory
                            (directory-file-name dir))))
            (unless (and (string= "nxhtml" last-dir)
                         (member last '("util" "test" "nxhtml" "related" "alt")))
              (setq sub-elp-list (cons p sub-elp-list)))))))
    ;;(setq sub-env-load-path (mapconcat 'identity (reverse sub-elp-list) ";"))
    (setq sub-env-load-path (mapconcat 'identity (reverse sub-elp-list) path-separator))
    (setenv "EMACSLOADPATH" sub-env-load-path)
    (setq ret (apply 'call-process this-emacs-exe nil 0 nil "-Q" args))
    (setenv "EMACSLOADPATH" old-env-load-path)
    ret))

;; (call-interactively-p 'nxhtml-setup-test-auto-download)
;; (nxhtml-setup-test-auto-download "c:/test2/")
(defun nxhtml-setup-test-auto-download (test-dir)
  "Test autoload in a new emacs, started with 'emacs -Q'.
You can choose where to download the files and just delete them
when you have tested enough."
  (interactive (list (read-directory-name "Directory for test of auto download of nXhtml: ")))
  (let ((this-dir (file-name-directory web-vcs-el-this))
        (this-name (file-name-nondirectory web-vcs-el-this))
        that-file)
    (when (and (file-exists-p test-dir)
               (not (y-or-n-p (format "Directory %S exists, really test there? " test-dir))))
      (error "Aborted"))
    (unless (file-exists-p test-dir) (make-directory test-dir))
    (setq that-file (expand-file-name this-name test-dir))
    (when (file-exists-p that-file) (delete-file that-file))
    (copy-file web-vcs-el-this that-file)
    (emacs-Q-no-nxhtml "-l" that-file "-f" "nxhtml-setup-test-auto-download-do-it-here")))

(defun nxhtml-setup-test-auto-download-do-it-here ()
  "Helper for `nxhtml-setup-test-auto-down-load'."
  (let ((this-dir (file-name-directory web-vcs-el-this)))
    (nxhtml-setup-auto-download this-dir)))

(defun web-vcs-check-if-modified ()
  (let (
        (t1 (format-time-string "%Y-%m-%dT%T%z" (date-to-time "2010-01-01 18:20")))
        (t2 (format-time-string "%Y-%m-%dT%T%z" (date-to-time "Mon, 28 Dec 2009 08:57:44 GMT")))
        (url-request-extra-headers
         (list
          (cons "If-Modified-Since"
                (format-time-string
                 ;;"%Y-%m-%dT%T%z"
                 "%a, %e %b %Y %H:%M:%S GMT"
                 (nth 5 (file-attributes "c:/test/temp.el" )))
                )))
        xb)
    (setq xb (url-retrieve-synchronously "http://www.emacswiki.org/emacs/download/anything.el"))
    (switch-to-buffer xb)
    ))
;; (emacs-Q-no-nxhtml "web-vcs.el" "-l" "c:/test/d27/web-autostart.el")
;; (emacs-Q-no-nxhtml "web-vcs.el" "-l" "c:/test/d27/autostart.el")
;; (emacs-Q-no-nxhtml "web-vcs.el" "-f" "eval-buffer" "-f" "nxhtml-temp-setup-auto-download")
;; (emacs-Q-no-nxhtml "-l" "c:/test/d27/web-vcs" "-l" "c:/test/d27/nxhtml-web-vcs" "-f" "nxhtml-temp-setup-auto-download")
;; (emacs-Q-no-nxhtml "-l" "c:/test/d27/nxhtml-web-vcs" "-f" "nxhtml-temp-setup-auto-download")
;; (emacs-Q-no-nxhtml "--geometry=200x50+100+100" "-l" "c:/test/d27/web-vcs" "-f" "web-vcs-nxhtml")
(defun nxhtml-temp-setup-auto-download ()
  ;;(when (fboundp 'w32-send-sys-command) (w32-send-sys-command #xf030) (sit-for 2))
  (set-frame-size (selected-frame)
                  (/ 1024 (frame-char-width))
                  (/ 512 (frame-char-height))
                  )
  (tool-bar-mode -1)
  (set-frame-position (selected-frame) 100 50)
  (when (y-or-n-p "Do nXhtml? ")
    (view-echo-area-messages)
    (setq truncate-lines t)
    (split-window-horizontally)
    (let ((load-path (cons default-directory load-path)))
      (require 'web-vcs))
    ;(nxhtml-setup-auto-download "c:/test/d27")
    (call-interactively 'nxhtml-setup-auto-download)
    ))
;;;;;; End Testing function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(provide 'nxhtml-web-vcs)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; nxhtml-web-vcs.el ends here