Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
72dc60ca
Kaydet (Commit)
72dc60ca
authored
Nis 06, 1998
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Untabified, for tabnanny.
üst
e4e41062
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
593 additions
and
593 deletions
+593
-593
faqwiz.py
Tools/faqwiz/faqwiz.py
+593
-593
No files found.
Tools/faqwiz/faqwiz.py
Dosyayı görüntüle @
72dc60ca
...
@@ -12,25 +12,25 @@ The actual script to place in cgi-bin is faqw.py.
...
@@ -12,25 +12,25 @@ The actual script to place in cgi-bin is faqw.py.
"""
"""
import
sys
,
string
,
time
,
os
,
stat
,
re
,
cgi
,
faqconf
import
sys
,
string
,
time
,
os
,
stat
,
re
,
cgi
,
faqconf
from
faqconf
import
*
# This imports all uppercase names
from
faqconf
import
*
# This imports all uppercase names
now
=
time
.
time
()
now
=
time
.
time
()
class
FileError
:
class
FileError
:
def
__init__
(
self
,
file
):
def
__init__
(
self
,
file
):
self
.
file
=
file
self
.
file
=
file
class
InvalidFile
(
FileError
):
class
InvalidFile
(
FileError
):
pass
pass
class
NoSuchSection
(
FileError
):
class
NoSuchSection
(
FileError
):
def
__init__
(
self
,
section
):
def
__init__
(
self
,
section
):
FileError
.
__init__
(
self
,
NEWFILENAME
%
(
section
,
1
))
FileError
.
__init__
(
self
,
NEWFILENAME
%
(
section
,
1
))
self
.
section
=
section
self
.
section
=
section
class
NoSuchFile
(
FileError
):
class
NoSuchFile
(
FileError
):
def
__init__
(
self
,
file
,
why
=
None
):
def
__init__
(
self
,
file
,
why
=
None
):
FileError
.
__init__
(
self
,
file
)
FileError
.
__init__
(
self
,
file
)
self
.
why
=
why
self
.
why
=
why
def
escape
(
s
):
def
escape
(
s
):
s
=
string
.
replace
(
s
,
'&'
,
'&'
)
s
=
string
.
replace
(
s
,
'&'
,
'&'
)
...
@@ -45,9 +45,9 @@ def escapeq(s):
...
@@ -45,9 +45,9 @@ def escapeq(s):
def
_interpolate
(
format
,
args
,
kw
):
def
_interpolate
(
format
,
args
,
kw
):
try
:
try
:
quote
=
kw
[
'_quote'
]
quote
=
kw
[
'_quote'
]
except
KeyError
:
except
KeyError
:
quote
=
1
quote
=
1
d
=
(
kw
,)
+
args
+
(
faqconf
.
__dict__
,)
d
=
(
kw
,)
+
args
+
(
faqconf
.
__dict__
,)
m
=
MagicDict
(
d
,
quote
)
m
=
MagicDict
(
d
,
quote
)
return
format
%
m
return
format
%
m
...
@@ -57,9 +57,9 @@ def interpolate(format, *args, **kw):
...
@@ -57,9 +57,9 @@ def interpolate(format, *args, **kw):
def
emit
(
format
,
*
args
,
**
kw
):
def
emit
(
format
,
*
args
,
**
kw
):
try
:
try
:
f
=
kw
[
'_file'
]
f
=
kw
[
'_file'
]
except
KeyError
:
except
KeyError
:
f
=
sys
.
stdout
f
=
sys
.
stdout
f
.
write
(
_interpolate
(
format
,
args
,
kw
))
f
.
write
(
_interpolate
(
format
,
args
,
kw
))
translate_prog
=
None
translate_prog
=
None
...
@@ -67,32 +67,32 @@ translate_prog = None
...
@@ -67,32 +67,32 @@ translate_prog = None
def
translate
(
text
,
pre
=
0
):
def
translate
(
text
,
pre
=
0
):
global
translate_prog
global
translate_prog
if
not
translate_prog
:
if
not
translate_prog
:
translate_prog
=
prog
=
re
.
compile
(
translate_prog
=
prog
=
re
.
compile
(
r'\b(http|ftp|https)://\S+(\b|/)|\b[-.\w]+@[-.\w]+'
)
r'\b(http|ftp|https)://\S+(\b|/)|\b[-.\w]+@[-.\w]+'
)
else
:
else
:
prog
=
translate_prog
prog
=
translate_prog
i
=
0
i
=
0
list
=
[]
list
=
[]
while
1
:
while
1
:
m
=
prog
.
search
(
text
,
i
)
m
=
prog
.
search
(
text
,
i
)
if
not
m
:
if
not
m
:
break
break
j
=
m
.
start
()
j
=
m
.
start
()
list
.
append
(
escape
(
text
[
i
:
j
]))
list
.
append
(
escape
(
text
[
i
:
j
]))
i
=
j
i
=
j
url
=
m
.
group
(
0
)
url
=
m
.
group
(
0
)
while
url
[
-
1
]
in
'();:,.?
\'
"<>'
:
while
url
[
-
1
]
in
'();:,.?
\'
"<>'
:
url
=
url
[:
-
1
]
url
=
url
[:
-
1
]
i
=
i
+
len
(
url
)
i
=
i
+
len
(
url
)
url
=
escape
(
url
)
url
=
escape
(
url
)
if
not
pre
or
(
pre
and
PROCESS_PREFORMAT
):
if
not
pre
or
(
pre
and
PROCESS_PREFORMAT
):
if
':'
in
url
:
if
':'
in
url
:
repl
=
'<A HREF="
%
s">
%
s</A>'
%
(
url
,
url
)
repl
=
'<A HREF="
%
s">
%
s</A>'
%
(
url
,
url
)
else
:
else
:
repl
=
'<A HREF="mailto:
%
s"><
%
s></A>'
%
(
url
,
url
)
repl
=
'<A HREF="mailto:
%
s"><
%
s></A>'
%
(
url
,
url
)
else
:
else
:
repl
=
url
repl
=
url
list
.
append
(
repl
)
list
.
append
(
repl
)
j
=
len
(
text
)
j
=
len
(
text
)
list
.
append
(
escape
(
text
[
i
:
j
]))
list
.
append
(
escape
(
text
[
i
:
j
]))
return
string
.
join
(
list
,
''
)
return
string
.
join
(
list
,
''
)
...
@@ -105,43 +105,43 @@ revparse_prog = None
...
@@ -105,43 +105,43 @@ revparse_prog = None
def
revparse
(
rev
):
def
revparse
(
rev
):
global
revparse_prog
global
revparse_prog
if
not
revparse_prog
:
if
not
revparse_prog
:
revparse_prog
=
re
.
compile
(
r'^(\d{1,3})\.(\d{1-4})$'
)
revparse_prog
=
re
.
compile
(
r'^(\d{1,3})\.(\d{1-4})$'
)
m
=
revparse_prog
.
match
(
rev
)
m
=
revparse_prog
.
match
(
rev
)
if
not
m
:
if
not
m
:
return
None
return
None
[
major
,
minor
]
=
map
(
string
.
atoi
,
m
.
group
(
1
,
2
))
[
major
,
minor
]
=
map
(
string
.
atoi
,
m
.
group
(
1
,
2
))
return
major
,
minor
return
major
,
minor
def
load_cookies
():
def
load_cookies
():
if
not
os
.
environ
.
has_key
(
'HTTP_COOKIE'
):
if
not
os
.
environ
.
has_key
(
'HTTP_COOKIE'
):
return
{}
return
{}
raw
=
os
.
environ
[
'HTTP_COOKIE'
]
raw
=
os
.
environ
[
'HTTP_COOKIE'
]
words
=
map
(
string
.
strip
,
string
.
split
(
raw
,
';'
))
words
=
map
(
string
.
strip
,
string
.
split
(
raw
,
';'
))
cookies
=
{}
cookies
=
{}
for
word
in
words
:
for
word
in
words
:
i
=
string
.
find
(
word
,
'='
)
i
=
string
.
find
(
word
,
'='
)
if
i
>=
0
:
if
i
>=
0
:
key
,
value
=
word
[:
i
],
word
[
i
+
1
:]
key
,
value
=
word
[:
i
],
word
[
i
+
1
:]
cookies
[
key
]
=
value
cookies
[
key
]
=
value
return
cookies
return
cookies
def
load_my_cookie
():
def
load_my_cookie
():
cookies
=
load_cookies
()
cookies
=
load_cookies
()
try
:
try
:
value
=
cookies
[
COOKIE_NAME
]
value
=
cookies
[
COOKIE_NAME
]
except
KeyError
:
except
KeyError
:
return
{}
return
{}
import
urllib
import
urllib
value
=
urllib
.
unquote
(
value
)
value
=
urllib
.
unquote
(
value
)
words
=
string
.
split
(
value
,
'/'
)
words
=
string
.
split
(
value
,
'/'
)
while
len
(
words
)
<
3
:
while
len
(
words
)
<
3
:
words
.
append
(
''
)
words
.
append
(
''
)
author
=
string
.
join
(
words
[:
-
2
],
'/'
)
author
=
string
.
join
(
words
[:
-
2
],
'/'
)
email
=
words
[
-
2
]
email
=
words
[
-
2
]
password
=
words
[
-
1
]
password
=
words
[
-
1
]
return
{
'author'
:
author
,
return
{
'author'
:
author
,
'email'
:
email
,
'email'
:
email
,
'password'
:
password
}
'password'
:
password
}
def
send_my_cookie
(
ui
):
def
send_my_cookie
(
ui
):
name
=
COOKIE_NAME
name
=
COOKIE_NAME
...
@@ -156,147 +156,147 @@ def send_my_cookie(ui):
...
@@ -156,147 +156,147 @@ def send_my_cookie(ui):
class
MagicDict
:
class
MagicDict
:
def
__init__
(
self
,
d
,
quote
):
def
__init__
(
self
,
d
,
quote
):
self
.
__d
=
d
self
.
__d
=
d
self
.
__quote
=
quote
self
.
__quote
=
quote
def
__getitem__
(
self
,
key
):
def
__getitem__
(
self
,
key
):
for
d
in
self
.
__d
:
for
d
in
self
.
__d
:
try
:
try
:
value
=
d
[
key
]
value
=
d
[
key
]
if
value
:
if
value
:
value
=
str
(
value
)
value
=
str
(
value
)
if
self
.
__quote
:
if
self
.
__quote
:
value
=
escapeq
(
value
)
value
=
escapeq
(
value
)
return
value
return
value
except
KeyError
:
except
KeyError
:
pass
pass
return
''
return
''
class
UserInput
:
class
UserInput
:
def
__init__
(
self
):
def
__init__
(
self
):
self
.
__form
=
cgi
.
FieldStorage
()
self
.
__form
=
cgi
.
FieldStorage
()
def
__getattr__
(
self
,
name
):
def
__getattr__
(
self
,
name
):
if
name
[
0
]
==
'_'
:
if
name
[
0
]
==
'_'
:
raise
AttributeError
raise
AttributeError
try
:
try
:
value
=
self
.
__form
[
name
]
.
value
value
=
self
.
__form
[
name
]
.
value
except
(
TypeError
,
KeyError
):
except
(
TypeError
,
KeyError
):
value
=
''
value
=
''
else
:
else
:
value
=
string
.
strip
(
value
)
value
=
string
.
strip
(
value
)
setattr
(
self
,
name
,
value
)
setattr
(
self
,
name
,
value
)
return
value
return
value
def
__getitem__
(
self
,
key
):
def
__getitem__
(
self
,
key
):
return
getattr
(
self
,
key
)
return
getattr
(
self
,
key
)
class
FaqEntry
:
class
FaqEntry
:
def
__init__
(
self
,
fp
,
file
,
sec_num
):
def
__init__
(
self
,
fp
,
file
,
sec_num
):
self
.
file
=
file
self
.
file
=
file
self
.
sec
,
self
.
num
=
sec_num
self
.
sec
,
self
.
num
=
sec_num
if
fp
:
if
fp
:
import
rfc822
import
rfc822
self
.
__headers
=
rfc822
.
Message
(
fp
)
self
.
__headers
=
rfc822
.
Message
(
fp
)
self
.
body
=
string
.
strip
(
fp
.
read
())
self
.
body
=
string
.
strip
(
fp
.
read
())
else
:
else
:
self
.
__headers
=
{
'title'
:
"
%
d.
%
d. "
%
sec_num
}
self
.
__headers
=
{
'title'
:
"
%
d.
%
d. "
%
sec_num
}
self
.
body
=
''
self
.
body
=
''
def
__getattr__
(
self
,
name
):
def
__getattr__
(
self
,
name
):
if
name
[
0
]
==
'_'
:
if
name
[
0
]
==
'_'
:
raise
AttributeError
raise
AttributeError
key
=
string
.
join
(
string
.
split
(
name
,
'_'
),
'-'
)
key
=
string
.
join
(
string
.
split
(
name
,
'_'
),
'-'
)
try
:
try
:
value
=
self
.
__headers
[
key
]
value
=
self
.
__headers
[
key
]
except
KeyError
:
except
KeyError
:
value
=
''
value
=
''
setattr
(
self
,
name
,
value
)
setattr
(
self
,
name
,
value
)
return
value
return
value
def
__getitem__
(
self
,
key
):
def
__getitem__
(
self
,
key
):
return
getattr
(
self
,
key
)
return
getattr
(
self
,
key
)
def
load_version
(
self
):
def
load_version
(
self
):
command
=
interpolate
(
SH_RLOG_H
,
self
)
command
=
interpolate
(
SH_RLOG_H
,
self
)
p
=
os
.
popen
(
command
)
p
=
os
.
popen
(
command
)
version
=
''
version
=
''
while
1
:
while
1
:
line
=
p
.
readline
()
line
=
p
.
readline
()
if
not
line
:
if
not
line
:
break
break
if
line
[:
5
]
==
'head:'
:
if
line
[:
5
]
==
'head:'
:
version
=
string
.
strip
(
line
[
5
:])
version
=
string
.
strip
(
line
[
5
:])
p
.
close
()
p
.
close
()
self
.
version
=
version
self
.
version
=
version
def
getmtime
(
self
):
def
getmtime
(
self
):
if
not
self
.
last_changed_date
:
if
not
self
.
last_changed_date
:
return
0
return
0
try
:
try
:
return
os
.
stat
(
self
.
file
)[
stat
.
ST_MTIME
]
return
os
.
stat
(
self
.
file
)[
stat
.
ST_MTIME
]
except
os
.
error
:
except
os
.
error
:
return
0
return
0
def
emit_marks
(
self
):
def
emit_marks
(
self
):
mtime
=
self
.
getmtime
()
mtime
=
self
.
getmtime
()
if
mtime
>=
now
-
DT_VERY_RECENT
:
if
mtime
>=
now
-
DT_VERY_RECENT
:
emit
(
MARK_VERY_RECENT
,
self
)
emit
(
MARK_VERY_RECENT
,
self
)
elif
mtime
>=
now
-
DT_RECENT
:
elif
mtime
>=
now
-
DT_RECENT
:
emit
(
MARK_RECENT
,
self
)
emit
(
MARK_RECENT
,
self
)
def
show
(
self
,
edit
=
1
):
def
show
(
self
,
edit
=
1
):
emit
(
ENTRY_HEADER1
,
self
)
emit
(
ENTRY_HEADER1
,
self
)
self
.
emit_marks
()
self
.
emit_marks
()
emit
(
ENTRY_HEADER2
,
self
)
emit
(
ENTRY_HEADER2
,
self
)
pre
=
0
pre
=
0
raw
=
0
raw
=
0
for
line
in
string
.
split
(
self
.
body
,
'
\n
'
):
for
line
in
string
.
split
(
self
.
body
,
'
\n
'
):
# Allow the user to insert raw html into a FAQ answer
# Allow the user to insert raw html into a FAQ answer
# (Skip Montanaro, with changes by Guido)
# (Skip Montanaro, with changes by Guido)
tag
=
string
.
lower
(
string
.
rstrip
(
line
))
tag
=
string
.
lower
(
string
.
rstrip
(
line
))
if
tag
==
'<html>'
:
if
tag
==
'<html>'
:
raw
=
1
raw
=
1
continue
continue
if
tag
==
'</html>'
:
if
tag
==
'</html>'
:
raw
=
0
raw
=
0
continue
continue
if
raw
:
if
raw
:
print
line
print
line
continue
continue
if
not
string
.
strip
(
line
):
if
not
string
.
strip
(
line
):
if
pre
:
if
pre
:
print
'</PRE>'
print
'</PRE>'
pre
=
0
pre
=
0
else
:
else
:
print
'<P>'
print
'<P>'
else
:
else
:
if
line
[
0
]
not
in
string
.
whitespace
:
if
line
[
0
]
not
in
string
.
whitespace
:
if
pre
:
if
pre
:
print
'</PRE>'
print
'</PRE>'
pre
=
0
pre
=
0
else
:
else
:
if
not
pre
:
if
not
pre
:
print
'<PRE>'
print
'<PRE>'
pre
=
1
pre
=
1
if
'/'
in
line
or
'@'
in
line
:
if
'/'
in
line
or
'@'
in
line
:
line
=
translate
(
line
,
pre
)
line
=
translate
(
line
,
pre
)
elif
'<'
in
line
or
'&'
in
line
:
elif
'<'
in
line
or
'&'
in
line
:
line
=
escape
(
line
)
line
=
escape
(
line
)
if
not
pre
and
'*'
in
line
:
if
not
pre
and
'*'
in
line
:
line
=
emphasize
(
line
)
line
=
emphasize
(
line
)
print
line
print
line
if
pre
:
if
pre
:
print
'</PRE>'
print
'</PRE>'
pre
=
0
pre
=
0
if
edit
:
if
edit
:
print
'<P>'
print
'<P>'
emit
(
ENTRY_FOOTER
,
self
)
emit
(
ENTRY_FOOTER
,
self
)
if
self
.
last_changed_date
:
if
self
.
last_changed_date
:
emit
(
ENTRY_LOGINFO
,
self
)
emit
(
ENTRY_LOGINFO
,
self
)
print
'<P>'
print
'<P>'
class
FaqDir
:
class
FaqDir
:
...
@@ -305,517 +305,517 @@ class FaqDir:
...
@@ -305,517 +305,517 @@ class FaqDir:
__okprog
=
re
.
compile
(
OKFILENAME
)
__okprog
=
re
.
compile
(
OKFILENAME
)
def
__init__
(
self
,
dir
=
os
.
curdir
):
def
__init__
(
self
,
dir
=
os
.
curdir
):
self
.
__dir
=
dir
self
.
__dir
=
dir
self
.
__files
=
None
self
.
__files
=
None
def
__fill
(
self
):
def
__fill
(
self
):
if
self
.
__files
is
not
None
:
if
self
.
__files
is
not
None
:
return
return
self
.
__files
=
files
=
[]
self
.
__files
=
files
=
[]
okprog
=
self
.
__okprog
okprog
=
self
.
__okprog
for
file
in
os
.
listdir
(
self
.
__dir
):
for
file
in
os
.
listdir
(
self
.
__dir
):
if
self
.
__okprog
.
match
(
file
):
if
self
.
__okprog
.
match
(
file
):
files
.
append
(
file
)
files
.
append
(
file
)
files
.
sort
()
files
.
sort
()
def
good
(
self
,
file
):
def
good
(
self
,
file
):
return
self
.
__okprog
.
match
(
file
)
return
self
.
__okprog
.
match
(
file
)
def
parse
(
self
,
file
):
def
parse
(
self
,
file
):
m
=
self
.
good
(
file
)
m
=
self
.
good
(
file
)
if
not
m
:
if
not
m
:
return
None
return
None
sec
,
num
=
m
.
group
(
1
,
2
)
sec
,
num
=
m
.
group
(
1
,
2
)
return
string
.
atoi
(
sec
),
string
.
atoi
(
num
)
return
string
.
atoi
(
sec
),
string
.
atoi
(
num
)
def
list
(
self
):
def
list
(
self
):
# XXX Caller shouldn't modify result
# XXX Caller shouldn't modify result
self
.
__fill
()
self
.
__fill
()
return
self
.
__files
return
self
.
__files
def
open
(
self
,
file
):
def
open
(
self
,
file
):
sec_num
=
self
.
parse
(
file
)
sec_num
=
self
.
parse
(
file
)
if
not
sec_num
:
if
not
sec_num
:
raise
InvalidFile
(
file
)
raise
InvalidFile
(
file
)
try
:
try
:
fp
=
open
(
file
)
fp
=
open
(
file
)
except
IOError
,
msg
:
except
IOError
,
msg
:
raise
NoSuchFile
(
file
,
msg
)
raise
NoSuchFile
(
file
,
msg
)
try
:
try
:
return
self
.
entryclass
(
fp
,
file
,
sec_num
)
return
self
.
entryclass
(
fp
,
file
,
sec_num
)
finally
:
finally
:
fp
.
close
()
fp
.
close
()
def
show
(
self
,
file
,
edit
=
1
):
def
show
(
self
,
file
,
edit
=
1
):
self
.
open
(
file
)
.
show
(
edit
=
edit
)
self
.
open
(
file
)
.
show
(
edit
=
edit
)
def
new
(
self
,
section
):
def
new
(
self
,
section
):
if
not
SECTION_TITLES
.
has_key
(
section
):
if
not
SECTION_TITLES
.
has_key
(
section
):
raise
NoSuchSection
(
section
)
raise
NoSuchSection
(
section
)
maxnum
=
0
maxnum
=
0
for
file
in
self
.
list
():
for
file
in
self
.
list
():
sec
,
num
=
self
.
parse
(
file
)
sec
,
num
=
self
.
parse
(
file
)
if
sec
==
section
:
if
sec
==
section
:
maxnum
=
max
(
maxnum
,
num
)
maxnum
=
max
(
maxnum
,
num
)
sec_num
=
(
section
,
maxnum
+
1
)
sec_num
=
(
section
,
maxnum
+
1
)
file
=
NEWFILENAME
%
sec_num
file
=
NEWFILENAME
%
sec_num
return
self
.
entryclass
(
None
,
file
,
sec_num
)
return
self
.
entryclass
(
None
,
file
,
sec_num
)
class
FaqWizard
:
class
FaqWizard
:
def
__init__
(
self
):
def
__init__
(
self
):
self
.
ui
=
UserInput
()
self
.
ui
=
UserInput
()
self
.
dir
=
FaqDir
()
self
.
dir
=
FaqDir
()
def
go
(
self
):
def
go
(
self
):
print
'Content-type: text/html'
print
'Content-type: text/html'
req
=
self
.
ui
.
req
or
'home'
req
=
self
.
ui
.
req
or
'home'
mname
=
'do_
%
s'
%
req
mname
=
'do_
%
s'
%
req
try
:
try
:
meth
=
getattr
(
self
,
mname
)
meth
=
getattr
(
self
,
mname
)
except
AttributeError
:
except
AttributeError
:
self
.
error
(
"Bad request type
%
s."
%
`req`
)
self
.
error
(
"Bad request type
%
s."
%
`req`
)
else
:
else
:
try
:
try
:
meth
()
meth
()
except
InvalidFile
,
exc
:
except
InvalidFile
,
exc
:
self
.
error
(
"Invalid entry file name
%
s"
%
exc
.
file
)
self
.
error
(
"Invalid entry file name
%
s"
%
exc
.
file
)
except
NoSuchFile
,
exc
:
except
NoSuchFile
,
exc
:
self
.
error
(
"No entry with file name
%
s"
%
exc
.
file
)
self
.
error
(
"No entry with file name
%
s"
%
exc
.
file
)
except
NoSuchSection
,
exc
:
except
NoSuchSection
,
exc
:
self
.
error
(
"No section number
%
s"
%
exc
.
section
)
self
.
error
(
"No section number
%
s"
%
exc
.
section
)
self
.
epilogue
()
self
.
epilogue
()
def
error
(
self
,
message
,
**
kw
):
def
error
(
self
,
message
,
**
kw
):
self
.
prologue
(
T_ERROR
)
self
.
prologue
(
T_ERROR
)
emit
(
message
,
kw
)
emit
(
message
,
kw
)
def
prologue
(
self
,
title
,
entry
=
None
,
**
kw
):
def
prologue
(
self
,
title
,
entry
=
None
,
**
kw
):
emit
(
PROLOGUE
,
entry
,
kwdict
=
kw
,
title
=
escape
(
title
))
emit
(
PROLOGUE
,
entry
,
kwdict
=
kw
,
title
=
escape
(
title
))
def
epilogue
(
self
):
def
epilogue
(
self
):
emit
(
EPILOGUE
)
emit
(
EPILOGUE
)
def
do_home
(
self
):
def
do_home
(
self
):
self
.
prologue
(
T_HOME
)
self
.
prologue
(
T_HOME
)
emit
(
HOME
)
emit
(
HOME
)
def
do_debug
(
self
):
def
do_debug
(
self
):
self
.
prologue
(
"FAQ Wizard Debugging"
)
self
.
prologue
(
"FAQ Wizard Debugging"
)
form
=
cgi
.
FieldStorage
()
form
=
cgi
.
FieldStorage
()
cgi
.
print_form
(
form
)
cgi
.
print_form
(
form
)
cgi
.
print_environ
(
os
.
environ
)
cgi
.
print_environ
(
os
.
environ
)
cgi
.
print_directory
()
cgi
.
print_directory
()
cgi
.
print_arguments
()
cgi
.
print_arguments
()
def
do_search
(
self
):
def
do_search
(
self
):
query
=
self
.
ui
.
query
query
=
self
.
ui
.
query
if
not
query
:
if
not
query
:
self
.
error
(
"Empty query string!"
)
self
.
error
(
"Empty query string!"
)
return
return
if
self
.
ui
.
querytype
==
'simple'
:
if
self
.
ui
.
querytype
==
'simple'
:
query
=
re
.
escape
(
query
)
query
=
re
.
escape
(
query
)
queries
=
[
query
]
queries
=
[
query
]
elif
self
.
ui
.
querytype
in
(
'anykeywords'
,
'allkeywords'
):
elif
self
.
ui
.
querytype
in
(
'anykeywords'
,
'allkeywords'
):
words
=
filter
(
None
,
re
.
split
(
'
\
W+'
,
query
))
words
=
filter
(
None
,
re
.
split
(
'
\
W+'
,
query
))
if
not
words
:
if
not
words
:
self
.
error
(
"No keywords specified!"
)
self
.
error
(
"No keywords specified!"
)
return
return
words
=
map
(
lambda
w
:
r'\b
%
s\b'
%
w
,
words
)
words
=
map
(
lambda
w
:
r'\b
%
s\b'
%
w
,
words
)
if
self
.
ui
.
querytype
[:
3
]
==
'any'
:
if
self
.
ui
.
querytype
[:
3
]
==
'any'
:
queries
=
[
string
.
join
(
words
,
'|'
)]
queries
=
[
string
.
join
(
words
,
'|'
)]
else
:
else
:
# Each of the individual queries must match
# Each of the individual queries must match
queries
=
words
queries
=
words
else
:
else
:
# Default to regular expression
# Default to regular expression
queries
=
[
query
]
queries
=
[
query
]
self
.
prologue
(
T_SEARCH
)
self
.
prologue
(
T_SEARCH
)
progs
=
[]
progs
=
[]
for
query
in
queries
:
for
query
in
queries
:
if
self
.
ui
.
casefold
==
'no'
:
if
self
.
ui
.
casefold
==
'no'
:
p
=
re
.
compile
(
query
)
p
=
re
.
compile
(
query
)
else
:
else
:
p
=
re
.
compile
(
query
,
re
.
IGNORECASE
)
p
=
re
.
compile
(
query
,
re
.
IGNORECASE
)
progs
.
append
(
p
)
progs
.
append
(
p
)
hits
=
[]
hits
=
[]
for
file
in
self
.
dir
.
list
():
for
file
in
self
.
dir
.
list
():
try
:
try
:
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
except
FileError
:
except
FileError
:
constants
constants
for
p
in
progs
:
for
p
in
progs
:
if
not
p
.
search
(
entry
.
title
)
and
not
p
.
search
(
entry
.
body
):
if
not
p
.
search
(
entry
.
title
)
and
not
p
.
search
(
entry
.
body
):
break
break
else
:
else
:
hits
.
append
(
file
)
hits
.
append
(
file
)
if
not
hits
:
if
not
hits
:
emit
(
NO_HITS
,
self
.
ui
,
count
=
0
)
emit
(
NO_HITS
,
self
.
ui
,
count
=
0
)
elif
len
(
hits
)
<=
MAXHITS
:
elif
len
(
hits
)
<=
MAXHITS
:
if
len
(
hits
)
==
1
:
if
len
(
hits
)
==
1
:
emit
(
ONE_HIT
,
count
=
1
)
emit
(
ONE_HIT
,
count
=
1
)
else
:
else
:
emit
(
FEW_HITS
,
count
=
len
(
hits
))
emit
(
FEW_HITS
,
count
=
len
(
hits
))
self
.
format_all
(
hits
,
headers
=
0
)
self
.
format_all
(
hits
,
headers
=
0
)
else
:
else
:
emit
(
MANY_HITS
,
count
=
len
(
hits
))
emit
(
MANY_HITS
,
count
=
len
(
hits
))
self
.
format_index
(
hits
)
self
.
format_index
(
hits
)
def
do_all
(
self
):
def
do_all
(
self
):
self
.
prologue
(
T_ALL
)
self
.
prologue
(
T_ALL
)
files
=
self
.
dir
.
list
()
files
=
self
.
dir
.
list
()
self
.
last_changed
(
files
)
self
.
last_changed
(
files
)
self
.
format_index
(
files
,
localrefs
=
1
)
self
.
format_index
(
files
,
localrefs
=
1
)
self
.
format_all
(
files
)
self
.
format_all
(
files
)
def
do_compat
(
self
):
def
do_compat
(
self
):
files
=
self
.
dir
.
list
()
files
=
self
.
dir
.
list
()
emit
(
COMPAT
)
emit
(
COMPAT
)
self
.
last_changed
(
files
)
self
.
last_changed
(
files
)
self
.
format_index
(
files
,
localrefs
=
1
)
self
.
format_index
(
files
,
localrefs
=
1
)
self
.
format_all
(
files
,
edit
=
0
)
self
.
format_all
(
files
,
edit
=
0
)
sys
.
exit
(
0
)
# XXX Hack to suppress epilogue
sys
.
exit
(
0
)
# XXX Hack to suppress epilogue
def
last_changed
(
self
,
files
):
def
last_changed
(
self
,
files
):
latest
=
0
latest
=
0
for
file
in
files
:
for
file
in
files
:
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
if
entry
:
if
entry
:
mtime
=
mtime
=
entry
.
getmtime
()
mtime
=
mtime
=
entry
.
getmtime
()
if
mtime
>
latest
:
if
mtime
>
latest
:
latest
=
mtime
latest
=
mtime
print
time
.
strftime
(
LAST_CHANGED
,
time
.
localtime
(
latest
))
print
time
.
strftime
(
LAST_CHANGED
,
time
.
localtime
(
latest
))
emit
(
EXPLAIN_MARKS
)
emit
(
EXPLAIN_MARKS
)
def
format_all
(
self
,
files
,
edit
=
1
,
headers
=
1
):
def
format_all
(
self
,
files
,
edit
=
1
,
headers
=
1
):
sec
=
0
sec
=
0
for
file
in
files
:
for
file
in
files
:
try
:
try
:
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
except
NoSuchFile
:
except
NoSuchFile
:
continue
continue
if
headers
and
entry
.
sec
!=
sec
:
if
headers
and
entry
.
sec
!=
sec
:
sec
=
entry
.
sec
sec
=
entry
.
sec
try
:
try
:
title
=
SECTION_TITLES
[
sec
]
title
=
SECTION_TITLES
[
sec
]
except
KeyError
:
except
KeyError
:
title
=
"Untitled"
title
=
"Untitled"
emit
(
"
\n
<HR>
\n
<H1>
%(sec)
s.
%(title)
s</H1>
\n
"
,
emit
(
"
\n
<HR>
\n
<H1>
%(sec)
s.
%(title)
s</H1>
\n
"
,
sec
=
sec
,
title
=
title
)
sec
=
sec
,
title
=
title
)
entry
.
show
(
edit
=
edit
)
entry
.
show
(
edit
=
edit
)
def
do_index
(
self
):
def
do_index
(
self
):
self
.
prologue
(
T_INDEX
)
self
.
prologue
(
T_INDEX
)
files
=
self
.
dir
.
list
()
files
=
self
.
dir
.
list
()
self
.
last_changed
(
files
)
self
.
last_changed
(
files
)
self
.
format_index
(
files
,
add
=
1
)
self
.
format_index
(
files
,
add
=
1
)
def
format_index
(
self
,
files
,
add
=
0
,
localrefs
=
0
):
def
format_index
(
self
,
files
,
add
=
0
,
localrefs
=
0
):
sec
=
0
sec
=
0
for
file
in
files
:
for
file
in
files
:
try
:
try
:
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
except
NoSuchFile
:
except
NoSuchFile
:
continue
continue
if
entry
.
sec
!=
sec
:
if
entry
.
sec
!=
sec
:
if
sec
:
if
sec
:
if
add
:
if
add
:
emit
(
INDEX_ADDSECTION
,
sec
=
sec
)
emit
(
INDEX_ADDSECTION
,
sec
=
sec
)
emit
(
INDEX_ENDSECTION
,
sec
=
sec
)
emit
(
INDEX_ENDSECTION
,
sec
=
sec
)
sec
=
entry
.
sec
sec
=
entry
.
sec
try
:
try
:
title
=
SECTION_TITLES
[
sec
]
title
=
SECTION_TITLES
[
sec
]
except
KeyError
:
except
KeyError
:
title
=
"Untitled"
title
=
"Untitled"
emit
(
INDEX_SECTION
,
sec
=
sec
,
title
=
title
)
emit
(
INDEX_SECTION
,
sec
=
sec
,
title
=
title
)
if
localrefs
:
if
localrefs
:
emit
(
LOCAL_ENTRY
,
entry
)
emit
(
LOCAL_ENTRY
,
entry
)
else
:
else
:
emit
(
INDEX_ENTRY
,
entry
)
emit
(
INDEX_ENTRY
,
entry
)
entry
.
emit_marks
()
entry
.
emit_marks
()
if
sec
:
if
sec
:
if
add
:
if
add
:
emit
(
INDEX_ADDSECTION
,
sec
=
sec
)
emit
(
INDEX_ADDSECTION
,
sec
=
sec
)
emit
(
INDEX_ENDSECTION
,
sec
=
sec
)
emit
(
INDEX_ENDSECTION
,
sec
=
sec
)
def
do_recent
(
self
):
def
do_recent
(
self
):
if
not
self
.
ui
.
days
:
if
not
self
.
ui
.
days
:
days
=
1
days
=
1
else
:
else
:
days
=
string
.
atof
(
self
.
ui
.
days
)
days
=
string
.
atof
(
self
.
ui
.
days
)
try
:
try
:
cutoff
=
now
-
days
*
24
*
3600
cutoff
=
now
-
days
*
24
*
3600
except
OverflowError
:
except
OverflowError
:
cutoff
=
0
cutoff
=
0
list
=
[]
list
=
[]
for
file
in
self
.
dir
.
list
():
for
file
in
self
.
dir
.
list
():
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
if
not
entry
:
if
not
entry
:
continue
continue
mtime
=
entry
.
getmtime
()
mtime
=
entry
.
getmtime
()
if
mtime
>=
cutoff
:
if
mtime
>=
cutoff
:
list
.
append
((
mtime
,
file
))
list
.
append
((
mtime
,
file
))
list
.
sort
()
list
.
sort
()
list
.
reverse
()
list
.
reverse
()
self
.
prologue
(
T_RECENT
)
self
.
prologue
(
T_RECENT
)
if
days
<=
1
:
if
days
<=
1
:
period
=
"
%.2
g hours"
%
(
days
*
24
)
period
=
"
%.2
g hours"
%
(
days
*
24
)
else
:
else
:
period
=
"
%.6
g days"
%
days
period
=
"
%.6
g days"
%
days
if
not
list
:
if
not
list
:
emit
(
NO_RECENT
,
period
=
period
)
emit
(
NO_RECENT
,
period
=
period
)
elif
len
(
list
)
==
1
:
elif
len
(
list
)
==
1
:
emit
(
ONE_RECENT
,
period
=
period
)
emit
(
ONE_RECENT
,
period
=
period
)
else
:
else
:
emit
(
SOME_RECENT
,
period
=
period
,
count
=
len
(
list
))
emit
(
SOME_RECENT
,
period
=
period
,
count
=
len
(
list
))
self
.
format_all
(
map
(
lambda
(
mtime
,
file
):
file
,
list
),
headers
=
0
)
self
.
format_all
(
map
(
lambda
(
mtime
,
file
):
file
,
list
),
headers
=
0
)
emit
(
TAIL_RECENT
)
emit
(
TAIL_RECENT
)
def
do_roulette
(
self
):
def
do_roulette
(
self
):
import
whrandom
import
whrandom
files
=
self
.
dir
.
list
()
files
=
self
.
dir
.
list
()
if
not
files
:
if
not
files
:
self
.
error
(
"No entries."
)
self
.
error
(
"No entries."
)
return
return
file
=
whrandom
.
choice
(
files
)
file
=
whrandom
.
choice
(
files
)
self
.
prologue
(
T_ROULETTE
)
self
.
prologue
(
T_ROULETTE
)
emit
(
ROULETTE
)
emit
(
ROULETTE
)
self
.
dir
.
show
(
file
)
self
.
dir
.
show
(
file
)
def
do_help
(
self
):
def
do_help
(
self
):
self
.
prologue
(
T_HELP
)
self
.
prologue
(
T_HELP
)
emit
(
HELP
)
emit
(
HELP
)
def
do_show
(
self
):
def
do_show
(
self
):
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
self
.
prologue
(
T_SHOW
)
self
.
prologue
(
T_SHOW
)
entry
.
show
()
entry
.
show
()
def
do_add
(
self
):
def
do_add
(
self
):
self
.
prologue
(
T_ADD
)
self
.
prologue
(
T_ADD
)
emit
(
ADD_HEAD
)
emit
(
ADD_HEAD
)
sections
=
SECTION_TITLES
.
items
()
sections
=
SECTION_TITLES
.
items
()
sections
.
sort
()
sections
.
sort
()
for
section
,
title
in
sections
:
for
section
,
title
in
sections
:
emit
(
ADD_SECTION
,
section
=
section
,
title
=
title
)
emit
(
ADD_SECTION
,
section
=
section
,
title
=
title
)
emit
(
ADD_TAIL
)
emit
(
ADD_TAIL
)
def
do_delete
(
self
):
def
do_delete
(
self
):
self
.
prologue
(
T_DELETE
)
self
.
prologue
(
T_DELETE
)
emit
(
DELETE
)
emit
(
DELETE
)
def
do_log
(
self
):
def
do_log
(
self
):
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
self
.
prologue
(
T_LOG
,
entry
)
self
.
prologue
(
T_LOG
,
entry
)
emit
(
LOG
,
entry
)
emit
(
LOG
,
entry
)
self
.
rlog
(
interpolate
(
SH_RLOG
,
entry
),
entry
)
self
.
rlog
(
interpolate
(
SH_RLOG
,
entry
),
entry
)
def
rlog
(
self
,
command
,
entry
=
None
):
def
rlog
(
self
,
command
,
entry
=
None
):
output
=
os
.
popen
(
command
)
.
read
()
output
=
os
.
popen
(
command
)
.
read
()
sys
.
stdout
.
write
(
'<PRE>'
)
sys
.
stdout
.
write
(
'<PRE>'
)
athead
=
0
athead
=
0
lines
=
string
.
split
(
output
,
'
\n
'
)
lines
=
string
.
split
(
output
,
'
\n
'
)
while
lines
and
not
lines
[
-
1
]:
while
lines
and
not
lines
[
-
1
]:
del
lines
[
-
1
]
del
lines
[
-
1
]
if
lines
:
if
lines
:
line
=
lines
[
-
1
]
line
=
lines
[
-
1
]
if
line
[:
1
]
==
'='
and
len
(
line
)
>=
40
and
\
if
line
[:
1
]
==
'='
and
len
(
line
)
>=
40
and
\
line
==
line
[
0
]
*
len
(
line
):
line
==
line
[
0
]
*
len
(
line
):
del
lines
[
-
1
]
del
lines
[
-
1
]
headrev
=
None
headrev
=
None
for
line
in
lines
:
for
line
in
lines
:
if
entry
and
athead
and
line
[:
9
]
==
'revision '
:
if
entry
and
athead
and
line
[:
9
]
==
'revision '
:
rev
=
string
.
strip
(
line
[
9
:])
rev
=
string
.
strip
(
line
[
9
:])
mami
=
revparse
(
rev
)
mami
=
revparse
(
rev
)
if
not
mami
:
if
not
mami
:
print
line
print
line
else
:
else
:
emit
(
REVISIONLINK
,
entry
,
rev
=
rev
,
line
=
line
)
emit
(
REVISIONLINK
,
entry
,
rev
=
rev
,
line
=
line
)
if
mami
[
1
]
>
1
:
if
mami
[
1
]
>
1
:
prev
=
"
%
d.
%
d"
%
(
mami
[
0
],
mami
[
1
]
-
1
)
prev
=
"
%
d.
%
d"
%
(
mami
[
0
],
mami
[
1
]
-
1
)
emit
(
DIFFLINK
,
entry
,
prev
=
prev
,
rev
=
rev
)
emit
(
DIFFLINK
,
entry
,
prev
=
prev
,
rev
=
rev
)
if
headrev
:
if
headrev
:
emit
(
DIFFLINK
,
entry
,
prev
=
rev
,
rev
=
headrev
)
emit
(
DIFFLINK
,
entry
,
prev
=
rev
,
rev
=
headrev
)
else
:
else
:
headrev
=
rev
headrev
=
rev
print
print
athead
=
0
athead
=
0
else
:
else
:
athead
=
0
athead
=
0
if
line
[:
1
]
==
'-'
and
len
(
line
)
>=
20
and
\
if
line
[:
1
]
==
'-'
and
len
(
line
)
>=
20
and
\
line
==
len
(
line
)
*
line
[
0
]:
line
==
len
(
line
)
*
line
[
0
]:
athead
=
1
athead
=
1
sys
.
stdout
.
write
(
'<HR>'
)
sys
.
stdout
.
write
(
'<HR>'
)
else
:
else
:
print
line
print
line
print
'</PRE>'
print
'</PRE>'
def
do_revision
(
self
):
def
do_revision
(
self
):
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
rev
=
self
.
ui
.
rev
rev
=
self
.
ui
.
rev
mami
=
revparse
(
rev
)
mami
=
revparse
(
rev
)
if
not
mami
:
if
not
mami
:
self
.
error
(
"Invalid revision number:
%
s."
%
`rev`
)
self
.
error
(
"Invalid revision number:
%
s."
%
`rev`
)
self
.
prologue
(
T_REVISION
,
entry
)
self
.
prologue
(
T_REVISION
,
entry
)
self
.
shell
(
interpolate
(
SH_REVISION
,
entry
,
rev
=
rev
))
self
.
shell
(
interpolate
(
SH_REVISION
,
entry
,
rev
=
rev
))
def
do_diff
(
self
):
def
do_diff
(
self
):
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
prev
=
self
.
ui
.
prev
prev
=
self
.
ui
.
prev
rev
=
self
.
ui
.
rev
rev
=
self
.
ui
.
rev
mami
=
revparse
(
rev
)
mami
=
revparse
(
rev
)
if
not
mami
:
if
not
mami
:
self
.
error
(
"Invalid revision number:
%
s."
%
`rev`
)
self
.
error
(
"Invalid revision number:
%
s."
%
`rev`
)
if
prev
:
if
prev
:
if
not
revparse
(
prev
):
if
not
revparse
(
prev
):
self
.
error
(
"Invalid previous revision number:
%
s."
%
`prev`
)
self
.
error
(
"Invalid previous revision number:
%
s."
%
`prev`
)
else
:
else
:
prev
=
'
%
d.
%
d'
%
(
mami
[
0
],
mami
[
1
])
prev
=
'
%
d.
%
d'
%
(
mami
[
0
],
mami
[
1
])
self
.
prologue
(
T_DIFF
,
entry
)
self
.
prologue
(
T_DIFF
,
entry
)
self
.
shell
(
interpolate
(
SH_RDIFF
,
entry
,
rev
=
rev
,
prev
=
prev
))
self
.
shell
(
interpolate
(
SH_RDIFF
,
entry
,
rev
=
rev
,
prev
=
prev
))
def
shell
(
self
,
command
):
def
shell
(
self
,
command
):
output
=
os
.
popen
(
command
)
.
read
()
output
=
os
.
popen
(
command
)
.
read
()
sys
.
stdout
.
write
(
'<PRE>'
)
sys
.
stdout
.
write
(
'<PRE>'
)
print
escape
(
output
)
print
escape
(
output
)
print
'</PRE>'
print
'</PRE>'
def
do_new
(
self
):
def
do_new
(
self
):
entry
=
self
.
dir
.
new
(
section
=
string
.
atoi
(
self
.
ui
.
section
))
entry
=
self
.
dir
.
new
(
section
=
string
.
atoi
(
self
.
ui
.
section
))
entry
.
version
=
'*new*'
entry
.
version
=
'*new*'
self
.
prologue
(
T_EDIT
)
self
.
prologue
(
T_EDIT
)
emit
(
EDITHEAD
)
emit
(
EDITHEAD
)
emit
(
EDITFORM1
,
entry
,
editversion
=
entry
.
version
)
emit
(
EDITFORM1
,
entry
,
editversion
=
entry
.
version
)
emit
(
EDITFORM2
,
entry
,
load_my_cookie
())
emit
(
EDITFORM2
,
entry
,
load_my_cookie
())
emit
(
EDITFORM3
)
emit
(
EDITFORM3
)
entry
.
show
(
edit
=
0
)
entry
.
show
(
edit
=
0
)
def
do_edit
(
self
):
def
do_edit
(
self
):
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
.
load_version
()
entry
.
load_version
()
self
.
prologue
(
T_EDIT
)
self
.
prologue
(
T_EDIT
)
emit
(
EDITHEAD
)
emit
(
EDITHEAD
)
emit
(
EDITFORM1
,
entry
,
editversion
=
entry
.
version
)
emit
(
EDITFORM1
,
entry
,
editversion
=
entry
.
version
)
emit
(
EDITFORM2
,
entry
,
load_my_cookie
())
emit
(
EDITFORM2
,
entry
,
load_my_cookie
())
emit
(
EDITFORM3
)
emit
(
EDITFORM3
)
entry
.
show
(
edit
=
0
)
entry
.
show
(
edit
=
0
)
def
do_review
(
self
):
def
do_review
(
self
):
send_my_cookie
(
self
.
ui
)
send_my_cookie
(
self
.
ui
)
if
self
.
ui
.
editversion
==
'*new*'
:
if
self
.
ui
.
editversion
==
'*new*'
:
sec
,
num
=
self
.
dir
.
parse
(
self
.
ui
.
file
)
sec
,
num
=
self
.
dir
.
parse
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
new
(
section
=
sec
)
entry
=
self
.
dir
.
new
(
section
=
sec
)
entry
.
version
=
"*new*"
entry
.
version
=
"*new*"
if
entry
.
file
!=
self
.
ui
.
file
:
if
entry
.
file
!=
self
.
ui
.
file
:
self
.
error
(
"Commit version conflict!"
)
self
.
error
(
"Commit version conflict!"
)
emit
(
NEWCONFLICT
,
self
.
ui
,
sec
=
sec
,
num
=
num
)
emit
(
NEWCONFLICT
,
self
.
ui
,
sec
=
sec
,
num
=
num
)
return
return
else
:
else
:
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
=
self
.
dir
.
open
(
self
.
ui
.
file
)
entry
.
load_version
()
entry
.
load_version
()
# Check that the FAQ entry number didn't change
# Check that the FAQ entry number didn't change
if
string
.
split
(
self
.
ui
.
title
)[:
1
]
!=
string
.
split
(
entry
.
title
)[:
1
]:
if
string
.
split
(
self
.
ui
.
title
)[:
1
]
!=
string
.
split
(
entry
.
title
)[:
1
]:
self
.
error
(
"Don't change the entry number please!"
)
self
.
error
(
"Don't change the entry number please!"
)
return
return
# Check that the edited version is the current version
# Check that the edited version is the current version
if
entry
.
version
!=
self
.
ui
.
editversion
:
if
entry
.
version
!=
self
.
ui
.
editversion
:
self
.
error
(
"Commit version conflict!"
)
self
.
error
(
"Commit version conflict!"
)
emit
(
VERSIONCONFLICT
,
entry
,
self
.
ui
)
emit
(
VERSIONCONFLICT
,
entry
,
self
.
ui
)
return
return
commit_ok
=
((
not
PASSWORD
commit_ok
=
((
not
PASSWORD
or
self
.
ui
.
password
==
PASSWORD
)
or
self
.
ui
.
password
==
PASSWORD
)
and
self
.
ui
.
author
and
self
.
ui
.
author
and
'@'
in
self
.
ui
.
email
and
'@'
in
self
.
ui
.
email
and
self
.
ui
.
log
)
and
self
.
ui
.
log
)
if
self
.
ui
.
commit
:
if
self
.
ui
.
commit
:
if
not
commit_ok
:
if
not
commit_ok
:
self
.
cantcommit
()
self
.
cantcommit
()
else
:
else
:
self
.
commit
(
entry
)
self
.
commit
(
entry
)
return
return
self
.
prologue
(
T_REVIEW
)
self
.
prologue
(
T_REVIEW
)
emit
(
REVIEWHEAD
)
emit
(
REVIEWHEAD
)
entry
.
body
=
self
.
ui
.
body
entry
.
body
=
self
.
ui
.
body
entry
.
title
=
self
.
ui
.
title
entry
.
title
=
self
.
ui
.
title
entry
.
show
(
edit
=
0
)
entry
.
show
(
edit
=
0
)
emit
(
EDITFORM1
,
self
.
ui
,
entry
)
emit
(
EDITFORM1
,
self
.
ui
,
entry
)
if
commit_ok
:
if
commit_ok
:
emit
(
COMMIT
)
emit
(
COMMIT
)
else
:
else
:
emit
(
NOCOMMIT
)
emit
(
NOCOMMIT
)
emit
(
EDITFORM2
,
self
.
ui
,
entry
,
load_my_cookie
())
emit
(
EDITFORM2
,
self
.
ui
,
entry
,
load_my_cookie
())
emit
(
EDITFORM3
)
emit
(
EDITFORM3
)
def
cantcommit
(
self
):
def
cantcommit
(
self
):
self
.
prologue
(
T_CANTCOMMIT
)
self
.
prologue
(
T_CANTCOMMIT
)
print
CANTCOMMIT_HEAD
print
CANTCOMMIT_HEAD
if
not
self
.
ui
.
passwd
:
if
not
self
.
ui
.
passwd
:
emit
(
NEED_PASSWD
)
emit
(
NEED_PASSWD
)
if
not
self
.
ui
.
log
:
if
not
self
.
ui
.
log
:
emit
(
NEED_LOG
)
emit
(
NEED_LOG
)
if
not
self
.
ui
.
author
:
if
not
self
.
ui
.
author
:
emit
(
NEED_AUTHOR
)
emit
(
NEED_AUTHOR
)
if
not
self
.
ui
.
email
:
if
not
self
.
ui
.
email
:
emit
(
NEED_EMAIL
)
emit
(
NEED_EMAIL
)
print
CANTCOMMIT_TAIL
print
CANTCOMMIT_TAIL
def
commit
(
self
,
entry
):
def
commit
(
self
,
entry
):
file
=
entry
.
file
file
=
entry
.
file
# Normalize line endings in body
# Normalize line endings in body
if
'
\r
'
in
self
.
ui
.
body
:
if
'
\r
'
in
self
.
ui
.
body
:
self
.
ui
.
body
=
re
.
sub
(
'
\r\n
?'
,
'
\n
'
,
self
.
ui
.
body
)
self
.
ui
.
body
=
re
.
sub
(
'
\r\n
?'
,
'
\n
'
,
self
.
ui
.
body
)
# Normalize whitespace in title
# Normalize whitespace in title
self
.
ui
.
title
=
string
.
join
(
string
.
split
(
self
.
ui
.
title
))
self
.
ui
.
title
=
string
.
join
(
string
.
split
(
self
.
ui
.
title
))
# Check that there were any changes
# Check that there were any changes
if
self
.
ui
.
body
==
entry
.
body
and
self
.
ui
.
title
==
entry
.
title
:
if
self
.
ui
.
body
==
entry
.
body
and
self
.
ui
.
title
==
entry
.
title
:
self
.
error
(
"You didn't make any changes!"
)
self
.
error
(
"You didn't make any changes!"
)
return
return
# XXX Should lock here
# XXX Should lock here
try
:
try
:
os
.
unlink
(
file
)
os
.
unlink
(
file
)
except
os
.
error
:
except
os
.
error
:
pass
pass
try
:
try
:
f
=
open
(
file
,
'w'
)
f
=
open
(
file
,
'w'
)
except
IOError
,
why
:
except
IOError
,
why
:
self
.
error
(
CANTWRITE
,
file
=
file
,
why
=
why
)
self
.
error
(
CANTWRITE
,
file
=
file
,
why
=
why
)
return
return
date
=
time
.
ctime
(
now
)
date
=
time
.
ctime
(
now
)
emit
(
FILEHEADER
,
self
.
ui
,
os
.
environ
,
date
=
date
,
_file
=
f
,
_quote
=
0
)
emit
(
FILEHEADER
,
self
.
ui
,
os
.
environ
,
date
=
date
,
_file
=
f
,
_quote
=
0
)
f
.
write
(
'
\n
'
)
f
.
write
(
'
\n
'
)
f
.
write
(
self
.
ui
.
body
)
f
.
write
(
self
.
ui
.
body
)
f
.
write
(
'
\n
'
)
f
.
write
(
'
\n
'
)
f
.
close
()
f
.
close
()
import
tempfile
import
tempfile
tfn
=
tempfile
.
mktemp
()
tfn
=
tempfile
.
mktemp
()
f
=
open
(
tfn
,
'w'
)
f
=
open
(
tfn
,
'w'
)
emit
(
LOGHEADER
,
self
.
ui
,
os
.
environ
,
date
=
date
,
_file
=
f
)
emit
(
LOGHEADER
,
self
.
ui
,
os
.
environ
,
date
=
date
,
_file
=
f
)
f
.
close
()
f
.
close
()
command
=
interpolate
(
command
=
interpolate
(
SH_LOCK
+
'
\n
'
+
SH_CHECKIN
,
SH_LOCK
+
'
\n
'
+
SH_CHECKIN
,
file
=
file
,
tfn
=
tfn
)
file
=
file
,
tfn
=
tfn
)
p
=
os
.
popen
(
command
)
p
=
os
.
popen
(
command
)
output
=
p
.
read
()
output
=
p
.
read
()
sts
=
p
.
close
()
sts
=
p
.
close
()
# XXX Should unlock here
# XXX Should unlock here
if
not
sts
:
if
not
sts
:
self
.
prologue
(
T_COMMITTED
)
self
.
prologue
(
T_COMMITTED
)
emit
(
COMMITTED
)
emit
(
COMMITTED
)
else
:
else
:
self
.
error
(
T_COMMITFAILED
)
self
.
error
(
T_COMMITFAILED
)
emit
(
COMMITFAILED
,
sts
=
sts
)
emit
(
COMMITFAILED
,
sts
=
sts
)
print
'<PRE>
%
s</PRE>'
%
escape
(
output
)
print
'<PRE>
%
s</PRE>'
%
escape
(
output
)
try
:
try
:
os
.
unlink
(
tfn
)
os
.
unlink
(
tfn
)
except
os
.
error
:
except
os
.
error
:
pass
pass
entry
=
self
.
dir
.
open
(
file
)
entry
=
self
.
dir
.
open
(
file
)
entry
.
show
()
entry
.
show
()
wiz
=
FaqWizard
()
wiz
=
FaqWizard
()
wiz
.
go
()
wiz
.
go
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment