Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch wcag-2.1
Excluding Merge-Ins
This is equivalent to a diff from
d0ee8100
to 56d8000a
2022-11-16
| | |
18:46 |
|
...
(check-in: 210e89a0 user: drh tags: trunk, release, version-2.20)
|
16:09 |
|
...
(Leaf
check-in: 56d8000a user: stephan tags: wcag-2.1)
|
16:02 |
|
...
(check-in: d0ee8100 user: drh tags: trunk)
|
2022-11-14
| | |
12:43 |
|
...
(check-in: 2ece5d0f user: drh tags: trunk)
|
2022-11-13
| | |
19:49 |
|
...
(check-in: ba3fa28d user: ericwikman tags: wcag-2.1)
|
| | |
Changes to skins/ardoise/css.txt.
︙ | | |
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
|
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
|
-
+
|
.mainmenu li:hover {
background-color: #ff8000;
border-radius: 5px
}
.mainmenu li:hover a {
color: #000
}
div#hbdrop {
nav#hbdrop {
background-color: #161819;
border-radius: 15px;
display: none;
width: 100%;
position: absolute;
z-index: 20;
}
|
︙ | | |
Changes to skins/ardoise/footer.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-
+
-
+
|
<th1>
if {[string first artifact $current_page] == 0 || [string first hexdump $current_page] == 0} {
html "</div>"
}
</th1>
</div> <!-- end div container -->
</div> <!-- end div middle max-full-width -->
<div class="footer">
<footer class="footer">
<div class="container">
<div class="pull-right">
<a href="https://fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a>
</div>
This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s
</div>
</div>
</footer>
|
Changes to skins/ardoise/header.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="header">
<header class="header">
<div class="container">
<div class="login pull-right">
<th1>
if {[info exists login]} {
html "<b>$login</b> — <a class='button' href='$home/login'>Logout</a>\n"
} else {
html "<a class='button' href='$home/login'>Login</a>\n"
|
︙ | | |
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
|
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
|
-
+
-
-
+
+
-
+
|
html "<a class='rss' href='$home/timeline.rss'></a>"
}
</th1>
<small> $<title></small></h1>
</div>
<!-- Main Menu -->
<div class="mainmenu">
<nav class="mainmenu">
<ul>
<th1>
html "<li><a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a></li>\n"
builtin_request_js hbmenu.js
set once 1
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {$once && [string match $url\[/?#\]* /$current_page/]} {
set class "$class active"
set once 0
}
html "<li class='$class'>"
if {[string match /* $url]} {set url $home$url}
html "<a href='$url'>$name</a></li>\n"
}
</th1></ul>
</div> <!-- end div mainmenu -->
<div id="hbdrop"></div>
</nav> <!-- end div mainmenu -->
<nav id='hbdrop' title="Sitemap"></nav>
</div> <!-- end div container -->
</div> <!-- end div header -->
</header> <!-- end div header -->
<div class="middle max-full-width">
<div class="container">
<th1>
if {[string first artifact $current_page] == 0 || [string first hexdump $current_page] == 0} {
html "<div class=\"artifact_content\">"
}
</th1>
|
Changes to skins/black_and_white/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
|
color: #333;
font-size: 0.8em;
font-weight: bold;
white-space: nowrap;
}
/* The header across the top of the page */
div.header {
header.header {
margin:10px 0px 10px 0px;
padding:1px 0px 0px 20px;
border-style:solid;
border-color:black;
border-width:1px 0px;
background-color:#eee;
}
/* The main menu bar that appears at the top left of the page beneath
** the header. Width must be co-ordinated with the container below */
div.mainmenu {
nav.mainmenu {
float: left;
margin-left: 10px;
margin-right: 20px;
font-size: 0.9em;
font-weight: bold;
padding:5px;
background-color:#eee;
border:1px solid #999;
width:6em;
}
/* Main menu is now a list */
div.mainmenu ul {
nav.mainmenu ul {
padding: 0;
list-style:none;
}
div.mainmenu a, div.mainmenu a:visited{
nav.mainmenu a, nav.mainmenu a:visited{
padding: 1px 10px 1px 10px;
color: #333;
text-decoration: none;
}
div.mainmenu a:hover {
nav.mainmenu a:hover {
color: #eee;
background-color: #333;
}
/* Container for the sub-menu and content so they don't spread
** out underneath the main menu */
#container {
padding-left: 9em;
}
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 3px 10px 3px 10px;
font-size: 0.9em;
text-align: center;
border:1px solid #999;
border-width:1px 0px;
background-color: #eee;
color: #333;
}
div.submenu a, div.submenu a:visited, div.sectionmenu>a.button:link,
div.sectionmenu>a.button:visited, div.submenu label {
nav.submenu a, nav.submenu a:visited, div.sectionmenu>a.button:link,
div.sectionmenu>a.button:visited, nav.submenu label {
padding: 3px 10px 3px 10px;
color: #333;
text-decoration: none;
}
div.submenu a:hover, div.sectionmenu>a.button:hover, div.submenu label:hover {
nav.submenu a:hover, div.sectionmenu>a.button:hover, nav.submenu label:hover {
color: #eee;
background-color: #333;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 2ex 1ex 0ex 2ex;
}
/* Some pages have section dividers */
div.section {
margin-bottom: 0px;
margin-top: 1em;
|
︙ | | |
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
-
+
|
float: left;
clear: left;
color: #333;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
font-size: 0.8em;
margin-top: 12px;
padding: 5px 10px 5px 10px;
text-align: right;
background-color: #eee;
color: #555;
}
|
︙ | | |
Changes to skins/black_and_white/footer.txt.
1
2
3
|
1
2
3
|
-
+
-
+
|
<div class="footer">
<footer class="footer">
Fossil $release_version $manifest_version $manifest_date
</div>
</footer>
|
Changes to skins/black_and_white/header.txt.
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
|
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
|
-
+
-
-
+
+
-
+
|
<div class="header">
<header class="header">
<div class="logo">
<img src="$logo_image_url" alt="logo">
<br />$<project_name>
</div>
<div class="title">$<title></div>
<div class="status"><th1>
if {[info exists login]} {
puts "Logged in as $login"
} else {
puts "Not logged in"
}
</th1></div>
</div>
<div class="mainmenu">
</header>
<nav class="mainmenu">
<th1>
set sitemap 0
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {set url $home$url}
html "<a href='$url'>$name</a><br/>\n"
if {[string match /sitemap $url]} {set sitemap 1}
}
if {!$sitemap} {
html "<a href='$home/sitemap'>Sitemap</a>\n"
}
</th1></div>
</th1></nav>
|
Changes to skins/blitz/css.txt.
︙ | | |
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
|
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
|
-
+
-
+
-
+
|
.mainmenu li.active {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB90FDxEXAZ2XRzAAAABJSURBVCjPY2CgBzhz5sx/QmoYiTXAxMSEkWRDsLkAl0GMpHoBm0EoAlu3bmUQFxcnGAboBjEhc4gxAJtLGUmJBVwuYiTXAGSDAIx5IBObnuVxAAAAAElFTkSuQmCC);
background-repeat: no-repeat;
background-position: center bottom;
}
.mainmenu li a,
div#hbdrop a {
nav#hbdrop a {
color: #3b5c6b;
padding: 10px 15px;
}
.mainmenu li.active a {
font-weight: bold;
}
.mainmenu li:hover
div#hbdrop a:hover {
nav#hbdrop a:hover {
background-color: #eee;
}
div#hbdrop {
nav#hbdrop {
background-color: white;
border: 2px solid #ccc;
display: none;
width: 100%;
position: absolute;
z-index: 20;
}
|
︙ | | |
Changes to skins/blitz/footer.txt.
1
2
3
4
5
6
7
8
9
10
|
1
2
3
4
5
6
7
8
9
10
|
-
+
-
+
|
</div> <!-- end div container -->
</div> <!-- end div middle max-full-width -->
<div class="footer">
<footer class="footer">
<div class="container">
<div class="pull-right">
<a href="https://www.fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a>
</div>
This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s
</div>
</div>
</footer>
|
Changes to skins/blitz/header.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="header">
<header class="header">
<div class="container">
<!-- Header -->
<div class="login pull-right">
<th1>
if {[info exists login]} {
html "<b>$login</b> — <a class='button' href='$home/login'>Logout</a>\n"
|
︙ | | |
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
|
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
|
-
+
-
-
+
+
-
+
|
html "<a class='rss' href='$home/timeline.rss'></a>"
}
</th1>
<small> $<title></small></h1>
</div>
<!-- Main Menu -->
<div class="mainmenu">
<nav class="mainmenu">
<ul><th1>
html "<li><a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a></li>\n"
builtin_request_js hbmenu.js
set once 1
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {$once && [string match $url\[/?#\]* /$current_page/]} {
set class "active $class"
set once 0
}
html "<li class='$class'>"
if {[string match /* $url]} {set url $home$url}
html "<a href='$url'>$name</a></li>\n"
}
</th1></ul>
</div> <!-- end div mainmenu -->
<div id="hbdrop"></div>
</nav> <!-- end div mainmenu -->
<nav id='hbdrop' title="Sitemap"></nav>
</div> <!-- end div container -->
</div> <!-- end div header -->
</header> <!-- end div header -->
<div class="middle max-full-width">
<div class="container">
|
Changes to skins/darkmode/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
|
** the area to show as blank. The purpose is to cause the
** title to be exactly centered. */
div.leftoftitle {
visibility: hidden;
}
/* The header across the top of the page */
div.header {
header.header {
display: table;
width: 100%;
}
/* The main menu bar that appears at the top of the page beneath
** the header */
div.mainmenu {
nav.mainmenu {
padding: 0.25em 0.5em;
font-size: 0.9em;
font-weight: bold;
text-align: center;
border-top-left-radius: 0.5em;
border-top-right-radius: 0.5em;
border-bottom: 1px dotted rgba(200,200,200,0.3);
z-index: 21; /* just above hbdrop */
}
div#hbdrop {
nav#hbdrop {
background-color: #1f1f1f;
border: 2px solid #303536;
border-radius: 0 0 0.5em 0.5em;
display: none;
left: 2em;
width: calc(100% - 4em);
position: absolute;
z-index: 20; /* just below mainmenu, but above timeline bubbles */
}
div.mainmenu, div.submenu, div.sectionmenu {
nav.mainmenu, nav.submenu, div.sectionmenu {
color: #ffffffcc;
background-color: #303536/*#0000ff60*/;
}
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 0.15em 0.5em 0.15em 0;
font-size: 0.9em;
text-align: center;
border-bottom-left-radius: 0.5em;
border-bottom-right-radius: 0.5em;
}
a, a:visited {
color: rgba(127, 201, 255, 0.9);
display: inline;
text-decoration: none;
}
a:visited {opacity: 0.8}
div.mainmenu a, div.submenu a,
div.sectionmenu>a.button, div.submenu label,
div.footer a {
nav.mainmenu a, nav.submenu a,
div.sectionmenu>a.button, nav.submenu label,
footer.footer a {
padding: 0.15em 0.5em;
}
div.mainmenu a.active {
nav.mainmenu a.active {
border-bottom: 1px solid #FF4500f0;
}
a:hover,
a:visited:hover {
background-color: #FF4500f0;
color: rgba(24,24,24,0.8);
border-radius: 0.1em;
|
︙ | | |
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
-
+
|
input[type=submit]:focus {
outline: 2px outset #333;
border-color: #888;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 0ex 1ex 1ex 1ex;
}
/* Some pages have section dividers */
div.section {
margin-bottom: 0;
margin-top: 1em;
|
︙ | | |
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
-
+
|
margin: .2em 0 .2em 0;
float: left;
clear: left;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
clear: both;
font-size: 0.8em;
padding: 0.15em 0.5em;
text-align: right;
background-color: #303536/*#0000ff60*/;
border-top: 1px dotted rgba(200,200,200,0.3);
border-bottom-left-radius: 0.5em;
|
︙ | | |
Changes to skins/darkmode/footer.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
-
+
|
<div class="footer">
<footer class="footer">
<div class="container">
<div class="pull-right">
<a href="https://www.fossil-scm.org/">Fossil $release_version $manifest_version $manifest_date</a>
</div>
This page was generated in about <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s
</div>
</div>
</footer>
|
Changes to skins/darkmode/header.txt.
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
|
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
|
-
+
-
-
+
+
-
-
+
+
|
<div class="header">
<header class="header">
<div class="status leftoftitle"><th1>
if {[info exists login]} {
set logintext "<a href='$home/login'>$login</a>\n"
} else {
set logintext "<a href='$home/login'>Login</a>\n"
}
html $logintext
</th1></div>
<div class="title">$<title></div>
<div class="status"><nobr><th1>
html $logintext
</th1></nobr></div>
</div>
<div class="mainmenu">
</header>
<nav class="mainmenu">
<th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {
if {[string match $url\[/?#\]* /$current_page/]} {
set class "active $class"
}
set url $home$url
}
html "<a href='$url' class='$class'>$name</a>\n"
}
</th1></div>
<div id='hbdrop'></div>
</th1></nav>
<nav id='hbdrop' title="Sitemap"></nav>
|
Changes to skins/default/css.txt.
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
|
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
|
-
+
-
+
-
+
-
+
|
/* Overall page style */
body {
margin: 0 auto;
background-color: white;
font-family: sans-serif;
font-size: 14pt;
-moz-text-size-adjust: none;
-mx-text-size-adjust: none;
-webkit-text-size-adjust: none;
}
a {
color: #4183C4;
color: #2D5486;
text-decoration: none;
}
a:hover {
color: #4183C4;
color: #2D5486;
text-decoration: underline;
}
/* Page title, above menu bars */
.title {
color: #4183C4;
color: #3A76BB;
float: left;
}
.title h1 {
display: inline;
}
.title h1:after {
content: " / ";
color: #777;
color: #6B6B6B;
font-weight: normal;
}
.status {
float: right;
font-size: 0.7em;
}
|
︙ | | |
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
-
+
-
+
|
overflow-x: auto;
overflow-y: hidden;
white-space: nowrap;
z-index: 21; /* just above hbdrop */
}
.mainmenu a {
text-decoration: none;
color: #777;
color: #6B6B6B;
border-right: 1px solid #eaeaea;
}
.mainmenu a.active,
.mainmenu a:hover {
color: #000;
border-bottom: 2px solid #D26911;
}
div#hbdrop {
nav#hbdrop {
background-color: white;
border: 1px solid black;
border-top: white;
border-radius: 0 0 0.5em 0.5em;
display: none;
font-size: 80%;
left: 2em;
|
︙ | | |
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
|
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
|
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
font-size: .7em;
padding: 10px;
border-bottom: 1px solid #ccc;
}
.submenu a, .submenu label {
padding: 10px 11px;
text-decoration: none;
color: #777;
color: #6B6B6B;
}
.submenu label {
white-space: nowrap;
}
.submenu a:hover, .submenu label:hover {
padding: 6px 10px;
border: 1px solid #ccc;
border-radius: 5px;
color: #000;
}
span.submenuctrl, span.submenuctrl input, select.submenuctrl {
color: #777;
color: #6B6B6B;
}
span.submenuctrl {
white-space: nowrap;
}
div.searchForm {
text-align: left;
}
.searchForm {
padding: 10px;
border-bottom: 1px solid #ccc;
}
.searchForm label {
padding: 10px 11px;
text-decoration: none;
color: #6B6B6B;
white-space: nowrap;
}
.searchForm label:hover {
padding: 6px 10px;
border: 1px solid #ccc;
border-radius: 5px;
color: #000;
}
/* Main document area; elements common to most pages. */
.content {
padding-top: 10px;
font-size: 0.8em;
color: #444;
|
︙ | | |
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
-
+
|
/* Page footer */
.footer {
border-top: 1px solid #ccc;
padding: 10px;
font-size: 0.7em;
margin-top: 10px;
color: #ccc;
color: #757575;
}
/* Forum */
.forum a:visited {
color: #6A7F94;
}
|
︙ | | |
Changes to skins/default/footer.txt.
1
2
3
4
5
|
1
2
3
4
5
|
-
+
-
+
|
<div class="footer">
<footer class="footer">
This page was generated in about
<th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
Fossil $release_version $manifest_version $manifest_date
</div>
</footer>
|
Changes to skins/default/header.txt.
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
|
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
|
-
+
-
+
-
-
+
+
-
+
-
-
+
+
|
<div class="header">
<header class="header">
<div class="title"><h1>$<project_name></h1>$<title></div>
<div class="status"><th1>
if {[info exists login]} {
html "<a href='$home/login'>$login</a>\n"
html "<a href='$home/login' title='Logout'>$login</a>\n"
} else {
html "<a href='$home/login'>Login</a>\n"
}
</th1></div>
</div>
<div class="mainmenu">
</header>
<nav class="mainmenu" title="Main Menu">
<th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>"
html "<a id='hbbtn' href='$home/sitemap' title='Site Map'>☰</a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {
if {[string match $url\[/?#\]* /$current_page/]} {
set class "active $class"
}
set url $home$url
}
html "<a href='$url' class='$class'>$name</a>\n"
}
</th1></div>
<div id='hbdrop'></div>
</th1></nav>
<nav id='hbdrop' title="Sitemap"></nav>
|
Changes to skins/eagle/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
|
color: white;
font-size: 0.8em;
font-weight: bold;
white-space: nowrap;
}
/* The header across the top of the page */
div.header {
header.header {
display: table;
width: 100%;
}
/* The main menu bar that appears at the top of the page beneath
** the header */
div.mainmenu {
nav.mainmenu {
padding: 5px 10px 5px 10px;
font-size: 0.9em;
font-weight: bold;
text-align: center;
letter-spacing: 1px;
background-color: #76869D;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
color: white;
}
div#hbdrop {
nav#hbdrop {
background-color: #485D7B;
border-radius: 0 0 15px 15px;
border-left: 0.5em solid #76869d;
border-bottom: 1.2em solid #76869d;
display: none;
width: 98%;
position: absolute;
z-index: 20;
}
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 3px 10px 3px 0px;
font-size: 0.9em;
font-weight: bold;
text-align: center;
background-color: #485D7B;
color: white;
}
div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited,
nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited,
div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited,
div.submenu label {
nav.submenu label {
padding: 3px 10px 3px 10px;
color: white;
text-decoration: none;
}
div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover,
div.submenu label:hover {
nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover,
nav.submenu label:hover {
text-decoration: underline;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 0ex 1ex 0ex 2ex;
}
/* Some pages have section dividers */
div.section {
margin-bottom: 0px;
margin-top: 1em;
|
︙ | | |
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
-
+
|
margin: .2em 0 .2em 0;
float: left;
clear: left;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
clear: both;
font-size: 0.8em;
margin-top: 12px;
padding: 5px 10px 5px 10px;
text-align: right;
background-color: #485D7B;
border-bottom-left-radius: 8px;
|
︙ | | |
Changes to skins/eagle/footer.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="footer">
<footer class="footer">
<th1>
proc getTclVersion {} {
if {[catch {tclEval info patchlevel} tclVersion] == 0} {
return "<a href=\"https://www.tcl.tk/\">Tcl</a> version $tclVersion"
}
return ""
}
|
︙ | | |
17
18
19
20
21
22
23
24
|
17
18
19
20
21
22
23
24
|
-
+
|
</th1>
This page was generated in about
<th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
<a href="$fossilUrl/">Fossil</a>
version $release_version $tclVersion
<a href="$fossilUrl/index.html/info/$version">$manifest_version</a>
<a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a>
</div>
</footer>
|
Changes to skins/eagle/header.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="header">
<header class="header">
<div class="logo">
<th1>
##
## NOTE: The purpose of this procedure is to take the base URL of the
## Fossil project and return the root of the entire web site using
## the same URI scheme as the base URL (e.g. http or https).
##
|
︙ | | |
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
|
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
|
-
+
-
+
-
-
+
+
|
<div class="status"><nobr><th1>
if {[info exists login]} {
puts "Logged in as $login"
} else {
puts "Not logged in"
}
</th1></nobr><small><div id="clock"></div></small></div>
</div>
</header>
<th1>html "<script nonce='$nonce'>"</th1>
(function updateClock(){
var e = document.getElementById("clock");
if(!e) return;
if(!updateClock.fmt){
updateClock.fmt = function(n){
return n < 10 ? '0' + n : n;
};
}
var d = new Date();
e.innerHTML = d.getUTCFullYear()+ '-' +
updateClock.fmt(d.getUTCMonth() + 1) + '-' +
updateClock.fmt(d.getUTCDate()) + ' ' +
updateClock.fmt(d.getUTCHours()) + ':' +
updateClock.fmt(d.getUTCMinutes());
setTimeout(updateClock,(60-d.getUTCSeconds())*1000);
})();
</script>
<div class="mainmenu"><th1>
<nav class="mainmenu"><th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>\n"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {set url $home$url}
html "<a href='$url' class='$class'>$name</a>\n"
}
</th1></div>
<div id="hbdrop"></div>
</th1></nav>
<nav id='hbdrop' title="Sitemap"></nav>
|
Changes to skins/khaki/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
|
padding: 5px 5px 0 0;
font-size: 0.8em;
font-weight: bold;
white-space: nowrap;
}
/* The header across the top of the page */
div.header {
header.header {
display: table;
width: 100%;
}
/* The main menu bar that appears at the top of the page beneath
** the header */
div.mainmenu {
nav.mainmenu {
padding: 5px 10px 5px 10px;
font-size: 0.9em;
font-weight: bold;
text-align: center;
letter-spacing: 1px;
background-color: #a09048;
color: black;
z-index: 21; /* just above hbdrop */
}
div#hbdrop {
nav#hbdrop {
background-color: #fef3bc;
border: 2px solid #a09048;
border-radius: 0 0 0.5em 0.5em;
display: none;
left: 2em;
width: 90%;
padding-right: 1em;
position: absolute;
z-index: 20; /* just below mainmenu, but above timeline bubbles */
}
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 3px 10px 3px 0px;
font-size: 0.9em;
text-align: center;
background-color: #c0af58;
color: white;
}
div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited,
nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited,
div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited,
div.submenu label {
nav.submenu label {
padding: 3px 10px 3px 10px;
color: white;
text-decoration: none;
}
div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover,
div.submenu label:hover, div#hbdrop a:hover {
nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover,
nav.submenu label:hover, nav#hbdrop a:hover {
color: #a09048;
background-color: white;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 1ex 5px;
}
div.content a, div#hbdrop a { color: #706532; }
div.content a:link, div#hbdrop a:link { color: #706532; }
div.content a:visited, div#hbdrop a:visited { color: #704032; }
div.content a:hover, div#hbdrop a:hover {
main.content a, nav#hbdrop a { color: #706532; }
main.content a:link, nav#hbdrop a:link { color: #706532; }
main.content a:visited, nav#hbdrop a:visited { color: #704032; }
main.content a:hover, nav#hbdrop a:hover {
background-color: white; color: #706532;
}
a, a:visited {
text-decoration: none;
}
|
︙ | | |
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
|
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
|
-
+
-
-
-
-
+
+
+
+
|
margin: .2em 0 .2em 0;
float: left;
clear: left;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
font-size: 0.8em;
margin-top: 12px;
padding: 5px 10px 5px 10px;
text-align: right;
background-color: #a09048;
color: white;
}
/* Hyperlink colors */
div.footer a { color: white; }
div.footer a:link { color: white; }
div.footer a:visited { color: white; }
div.footer a:hover { background-color: white; color: #558195; }
footer.footer a { color: white; }
footer.footer a:link { color: white; }
footer.footer a:visited { color: white; }
footer.footer a:hover { background-color: white; color: #558195; }
/* <verbatim> blocks */
pre.verbatim {
background-color: #f5f5f5;
padding: 0.5em;
white-space: pre-wrap;
}
|
︙ | | |
Changes to skins/khaki/footer.txt.
1
2
3
|
1
2
3
|
-
+
-
+
|
<div class="footer">
<footer class="footer">
Fossil $release_version $manifest_version $manifest_date
</div>
</footer>
|
Changes to skins/khaki/header.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-
+
-
-
+
+
-
-
+
+
|
<div class="header">
<header class="header">
<div class="title">$<title></div>
<div class="status">
<div class="logo">$<project_name></div><br/>
<th1>
if {[info exists login]} {
puts "Logged in as $login"
} else {
puts "Not logged in"
}
</th1></div>
</div>
<div class="mainmenu"><th1>
</header>
<nav class="mainmenu"><th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {set url $home$url}
html "<a href='$url' class='$class'>$name</a>\n"
}
</th1></div>
<div id='hbdrop'></div>
</th1></nav>
<nav id='hbdrop' title="Sitemap"></nav>
|
Changes to skins/original/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
|
color: #558195;
font-size: 0.8em;
font-weight: bold;
white-space: nowrap;
}
/* The header across the top of the page */
div.header {
header.header {
display: table;
width: 100%;
}
/* The main menu bar that appears at the top of the page beneath
** the header */
div.mainmenu {
nav.mainmenu {
padding: 5px;
font-size: 0.9em;
font-weight: bold;
text-align: center;
letter-spacing: 1px;
background-color: #558195;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
color: white;
}
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 3px 10px 3px 0px;
font-size: 0.9em;
text-align: center;
background-color: #456878;
color: white;
}
div.mainmenu a, div.mainmenu a:visited, div.submenu a, div.submenu a:visited,
nav.mainmenu a, nav.mainmenu a:visited, nav.submenu a, nav.submenu a:visited,
div.sectionmenu>a.button:link, div.sectionmenu>a.button:visited,
div.submenu label {
nav.submenu label {
padding: 3px 10px 3px 10px;
color: white;
text-decoration: none;
}
div.mainmenu a:hover, div.submenu a:hover, div.sectionmenu>a.button:hover,
div.submenu label:hover {
nav.mainmenu a:hover, nav.submenu a:hover, div.sectionmenu>a.button:hover,
nav.submenu label:hover {
color: #558195;
background-color: white;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 0ex 1ex 1ex 1ex;
border: solid #aaa;
border-width: 1px;
}
/* Some pages have section dividers */
div.section {
|
︙ | | |
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
|
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
|
-
+
-
-
-
-
+
+
+
+
|
margin: .2em 0 .2em 0;
float: left;
clear: left;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
clear: both;
font-size: 0.8em;
padding: 5px 10px 5px 10px;
text-align: right;
background-color: #558195;
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
color: white;
}
/* Hyperlink colors in the footer */
div.footer a { color: white; }
div.footer a:link { color: white; }
div.footer a:visited { color: white; }
div.footer a:hover { background-color: white; color: #558195; }
footer.footer a { color: white; }
footer.footer a:link { color: white; }
footer.footer a:visited { color: white; }
footer.footer a:hover { background-color: white; color: #558195; }
/* verbatim blocks */
pre.verbatim {
background-color: #f5f5f5;
padding: 0.5em;
white-space: pre-wrap;
}
|
︙ | | |
Changes to skins/original/footer.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="footer">
<footer class="footer">
<th1>
proc getTclVersion {} {
if {[catch {tclEval info patchlevel} tclVersion] == 0} {
return "<a href=\"https://www.tcl.tk/\">Tcl</a> version $tclVersion"
}
return ""
}
|
︙ | | |
17
18
19
20
21
22
23
24
|
17
18
19
20
21
22
23
24
|
-
+
|
</th1>
This page was generated in about
<th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s by
<a href="$fossilUrl/">Fossil</a>
version $release_version $tclVersion
<a href="$fossilUrl/index.html/info/$version">$manifest_version</a>
<a href="$fossilUrl/index.html/timeline?c=$fossilDate&y=ci">$manifest_date</a>
</div>
</footer>
|
Changes to skins/original/header.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="header">
<header class="header">
<div class="logo">
<th1>
##
## NOTE: The purpose of this procedure is to take the base URL of the
## Fossil project and return the root of the entire web site using
## the same URI scheme as the base URL (e.g. http or https).
##
|
︙ | | |
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
|
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
|
-
+
-
+
-
+
|
<div class="status"><nobr><th1>
if {[info exists login]} {
puts "Logged in as $login"
} else {
puts "Not logged in"
}
</th1></nobr><small><div id="clock"></div></small></div>
</div>
</header>
<th1>html "<script nonce='$nonce'>"</th1>
function updateClock(){
var e = document.getElementById("clock");
if(e){
var d = new Date();
function f(n) {
return n < 10 ? '0' + n : n;
}
e.innerHTML = d.getUTCFullYear()+ '-' +
f(d.getUTCMonth() + 1) + '-' +
f(d.getUTCDate()) + ' ' +
f(d.getUTCHours()) + ':' +
f(d.getUTCMinutes());
setTimeout(updateClock,(60-d.getUTCSeconds())*1000);
}
}
updateClock();
</script>
<div class="mainmenu"><th1>
<nav class="mainmenu"><th1>
set sitemap 0
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {set url $home$url}
html "<a href='$url' class='$class'>$name</a>\n"
if {[string match */sitemap $url]} {set sitemap 1}
}
if {!$sitemap} {
html "<a href='$home/sitemap'>...</a>"
}
</th1></div>
</th1></nav>
|
Changes to skins/plain_gray/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
+
-
+
-
-
-
+
+
+
|
vertical-align: bottom;
color: #404040;
font-weight: bold;
white-space: nowrap;
}
/* The header across the top of the page */
div.header {
header.header {
display: table;
width: 100%;
}
/* The main menu bar that appears at the top of the page beneath
** the header */
div.mainmenu {
nav.mainmenu {
padding: 5px 10px 5px 10px;
font-size: 0.9em;
font-weight: bold;
text-align: center;
letter-spacing: 1px;
background-color: #404040;
color: white;
z-index: 21; /* just above hbdrop */
}
.hbdrop {
background-color: white;
border: 1px solid black;
border-radius: 0.5em;
display: none;
width: 95%;
position: absolute;
z-index: 20; /* just below mainmenu, but above timeline bubbles */
}
div.hbdrop a { color: #604000; }
div.hbdrop a:link { color: #604000;}
div.hbdrop a:visited { color: #600000; }
nav.hbdrop a { color: #604000; }
nav.hbdrop a:link { color: #604000;}
nav.hbdrop a:visited { color: #600000; }
/* The submenu bar that *sometimes* appears below the main menu */
div.submenu, div.sectionmenu {
nav.submenu, div.sectionmenu {
padding: 3px 10px 3px 0px;
font-size: 0.9em;
text-align: center;
background-color: #606060;
color: white;
}
div.mainmenu a,
div.mainmenu a:visited,
div.submenu a,
div.submenu a:visited,
nav.mainmenu a,
nav.mainmenu a:visited,
nav.submenu a,
nav.submenu a:visited,
div.sectionmenu>a.button:link,
div.sectionmenu>a.button:visited,
div.submenu label {
nav.submenu label {
padding: 3px 10px 3px 10px;
color: white;
text-decoration: none;
}
div.mainmenu a:hover,
div.submenu a:hover,
nav.mainmenu a:hover,
nav.submenu a:hover,
div.sectionmenu>a.button:hover,
div.submenu label:hover {
nav.submenu label:hover {
color: #404040;
background-color: white;
}
a, a:visited {
text-decoration: none;
}
/* All page content from the bottom of the menu or submenu down to
** the footer */
div.content {
main.content {
padding: 0ex 0ex 0ex 0ex;
}
/* Hyperlink colors */
div.content a { color: #604000; }
div.content a:link { color: #604000;}
div.content a:visited { color: #600000; }
main.content a { color: #604000; }
main.content a:link { color: #604000;}
main.content a:visited { color: #600000; }
/* <verbatim> blocks */
pre.verbatim {
background-color: #ffffff;
padding: 0.5em;
white-space: pre-wrap;
}
|
︙ | | |
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
-
+
|
margin: .2em 0 .2em 0;
float: left;
clear: left;
white-space: nowrap;
}
/* The footer at the very bottom of the page */
div.footer {
footer.footer {
font-size: 0.8em;
margin-top: 12px;
padding: 5px 10px 5px 10px;
text-align: right;
background-color: #404040;
color: white;
}
|
︙ | | |
Changes to skins/plain_gray/footer.txt.
1
2
3
|
1
2
3
|
-
+
-
+
|
<div class="footer">
<footer class="footer">
Fossil $release_version $manifest_version $manifest_date
</div>
</footer>
|
Changes to skins/plain_gray/header.txt.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
-
+
-
-
+
+
-
-
+
+
|
<div class="header">
<header class="header">
<div class="title">$<project_name>: $<title></div>
</div>
<div class="mainmenu">
</header>
<nav class="mainmenu">
<th1>
html "<a id='hbbtn' href='$home/sitemap' aria-label='Site Map'>☰</a>"
builtin_request_js hbmenu.js
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {set url $home$url}
html "<a href='$url' class='$class'>$name</a>\n"
}
</th1></div>
<div id='hbdrop' class='hbdrop'></div>
</th1></nav>
<nav id='hbdrop' class='hbdrop' title="Sitemap"></nav>
|
Changes to skins/xekri/css.txt.
︙ | | |
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
|
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
|
-
+
-
+
|
}
/**************************************
* Main Area
*/
div.header, div.mainmenu, div.submenu, div.content, div.footer {
header.header, nav.mainmenu, nav.submenu, main.content, footer.footer {
clear: both;
margin: 0 auto;
max-width: 90%;
padding: 0.25rem 1rem;
}
/**************************************
* Main Area: Header
*/
div.header {
header.header {
margin: 0.5rem auto 0 auto;
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;
}
div.logo {
|
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
}
/**************************************
* Main Area: Global Menu
*/
div.mainmenu, div.submenu {
nav.mainmenu, nav.submenu {
background-color: #080;
border-radius: 1rem 1rem 0 0;
box-shadow: 3px 4px 1px #000;
color: #000;
font-weight: bold;
font-size: 1.1rem;
text-align: center;
}
div.mainmenu {
nav.mainmenu {
padding-top: 0.33rem;
padding-bottom: 0.25rem;
}
div.submenu {
nav.submenu {
border-top: 1px solid #0a0;
border-radius: 0;
display: block;
}
div.mainmenu a, div.submenu a, div.submenu label {
nav.mainmenu a, nav.submenu a, nav.submenu label {
color: #000;
padding: 0 0.75rem;
text-decoration: none;
}
div.mainmenu a:hover, div.submenu a:hover, div.submenu label:hover {
nav.mainmenu a:hover, nav.submenu a:hover, nav.submenu label:hover {
color: #fff;
text-shadow: 0px 0px 6px #0f0;
}
div.submenu * {
nav.submenu * {
margin: 0 0.5rem;
vertical-align: middle;
}
div.submenu select, div.submenu input {
nav.submenu select, nav.submenu input {
background-color: #222;
border: 1px inset #080;
color: #eee;
cursor: pointer;
font-size: 0.9rem;
}
div.submenu select {
nav.submenu select {
height: 1.75rem;
}
/**************************************
* Main Area: Content
*/
div.content {
main.content {
background-color: #222;
border-radius: 0 0 1rem 1rem;
box-shadow: 3px 3px 1px #000;
min-height:40%;
padding-bottom: 1rem;
padding-top: 0.5rem;
}
div.content table[bgcolor="white"] {
main.content table[bgcolor="white"] {
color: #000;
}
.piechartLabel {
fill: white;
}
.piechartLine {
stroke: white;
}
/**************************************
* Main Area: Footer
*/
div.footer {
footer.footer {
color: #ee0;
font-size: 0.75rem;
padding: 0;
text-align: right;
width: 75%;
}
div.footer div {
footer.footer div {
background-color: #222;
box-shadow: 3px 3px 1px #000;
border-radius: 0 0 1rem 1rem;
margin: 0 0 10px 0;
padding: 0.25rem 0.75rem;
}
div.footer div.page-time {
footer.footer div.page-time {
float: left;
}
div.footer div.fossil-info {
footer.footer div.fossil-info {
float: right;
}
div.footer a, div.footer a:link, div.footer a:visited {
footer.footer a, footer.footer a:link, footer.footer a:visited {
color: #ee0;
}
div.footer a:hover {
footer.footer a:hover {
color: #fff;
text-shadow: 0px 0px 6px #ee0;
}
/**************************************
* Check-in
|
︙ | | |
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
|
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
|
-
-
-
+
+
+
-
+
|
}
body.branch .brlist > table > tbody > tr:hover:not(.selected),
body.branch .brlist > table > tbody > tr.selected {
background-color: #444;
}
body.chat div.header, body.chat div.footer,
body.chat div.mainmenu, body.chat div.submenu,
body.chat div.content {
body.chat header.header, body.chat footer.footer,
body.chat nav.mainmenu, body.chat nav.submenu,
body.chat main.content {
margin-left: 0.5em;
margin-right: 0.5em;
margin-top: auto/*eliminates unnecessary scrollbars*/;
}
body.chat.chat-only-mode div.content {
body.chat.chat-only-mode main.content {
max-width: revert;
}
body.chat #chat-user-list .chat-user{
color: white;
}
|
Changes to skins/xekri/footer.txt.
1
2
3
4
5
6
7
8
9
|
1
2
3
4
5
6
7
8
9
|
-
+
-
+
|
</div>
<div class="footer">
<footer class="footer">
<div class="page-time">
Generated in <th1>puts [expr {([utime]+[stime]+1000)/1000*0.001}]</th1>s
</div>
<div class="fossil-info">
Fossil v$release_version $manifest_version
</div>
</div>
</footer>
|
Changes to skins/xekri/header.txt.
1
2
3
4
5
6
7
8
|
1
2
3
4
5
6
7
8
|
-
+
|
<div class="header">
<header class="header">
<div class="logo">
<th1>
##
## NOTE: The purpose of this procedure is to take the base URL of the
## Fossil project and return the root of the entire web site using
## the same URI scheme as the base URL (e.g. http or https).
##
|
︙ | | |
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
|
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
|
-
+
-
+
-
+
|
<div class="status"><nobr><th1>
if {[info exists login]} {
puts "Logged in as $login"
} else {
puts "Not logged in"
}
</th1></nobr><small><div id="clock"></div></small></div>
</div>
</header>
<th1>html "<script nonce='$nonce'>"</th1>
function updateClock(){
var e = document.getElementById("clock");
if(e){
var d = new Date();
function f(n) {
return n < 10 ? '0' + n : n;
}
e.innerHTML = d.getUTCFullYear()+ '-' +
f(d.getUTCMonth() + 1) + '-' +
f(d.getUTCDate()) + ' ' +
f(d.getUTCHours()) + ':' +
f(d.getUTCMinutes());
setTimeout(updateClock,(60-d.getUTCSeconds())*1000);
}
}
updateClock();
</script>
<div class="mainmenu"><th1>
<nav class="mainmenu"><th1>
set sitemap 0
foreach {name url expr class} $mainmenu {
if {![capexpr $expr]} continue
if {[string match /* $url]} {
if {[string match $url\[/?#\]* /$current_page/]} {
set class "active $class"
}
set url $home$url
}
html "<a href='$url' class='$class'>$name</a>\n"
if {[string match */sitemap $url]} {set sitemap 1}
}
if {!$sitemap} {
html "<a href='$home/sitemap'>...</a>\n"
}
</th1></div>
</th1></nav>
|
Changes to src/accordion.js.
︙ | | |
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
+
|
var img = document.createElement("img");
img.src = acc_svgdata[0]+acc_svgdata[2]+acc_svgdata[1];
img.className = "accordion_btn accordion_btn_plus";
a[i].insertBefore(img,a[i].firstChild);
img = document.createElement("img");
img.src = acc_svgdata[0]+acc_svgdata[3]+acc_svgdata[1];
img.className = "accordion_btn accordion_btn_minus";
img.alt = "Open/Close Section";
a[i].insertBefore(img,a[i].firstChild);
a[i].addEventListener("click",function(){
var x = this.nextElementSibling;
if( this.classList.contains("accordion_closed") ){
x.style.maxHeight = x.scrollHeight + "px";
setTimeout(function(){
x.style.maxHeight = "";
|
︙ | | |
Changes to src/add.c.
︙ | | |
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
|
360
361
362
363
364
365
366
367
368
369
370
371
372
373
|
-
|
** using the -f|--force option.
**
** The --case-sensitive option determines whether or not filenames should
** be treated case sensitive or not. If the option is not given, the default
** depends on the global setting, or the operating system default, if not set.
**
** Options:
**
** --case-sensitive BOOL Override the case-sensitive setting
** --dotfiles Include files beginning with a dot (".")
** -f|--force Add files without prompting
** --ignore CSG Ignore unmanaged files matching patterns from
** the Comma Separated Glob (CSG) pattern list
** --clean CSG Also ignore files matching patterns from
** the Comma Separated Glob (CSG) list
|
︙ | | |
Changes to src/alerts.c.
︙ | | |
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
|
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
|
-
+
|
style_set_current_feature("alerts");
style_header("Email Notification Setup");
@ <h1>Status</h1>
@ <table class="label-value">
if( alert_enabled() ){
stats_for_email();
}else{
@ <th>Disabled</th>
@ <td>Disabled</td>
}
@ </table>
@ <hr>
@ <h1> Configuration </h1>
@ <form action="%R/setup_notification" method="post"><div>
@ <input type="submit" name="submit" value="Apply Changes" /><hr>
login_insert_csrf_secret();
|
︙ | | |
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
|
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
|
-
-
-
-
+
-
-
-
-
-
+
+
-
|
/*
** COMMAND: alerts*
**
** Usage: %fossil alerts SUBCOMMAND ARGS...
**
** Subcommands:
**
** pending Show all pending alerts. Useful for debugging.
**
** reset Hard reset of all email notification tables
** in the repository. This erases all subscription
** information. ** Use with extreme care **
**
** send Compose and send pending email alerts.
** Some installations may want to do this via
** a cron-job to make sure alerts are sent
** in a timely manner.
** Options:
**
** Options:
** --digest Send digests
** --renewal Send subscription renewal
** notices
** --test Write to standard output
**
** settings [NAME VALUE] With no arguments, list all email settings.
** Or change the value of a single email setting.
**
** status Report on the status of the email alert
** subsystem
**
** subscribers [PATTERN] List all subscribers matching PATTERN. Either
** LIKE or GLOB wildcards can be used in PATTERN.
**
** test-message TO [OPTS] Send a single email message using whatever
** email sending mechanism is currently configured.
** Use this for testing the email notification
** configuration. Options:
** configuration.
**
** Options:
** --body FILENAME Content from FILENAME
** --smtp-trace Trace SMTP processing
** --stdout Send msg to stdout
** -S|--subject SUBJECT Message "subject:"
**
** unsubscribe EMAIL Remove a single subscriber with the given EMAIL.
*/
void alert_cmd(void){
const char *zCmd;
int nCmd;
db_find_and_open_repository(0, 0);
alert_schema(0);
|
︙ | | |
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
|
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
|
-
-
+
+
-
-
+
+
-
-
-
+
+
+
|
if( g.perm.RdWiki ) cgi_set_parameter_nocopy("sw","1",1);
}
@ <p>To receive email notifications for changes to this
@ repository, fill out the form below and press the "Submit" button.</p>
form_begin(0, "%R/subscribe");
@ <table class="subscribe">
@ <tr>
@ <td class="form_label">Email Address:</td>
@ <td><input type="text" name="e" value="%h(PD("e",""))" size="30"></td>
@ <td class="form_label"><label for="e">Email Address:</label></td>
@ <td><input type="text" id="e" name="e" value="%h(PD("e",""))" size="30"></td>
@ <tr>
if( eErr==1 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ </tr>
if( needCaptcha ){
const char *zInit = "";
if( P("captchaseed")!=0 && eErr!=2 ){
uSeed = strtoul(P("captchaseed"),0,10);
zInit = P("captcha");
}else{
uSeed = captcha_seed();
}
zDecoded = captcha_decode(uSeed);
zCaptcha = captcha_render(zDecoded);
@ <tr>
@ <td class="form_label">Security Code:</td>
@ <td><input type="text" name="captcha" value="%h(zInit)" size="30">
@ <td class="form_label"><label for="captcha">Security Code:</label></td>
@ <td><input type="text" id="captcha" name="captcha" value="%h(zInit)" size="30">
captcha_speakit_button(uSeed, "Speak the code");
@ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td>
@ </tr>
if( eErr==2 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ </tr>
}
if( g.perm.Admin ){
@ <tr>
@ <td class="form_label">User:</td>
@ <td><input type="text" name="suname" value="%h(PD("suname",g.zLogin))" \
@ size="30"></td>
@ <td class="form_label"><label for="suname">User:</label></td>
@ <td><input type="text" id="suname" name="suname" \
@ value="%h(PD("suname",g.zLogin))" size="30"></td>
@ </tr>
if( eErr==3 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ </tr>
}
@ <tr>
|
︙ | | |
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
|
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
|
-
-
+
+
|
if( g.perm.RdWiki ){
@ <label><input type="checkbox" name="sw" %s(PCK("sw"))> \
@ Wiki</label><br>
}
di = PB("di");
@ </td></tr>
@ <tr>
@ <td class="form_label">Delivery:</td>
@ <td><select size="1" name="di">
@ <td class="form_label"><label for="di">Delivery:</label></td>
@ <td><select size="1" id="di" name="di">
@ <option value="0" %s(di?"":"selected")>Individual Emails</option>
@ <option value="1" %s(di?"selected":"")>Daily Digest</option>
@ </select></td>
@ </tr>
if( g.perm.Admin ){
@ <tr>
@ <td class="form_label">Admin Options:</td><td>
|
︙ | | |
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
|
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
|
-
+
-
+
|
}
form_begin(0, "%R/alerts");
zHalfCode = db_text("x","SELECT hex(substr(subscriberCode,1,16))"
" FROM subscriber WHERE subscriberId=%d", sid);
@ <input type="hidden" name="name" value="%h(zHalfCode)">
@ <table class="subscribe">
@ <tr>
@ <td class="form_label">Email Address:</td>
@ <td class="form_label"><label for="semail">Email Address:</label></td>
if( isLogin ){
@ <td><input type="text" name="semail" value="%h(semail)" size="30">\
@ <td><input type="text" id="semail" name="semail" value="%h(semail)" size="30">\
if( eErr==8 ){
@ <span class='loginError'>← not a valid email address!</span>
}else if( g.perm.Admin ){
@ <a href="%R/announce?to=%t(semail)">\
@ (Send a message to %h(semail))</a>\
}
@ </td>
|
︙ | | |
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
|
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
|
-
-
-
+
+
+
|
@ <td>%h(db_column_text(&q,9))</td>
@ <tr>
@ <tr>
@ <td class='form_label'>Last Contact:</td>
@ <td>%h(db_column_text(&q,10)) ← \
@ %,d(db_column_int(&q,11)) days ago</td>
@ </tr>
@ <td class="form_label">User:</td>
@ <td><input type="text" name="suname" value="%h(suname?suname:"")" \
@ size="30">\
@ <td class="form_label"><label for="suname">User:</label></td>
@ <td><input type="text" id="suname" name="suname" \
@ value="%h(suname?suname:"")" size="30">\
uid = db_int(0, "SELECT uid FROM user WHERE login=%Q", suname);
if( uid ){
@ <a href='%R/setup_uedit?id=%d(uid)'>\
@ (login info for %h(suname))</a>\
}
@ </tr>
}
|
︙ | | |
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
|
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
|
-
-
+
+
|
}
if( g.perm.RdWiki ){
@ <label><input type="checkbox" name="sw" %s(sw?"checked":"")>\
@ Wiki</label>
}
@ </td></tr>
@ <tr>
@ <td class="form_label">Delivery:</td>
@ <td><select size="1" name="sdigest">
@ <td class="form_label"><label for="sdigest">Delivery:</label></td>
@ <td><select size="1" id="sdigest" name="sdigest">
@ <option value="0" %s(sdigest?"":"selected")>Individual Emails</option>
@ <option value="1" %s(sdigest?"selected":"")>Daily Digest</option>
@ </select></td>
@ </tr>
if( g.perm.Admin ){
@ <tr>
@ <td class="form_label">Admin Options:</td><td>
|
︙ | | |
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
|
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
|
-
-
+
+
-
-
+
+
|
style_header("Unsubscribe Request");
@ <p>Fill out the form below to request an email message that will
@ explain how to unsubscribe and/or change your subscription settings.</p>
@
form_begin(0, "%R/unsubscribe");
@ <table class="subscribe">
@ <tr>
@ <td class="form_label">Email Address:</td>
@ <td><input type="text" name="e" value="%h(zEAddr)" size="30"></td>
@ <td class="form_label"><label for="e">Email Address:</label></td>
@ <td><input type="text" id="e" name="e" value="%h(zEAddr)" size="30"></td>
if( eErr==1 ){
@ <td><span class="loginError">← %h(zErr)</span></td>
}
@ </tr>
uSeed = captcha_seed();
zDecoded = captcha_decode(uSeed);
zCaptcha = captcha_render(zDecoded);
@ <tr>
@ <td class="form_label">Security Code:</td>
@ <td><input type="text" name="captcha" value="" size="30">
@ <td class="form_label"><label for="captcha">Security Code:</label></td>
@ <td><input type="text" id="captcha" name="captcha" value="" size="30">
captcha_speakit_button(uSeed, "Speak the code");
@ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td>
if( eErr==2 ){
@ <td><span class="loginError">← %h(zErr)</span></td>
}
@ </tr>
@ <tr>
|
︙ | | |
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
|
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
|
-
|
**
** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w'
** for check-in, forum, ticket, or wiki. The remaining text is a
** integer that references the EVENT.OBJID value for the event.
** Run /timeline?showid to see these OBJID values.
**
** Options:
**
** --digest Generate digest alert text
** --needmod Assume all events are pending moderator approval
*/
void test_alert_cmd(void){
Blob out;
int nEvent;
int needMod;
|
︙ | | |
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
|
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
|
-
-
-
|
**
** EVENTIDs are text. The first character is 'c', 'f', 't', or 'w'
** for check-in, forum, ticket, or wiki. The remaining text is a
** integer that references the EVENT.OBJID value for the event.
** Run /timeline?showid to see these OBJID values.
**
** Options:
**
** --backoffice Run alert_backoffice() after all alerts have
** been added. This will cause the alerts to be
** sent out with the SENDALERT_TRACE option.
**
** --debug Like --backoffice, but add the SENDALERT_STDOUT
** so that emails are printed to standard output
** rather than being sent.
**
** --digest Process emails using SENDALERT_DIGEST
*/
void test_add_alert_cmd(void){
int i;
int doAuto = find_option("backoffice",0,0)!=0;
unsigned mFlags = 0;
if( find_option("debug",0,0)!=0 ){
|
︙ | | |
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
|
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
|
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
|
style_set_current_feature("alerts");
style_header("Message To Administrator");
form_begin(0, "%R/contact_admin");
@ <p>Enter a message to the repository administrator below:</p>
@ <table class="subscribe">
if( zCaptcha ){
@ <tr>
@ <td class="form_label">Security Code:</td>
@ <td><input type="text" name="captcha" value="" size="10">
@ <td class="form_label"><label for="captcha">Security Code:</label></td>
@ <td><input type="text" id="captcha" name="captcha" value="" size="10">
captcha_speakit_button(uSeed, "Speak the code");
@ <input type="hidden" name="captchaseed" value="%u(uSeed)"></td>
@ </tr>
}
@ <tr>
@ <td class="form_label">Your Email Address:</td>
@ <td><input type="text" name="from" value="%h(PT("from"))" size="30"></td>
@ <td class="form_label"><label for="from">Your Email Address:</label></td>
@ <td><input type="text" id="from" name="from" value="%h(PT("from"))" size="30"></td>
@ </tr>
@ <tr>
@ <td class="form_label">Subject:</td>
@ <td><input type="text" name="subject" value="%h(PT("subject"))"\
@ <td class="form_label"><label for="subject">Subject:</label></td>
@ <td><input type="text" id="subject" name="subject" value="%h(PT("subject"))"\
@ size="80"></td>
@ </tr>
@ <tr>
@ <td class="form_label">Message:</td>
@ <td><textarea name="msg" cols="80" rows="10" wrap="virtual">\
@ <td class="form_label"><label for="msg">Message:</label></td>
@ <td><textarea id="msg" name="msg" cols="80" rows="10" wrap="virtual">\
@ %h(PT("msg"))</textarea>
@ </tr>
@ <tr>
@ <td></td>
@ <td><input type="submit" name="submit" value="Send Message">
@ </tr>
@ </table>
|
︙ | | |
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
|
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
|
-
-
+
+
-
-
+
+
-
-
+
+
|
int aa = PB("aa");
int all = PB("all");
int aMod = PB("mods");
const char *aack = aa ? "checked" : "";
const char *allck = all ? "checked" : "";
const char *modck = aMod ? "checked" : "";
@ <tr>
@ <td class="form_label">To:</td>
@ <td><input type="text" name="to" value="%h(PT("to"))" size="30"><br>
@ <td class="form_label"><label for="to">To:</label></td>
@ <td><input type="text" id="to" name="to" value="%h(PT("to"))" size="30"><br>
@ <label><input type="checkbox" name="aa" %s(aack)> \
@ All "announcement" subscribers</label> \
@ <a href="%R/subscribers?only=a" target="_blank">(list)</a><br>
@ <label><input type="checkbox" name="all" %s(allck)> \
@ All subscribers</label> \
@ <a href="%R/subscribers" target="_blank">(list)</a><br>
@ <label><input type="checkbox" name="mods" %s(modck)> \
@ All moderators</label> \
@ <a href="%R/setup_ulist?with=5" target="_blank">(list)</a><br></td>
@ </tr>
}
@ <tr>
@ <td class="form_label">Subject:</td>
@ <td><input type="text" name="subject" value="%h(PT("subject"))"\
@ <td class="form_label"><label for="subject">Subject:</label></td>
@ <td><input type="text" id="subject" name="subject" value="%h(PT("subject"))"\
@ size="80"></td>
@ </tr>
@ <tr>
@ <td class="form_label">Message:</td>
@ <td><textarea name="msg" cols="80" rows="10" wrap="virtual">\
@ <td class="form_label"><label for="msg">Message:</label></td>
@ <td><textarea id="msg" name="msg" cols="80" rows="10" wrap="virtual">\
@ %h(PT("msg"))</textarea>
@ </tr>
@ <tr>
@ <td></td>
if( fossil_strcmp(P("name"),"test2")==0 ){
@ <td><input type="submit" name="submit" value="Dry Run">
}else{
|
︙ | | |
Changes to src/allrepo.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
** user. This command performs certain operations on all repositories
** that can be useful before or after a period of disconnected operation.
**
** On Win32 systems, the file is named "_fossil" and is located in
** %LOCALAPPDATA%, %APPDATA% or %HOMEPATH%.
**
** Available operations are:
**
** backup Backup all repositories. The argument must be the name of
** a directory into which all backup repositories are written.
**
** cache Manages the cache used for potentially expensive web
** pages. Any additional arguments are passed on verbatim
** to the cache command.
**
** changes Shows all local checkouts that have uncommitted changes.
** This operation has no additional options.
**
** clean Delete all "extra" files in all local checkouts. Extreme
** caution should be exercised with this command because its
** effects cannot be undone. Use of the --dry-run option to
** carefully review the local checkouts to be operated upon
** and the --whatif option to carefully review the files to
** be deleted beforehand is highly recommended. The command
** line options supported by the clean command itself, if any
** are present, are passed along verbatim.
**
** config Only the "config pull AREA" command works.
**
** dbstat Run the "dbstat" command on all repositories.
**
** extras Shows "extra" files from all local checkouts. The command
** line options supported by the extra command itself, if any
** are present, are passed along verbatim.
**
** fts-config Run the "fts-config" command on all repositories.
**
** git CMD Do the "git export" or "git status" command (whichever
** is specified by CMD) on all repositories for which
** a Git mirror has been previously established.
**
** info Run the "info" command on all repositories.
**
** pull Run a "pull" operation on all repositories. Only the
** --verbose and --share-links options are supported.
**
** push Run a "push" on all repositories. Only the --verbose
** option is supported.
**
** rebuild Rebuild on all repositories. The command line options
** supported by the rebuild command itself, if any are
** present, are passed along verbatim. The --force and
** --randomize options are not supported.
**
** sync Run a "sync" on all repositories. Only the --verbose
** and --unversioned and --share-links options are supported.
**
** set Run the "setting" or "set" commands on all
** repositories. These command are particularly useful in
** conjunction with the "max-loadavg" setting which cannot
** otherwise be set globally.
**
** unset Run the "unset" command on all repositories
**
** server Run the "server" commands on all repositories.
** The root URI gives a listing of all repos.
**
** ui Run the "ui" command on all repositories. Like "server"
** but bind to the loopback TCP address only, enable
** the --localauth option and automatically launch a
** web-browser
**
**
** In addition, the following maintenance operations are supported:
**
** add Add all the repositories named to the set of repositories
** tracked by Fossil. Normally Fossil is able to keep up with
** this list by itself, but sometimes it can benefit from this
** hint if you rename repositories.
**
** ignore Arguments are repositories that should be ignored by
** subsequent clean, extras, list, pull, push, rebuild, and
** sync operations. The -c|--ckout option causes the listed
** local checkouts to be ignored instead.
**
** list | ls Display the location of all repositories. The -c|--ckout
** option causes all local checkouts to be listed instead.
**
** Repositories are automatically added to the set of known repositories
** when one of the following commands are run against the repository:
** clone, info, pull, push, or sync. Even previously ignored repositories
** are added back to the list of repositories by these commands.
|
︙ | | |
Changes to src/attach.c.
︙ | | |
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
|
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
|
-
-
+
+
|
@ <p class="generalError">Error: Incorrect security code.</p>
}
@ <h2>Add Attachment To %s(zTargetType)</h2>
form_begin("enctype='multipart/form-data'", "%R/attachadd");
@ <div>
@ File to Attach:
@ <input type="file" name="f" size="60" /><br />
@ Description:<br />
@ <textarea name="comment" cols="80" rows="5" wrap="virtual"></textarea><br />
@ <label>Description:<br />
@ <textarea name="comment" cols="80" rows="5" wrap="virtual"></textarea></label><br />
if( zTkt ){
@ <input type="hidden" name="tkt" value="%h(zTkt)" />
}else if( zTechNote ){
@ <input type="hidden" name="technote" value="%h(zTechNote)" />
}else{
@ <input type="hidden" name="page" value="%h(zPage)" />
}
|
︙ | | |
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
|
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
|
-
+
-
|
/*
** COMMAND: attachment*
**
** Usage: %fossil attachment add ?PAGENAME? FILENAME ?OPTIONS?
**
** Add an attachment to an existing wiki page or tech note.
** Options:
**
** Options:
** -t|--technote DATETIME Specifies the timestamp of
** the technote to which the attachment
** is to be made. The attachment will be
** to the most recently modified tech note
** with the specified timestamp.
**
** -t|--technote TECHNOTE-ID Specifies the technote to be
** updated by its technote id.
**
** One of PAGENAME, DATETIME or TECHNOTE-ID must be specified.
**
** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in
** year-month-day form, it may be truncated, the "T" may be replaced by
|
︙ | | |
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
|
789
790
791
792
793
794
795
796
797
798
799
800
801
802
|
-
|
**
** List attachments for one or more attachment targets. The target
** name arguments are glob prefixes for the attachment.target
** field. If no names are provided then a prefix of [a-zA-Z] is used,
** which will match most wiki page names and some ticket hashes.
**
** Options:
**
** -latest List only the latest version of a given attachment.
**
*/
void test_list_attachments(void){
Stmt q;
int i;
const int fLatest = find_option("latest", 0, 0) != 0;
|
︙ | | |
Changes to src/backoffice.c.
︙ | | |
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
|
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
|
-
-
-
-
-
-
-
|
**
** If only a single repository is named and --poll is omitted, then the
** backoffice work is done in-process. But if there are multiple repositories
** or if --poll is used, a separate sub-process is started for each poll of
** each repository.
**
** Standard options:
**
** --debug Show what this command is doing.
**
** --logfile FILE Append a log of backoffice actions onto FILE.
**
** --min N When polling, invoke backoffice at least
** once every N seconds even if the repository
** never changes. 0 or negative means disable
** this feature. Default: 3600 (once per hour).
**
** --poll N Repeat backoffice calls for repositories that
** change in appoximately N-second intervals.
** N less than 1 turns polling off (the default).
** Recommended polling interval: 60 seconds.
**
** --trace Enable debugging output on stderr
**
** Options intended for internal use only which may change or be
** discontinued in future releases:
**
** --nodelay Do not queue up or wait for a backoffice job
** to complete. If no work is available or if
** backoffice has run recently, return immediately.
**
** --nolease Always run backoffice, even if there is a lease
** conflict. This option implies --nodelay. This
** option is added to secondary backoffice commands
** that are invoked by the --poll option.
*/
void backoffice_command(void){
int nPoll;
|
︙ | | |
Changes to src/bisect.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
|
/*
** COMMAND: bisect
**
** Usage: %fossil bisect SUBCOMMAND ...
**
** Run various subcommands useful for searching back through the change
** history for a particular checkin that causes or fixes a problem.
**
** > fossil bisect bad ?VERSION?
**
** Identify version VERSION as non-working. If VERSION is omitted,
** the current checkout is marked as non-working.
**
** > fossil bisect good ?VERSION?
**
** Identify version VERSION as working. If VERSION is omitted,
** the current checkout is marked as working.
**
** > fossil bisect log
** > fossil bisect chart
**
** Show a log of "good", "bad", and "skip" versions. "bisect log"
** shows the events in the order that they were tested.
** "bisect chart" shows them in order of check-in.
**
** > fossil bisect next
**
** Update to the next version that is halfway between the working and
** non-working versions.
**
** > fossil bisect options ?NAME? ?VALUE?
**
** List all bisect options, or the value of a single option, or set the
** value of a bisect option.
**
** > fossil bisect reset
**
** Reinitialize a bisect session. This cancels prior bisect history
** and allows a bisect session to start over from the beginning.
**
** > fossil bisect run [OPTIONS] COMMAND
**
** Invoke COMMAND repeatedly to run the bisect. The exit code for
** COMMAND should be 0 for "good", 125 for "skip", and any other value
** for "bad". Options:
** for "bad".
**
** Options:
** -i|--interactive Prompt the user for the good/bad/skip decision
** after each step, rather than using the exit
** code from COMMAND
**
** > fossil bisect skip ?VERSION?
**
** Cause VERSION (or the current checkout if VERSION is omitted) to
** be ignored for the purpose of the current bisect. This might
** be done, for example, because VERSION does not compile correctly
** or is otherwise unsuitable to participate in this bisect.
**
** > fossil bisect vlist|ls|status ?-a|--all?
**
** List the versions in between the inner-most "bad" and "good".
**
** > fossil bisect ui
**
** Like "fossil ui" except start on a timeline that shows only the
** check-ins that are part of the current bisect.
**
** > fossil bisect undo
**
** Undo the most recent "good", "bad", or "skip" command.
*/
void bisect_cmd(void){
int n;
const char *zCmd;
int foundCmd = 0;
db_must_be_within_tree();
|
︙ | | |
Changes to src/blob.c.
︙ | | |
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
|
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
|
-
-
-
-
|
**
** Run each argument through blob_append_escaped_arg() and show the
** result. Append each argument to "fossil test-echo" and run that
** using fossil_system() to verify that it really does get escaped
** correctly.
**
** Other options:
**
** --filename-args BOOL Subsequent arguments are assumed to be
** filenames if BOOL is true, or not if BOOL
** is false. Defaults on.
**
** --hex HEX Skip the --hex flag and instead decode HEX
** into ascii. This provides a way to insert
** unusual characters as an argument for testing.
**
** --compare HEX ASCII Verify that argument ASCII is identical to
** to decoded HEX.
**
** --fuzz N Run N fuzz cases. Each cases is a call
** to "fossil test-escaped-arg --compare HEX ARG"
** where HEX and ARG are the same argument.
** The argument is chosen at random.
*/
void test_escaped_arg_command(void){
int i;
|
︙ | | |
Changes to src/branch.c.
︙ | | |
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
|
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
|
-
-
-
+
+
+
-
-
-
-
-
-
-
+
-
+
-
-
-
|
/*
** COMMAND: branch
**
** Usage: %fossil branch SUBCOMMAND ... ?OPTIONS?
**
** Run various subcommands to manage branches of the open repository or
** of the repository identified by the -R or --repository option.
**
** > fossil branch close|reopen ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES?
**
** Adds or cancels the "closed" tag to one or more branches.
** It accepts arbitrary unambiguous symbolic names but
** will only resolve checkin names and skips any which resolve
** to non-leaf checkins. Options:
** to non-leaf checkins.
**
** Options:
** -n|--dry-run do not commit changes and dump artifact
** to stdout
** -v|--verbose output more information
** --date-override DATE DATE to use instead of 'now'
** --user-override USER USER to use instead of the current default
**
** > fossil branch current
**
** Print the name of the branch for the current check-out
**
** > fossil branch hide|unhide ?OPTIONS? BRANCH-NAME ?...BRANCH-NAMES?
**
** Adds or cancels the "hidden" tag for the specified branches or
** or checkin IDs. Accepts the same options as the close
** subcommand.
**
** > fossil branch info BRANCH-NAME
**
** Print information about a branch
**
** > fossil branch list|ls ?OPTIONS? ?GLOB?
** > fossil branch lsh ?OPTIONS? ?LIMIT?
** List all branches.
**
** List all branches. Options:
** Options:
** -a|--all List all branches. Default show only open branches
** -c|--closed List closed branches.
** -p List only private branches.
** -r Reverse the sort order
** -t Show recently changed branches first
**
** The current branch is marked with an asterisk. Private branches are
** marked with a hash sign.
**
** If GLOB is given, show only branches matching the pattern.
**
** The "lsh" variant of this subcommand shows recently changed branches,
** and accepts an optional LIMIT argument (defaults to 5) to cap output,
** but no GLOB argument. All other options are supported, with -t being
** an implied no-op.
**
** > fossil branch new BRANCH-NAME BASIS ?OPTIONS?
**
** Create a new branch BRANCH-NAME off of check-in BASIS.
** Supported options for this subcommand include:
** --private branch is private (i.e., remains local)
** --bgcolor COLOR use COLOR instead of automatic background
** ("auto" lets Fossil choose it automatically,
** even for private branches)
** --nosign do not sign contents on this branch
** --date-override DATE DATE to use instead of 'now'
** --user-override USER USER to use instead of the current default
**
** DATE may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in
** year-month-day form, it may be truncated, the "T" may be
** replaced by a space, and it may also name a timezone offset
** from UTC as "-HH:MM" (westward) or "+HH:MM" (eastward).
** Either no timezone suffix or "Z" means UTC.
**
** Options valid for all subcommands:
**
** -R|--repository REPO Run commands on repository REPO
*/
void branch_cmd(void){
int n;
const char *zCmd = "list";
db_find_and_open_repository(0, 0);
if( g.argc>=3 ) zCmd = g.argv[2];
|
︙ | | |
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
|
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
|
-
-
+
+
|
}
}
if( zBgClr && zBgClr[0] && show_colors ){
@ <tr style="background-color:%s(zBgClr)">
}else{
@ <tr>
}
@ <td>%z(href("%R/timeline?r=%T",zBranch))%h(zBranch)</a><input
@ type="checkbox" disabled="disabled"/></td>
@ <td>%z(href("%R/timeline?r=%T",zBranch))%h(zBranch)</a><input type="checkbox"
@ title="%h(zBranch)" aria-label="%h(zBranch)" disabled="disabled"/></td>
@ <td data-sortkey="%016llx(iMtime)">%s(zAge)</td>
@ <td>%d(nCkin)</td>
fossil_free(zAge);
@ <td>%s(isClosed?"closed":"")</td>
if( zMergeTo ){
@ <td>merged into
@ %z(href("%R/timeline?f=%!S",zLastCkin))%h(zMergeTo)</a></td>
|
︙ | | |
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
|
826
827
828
829
830
831
832
833
834
835
836
837
838
839
|
-
|
/*
** WEBPAGE: brlist
** Show a list of branches. With no query parameters, a sortable table
** is used to show all branches. If query parameters are present a
** fixed bullet list is shown.
**
** Query parameters:
**
** all Show all branches
** closed Show only closed branches
** open Show only open branches
** colortest Show all branches with automatic color
**
** When there are no query parameters, a new-style /brlist page shows
** all branches in a sortable table. The new-style /brlist page is
|
︙ | | |
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
|
956
957
958
959
960
961
962
963
964
965
966
967
968
969
|
-
|
/*
** WEBPAGE: brtimeline
**
** Show a timeline of all branches
**
** Query parameters:
**
** ng No graph
** nohidden Hide check-ins with "hidden" tag
** onlyhidden Show only check-ins with "hidden" tag
** brbg Background color by branch name
** ubg Background color by user name
*/
void brtimeline_page(void){
|
︙ | | |
Changes to src/browse.c.
︙ | | |
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
-
|
**
** Show the files and subdirectories within a single directory of the
** source tree. Only files for a single check-in are shown if the ci=
** query parameter is present. If ci= is missing, the union of files
** across all check-ins is shown.
**
** Query parameters:
**
** ci=LABEL Show only files in this check-in. Optional.
** name=PATH Directory to display. Optional. Top-level if missing
** re=REGEXP Show only files matching REGEXP
** type=TYPE TYPE=flat: use this display
** TYPE=tree: use the /tree display instead
** noreadme Do not attempt to display the README file.
*/
|
︙ | | |
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
|
637
638
639
640
641
642
643
644
645
646
647
648
649
650
|
-
|
** then show only the files for the check-in identified. If ci= is omitted,
** then show the union of files over all check-ins.
**
** The type=tree query parameter is required or else the /dir format is
** used.
**
** Query parameters:
**
** type=tree Required to prevent use of /dir format
** name=PATH Directory to display. Optional
** ci=LABEL Show only files in this check-in. Optional.
** re=REGEXP Show only files matching REGEXP. Optional.
** expand Begin with the tree fully expanded.
** nofiles Show directories (folders) only. Omit files.
** mtime Order directory elements by decreasing mtime
|
︙ | | |
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
|
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
|
-
+
|
hyperlinked_path(zD, &dirname, zCI, "tree", zREx, 0);
if( zRE ) blob_appendf(&dirname, " matching \"%s\"", zRE);
style_submenu_element("Top-Level", "%s",
url_render(&sURI, "name", 0, 0, 0));
}else if( zRE ){
blob_appendf(&dirname, "matching \"%s\"", zRE);
}
style_submenu_binary("mtime","Sort By Time","Sort By Filename", 0);
style_submenu_binary("mtime","Sort By","Time","Filename", 0);
if( zCI ){
style_submenu_element("All", "%s", url_render(&sURI, "ci", 0, 0, 0));
if( nD==0 && !showDirOnly ){
style_submenu_element("File Ages", "%R/fileage?name=%T", zCI);
}
}
if( linkTrunk ){
|
︙ | | |
Changes to src/builtin.c.
︙ | | |
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
-
+
+
|
}
return;
}
/*
** WEBPAGE: builtin loadavg-exempt
**
** Return one of many built-in content files. Query parameters:
** Return one of many built-in content files.
**
** Query parameters:
** name=FILENAME Return the single file whose name is FILENAME.
** mimetype=TYPE Override the mimetype in the returned file to
** be TYPE. If this query parameter is omitted
** (the usual case) then the mimetype is inferred
** from the suffix on FILENAME
** m=IDLIST IDLIST is a comma-separated list of integers
** that specify multiple javascript files to be
|
︙ | | |
Changes to src/bundle.c.
︙ | | |
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
|
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
db_end_transaction(0);
}
/*
** COMMAND: bundle*
**
** Usage: %fossil bundle SUBCOMMAND ARGS...
**
** > fossil bundle append BUNDLE FILE...
**
** Add files named on the command line to BUNDLE. This subcommand has
** little practical use and is mostly intended for testing.
**
** > fossil bundle cat BUNDLE HASH...
**
** Extract one or more artifacts from the bundle and write them
** consecutively on standard output. This subcommand was designed
** for testing and introspection of bundles and is not something
** commonly used.
**
** > fossil bundle export BUNDLE ?OPTIONS?
**
** Generate a new bundle, in the file named BUNDLE, that contains a
** subset of the check-ins in the repository (usually a single branch)
** described by the --branch, --from, --to, and/or --checkin options,
** at least one of which is required. If BUNDLE already exists, the
** specified content is added to the bundle.
**
** --branch BRANCH Package all check-ins on BRANCH
** --from TAG1 --to TAG2 Package check-ins between TAG1 and TAG2
** --checkin TAG Package the single check-in TAG
** --standalone Do no use delta-encoding against
** artifacts not in the bundle
**
** > fossil bundle extend BUNDLE
**
** The BUNDLE must already exist. This subcommand adds to the bundle
** any check-ins that are descendants of check-ins already in the bundle,
** and any tags that apply to artifacts in the bundle.
**
** > fossil bundle import BUNDLE ?--publish?
**
** Import all content from BUNDLE into the repository. By default, the
** imported files are private and will not sync. Use the --publish
** option to make the import public.
**
** > fossil bundle ls BUNDLE
**
** List the contents of BUNDLE on standard output
**
** > fossil bundle purge BUNDLE
**
** Remove from the repository all files that are used exclusively
** by check-ins in BUNDLE. This has the effect of undoing a
** "fossil bundle import".
**
** See also: [[publish]]
*/
void bundle_cmd(void){
|
︙ | | |
Changes to src/cache.c.
︙ | | |
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
|
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
-
+
+
-
-
-
-
|
/*
** COMMAND: cache*
**
** Usage: %fossil cache SUBCOMMAND
**
** Manage the cache used for potentially expensive web pages such as
** /zip and /tarball. SUBCOMMAND can be:
** /zip and /tarball.
**
** SUBCOMMAND can be:
** clear Remove all entries from the cache.
**
** init Create the cache file if it does not already exist.
**
** list|ls List the keys and content sizes and other stats for
** all entries currently in the cache.
**
** size ?N? Query or set the maximum number of entries in the cache.
**
** status Show a summary of the cache status.
**
** The cache is stored in a file that is distinct from the repository
** but that is held in the same directory as the repository. The cache
** file can be deleted in order to completely disable the cache.
*/
void cache_cmd(void){
|
︙ | | |
Changes to src/capabilities.c.
︙ | | |
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
-
+
|
" UNION ALL"
" SELECT 'Adminstrator', fullcap(capunion(cap)), 300, count(*) FROM user"
" WHERE cap GLOB '*[as]*'"
" ORDER BY 3 ASC",
zSelfCap, hasPubPages, zSelfCap
);
@ <table id='capabilitySummary' cellpadding="0" cellspacing="0" border="1">
@ <tr><th> <th>Code<th>Forum<th>Tickets<th>Wiki<th>Chat\
@ <tr><th>Role<th>Code<th>Forum<th>Tickets<th>Wiki<th>Chat\
@ <th>Unversioned Content</th></tr>
while( db_step(&q)==SQLITE_ROW ){
const char *zId = db_column_text(&q, 0);
const char *zCap = db_column_text(&q, 1);
int n = db_column_int(&q, 3);
int eType;
static const char *const azType[] = { "off", "read", "write" };
|
︙ | | |
Changes to src/captcha.c.
︙ | | |
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
|
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
|
-
+
-
+
-
+
+
|
if( !captcha_needed() ) return;
uSeed = captcha_seed();
zDecoded = captcha_decode(uSeed);
zCaptcha = captcha_render(zDecoded);
@ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
@ %h(zCaptcha)
@ </pre>
@ Enter security code shown above:
@ <label for="captcha">Enter security code shown above:</label>
@ <input type="hidden" name="captchaseed" value="%u(uSeed)" />
@ <input type="text" name="captcha" size=8 />
@ <input type="text" id="captcha" name="captcha" size=8 />
if( showButton ){
@ <input type="submit" value="Submit">
}
@ <br/>\
captcha_speakit_button(uSeed, 0);
@ </td></tr></table></div>
}
/*
** Add a "Speak the captcha" button.
*/
void captcha_speakit_button(unsigned int uSeed, const char *zMsg){
if( zMsg==0 ) zMsg = "Speak the text";
@ <input aria-label="%h(zMsg)" type="button" value="%h(zMsg)" \
@ <input aria-label="%h(zMsg)" title="%h(zMsg)" type="button" value="%h(zMsg)" \
@ id="speakthetext">
@ <script nonce="%h(style_nonce())">/* captcha_speakit_button() */
@ document.getElementById("speakthetext").onclick = function(){
@ var audio = window.fossilAudioCaptcha \
@ || new Audio("%R/captcha-audio/%u(uSeed)");
@ window.fossilAudioCaptcha = audio;
@ audio.currentTime = 0;
@ audio.play();
@ }
@ </script>
}
/*
** WEBPAGE: test-captcha
**
** Test the captcha-generator by rendering the value of the name= query
** parameter using ascii-art. If name= is omitted, show a random 16-digit
** hexadecimal number.
*/
void captcha_test(void){
const char *zPw = P("name");
if( zPw==0 || zPw[0]==0 ){
|
︙ | | |
Changes to src/chat.c.
︙ | | |
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
|
699
700
701
702
703
704
705
706
707
708
709
710
711
712
|
-
|
** WEBPAGE: chat-fetch-one hidden loadavg-exempt
**
** /chat-fetch-one/N
**
** Fetches a single message with the given ID, if available.
**
** Options:
**
** raw = the xmsg field will be returned unparsed.
**
** Response is either a single object in the format returned by
** /chat-poll (without the wrapper array) or a JSON-format error
** response, as documented for ajax_route_error().
*/
void chat_fetch_one(void){
|
︙ | | |
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
|
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
|
-
-
-
-
-
-
-
-
-
-
|
** on the default remote Fossil repository (the Fossil repository whose
** URL shows when you run the "fossil remote" command) or to the URL
** specified by the --remote option. If there is no default remote
** Fossil repository and the --remote option is omitted, then this
** command fails with an error.
**
** Subcommands:
**
** > fossil chat
**
** When there is no SUBCOMMAND (when this command is simply "fossil chat")
** the response is to bring up a web-browser window to the chatroom
** on the default system web-browser. You can accomplish the same by
** typing the appropriate URL into the web-browser yourself. This
** command is merely a convenience for command-line oriented people.
**
** > fossil chat pull
**
** Copy chat content from the server down into the local clone,
** as a backup or archive. Setup privilege is required on the server.
**
** --all Download all chat content. Normally only
** previously undownloaded content is retrieved.
** --debug Additional debugging output.
** --out DATABASE Store CHAT table in separate database file
** DATABASE rather that adding to local clone
** --unsafe Allow the use of unencrypted http://
**
** > fossil chat send [ARGUMENTS]
**
** This command sends a new message to the chatroom. The message
** to be sent is determined by arguments as follows:
**
** -f|--file FILENAME File to attach to the message
** --as FILENAME2 Causes --file FILENAME to be sent with
** the attachment name FILENAME2
** -m|--message TEXT Text of the chat message
** --remote URL Send to this remote URL
** --unsafe Allow the use of unencrypted http://
**
** > fossil chat url
**
** Show the default URL used to access the chat server.
**
** Additional subcommands may be added in the future.
*/
void chat_command(void){
const char *zUrl = find_option("remote",0,1);
int urlFlags = 0;
|
︙ | | |
Changes to src/color.c.
︙ | | |
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
+
-
+
+
|
}
@ <form method="POST">
@ <p>Enter candidate branch names below and see them displayed in their
@ default background colors above.</p>
for(i=0; i<10; i++){
sqlite3_snprintf(sizeof(zNm),zNm,"b%d",i);
zBr = P(zNm);
@ <label>Branch %s(zNm):
@ <input type="text" size="30" name='%s(zNm)' value='%h(PD(zNm,""))'><br />
@ <input type="text" size="30" name='%s(zNm)' value='%h(PD(zNm,""))'>
@ </label><br />
}
@ <input type="submit" value="Submit">
@ <input type="submit" name="rand" value="Random">
@ </form>
style_finish_page();
}
|
Changes to src/configure.c.
︙ | | |
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
|
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
|
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
|
/*
** COMMAND: configuration*
**
** Usage: %fossil configuration METHOD ... ?OPTIONS?
**
** Where METHOD is one of: export import merge pull push reset.
**
** > fossil configuration export AREA FILENAME
**
** Write to FILENAME exported configuration information for AREA.
** AREA can be one of:
**
** AREA can be one of:
** all email interwiki project shun skin
** ticket user alias subscriber
**
** > fossil configuration import FILENAME
**
** Read a configuration from FILENAME, overwriting the current
** configuration.
**
** > fossil configuration merge FILENAME
**
** Read a configuration from FILENAME and merge its values into
** the current configuration. Existing values take priority over
** values read from FILENAME.
**
** > fossil configuration pull AREA ?URL?
**
** Pull and install the configuration from a different server
** identified by URL. If no URL is specified, then the default
** server is used. Use the --overwrite flag to completely
** replace local settings with content received from URL.
**
** > fossil configuration push AREA ?URL?
**
** Push the local configuration into the remote server identified
** by URL. Admin privilege is required on the remote server for
** this to work. When the same record exists both locally and on
** the remote end, the one that was most recently changed wins.
**
** > fossil configuration reset AREA
**
** Restore the configuration to the default. AREA as above.
**
** > fossil configuration sync AREA ?URL?
**
** Synchronize configuration changes in the local repository with
** the remote repository at URL.
**
** Options:
** -R|--repository REPO Affect repository REPO with changes
**
** See also: [[settings]], [[unset]]
|
︙ | | |
Changes to src/content.c.
︙ | | |
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
|
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
|
-
-
-
|
** COMMAND: test-integrity
**
** Verify that all content can be extracted from the BLOB table correctly.
** If the BLOB table is correct, then the repository can always be
** successfully reconstructed using "fossil rebuild".
**
** Options:
**
** -d|--db-only Run "PRAGMA integrity_check" on the database only.
** No other validation is performed.
**
** --parse Parse all manifests, wikis, tickets, events, and
** so forth, reporting any errors found.
**
** -q|--quick Run "PRAGMA quick_check" on the database only.
** No other validation is performed.
*/
void test_integrity(void){
Stmt q;
Blob content;
int n1 = 0;
|
︙ | | |
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
|
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
|
-
|
** Usage: %fossil test-missing
**
** Look at every artifact in the repository and verify that
** all references are satisfied. Report any referenced artifacts
** that are missing or shunned.
**
** Options:
**
** --notshunned Do not report shunned artifacts
** --quiet Only show output if there are errors
*/
void test_missing(void){
Stmt q;
Blob content;
int nErr = 0;
|
︙ | | |
Changes to src/db.c.
︙ | | |
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
|
865
866
867
868
869
870
871
872
873
874
875
876
877
878
|
-
|
}
/*
** COMMAND: test-db-prepare
** Usage: %fossil test-db-prepare ?OPTIONS? SQL-STATEMENT
**
** Options:
**
** --auth-report Enable the ticket report query authorizer.
** --auth-ticket Enable the ticket schema query authorizer.
**
** Invoke db_prepare() on the SQL input. Report any errors encountered.
** This command is used to verify error detection logic in the db_prepare()
** utility routine.
*/
|
︙ | | |
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
|
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
|
-
|
** configuration database. If both a local and a global value exists for a
** setting, the local value takes precedence. This command normally operates
** on the local settings. Use the --global option to change global settings.
**
** Options:
** --global set or unset the given property globally instead of
** setting or unsetting it for the open repository only.
**
** --exact only consider exact name matches.
**
** See also: [[configuration]]
*/
void setting_cmd(void){
int i;
int globalFlag = find_option("global","g",0)!=0;
|
︙ | | |
Changes to src/default.css.
︙ | | |
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
-
|
.timelineModernCell[id], .timelineColumnarCell[id], .timelineDetailCell[id] {
background-color: #efefef;
}
.timelineModernDetail {
font-size: 80%;
text-align: right;
float: right;
opacity: 0.75;
margin-top: 0.5em;
margin-left: 1em;
}
.tl-canvas {
margin: 0 6px 0 10px;
}
.tl-rail {
|
︙ | | |
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
|
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
|
-
+
|
vertical-align: top;
background-color: #d0d0d0;
}
td.tktTlOpen {
color: #800;
}
td.tktTlClosed {
color: #888;
color: #757575;
}
span.tktError {
color: red;
font-weight: bold;
}
table.rpteditex {
float: right;
|
︙ | | |
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
|
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
|
-
+
|
line-height: 1.275/*for mobile: forum post e6f4ee7de98b55c0*/;
text-size-adjust: none
/* ^^^ attempt to keep mobile from inflating some text */;
}
table.diff pre > ins,
table.diff pre > del {
/* Fill platform-dependent color gaps caused by
inflated line-height */;
inflated line-height */
padding: 0.062em 0 0.062em 0;
}
table.diff pre > ins > *,
table.diff pre > del > *{
/* Avoid odd-looking color swatches in conjunction with
(table.diff pre > ins/del) padding */
padding: inherit;
|
︙ | | |
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
|
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
|
-
+
-
+
-
+
|
font-weight: bold;
}
td.difftxt ins > ins.edit {
background-color: #c0c0ff;
text-decoration: none;
font-weight: bold;
}
body.tkt div.content li > table.udiff {
body.tkt main.content li > table.udiff {
margin-left: 1.5em;
margin-top: 0.5em;
}
body.tkt div.content ol.tkt-changes > li:target > p > span {
body.tkt main.content ol.tkt-changes > li:target > p > span {
border-bottom: 3px solid gold;
}
body.tkt div.content ol.tkt-changes > li:target > ol {
body.tkt main.content ol.tkt-changes > li:target > ol {
border-left: 1px solid gold;
}
span.modpending {
color: #b03800;
font-style: italic;
}
|
︙ | | |
Changes to src/descendants.c.
︙ | | |
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
|
534
535
536
537
538
539
540
541
542
543
544
545
546
547
|
-
|
** are listed.
**
** A "leaf" is a check-in with no children in the same branch. A
** "closed leaf" is a leaf that has a "closed" tag. An "open leaf"
** is a leaf without a "closed" tag.
**
** Query parameters:
**
** all Show all leaves
** closed Show only closed leaves
** ng No graph
** nohidden Hide check-ins with "hidden" tag
** onlyhidden Show only check-ins with "hidden" tag
** brbg Background color by branch name
** ubg Background color by user name
|
︙ | | |
Changes to src/diff.c.
︙ | | |
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
|
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
|
-
|
** if the origin= query parameter is used to specify some future check-in
** (example: "origin=trunk") then these pages show changes moving towards
** that alternative origin. Thus using "origin=trunk" on an historical
** version of the file shows the first time each line in the file was changed
** or removed by any subsequent check-in.
**
** Query parameters:
**
** checkin=ID The check-in at which to start the annotation
** filename=FILENAME The filename.
** filevers=BOOLEAN Show file versions rather than check-in versions
** limit=LIMIT Limit the amount of analysis. LIMIT can be one of:
** none No limit
** Xs As much as can be computed in X seconds
** N N versions
|
︙ | | |
Changes to src/dispatch.c.
︙ | | |
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
|
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
|
-
+
-
-
|
/*
** WEBPAGE: help
** URL: /help?name=CMD
**
** Show the built-in help text for CMD. CMD can be a command-line interface
** command or a page name from the web interface or a setting.
** Query parameters:
**
** Query parameters:
** name=CMD Show help for CMD where CMD is a command name or
** webpage name or setting name.
**
** plaintext Show the help within <pre>...</pre>, as if it were
** displayed using the "fossil help" command.
**
** raw Show the raw help text without any formatting.
** (Used for debugging.)
*/
void help_page(void){
const char *zCmd = P("cmd");
if( zCmd==0 ) zCmd = P("name");
|
︙ | | |
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
|
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
|
-
-
|
** Usage: %fossil help [OPTIONS] [TOPIC]
**
** Display information on how to use TOPIC, which may be a command, webpage, or
** setting. Webpage names begin with "/". If TOPIC is omitted, a list of
** topics is returned.
**
** The following options can be used when TOPIC is omitted:
**
** -a|--all List both common and auxiliary commands
** -o|--options List command-line options common to all commands
** -s|--setting List setting names
** -t|--test List unsupported "test" commands
** -v|--verbose List both names and help text
** -x|--aux List only auxiliary commands
** -w|--www List all web pages
** -f|--full List full set of commands (including auxiliary
** and unsupported "test" commands), options,
** settings, and web pages
** -e|--everything List all help on all topics
**
** These options can be used when TOPIC is present:
**
** -h|--html Format output as HTML rather than plain text
** -c|--commands Restrict TOPIC search to commands
*/
void help_cmd(void){
int rc;
int mask = CMDFLAG_ANY;
int isPage = 0;
|
︙ | | |
Changes to src/doc.c.
︙ | | |
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
|
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
|
-
-
-
|
** WEBPAGE: doc
** URL: /uv/FILE
** URL: /doc/CHECKIN/FILE
**
** CHECKIN can be either tag or hash prefix or timestamp identifying a
** particular check-in, or the name of a branch (meaning the most recent
** check-in on that branch) or one of various magic words:
**
** "tip" means the most recent check-in
**
** "ckout" means the current check-out, if the server is run from
** within a check-out, otherwise it is the same as "tip"
**
** "latest" means use the most recent check-in for the document
** regardless of what branch it occurs on.
**
** FILE is the name of a file to delivered up as a webpage. FILE is relative
** to the root of the source tree of the repository. The FILE must
** be a part of CHECKIN, except when CHECKIN=="ckout" when FILE is read
** directly from disk and need not be a managed file. For /uv, FILE
|
︙ | | |
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
|
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
|
-
|
** WEBPAGE: docsrch
**
** Search for documents that match a user-supplied full-text search pattern.
** If no pattern is specified (by the s= query parameter) then the user
** is prompted to enter a search string.
**
** Query parameters:
**
** s=PATTERN Search for PATTERN
*/
void doc_search_page(void){
const int isSearch = P("s")!=0;
login_check_credentials();
style_header("Document Search%s", isSearch ? " Results" : "");
search_screen(SRCH_DOC, 0);
style_finish_page();
}
|
Changes to src/etag.c.
︙ | | |
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
|
250
251
252
253
254
255
256
257
258
259
260
261
262
263
|
-
|
** COMMAND: test-etag
**
** Usage: fossil test-etag -key KEY-NUMBER -hash HASH
**
** Generate an etag given a KEY-NUMBER and/or a HASH.
**
** KEY-NUMBER is some combination of:
**
** 1 ETAG_CONFIG The config table version number
** 2 ETAG_DATA The event table version number
** 4 ETAG_COOKIE The display cookie
*/
void test_etag_cmd(void){
const char *zHash = 0;
const char *zKey;
|
︙ | | |
Changes to src/event.c.
︙ | | |
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
-
|
/*
** WEBPAGE: technote
** WEBPAGE: event
**
** Display a technical note (formerly called an "event").
**
** PARAMETERS:
**
** name=ID Identify the technical note to display. ID must be
** complete.
** aid=ARTIFACTID Which specific version of the tech-note. Optional.
** v=BOOLEAN Show details if TRUE. Default is FALSE. Optional.
**
** Display an existing tech-note identified by its ID, optionally at a
** specific version, and optionally with additional details.
|
︙ | | |
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
|
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
-
-
|
/*
** WEBPAGE: technoteedit
** WEBPAGE: eventedit
**
** Revise or create a technical note (formerly called an "event").
**
** Required query parameter:
**
** name=ID Hex hash ID of the technote. If omitted, a new
** tech-note is created.
**
** POST parameters from the "Cancel", "Preview", or "Submit" buttons:
**
** w=TEXT Complete text of the technote.
** t=TEXT Time of the technote on the timeline (ISO 8601)
** c=TEXT Timeline comment
** g=TEXT Tags associated with this technote
** mimetype=TEXT Mimetype for w= text
** newclr Use a background color
** clr=TEXT Background color to use if newclr
|
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
+
-
-
-
+
+
+
-
+
-
+
+
-
+
+
-
+
-
+
|
if( n<20 ) n = 20;
if( n>40 ) n = 40;
@ <form method="post" action="%R/technoteedit"><div>
login_insert_csrf_secret();
@ <input type="hidden" name="name" value="%h(zId)" />
@ <table border="0" cellspacing="10">
@ <tr><th align="right" valign="top">Timestamp (UTC):</th>
@ <tr><th align="right" valign="top"><label for="t">Timestamp (UTC):</label></th>
@ <td valign="top">
@ <input type="text" name="t" size="25" value="%h(zETime)" />
@ <input type="text" id="t" name="t" size="25" value="%h(zETime)" />
@ </td></tr>
@ <tr><th align="right" valign="top">Timeline Comment:</th>
@ <tr><th align="right" valign="top"><label for="c">Timeline Comment:</label></th>
@ <td valign="top">
@ <textarea name="c" class="technoteedit" cols="80"
@ <textarea id="c" name="c" class="technoteedit" cols="80"
@ rows="3" wrap="virtual">%h(zComment)</textarea>
@ </td></tr>
@ <tr><th align="right" valign="top">Timeline Background Color:</th>
@ <tr><th align="right" valign="top">
@ <label for='newclr'%s(zClrFlag)>Timeline Background Color:</label></th>
@ <td valign="top">
@ <input type='checkbox' name='newclr'%s(zClrFlag) />
@ Use custom color: \
@ <input type='color' name='clr' value='%s(zClr[0]?zClr:"#c0f0ff")'>
@ <input type='checkbox' id='newclr'%s(zClrFlag) name='newclr'%s(zClrFlag) />
@ <label>Use custom color: \
@ <input type='color' name='clr' value='%s(zClr[0]?zClr:"#c0f0ff")'></label>
@ </td></tr>
@ <tr><th align="right" valign="top">Tags:</th>
@ <tr><th align="right" valign="top"><label for="g">Tags:</label></th>
@ <td valign="top">
@ <input type="text" name="g" size="40" value="%h(zTags)" />
@ <input type="text" id="g" name="g" size="40" value="%h(zTags)" />
@ </td></tr>
@ <tr><th align="right" valign="top">\
@ <label for="mimetype">Markup style</label>
@ %z(href("%R/markup_help"))Markup Style</a>:</th>
@ %z(href("%R/markup_help"))
@ <span class="help-buttonlet processed" title="Help"></span></a>:
@ <td valign="top">
mimetype_option_menu(zMimetype);
@ </td></tr>
@ <tr><th align="right" valign="top">Page Content:</th>
@ <tr><th align="right" valign="top"><label for="w">Page Content:</label></th>
@ <td valign="top">
@ <textarea name="w" class="technoteedit" cols="80"
@ <textarea id="w" name="w" class="technoteedit" cols="80"
@ rows="%d(n)" wrap="virtual">%h(zBody)</textarea>
@ </td></tr>
@ <tr><td colspan="2">
@ <input type="submit" name="cancel" value="Cancel" />
@ <input type="submit" name="preview" value="Preview" />
if( P("preview") ){
|
︙ | | |
Changes to src/export.c.
︙ | | |
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
|
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
|
-
-
|
/*
** COMMAND: git*
**
** Usage: %fossil git SUBCOMMAND
**
** Do incremental import or export operations between Fossil and Git.
** Subcommands:
**
** > fossil git export [MIRROR] [OPTIONS]
**
** Write content from the Fossil repository into the Git repository
** in directory MIRROR. The Git repository is created if it does not
** already exist. If the Git repository does already exist, then
** new content added to fossil since the previous export is appended.
**
** Repeat this command whenever new checkins are added to the Fossil
** repository in order to reflect those changes into the mirror. If
|
︙ | | |
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
|
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
|
-
-
-
-
-
|
** Useful for debugging
** --mainbranch NAME Use NAME as the name of the main branch in Git.
** The "trunk" branch of the Fossil repository is
** mapped into this name. "master" is used if
** this option is omitted.
** -q|--quiet Reduce output. Repeat for even less output.
** -v|--verbose More output.
**
** > fossil git import MIRROR
**
** TBD...
**
** > fossil git status
**
** Show the status of the current Git mirror, if there is one.
**
** -q|--quiet No output if there is nothing to report
*/
void gitmirror_command(void){
char *zCmd;
int nCmd;
if( g.argc<3 ){
usage("export ARGS...");
|
︙ | | |
Changes to src/file.c.
︙ | | |
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
|
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
|
-
|
**
** Usage: %fossil test-file-environment FILENAME...
**
** Display the effective file handling subsystem "settings" and then
** display file system information about the files specified, if any.
**
** Options:
**
** --allow-symlinks BOOLEAN Temporarily turn allow-symlinks on/off
** --open-config Open the configuration database first.
** --reset Reset cached stat() info for each file.
** --root ROOT Use ROOT as the root of the checkout
** --slash Trailing slashes, if any, are retained.
*/
void cmd_test_file_environment(void){
|
︙ | | |
Changes to src/fileedit.c.
︙ | | |
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
|
696
697
698
699
700
701
702
703
704
705
706
707
708
709
|
-
|
**
** Usage: %fossil test-ci-mini ?OPTIONS? FILENAME
**
** where FILENAME is a repo-relative name as it would appear in the
** vfile table.
**
** Options:
**
** -R|--repository REPO The repository file to commit to.
** --as FILENAME The repository-side name of the input
** file, relative to the top of the
** repository. Default is the same as the
** input file name.
** -m|--comment COMMENT Required checkin comment.
** -M|--comment-file FILE Reads checkin comment from the given file.
|
︙ | | |
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
|
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
|
-
|
** permissions has set the fileedit-glob setting to a list of glob
** patterns matching files which may be edited (e.g. "*.wiki,*.md").
** Note that fileedit-glob, by design, is a local-only setting.
** It does not sync across repository clones, and must be explicitly
** set on any repositories where this page should be activated.
**
** Optional query parameters:
**
** filename=FILENAME Repo-relative path to the file.
** checkin=VERSION Checkin version, using any unambiguous
** symbolic version name.
**
** If passed a filename but no checkin then it will attempt to
** load that file from the most recent leaf checkin.
**
|
︙ | | |
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
|
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
|
-
+
|
100,
"100%", 100, "125%", 125,
"150%", 150, "175%", 175,
"200%", 200, NULL);
CX("</div>");
CX("<div class='flex-container flex-column stretch'>");
CX("<textarea name='content' id='fileedit-content-editor' "
"class='fileedit' rows='25'>");
"class='fileedit' rows='25' aria-label='Content' title='Content'>");
CX("</textarea>");
CX("</div>"/*textarea wrapper*/);
CX("</div>"/*#tab-file-content*/);
}
/****** Preview tab ******/
{
|
︙ | | |
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
|
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
|
-
+
|
NULL);
CX("</div>"/*checkboxes*/);
}
{ /******* Commit comment, button, and result manifest *******/
CX("<fieldset class='fileedit-options commit-message'>"
"<legend>Message (required)</legend><div>\n");
"<legend><label for='fileedit-comment'>Message (required)</label></legend><div>\n");
/* We have two comment input fields, defaulting to single-line
** mode. JS code sets up the ability to toggle between single-
** and multi-line modes. */
CX("<input type='text' name='comment' "
"id='fileedit-comment'></input>");
CX("<textarea name='commentBig' class='hidden' "
"rows='5' id='fileedit-comment-big'></textarea>\n");
|
︙ | | |
Changes to src/finfo.c.
︙ | | |
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
|
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
|
+
-
|
}
/* Values for the debug= query parameter to finfo */
#define FINFO_DEBUG_MLINK 0x01
/*
** WEBPAGE: finfo
**
** Usage:
** * /finfo?name=FILENAME
** * /finfo?name=FILENAME&ci=HASH
**
** Show the change history for a single file. The name=FILENAME query
** parameter gives the filename and is a required parameter. If the
** ci=HASH parameter is also supplied, then the FILENAME,HASH combination
** identifies a particular version of a file, and in that case all changes
** to that one file version are tracked across both edits and renames.
** If only the name=FILENAME parameter is supplied (if ci=HASH is omitted)
** then the graph shows all changes to any file while it happened
** to be called FILENAME and changes are not tracked across renames.
**
** Additional query parameters:
**
** a=DATETIME Only show changes after DATETIME
** b=DATETIME Only show changes before DATETIME
** ci=HASH identify a particular version of a file and then
** track changes to that file across renames
** m=HASH Mark this particular file version.
** n=NUM Show the first NUM changes only
** name=FILENAME (Required) name of file whose history to show
|
︙ | | |
Changes to src/forum.c.
︙ | | |
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
|
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
|
-
+
-
+
|
zEditorName = zPosterName;
}
zDate = db_text(0, "SELECT datetime(%.17g,toLocal())", p->rDate);
if( p->pEditPrev ){
zPosterName = forum_post_display_name(p->pEditHead, 0);
zEditorName = forum_post_display_name(p, pManifest);
zHist = bHist ? "" : zQuery[0]==0 ? "?hist" : "&hist";
@ <h3 class='forumPostHdr'>(%d(p->sid)\
@ <h2 class='forumPostHdr'>(%d(p->sid)\
@ .%0*d(fossil_num_digits(p->nEdit))(p->rev)) \
if( fossil_strcmp(zPosterName, zEditorName)==0 ){
@ By %s(zPosterName) on %h(zDate) edited from \
@ %z(href("%R/forumpost/%S?%s%s",p->pEditPrev->zUuid,zQuery,zHist))\
@ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a>
}else{
@ Originally by %s(zPosterName) \
@ with edits by %s(zEditorName) on %h(zDate) from \
@ %z(href("%R/forumpost/%S%s%s",p->pEditPrev->zUuid,zQuery,zHist))\
@ %d(p->sid).%0*d(fossil_num_digits(p->nEdit))(p->pEditPrev->rev)</a>
}
}else{
zPosterName = forum_post_display_name(p, pManifest);
@ <h3 class='forumPostHdr'>(%d(p->sid)) \
@ <h2 class='forumPostHdr'>(%d(p->sid)) \
@ By %s(zPosterName) on %h(zDate)
}
fossil_free(zDate);
/* If debugging is enabled, link to the artifact page. */
if( g.perm.Debug ){
|
︙ | | |
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
|
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
|
-
+
|
@ %z(href("%R/forumpost/%!S%s",p->zUuid,zQuery))[link]</a>
}
/* Provide a link to the raw source code. */
if( !bUnf ){
@ %z(href("%R/forumpost/%!S?raw",p->zUuid))[source]</a>
}
@ </h3>
@ </h2>
}
/* Check if this post is approved, also if it's by the current user. */
bPrivate = content_is_private(p->fpid);
bSameUser = login_is_individual()
&& fossil_strcmp(pManifest->zUser, g.zLogin)==0;
|
︙ | | |
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
|
791
792
793
794
795
796
797
798
799
800
801
802
803
804
|
-
|
**
** Show a single forum posting. The posting is shown in context with
** its entire thread. The selected posting is enclosed within
** <div class='forumSel'>...</div>. Javascript is used to move the
** selected posting into view after the page loads.
**
** Query parameters:
**
** name=X REQUIRED. The hash of the post to display.
** t=a Automatic display mode, i.e. hierarchical for
** desktop and chronological for mobile. This is the
** default if the "t" query parameter is omitted.
** t=c Show posts in the order they were written.
** t=h Show posts using hierarchical indenting.
** t=s Show only the post specified by "name=X".
|
︙ | | |
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
|
817
818
819
820
821
822
823
824
825
826
827
828
829
830
|
-
|
** WEBPAGE: forumthread
**
** Show all forum messages associated with a particular message thread.
** The result is basically the same as /forumpost except that none of
** the postings in the thread are selected.
**
** Query parameters:
**
** name=X REQUIRED. The hash of any post of the thread.
** t=a Automatic display mode, i.e. hierarchical for
** desktop and chronological for mobile. This is the
** default if the "t" query parameter is omitted.
** t=c Show posts in the order they were written.
** t=h Show posts using hierarchical indenting.
** unf Show the original, unformatted source text.
|
︙ | | |
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
|
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
|
-
-
+
+
+
-
+
+
-
-
+
+
|
*/
static void forum_post_widget(
const char *zTitle,
const char *zMimetype,
const char *zContent
){
if( zTitle ){
@ Title: <input type="input" name="title" value="%h(zTitle)" size="50"
@ maxlength="125"><br>
@ <label>Title: <input type="input" name="title" value="%h(zTitle)" size="50"
@ maxlength="125"></label><br>
}
@ <label>Markup style
@ %z(href("%R/markup_help"))Markup style</a>:
@ %z(href("%R/markup_help"))
@ <span class="help-buttonlet processed" title="Help"></span></a>:
mimetype_option_menu(zMimetype);
@ <br><textarea aria-label="Content:" name="content" class="wikiedit" \
@ cols="80" rows="25" wrap="virtual">%h(zContent)</textarea><br>
@ </label><br><textarea aria-label="Content" title="Content" name="content" \
@ class="wikiedit" cols="80" rows="25" wrap="virtual">%h(zContent)</textarea><br>
}
/*
** WEBPAGE: forumnew
** WEBPAGE: forumedit
**
** Start a new thread on the forum or reply to an existing thread.
|
︙ | | |
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
|
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
|
-
+
|
style_finish_page();
}
/*
** WEBPAGE: forume2
**
** Edit an existing forum message.
** Query parameters:
**
** Query parameters:
** fpid=X Hash of the post to be edited. REQUIRED
*/
void forumedit_page(void){
int fpid;
int froot;
Manifest *pPost = 0;
Manifest *pRootPost = 0;
|
︙ | | |
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
|
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
|
-
|
** WEBPAGE: forum
**
** The main page for the forum feature. Show a list of recent forum
** threads. Also show a search box at the top if search is enabled,
** and a button for creating a new thread, if enabled.
**
** Query parameters:
**
** n=N The number of threads to show on each page
** x=X Skip the first X threads
** s=Y Search for term Y.
*/
void forum_main_page(void){
Stmt q;
int iLimit, iOfst, iCnt;
|
︙ | | |
Changes to src/fossil.diff.js.
︙ | | |
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
+
+
|
/info and similar pages.
*/
const D = window.fossil.dom;
const addToggle = function(diffElem){
const sib = diffElem.previousElementSibling,
btn = sib ? D.addClass(D.checkbox(true), 'diff-toggle') : 0;
if(!sib) return;
D.attr(btn,'aria-label','Toggle Diff')
D.attr(btn,'title','Toggle Diff')
D.append(sib,btn);
btn.addEventListener('click', function(){
diffElem.classList.toggle('hidden');
}, false);
};
document.querySelectorAll('table.diff').forEach(addToggle);
});
|
︙ | | |
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
|
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
|
-
+
|
*/
window.fossil.onPageLoad(function(){
const SCROLL_LEN = 25;
const F = window.fossil, D = F.dom, Diff = F.diff;
var lastWidth;
Diff.checkTableWidth = function f(force){
if(undefined === f.contentNode){
f.contentNode = document.querySelector('div.content');
f.contentNode = document.querySelector('main.content');
}
force = true;
const parentCS = window.getComputedStyle(f.contentNode);
const parentWidth = (
//document.body.clientWidth;
//parentCS.width;
f.contentNode.clientWidth
|
︙ | | |
Changes to src/fossil.dom.js.
︙ | | |
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
|
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
|
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
+
+
|
/**
Creates and returns a FIELDSET element, optionaly with a LEGEND
element added to it. If legendText is an HTMLElement then is is
assumed to be a LEGEND and is appended as-is, else it is assumed
(if truthy) to be a value suitable for passing to
dom.append(aLegendElement,...).
*/
dom.fieldset = function(legendText){
dom.fieldset = function(legendText, labelFor){
const fs = this.create('fieldset');
if(legendText){
if(labelFor){
this.append(
fs,
(legendText instanceof HTMLElement)
? legendText
: this.append(this.legend(legendText))
);
this.append(
fs,
(legendText instanceof HTMLElement)
? legendText
: this.append(this.legend(legendText, labelFor))
);
} else {
this.append(
fs,
(legendText instanceof HTMLElement)
? legendText
: this.append(this.legend(legendText))
);
}
}
return fs;
};
/**
Returns a new LEGEND legend element. The given argument, if
not falsy, is append()ed to the element (so it may be a string
or DOM element.
*/
dom.legend = function(legendText){
dom.legend = function(legendText, labelFor){
const rc = this.create('legend');
if(legendText) {
if(labelFor){
legendText = this.label(labelFor,legendText)
}
if(legendText) this.append(rc, legendText);
this.append(rc, legendText);
}
return rc;
};
/**
Appends each argument after the first to the first argument
(a DOM node) and returns the first argument.
|
︙ | | |
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
|
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
|
-
-
+
+
+
+
+
+
|
|| 'boolean'===typeof e
|| e instanceof Error) e = this.text(e);
parent.appendChild(e);
}
return parent;
};
dom.input = function(type){
return this.attr(this.create('input'), 'type', type);
dom.input = function(type, id){
if(id){
return this.attr(this.create('input'), 'type', type, 'id', id);
} else {
return this.attr(this.create('input'), 'type', type);
}
};
/**
Returns a new CHECKBOX input element.
Usages:
([boolean checked = false])
|
︙ | | |
Changes to src/fossil.page.brlist.js.
︙ | | |
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
-
+
|
* According to MDN 'const' requires Android's WebView 37,
* which may not be available.
* For the time being, continueing without 'const' and 'indexOf'
* (but that may be reconsidered later).
*/
window.addEventListener( 'load', function() {
var submenu = document.querySelector("div.submenu");
var submenu = document.querySelector("nav.submenu");
var anchor = document.createElement("A");
var brlistDataObj = document.getElementById("brlist-data");
var brlistDataTxt = brlistDataObj.textContent || brlistDataObj.innerText;
var brlistData = JSON.parse(brlistDataTxt);
anchor.classList.add("label");
anchor.classList.add("timeline-link");
anchor.href = brlistData.timelineUrl;
|
︙ | | |
Changes to src/fossil.page.chat.js.
︙ | | |
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
|
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
|
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
|
let dbg = document.querySelector('#debugMsg');
if(dbg){
/* This can inadvertently influence our flexbox layouts, so move
it out of the way. */
D.append(document.body,dbg);
}
})();
/**
Selectors for elements which are direct children of the BODY
element but not part of the /chat UI.
*/
const selectorsOutsideChat = [
'body > *:not(.content)'
];
const ForceResizeKludge = (function(){
/* Workaround for Safari mayhem regarding use of vh CSS units....
We tried to use vh units to set the content area size for the
chat layout, but Safari chokes on that, so we calculate that
height here: 85% when in "normal" mode and 95% in chat-only
mode. Larger than ~95% is too big for Firefox on Android,
causing the input area to move off-screen.
While we're here, we also use this to cap the max-height
of the input field so that pasting huge text does not scroll
the upper area of the input widget off-screen. */
const elemsToCount = [
document.querySelector('body > div.header'),
document.querySelector('body > div.mainmenu'),
const elemsToCount = document.querySelectorAll(
selectorsOutsideChat.join(',')
);
document.querySelector('body > #hbdrop'),
document.querySelector('body > div.footer')
];
const contentArea = E1('div.content');
const contentArea = E1('main.content');
const bcl = document.body.classList;
const resized = function f(){
if(f.$disabled) return;
const wh = window.innerHeight,
com = bcl.contains('chat-only-mode');
var ht;
var extra = 0;
|
︙ | | |
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
-
+
|
viewMessages: E1('#chat-messages-wrapper'),
btnSubmit: E1('#chat-button-submit'),
btnAttach: E1('#chat-button-attach'),
inputX: E1('#chat-input-field-x'),
input1: E1('#chat-input-field-single'),
inputM: E1('#chat-input-field-multi'),
inputFile: E1('#chat-input-file'),
contentDiv: E1('div.content'),
contentDiv: E1('main.content'),
viewConfig: E1('#chat-config'),
viewPreview: E1('#chat-preview'),
previewContent: E1('#chat-preview-content'),
btnPreview: E1('#chat-button-preview'),
views: document.querySelectorAll('.chat-view'),
activeUserListWrapper: E1('#chat-user-list-wrapper'),
activeUserList: E1('#chat-user-list')
|
︙ | | |
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
|
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
|
-
+
-
-
-
-
-
-
-
|
Enters (if passed a truthy value or no arguments) or leaves
"chat-only" mode. That mode hides the page's header and
footer, leaving only the chat application visible to the
user.
*/
chatOnlyMode: function f(yes){
if(undefined === f.elemsToToggle){
f.elemsToToggle = [];
f.elemsToToggle = document.querySelectorAll(selectorsOutsideChat.join(','));
document.querySelectorAll(
["body > div.header",
"body > div.mainmenu",
"body > div.footer",
"#debugMsg"
].join(',')
).forEach((e)=>f.elemsToToggle.push(e));
}
if(!arguments.length) yes = true;
if(yes === this.isChatOnlyMode()) return this;
if(yes){
D.addClass(f.elemsToToggle, 'hidden');
D.addClass(document.body, 'chat-only-mode');
document.body.scroll(0,document.body.height);
|
︙ | | |
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
|
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
|
-
+
+
+
-
+
-
|
const menuEntry = D.addClass(D.div(), 'menu-entry');
if(true===indentOrIndex) D.addClass(menuEntry, 'child');
const label = op.label
? D.append(D.label(),op.label) : undefined;
const labelWrapper = D.addClass(D.div(), 'label-wrapper');
var hint;
if(op.hint){
hint = D.append(D.addClass(D.label(),'hint'),op.hint);
hint = D.append(D.addClass(D.span(),'hint'),op.hint);
}
if(op.hasOwnProperty('select')){
const col0 = D.addClass(D.span(/*empty, but for spacing*/),
'toggle-wrapper');
D.append(menuEntry, labelWrapper, col0);
D.attr(op.select,'aria-label',op.hint);
D.attr(op.select,'title',op.hint);
D.append(labelWrapper, op.select);
if(hint) D.append(labelWrapper, hint);
if(label) D.append(label);
if(op.callback){
op.select.addEventListener('change', (ev)=>op.callback(ev), false);
}
}else if(op.hasOwnProperty('boolValue')){
if(undefined === f.$id) f.$id = 0;
++f.$id;
if('string' ===typeof op.boolValue){
const key = op.boolValue;
op.boolValue = ()=>Chat.settings.getBool(key);
op.persistentSetting = key;
}
const check = op.checkbox
= D.attr(D.checkbox(1, op.boolValue()),
= D.attr(D.checkbox(1, op.boolValue()));
'aria-label', op.label);
const id = 'cfgopt'+f.$id;
const col0 = D.addClass(D.span(), 'toggle-wrapper');
check.checked = op.boolValue();
op.checkbox = check;
D.attr(check, 'id', id);
if(hint) D.attr(hint, 'for', id);
D.append(menuEntry, labelWrapper, col0);
|
︙ | | |
Changes to src/fossil.page.fileedit.js.
︙ | | |
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
|
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
|
-
+
-
-
+
+
+
+
|
this.cache.branchNames = F.storage.getJSON(this.cache.branchKey, {});
const selCi = this.e.selectCi = D.addClass(D.select(), 'flex-grow'),
selFiles = this.e.selectFiles
= D.addClass(D.select(), 'file-list'),
btnLoad = this.e.btnLoadFile =
D.addClass(D.button("Load file"), "flex-shrink"),
filesLabel = this.e.fileListLabel =
D.addClass(D.div(),'flex-shrink','file-list-label'),
D.addClass(D.label('editable-file-list'),'flex-shrink','file-list-label'),
ciLabelWrapper = D.addClass(
D.div(), 'flex-container','flex-row', 'flex-shrink',
'stretch', 'child-gap-small'
),
btnReload = D.addClass(
D.button('Reload'), 'flex-shrink'
),
ciLabel = this.e.ciListLabel =
D.addClass(D.span(),'flex-shrink','checkin-list-label')
ciLabel = this.e.ciListLabel =
D.addClass(D.label('open-leaf-list'),'flex-shrink','checkin-list-label')
;
D.attr(selCi, 'id',"open-leaf-list");
D.attr(selCi, 'title',"The list of opened leaves.");
D.attr(selFiles, 'title',
"The list of editable files for the selected checkin.");
D.attr(selFiles, 'id',"editable-file-list");
D.attr(btnLoad, 'title',
"Load the selected file into the editor.");
D.disable(selCi, selFiles, btnLoad);
D.attr(selFiles, 'size', 12);
D.append(
this.e.container,
ciLabel,
|
︙ | | |
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
|
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
|
-
-
-
+
+
+
+
|
btnHelp = D.append(
D.addClass(D.div(), "help-buttonlet"),
'Locally-edited files. Timestamps are the last local edit time. ',
'Only the ',P.config.defaultMaxStashSize,' most recent files ',
'are retained. Saving or reloading a file removes it from this list. ',
D.append(D.code(),F.storage.storageImplName()),
' = ',F.storage.storageHelpDescription()
);
D.append(wrapper, "Local edits (",
),
label = D.label('local-edits', "Local edits");
D.attr(sel, 'id', 'local-edits');
D.append(wrapper, label, " (",
D.append(D.code(),
F.storage.storageImplName()),
"):",
btnHelp, sel, btnClear);
F.helpButtonlets.setup(btnHelp);
D.option(D.disable(sel), undefined, "(empty)");
F.page.addEventListener('fileedit-stash-updated',(e)=>this.updateList(e.detail));
|
︙ | | |
Changes to src/fossil.page.pikchrshow.js.
︙ | | |
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
+
+
|
// Set up selection list of predefined scripts...
if(true){
const selectScript = P.e.selectScript = D.select(),
cbAutoPreview = P.e.cbAutoPreview =
D.attr(D.checkbox(true),'id', 'cb-auto-preview'),
cbWrap = D.addClass(D.div(),'input-with-label')
;
D.attr(selectScript, 'aria-label', 'Example Scripts');
D.attr(selectScript, 'title', 'Example Scripts');
D.append(
cbWrap,
selectScript,
cbAutoPreview,
D.label(cbAutoPreview,"Auto-preview?"),
F.helpButtonlets.create(
D.append(D.div(),
|
︙ | | |
Changes to src/fossil.page.pikchrshowasm.js.
︙ | | |
369
370
371
372
373
374
375
376
377
378
379
380
381
382
|
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
|
+
+
|
);
////////////////////////////////////////////////////////////
// Set up selection list of predefined scripts...
if(true){
const selectScript = PS.e.selectScript = D.select();
D.attr(selectScript, 'aria-label', 'Example Scripts');
D.attr(selectScript, 'title', 'Example Scripts');
D.append(PS.e.zoneInputButtons, selectScript);
PS.predefinedPiks.forEach(function(script,ndx){
const opt = D.option(script.code ? script.code.trim() :'', script.name);
D.append(selectScript, opt);
if(!ndx) selectScript.selectedIndex = 0 /*timing/ordering workaround*/;
if(ndx && !script.code){
/* Treat entries w/ no code as separators EXCEPT for the
|
︙ | | |
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
|
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
|
-
-
-
+
-
+
-
-
+
-
|
that height here. Larger than ~95% is too big for
Firefox on Android, causing the input area to move
off-screen. */
const appViews = EAll('.app-view');
const elemsToCount = [
/* Elements which we need to always count in the
visible body size. */
E('body > div.header'),
E('body > div.mainmenu'),
E('body > div.footer')
...EAll('body > *:not(.content)')
];
const resized = function f(){
if(f.$disabled) return;
const wh = window.innerHeight;
var ht;
let ht = wh;
var extra = 0;
elemsToCount.forEach((e)=>e ? extra += F.dom.effectiveHeight(e) : false);
elemsToCount.forEach((e)=>ht -= F.dom.effectiveHeight(e));
ht = wh - extra;
appViews.forEach(function(e){
e.style.height =
e.style.maxHeight = [
"calc(", (ht>=100 ? ht : 100), "px",
" - 2em"/*fudge value*/,")"
/* ^^^^ hypothetically not needed, but both
Chrome/FF on Linux will force scrollbars on the
|
︙ | | |
Changes to src/fossil.page.wikiedit.js.
︙ | | |
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
|
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
|
-
+
+
|
init: function(parentElem){
const sel = D.select(), btn = D.addClass(D.button("Reload page list"), 'save');
this.e.select = sel;
D.addClass(parentElem, 'WikiList');
D.clearElement(parentElem);
D.append(
parentElem,
D.append(D.fieldset("Select a page to edit"),
D.append(D.fieldset("Select a page to edit", 'select-page'),
sel)
);
D.attr(sel, 'size', 12);
D.attr(sel, 'id', 'select-page');
D.option(D.disable(D.clearElement(sel)), undefined, "Loading...");
/** Set up filter checkboxes for the various types
of wiki pages... */
const fsFilter = D.addClass(D.fieldset("Page types"),"page-types-list"),
fsFilterBody = D.div(),
filters = ['normal', 'branch/...', 'tag/...', 'checkin/...']
|
︙ | | |
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
|
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
|
-
+
-
+
|
D.append(
fsLegendBody,
D.append(D.span(), getEditMarker(getEditMarker.NEW,false)," = new/unsaved"),
D.append(D.span(), getEditMarker(getEditMarker.MODIFIED,false)," = has local edits"),
D.append(D.span(), getEditMarker(getEditMarker.DELETED,false)," = is empty (deleted)")
);
const fsNewPage = D.fieldset("Create new page"),
const fsNewPage = D.fieldset("Create new page", 'new-page'),
fsNewPageBody = D.div(),
newPageName = D.input('text'),
newPageName = D.input('text', 'new-page'),
newPageBtn = D.button("Add page locally")
;
D.append(parentElem, fsNewPage);
D.append(fsNewPage, fsNewPageBody);
D.addClass(fsNewPageBody, 'flex-container', 'flex-column', 'new-page');
D.append(
fsNewPageBody, newPageName, newPageBtn,
|
︙ | | |
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
|
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
|
-
-
+
+
+
+
|
btnHelp = D.append(
D.addClass(D.div(), "help-buttonlet"),
'Locally-edited wiki pages. Timestamps are the last local edit time. ',
'Only the ',P.config.defaultMaxStashSize,' most recent pages ',
'are retained. Saving or reloading a file removes it from this list. ',
D.append(D.code(),F.storage.storageImplName()),
' = ',F.storage.storageHelpDescription()
);
D.append(wrapper, "Local edits (",
),
label = D.label('local-edits', "Local edits");
D.attr(sel, 'id', 'local-edits');
D.append(wrapper, label, " (",
D.append(D.code(),
F.storage.storageImplName()),
"):",
btnHelp, sel, btnClear);
F.helpButtonlets.setup(btnHelp);
D.option(D.disable(sel), undefined, "(empty)");
P.addEventListener('wiki-stash-updated',(e)=>this.updateList(e.detail));
|
︙ | | |
Changes to src/hbmenu.js.
︙ | | |
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
-
+
|
** using the "builtin_request_js" TH1 command.
**
** Operation:
**
** This script request that the HTML contain two elements:
**
** <a id="hbbtn"> <--- The hamburger menu button
** <div id="hbdrop"> <--- Container for the hamburger menu
** <nav id="hbdrop"> <--- Container for the hamburger menu
**
** Bindings are made on hbbtn so that when it is clicked, the following
** happens:
**
** 1. An XHR is made to /sitemap?popup to fetch the HTML for the
** popup menu.
**
|
︙ | | |
Changes to src/hname.c.
︙ | | |
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
|
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
-
-
-
-
-
|
/*
** COMMAND: hash-policy*
**
** Usage: fossil hash-policy ?NEW-POLICY?
**
** Query or set the hash policy for the current repository. Available hash
** policies are as follows:
**
** sha1 New artifact names are created using SHA1
**
** auto New artifact names are created using SHA1, but
** automatically change the policy to "sha3" when
** any SHA3 artifact enters the repository.
**
** sha3 New artifact names are created using SHA3, but
** older artifacts with SHA1 names may be reused.
**
** sha3-only Use only SHA3 artifact names. Do not reuse legacy
** SHA1 names.
**
** shun-sha1 Shun any SHA1 artifacts received by sync operations
** other than clones. Older legacy SHA1 artifacts are
** allowed during a clone.
**
** The default hash policy for existing repositories is "auto", which will
** immediately promote to "sha3" if the repository contains one or more
** artifacts with SHA3 names. The default hash policy for new repositories
|
︙ | | |
Changes to src/hook.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
|
/*
** COMMAND: hook*
**
** Usage: %fossil hook COMMAND ...
**
** Commands include:
**
** > fossil hook add --command COMMAND --type TYPE --sequence NUMBER
**
** Create a new hook. The --command and --type arguments are
** required. --sequence is optional.
**
** > fossil hook delete ID ...
**
** Delete one or more hooks by their IDs. ID can be "all"
** to delete all hooks. Caution: There is no "undo" for
** this operation. Deleted hooks are permanently lost.
**
** > fossil hook edit --command COMMAND --type TYPE --sequence NUMBER ID ...
**
** Make changes to one or more existing hooks. The ID argument
** is either a hook-id, or a list of hook-ids, or the keyword
** "all". For example, to disable hook number 2, use:
**
** fossil hook edit --type disabled 2
**
** > fossil hook list
**
** Show all current hooks
**
** > fossil hook status
**
** Print the values of CONFIG table entries that are relevant to
** hook processing. Used for debugging.
**
** > fossil hook test [OPTIONS] ID
**
** Run the hook script given by ID for testing purposes.
** Options:
**
** Options:
** --dry-run Print the script on stdout rather than run it
** --base-rcvid N Pretend that the hook-last-rcvid value is N
** --new-rcvid M Pretend that the last rcvid valud is M
** --aux-file NAME NAME is substituted for %A in the script
**
** The --base-rcvid and --new-rcvid options are silently ignored if
** the hook type is not "after-receive". The default values for
** --base-rcvid and --new-rcvid cause the last receive to be processed.
*/
void hook_cmd(void){
const char *zCmd;
int nCmd;
|
︙ | | |
Changes to src/http.c.
︙ | | |
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
|
538
539
540
541
542
543
544
545
546
547
548
549
550
551
|
-
|
**
** If a second filename (OUTPUT) is given after PAYLOAD, then the reply
** is written into that second file instead of being written on standard
** output. Use the "--out OUTPUT" option to specify an output file for
** a GET request where there is no PAYLOAD.
**
** Options:
**
** --compress Use ZLIB compression on the payload
** --mimetype TYPE Mimetype of the payload
** --out FILE Store the reply in FILE
** -v Verbose output
** --xfer PAYLOAD in a Fossil xfer protocol message
*/
void test_httpmsg_command(void){
|
︙ | | |
Changes to src/http_ssl.c.
︙ | | |
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
|
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
|
-
-
-
|
** Usage: %fossil ssl-config [SUBCOMMAND] [OPTIONS...] [ARGS...]
**
** This command is used to view or modify the TLS (Transport Layer
** Security) configuration for Fossil. TLS (formerly SSL) is the
** encryption technology used for secure HTTPS transport.
**
** Sub-commands:
**
** remove-exception DOMAINS Remove TLS cert exceptions for the domains
** listed. Or remove them all if the --all
** option is specified.
**
** scrub ?--force? Remove all SSL configuration data from the
** repository. Use --force to omit the
** confirmation.
**
** show ?-v? Show the TLS configuration. Add -v to see
** additional explaination
*/
void test_tlsconfig_info(void){
const char *zCmd;
size_t nCmd;
int nHit = 0;
|
︙ | | |
Changes to src/import.c.
︙ | | |
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
|
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
|
-
+
-
+
-
|
**
** Read interchange format generated by another VCS and use it to
** construct a new Fossil repository named by the NEW-REPOSITORY
** argument. If no input file is supplied the interchange format
** data is read from standard input.
**
** The following formats are currently understood by this command
**
** --git Import from the git-fast-export file format (default)
**
** Options:
** --import-marks FILE Restore marks table from FILE
** --export-marks FILE Save marks table to FILE
** --rename-master NAME Renames the master branch to NAME
** --use-author Uses author as the committer
** --attribute "EMAIL USER" Attribute commits to USER
** instead of Git committer EMAIL address
**
** --svn Import from the svnadmin-dump file format. The default
** behaviour (unless overridden by --flat) is to treat 3
** folders in the SVN root as special, following the
** common layout of SVN repositories. These are (by
** default) trunk/, branches/ and tags/. The SVN --deltas
** format is supported but not required.
**
** Options:
** --trunk FOLDER Name of trunk folder
** --branches FOLDER Name of branches folder
** --tags FOLDER Name of tags folder
** --base PATH Path to project root in repository
** --flat The whole dump is a single branch
** --rev-tags Tag each revision, implied by -i
** --no-rev-tags Disables tagging effect of -i
** --rename-rev PAT Rev tag names, default "svn-rev-%"
** --ignore-tree DIR Ignores subtree rooted at DIR
**
** Common Options:
** -i|--incremental allow importing into an existing repository
** -f|--force overwrite repository if already exists
** -q|--quiet omit progress output
** --no-rebuild skip the "rebuilding metadata" step
** --no-vacuum skip the final VACUUM of the database file
** --rename-trunk NAME use NAME as name of imported trunk branch
|
︙ | | |
Changes to src/info.c.
︙ | | |
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
-
|
** to access the repository. The --verbose is (currently) a no-op if
** the argument is the name of an object within the repository.
**
** Use the "finfo" command to get information about a specific
** file in a checkout.
**
** Options:
**
** -R|--repository REPO Extract info from repository REPO
** -v|--verbose Show extra information about repositories
**
** See also: [[annotate]], [[artifact]], [[finfo]], [[timeline]]
*/
void info_cmd(void){
i64 fsize;
|
︙ | | |
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
|
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
|
-
|
** WEBPAGE: vdiff
** URL: /vdiff?from=TAG&to=TAG
**
** Show the difference between two check-ins identified by the from= and
** to= query parameters.
**
** Query parameters:
**
** from=TAG Left side of the comparison
** to=TAG Right side of the comparison
** branch=TAG Show all changes on a particular branch
** diff=INTEGER 0: none, 1: unified, 2: side-by-side
** glob=STRING only diff files matching this glob
** dc=N show N lines of context around each diff
** w=BOOLEAN ignore whitespace when computing diffs
|
︙ | | |
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
|
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
|
-
|
/*
** SETTING: preferred-diff-type width=16 default=0
**
** The preferred-diff-type setting determines the preferred diff format
** for web pages if the format is not otherwise specified, for example
** by a query parameter or cookie. Allowed values:
**
** 1 Unified diff
** 2 Side-by-side diff
**
** If this setting is omitted or has a value of 0 or less, then it
** is ignored.
*/
/*
|
︙ | | |
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
|
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
|
-
|
**
** If the "from" and "to" query parameters are both present, then they are
** the names of two files within the check-in "ci" that are diffed. If the
** "ci" parameter is omitted, then the most recent check-in ("tip") is
** used.
**
** Additional parameters:
**
** dc=N Show N lines of context around each diff
** patch Use the patch diff format
** regex=REGEX Only show differences that match REGEX
** sbs=BOOLEAN Turn side-by-side diffs on and off (default: on)
** verbose=BOOLEAN Show more detail when describing artifacts
** w=BOOLEAN Ignore whitespace
*/
|
︙ | | |
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
|
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
|
-
|
/*
** WEBPAGE: raw
** URL: /raw/ARTIFACTID
** URL: /raw?ci=BRANCH&filename=NAME
**
** Additional query parameters:
**
** m=MIMETYPE The mimetype is MIMETYPE
** at=FILENAME Content-disposition; attachment; filename=FILENAME;
**
** Return the uninterpreted content of an artifact. Used primarily
** to view artifacts that are images.
*/
void rawartifact_page(void){
|
︙ | | |
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
|
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
|
-
|
** WEBPAGE: hexdump
** URL: /hexdump?name=ARTIFACTID
**
** Show the complete content of a file identified by ARTIFACTID
** as preformatted text.
**
** Other parameters:
**
** verbose Show more detail when describing the object
*/
void hexdump_page(void){
int rid;
Blob content;
Blob downloadName;
char *zUuid;
|
︙ | | |
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
|
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
|
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
|
** Typical usage:
**
** /artifact/HASH
** /whatis/HASH
** /file/NAME
**
** Additional query parameters:
**
** ln - show line numbers
** ln=N - highlight line number N
** ln=M-N - highlight lines M through N inclusive
** ln=M-N+Y-Z - highlight lines M through N and Y through Z (inclusive)
** verbose - show more detail in the description
** download - redirect to the download (artifact page only)
** name=NAME - filename or hash as a query parameter
** filename=NAME - alternative spelling for "name="
** fn=NAME - alternative spelling for "name="
** ci=VERSION - The specific check-in to use with "name=" to
** identify the file.
** txt - Force display of unformatted source text
** ln show line numbers
** ln=N highlight line number N
** ln=M-N highlight lines M through N inclusive
** ln=M-N+Y-Z highlight lines M through N and Y through Z (inclusive)
** verbose show more detail in the description
** download redirect to the download (artifact page only)
** name=NAME filename or hash as a query parameter
** filename=NAME alternative spelling for "name="
** fn=NAME alternative spelling for "name="
** ci=VERSION The specific check-in to use with "name=" to
** identify the file.
** txt Force display of unformatted source text
**
** The /artifact page show the complete content of a file
** identified by HASH. The /whatis page shows only a description
** of how the artifact is used. The /file page shows the most recent
** version of the file or directory called NAME, or a list of the
** top-level directory if NAME is omitted.
**
|
︙ | | |
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
|
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
|
-
-
-
|
** WEBPAGE: ci_edit
**
** Edit a check-in. (Check-ins are immutable and do not really change.
** This page really creates supplemental tags that affect the display
** of the check-in.)
**
** Query parameters:
**
** rid=INTEGER Record ID of the check-in to edit (REQUIRED)
**
** POST parameters after pressing "Preview", "Cancel", or "Apply":
**
** c=TEXT New check-in comment
** u=TEXT New user name
** newclr Apply a background color
** clr=TEXT New background color (only if newclr)
** pclr Propagate new background color (only if newclr)
** dt=TEXT New check-in date/time (ISO8610 format)
** newtag Add a new tag to the check-in
** tagname=TEXT Name of the new tag to be added (only if newtag)
** newbr Put the check-in on a new branch
** brname=TEXT Name of the new branch (only if newbr)
** close Close this check-in
** hide Hide this check-in
** cNNN Cancel tag with tagid=NNN
**
** cancel Cancel the edit. Return to the check-in view
** preview Show a preview of the edited check-in comment
** apply Apply changes
*/
void ci_edit_page(void){
int rid;
const char *zComment; /* Current comment on the check-in */
|
︙ | | |
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
|
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
|
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
-
+
|
@ <p>Make changes to attributes of check-in
@ [%z(href("%R/ci/%!S",zUuid))%s(zUuid)</a>]:</p>
form_begin(0, "%R/ci_edit");
login_insert_csrf_secret();
@ <div><input type="hidden" name="r" value="%s(zUuid)" />
@ <table border="0" cellspacing="10">
@ <tr><th align="right" valign="top">User:</th>
@ <tr><th align="right" valign="top"><label for="u">User:</label></th>
@ <td valign="top">
@ <input type="text" name="u" size="20" value="%h(zNewUser)" />
@ <input type="text" id="u" name="u" size="20" value="%h(zNewUser)" />
@ </td></tr>
@ <tr><th align="right" valign="top">Comment:</th>
@ <tr><th align="right" valign="top"><label for="c">Comment:</label></th>
@ <td valign="top">
@ <textarea name="c" rows="10" cols="80">%h(zNewComment)</textarea>
@ <textarea id="c" name="c" rows="10" cols="80">%h(zNewComment)</textarea>
@ </td></tr>
@ <tr><th align="right" valign="top">Check-in Time:</th>
@ <tr><th align="right" valign="top"><label for="dt">Check-in Time:</label></th>
@ <td valign="top">
@ <input type="text" name="dt" size="20" value="%h(zNewDate)" />
@ <input type="text" id="dt" name="dt" size="20" value="%h(zNewDate)" />
@ </td></tr>
if( zChngTime ){
@ <tr><th align="right" valign="top">Timestamp of this change:</th>
@ <tr><th align="right" valign="top">
@ <label for="chngtime">Timestamp of this change:</label></th>
@ <td valign="top">
@ <input type="text" name="chngtime" size="20" value="%h(zChngTime)" />
@ <input type="text" id="chngtime" name="chngtime" size="20" value="%h(zChngTime)" />
@ </td></tr>
}
@ <tr><th align="right" valign="top">Background Color:</th>
@ <td valign="top">
@ <div><label><input type='checkbox' name='newclr'%s(zNewColorFlag) />
@ Change background color: \
|
︙ | | |
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
|
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
|
-
+
-
+
|
@ colors automatically so that it can take the skin's
@ preferences into account.</div>
@ </td></tr>
@ <tr><th align="right" valign="top">Tags:</th>
@ <td valign="top">
@ <label><input type="checkbox" id="newtag" name="newtag"%s(zNewTagFlag) />
@ Add the following new tag name to this check-in:</label>
@ Add the following</label> <label>new tag name to this check-in:
@ <input type="text" size='15' name="tagname" value="%h(zNewTag)" \
@ id='tagname' />
@ id='tagname' /></label>
zBranchName = db_text(0, "SELECT value FROM tagxref, tag"
" WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid"
" AND tagxref.tagid=%d", rid, TAG_BRANCH);
db_prepare(&q,
"SELECT tag.tagid, tagname, tagxref.value FROM tagxref, tag"
" WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid"
" ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)"
|
︙ | | |
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
|
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
|
-
+
-
+
|
if( !zNewBranch || !zNewBranch[0]){
zNewBranch = zBranchName;
}
@ <tr><th align="right" valign="top">Branching:</th>
@ <td valign="top">
@ <label><input id="newbr" type="checkbox" name="newbr" \
@ data-branch='%h(zBranchName)'%s(zNewBrFlag) />
@ Make this check-in the start of a new branch named:</label>
@ Make this check-in the start of a</label> <label>new branch named:
@ <input id="brname" type="text" style="width:15;" name="brname" \
@ value="%h(zNewBranch)" /></td></tr>
@ value="%h(zNewBranch)" /></label></td></tr>
if( !fHasHidden ){
@ <tr><th align="right" valign="top">Branch Hiding:</th>
@ <td valign="top">
@ <label><input type="checkbox" id="hidebr" name="hide"%s(zHideFlag) />
@ Hide branch
@ <span style="font-weight:bold" id="hbranch">%h(zBranchName)</span>
@ from the timeline starting from this check-in</label>
|
︙ | | |
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
|
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
|
-
|
** COMMAND: amend
**
** Usage: %fossil amend HASH OPTION ?OPTION ...?
**
** Amend the tags on check-in HASH to change how it displays in the timeline.
**
** Options:
**
** --author USER Make USER the author for check-in
** -m|--comment COMMENT Make COMMENT the check-in comment
** -M|--message-file FILE Read the amended comment from FILE
** -e|--edit-comment Launch editor to revise comment
** --date DATETIME Make DATETIME the check-in time
** --bgcolor COLOR Apply COLOR to this check-in
** --branchcolor COLOR Apply and propagate COLOR to the branch
|
︙ | | |
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
|
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
|
-
|
** If no VERSION is provided, describe the current checked-out version.
**
** If VERSION and the found ancestor refer to the same commit, the last two
** components are omitted, unless --long is provided. When no fitting tagged
** ancestor is found, show only the short hash of VERSION.
**
** Options:
**
** --digits Display so many hex digits of the hash
** (default: the larger of 6 and the 'hash-digit' setting)
** -d|--dirty Show whether there are changes to be committed
** --long Always show all three components
** --match GLOB Consider only non-propagating tags matching GLOB
*/
void describe_cmd(void){
|
︙ | | |
Changes to src/interwiki.c.
︙ | | |
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
|
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
-
-
-
-
-
-
|
/*
** COMMAND: interwiki*
**
** Usage: %fossil interwiki COMMAND ...
**
** Manage the "intermap" that defines the mapping from interwiki tags
** to complete URLs for interwiki links.
**
** > fossil interwiki delete TAG ...
**
** Delete one or more interwiki maps.
**
** > fossil interwiki edit TAG --base URL --hash PATH --wiki PATH
**
** Create an interwiki referenced call TAG. The base URL is
** the --base option, which is required. The --hash and --wiki
** paths are optional. The TAG must be lower-case alphanumeric
** and must be unique. A new entry is created if it does not
** already exit.
**
** > fossil interwiki list
**
** Show all interwiki mappings.
*/
void interwiki_cmd(void){
const char *zCmd;
int nCmd;
db_find_and_open_repository(0, 0);
if( g.argc<3 ){
|
︙ | | |
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
|
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
|
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
|
@ tag field but leave the "Base URL" field blank.</p>
if( zErr ){
@ <p class="error">%h(zErr)</p>
}
@ <form method="POST" action="%R/intermap">
login_insert_csrf_secret();
@ <table border="0">
@ <tr><td class="form_label" id="imtag">Tag:</td>
@ <td><input type="text" id="tag" aria-labeledby="imtag" name="tag" \
@ <tr><td class="form_label"><label for="tag">Tag:</label></td>
@ <td><input type="text" id="tag" name="tag" \
@ size="15" value="%h(zTag)"></td></tr>
@ <tr><td class="form_label" id="imbase">Base URL:</td>
@ <td><input type="text" id="base" aria-labeledby="imbase" name="base" \
@ <tr><td class="form_label"><label for="base">Base URL:</label></td>
@ <td><input type="text" id="base" name="base" \
@ size="70" value="%h(zBase)"></td></tr>
@ <tr><td class="form_label" id="imhash">Hash-path:</td>
@ <td><input type="text" id="hash" aria-labeledby="imhash" name="hash" \
@ <tr><td class="form_label"><label for="hash">Hash-path:</label></td>
@ <td><input type="text" id="hash" name="hash" \
@ size="20" value="%h(zHash)">
@ (use "<tt>/info/</tt>" when the target is Fossil)</td></tr>
@ <tr><td class="form_label" id="imwiki">Wiki-path:</td>
@ <td><input type="text" id="wiki" aria-labeledby="imwiki" name="wiki" \
@ <tr><td class="form_label"><label for="wiki">Wiki-path:</label></td>
@ <td><input type="text" id="wiki" name="wiki" \
@ size="20" value="%h(zWiki)">
@ (use "<tt>/wiki?name=</tt>" when the target is Fossil)</td></tr>
@ <tr><td></td>
@ <td><input type="submit" name="submit" value="Apply Changes"></td></tr>
@ </table>
@ </form>
style_finish_page();
}
|
Changes to src/login.c.
︙ | | |
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
|
532
533
534
535
536
537
538
539
540
541
542
543
544
545
|
-
|
** removed. Use this page as a placeholder in older installations.
**
** WEBPAGE: login
** WEBPAGE: logout
** WEBPAGE: my
**
** The login/logout page. Parameters:
**
** g=URL Jump back to this URL after login completes
** anon The g=URL is not accessible by "nobody" but is
** accessible by "anonymous"
*/
void login_page(void){
const char *zUsername, *zPasswd;
const char *zNew1, *zNew2;
|
︙ | | |
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
|
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
|
-
-
+
+
-
-
+
+
|
if( !g.sslNotAvailable ){
@ Consider logging in at
@ <a href='%s(g.zHttpsURL)'>%h(g.zHttpsURL)</a> instead.
}
@ </span></td></tr>
}
@ <tr>
@ <td class="form_label" id="userlabel1">User ID:</td>
@ <td><input type="text" id="u" aria-labelledby="userlabel1" name="u" \
@ <td class="form_label" id="userlabel1"><label for="u">User ID:</label></td>
@ <td><input type="text" id="u" id="u" name="u" \
@ size="30" value="%s(anonFlag?"anonymous":"")"></td>
@ </tr>
@ <tr>
@ <td class="form_label" id="pswdlabel">Password:</td>
@ <td><input aria-labelledby="pswdlabel" type="password" id="p" \
@ <td class="form_label" id="pswdlabel"><label for="p">Password:</label></td>
@ <td><input type="password" id="p" \
@ name="p" value="" size="30" />\
if( zAnonPw && !noAnon ){
captcha_speakit_button(uSeed, "Speak password for \"anonymous\"");
}
@ </td>
@ </tr>
@ <tr>
|
︙ | | |
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
|
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
|
-
-
+
+
-
-
+
+
-
-
+
+
+
|
}
if( g.perm.Password ){
char *zRPW = fossil_random_password(12);
@ <hr>
@ <p>Change Password for user <b>%h(g.zLogin)</b>:</p>
form_begin(0, "%R/login");
@ <table>
@ <tr><td class="form_label" id="oldpw">Old Password:</td>
@ <td><input aria-labelledby="oldpw" type="password" name="p" \
@ <tr><td class="form_label" id="oldpw"><label for="p">Old Password:</label></td>
@ <td><input type="password" id="p" name="p" \
@ size="30"/></td></tr>
@ <tr><td class="form_label" id="newpw">New Password:</td>
@ <td><input aria-labelledby="newpw" type="password" name="n1" \
@ <tr><td class="form_label" id="newpw"><label for="n1">New Password:</label></td>
@ <td><input type="password" id="n1" name="n1" \
@ size="30" /> Suggestion: %z(zRPW)</td></tr>
@ <tr><td class="form_label" id="reppw">Repeat New Password:</td>
@ <td><input aria-labledby="reppw" type="password" name="n2" \
@ <tr><td class="form_label" id="reppw">
@ <label for="n2">Repeat New Password:</label></td>
@ <td><input type="password" id="n2" name="n2" \
@ size="30" /></td></tr>
@ <tr><td></td>
@ <td><input type="submit" value="Change Password" /></td></tr>
@ </table>
@ </form>
}
}
|
︙ | | |
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
|
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
|
-
-
+
+
-
-
+
+
+
-
-
+
+
+
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
|
form_begin(0, "%R/register");
if( P("g") ){
@ <input type="hidden" name="g" value="%h(P("g"))" />
}
@ <p><input type="hidden" name="captchaseed" value="%u(uSeed)" />
@ <table class="login_out">
@ <tr>
@ <td class="form_label" align="right" id="uid">User ID:</td>
@ <td><input aria-labelledby="uid" type="text" name="u" \
@ <td class="form_label" align="right" id="uid"><label for="u">User ID:</label></td>
@ <td><input type="text" id="u" name="u" \
@ value="%h(zUserID)" size="30"></td>
@
if( iErrLine==1 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ <tr>
@ <td class="form_label" align="right" id="dpyname">Display Name:</td>
@ <td><input aria-labelledby="dpyname" type="text" name="dn" \
@ <td class="form_label" align="right" id="dpyname">
@ <label for="dn">Display Name:</label></td>
@ <td><input type="text" id="dn" name="dn" \
@ value="%h(zDName)" size="30"></td>
@ </tr>
if( iErrLine==2 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ </tr>
@ <tr>
@ <td class="form_label" align="right" id="emaddr">Email Address:</td>
@ <td><input aria-labelledby="emaddr" type="text" name="ea" \
@ <td class="form_label" align="right" id="emaddr">
@ <label for="ea">Email Address:</label></td>
@ <td><input type="text" id="ea" name="ea" \
@ value="%h(zEAddr)" size="30"></td>
@ </tr>
if( iErrLine==3 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
if( canDoAlerts ){
int a = atoi(PD("alerts","1"));
@ <tr>
@ <td class="form_label" align="right" id="emalrt">Email Alerts?</td>
@ <td><select aria-labelledby="emalrt" size='1' name='alerts'>
@ <td class="form_label" align="right" id="emalrt">
@ <label for="alerts">Email Alerts?</label></td>
@ <td><select size='1' id='alerts' name='alerts'>
@ <option value="1" %s(a?"selected":"")>Yes</option>
@ <option value="0" %s(!a?"selected":"")>No</option>
@ </select></td></tr>
}
@ <tr>
@ <td class="form_label" align="right" id="pswd">Password:</td>
@ <td><input aria-labelledby="pswd" type="password" name="p" \
@ <td class="form_label" align="right" id="pswd"><label for="p">Password:</label></td>
@ <td><input type="password" id="p" name="p" \
@ value="%h(zPasswd)" size="30"> \
if( zPasswd[0]==0 ){
char *zRPW = fossil_random_password(12);
@ Password suggestion: %z(zRPW)</td>
}else{
@ </td>
}
@ <tr>
if( iErrLine==4 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ <tr>
@ <td class="form_label" align="right" id="pwcfrm">Confirm:</td>
@ <td><input aria-labelledby="pwcfrm" type="password" name="cp" \
@ <td class="form_label" align="right" id="pwcfrm"><label for="cp">Confirm:</label></td>
@ <td><input type="password" id="cp" name="cp" \
@ value="%h(zConfirm)" size="30"></td>
@ </tr>
if( iErrLine==5 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
@ <tr>
@ <td class="form_label" align="right" id="cptcha">Captcha:</td>
@ <td><input type="text" name="captcha" aria-labelledby="cptcha" \
@ <td class="form_label" align="right" id="cptcha"><label for="captcha">Captcha:</label></td>
@ <td><input type="text" id="captcha" name="captcha" \
@ value="%h(captchaIsCorrect?zDecoded:"")" size="30">
captcha_speakit_button(uSeed, "Speak the captcha text");
@ </td>
@ </tr>
if( iErrLine==6 ){
@ <tr><td><td><span class='loginError'>↑ %h(zErr)</span></td></tr>
}
|
︙ | | |
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
|
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
|
-
-
-
-
-
-
-
|
/*
** COMMAND: login-group*
**
** Usage: %fossil login-group ?SUBCOMMAND? ?OPTIONS?
**
** Run various subcommands to manage login-group related settings of the open
** repository or of the repository identified by the -R or --repository option.
**
** > fossil login-group ?-R REPO?
**
** Show the login-group to which REPO, or if invoked from within a checkout
** the repository on which the current checkout is based, belongs.
**
** > fossil login-group join ?-R? REPO ?--name NAME?
**
** This subcommand must be invoked from within a checkout to either: add
** the open repository to the login group that REPO is a member, in which
** case the optional "--name" argument is not required; or create a new
** login group between the open repository and REPO, in which case the new
** group NAME is determined by the mandatory "--name" option. REPO may be
** specified with or without the -R flag.
**
** > fossil login-group leave ?-R REPO?
**
** Take the repository REPO, or if invoked from within a checkout the
** repository on which the current checkout is based, out of whatever
** login group it is a member.
**
** About Login Groups:
**
** A login-group is a set of repositories that share user credentials.
** If a user is logged into one member of the group, then that user can
** access any other group member as long as they have an entry in the USER
** table of that member. If a user changes their password using web
** interface, their password is also automatically changed in every other
|
︙ | | |
Changes to src/main.c.
︙ | | |
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
|
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
|
-
|
/*
** WEBPAGE: version
**
** Show the version information for Fossil.
**
** Query parameters:
**
** verbose Show details
*/
void test_version_page(void){
Blob versionInfo;
int verboseFlag;
login_check_credentials();
|
︙ | | |
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
|
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
**
** The command name, "cgi", may be omitted if the GATEWAY_INTERFACE
** environment variable is set to "CGI", which should always be the
** case for CGI scripts run by a webserver. Fossil ignores any lines
** that begin with "#".
**
** The following control lines are recognized:
**
** repository: PATH Name of the Fossil repository
**
** directory: PATH Name of a directory containing many Fossil
** repositories whose names all end with ".fossil".
** There should only be one of "repository:"
** or "directory:"
**
** notfound: URL When in "directory:" mode, redirect to
** URL if no suitable repository is found.
**
** repolist When in "directory:" mode, display a page
** showing a list of available repositories if
** the URL is "/".
**
** localauth Grant administrator privileges to connections
** from 127.0.0.1 or ::1.
**
** skin: LABEL Use the built-in skin called LABEL rather than
** the default. If there are no skins called LABEL
** then this line is a no-op.
**
** files: GLOBLIST GLOBLIST is a comma-separated list of GLOB
** patterns that specify files that can be
** returned verbatim. This feature allows Fossil
** to act as a web server returning static
** content.
**
** setenv: NAME VALUE Set environment variable NAME to VALUE. Or
** if VALUE is omitted, unset NAME.
**
** HOME: PATH Shorthand for "setenv: HOME PATH"
**
** cgi-debug: FILE Causing debugging information to be written
** into FILE.
**
** errorlog: FILE Warnings, errors, and panics written to FILE.
**
** timeout: SECONDS Do not run for longer than SECONDS. The default
** timeout is FOSSIL_DEFAULT_TIMEOUT (600) seconds.
**
** extroot: DIR Directory that is the root of the sub-CGI tree
** on the /ext page.
**
** redirect: REPO URL Extract the "name" query parameter and search
** REPO for a check-in or ticket that matches the
** value of "name", then redirect to URL. There
** can be multiple "redirect:" lines that are
** processed in order. If the REPO is "*", then
** an unconditional redirect to URL is taken.
**
** jsmode: VALUE Specifies the delivery mode for JavaScript
** files. See the help text for the --jsmode
** flag of the http command.
**
** mainmenu: FILE Override the mainmenu config setting with the
** contents of the given file.
**
** Most CGI files contain only a "repository:" line. It is uncommon to
** use any other option.
**
** The lines are processed in the order they are read, which is most
|
︙ | | |
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
|
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
|
-
|
/*
** WEBPAGE: test-pid
**
** Return the process identifier of the running Fossil server instance.
**
** Query parameters:
**
** usepidkey When present and available, also return the
** address and size, within this server process,
** of the saved database encryption key. This
** is only supported when using SEE on Windows.
*/
void test_pid_page(void){
login_check_credentials();
|
︙ | | |
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
|
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
|
-
|
}
/*
** WEBPAGE: test-warning
**
** Test error and warning log operation. This webpage is accessible to
** the administrator only.
**
** case=1 Issue a fossil_warning() while generating the page.
** case=2 Extra db_begin_transaction()
** case=3 Extra db_end_transaction()
** case=4 Error during SQL processing
** case=5 Call the segfault handler
** case=6 Call webpage_assert()
** case=7 Call webpage_error()
|
︙ | | |
Changes to src/manifest.c.
︙ | | |
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
|
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
|
-
|
**
** Parse all entries in the BLOB table that are believed to be non-data
** artifacts and report any errors. Run this test command on historical
** repositories after making any changes to the manifest_parse()
** implementation to confirm that the changes did not break anything.
**
** Options:
**
** --limit N Parse no more than N artifacts before stopping
** --wellformed Use all BLOB table entries as input, not just
** those entries that are believed to be valid
** artifacts, and verify that the result the
** manifest_is_well_formed() agrees with the
** result of manifest_parse().
*/
|
︙ | | |
Changes to src/merge.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
|
** a recent fork on the current branch to merge.
**
** Only file content is merged. The result continues to use the
** file and directory names from the current checkout even if those
** names might have been changed in the branch being merged in.
**
** Options:
**
** --backout Do a reverse cherrypick merge against VERSION.
** In other words, back out the changes that were
** added by VERSION.
**
** --baseline BASELINE Use BASELINE as the "pivot" of the merge instead
** of the nearest common ancestor. This allows
** a sequence of changes in a branch to be merged
** without having to merge the entire branch.
**
** --binary GLOBPATTERN Treat files that match GLOBPATTERN as binary
** and do not try to merge parallel changes. This
** option overrides the "binary-glob" setting.
**
** --cherrypick Do a cherrypick merge VERSION into the current
** checkout. A cherrypick merge pulls in the changes
** of the single check-in VERSION, rather than all
** changes back to the nearest common ancestor.
**
** -f|--force Force the merge even if it would be a no-op.
**
** --force-missing Force the merge even if there is missing content.
**
** --integrate Merged branch will be closed when committing.
**
** -K|--keep-merge-files On merge conflict, retain the temporary files
** used for merging, named *-baseline, *-original,
** and *-merge.
**
** -n|--dry-run If given, display instead of run actions
**
** -v|--verbose Show additional details of the merge
*/
void merge_cmd(void){
int vid; /* Current version "V" */
int mid; /* Version we are merging from "M" */
int pid = 0; /* The pivot version - most recent common ancestor P */
int nid = 0; /* The name pivot version "N" */
|
︙ | | |
Changes to src/name.c.
︙ | | |
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
|
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
|
-
|
** Usage: %fossil whatis NAME
**
** Resolve the symbol NAME into its canonical artifact hash
** artifact name and provide a description of what role that artifact
** plays.
**
** Options:
**
** --type TYPE Only find artifacts of TYPE (one of: 'ci', 't',
** 'w', 'g', or 'e')
** -v|--verbose Provide extra information (such as the RID)
*/
void whatis_cmd(void){
int rid;
const char *zName;
|
︙ | | |
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
|
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
|
-
+
+
|
zRange = mprintf("BETWEEN %d AND %d", iFrom, iFrom+iCnt-1);
describe_artifacts_to_stdout(zRange, 0);
}
/*
** WEBPAGE: bloblist
**
** Return a page showing all artifacts in the repository. Query parameters:
** Return a page showing all artifacts in the repository.
**
** Query parameters:
** n=N Show N artifacts
** s=S Start with artifact number S
** priv Show only unpublished or private artifacts
** phan Show only phantom artifacts
** hclr Color code hash types (SHA1 vs SHA3)
*/
void bloblist_page(void){
|
︙ | | |
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
|
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
|
-
|
}
/*
** WEBPAGE: bigbloblist
**
** Return a page showing the largest artifacts in the repository in order
** of decreasing size.
**
** n=N Show the top N artifacts
*/
void bigbloblist_page(void){
Stmt q;
int n = atoi(PD("n","250"));
login_check_credentials();
|
︙ | | |
Changes to src/patch.c.
︙ | | |
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
|
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
|
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
|
**
** Usage: %fossil patch SUBCOMMAND ?ARGS ..?
**
** This command is used to create, view, and apply Fossil binary patches.
** A Fossil binary patch is a single (binary) file that captures all of the
** uncommitted changes of a check-out. Use Fossil binary patches to transfer
** proposed or incomplete changes between machines for testing or analysis.
**
** > fossil patch create [DIRECTORY] FILENAME
**
** Create a new binary patch in FILENAME that captures all uncommitted
** changes in the check-out at DIRECTORY, or the current directory if
** DIRECTORY is omitted. If FILENAME is "-" then the binary patch
** is written to standard output.
**
** -f|--force Overwrite an existing patch with the same name.
**
** > fossil patch apply [DIRECTORY] FILENAME
**
** Apply the changes in FILENAME to the check-out at DIRECTORY, or
** in the current directory if DIRECTORY is omitted. Options:
** in the current directory if DIRECTORY is omitted.
**
** Options:
** -f|--force Apply the patch even though there are unsaved
** changes in the current check-out. Unsaved changes
** are reverted and permanently lost.
** -n|--dry-run Do nothing, but print what would have happened.
** -v|--verbose Extra output explaining what happens.
**
** > fossil patch diff [DIRECTORY] FILENAME
**
** Show a human-readable diff for the patch. All the usual
** diff flags described at "fossil help diff" apply. In addition:
**
** -f|--force Continue trying to perform the diff even if
** baseline information is missing from the current
** repository
**
** > fossil patch push REMOTE-CHECKOUT
**
** Create a patch for the current check-out, transfer that patch to
** a remote machine (using ssh) and apply the patch there. The
** REMOTE-CHECKOUT is in one of the following formats:
**
** * DIRECTORY
** * HOST:DIRECTORY
** * USER@HOST:DIRECTORY
**
** Command-line options:
**
** -f|--force Apply the patch even though there are unsaved
** changes in the current check-out. Unsaved
** changes will be reverted and then the patch is
** applied.
** --fossilcmd EXE Name of the "fossil" executable on the remote
** -n|--dry-run Do nothing, but print what would have happened.
** -v|--verbose Extra output explaining what happens.
**
**
** > fossil patch pull REMOTE-CHECKOUT
**
** Like "fossil patch push" except that the transfer is from remote
** to local. All the same command-line options apply.
**
** > fossil patch view FILENAME
**
** View a summary of the changes in the binary patch FILENAME.
** Use "fossil patch diff" for detailed patch content.
**
** -v|--verbose Show extra detail about the patch.
**
*/
void patch_cmd(void){
const char *zCmd;
size_t n;
if( g.argc<3 ){
|
︙ | | |
Changes to src/piechart.c.
︙ | | |
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
|
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
|
-
-
-
-
+
+
+
+
|
if( n>1 ){
@ <svg width=%d(width) height=%d(height) style="border:1px solid #d3d3d3;">
piechart_render(width,height, PIE_OTHER|PIE_PERCENT);
@ </svg>
@ <hr />
}
@ <form method="POST" action='%R/test-piechart'>
@ <p>Comma-separated list of slice widths:<br />
@ <input type='text' name='data' size='80' value='%h(zData)'/><br />
@ Width: <input type='text' size='8' name='width' value='%d(width)'/>
@ Height: <input type='text' size='8' name='height' value='%d(height)'/><br />
@ <p><label>Comma-separated list of slice widths:<br />
@ <input type='text' name='data' size='80' value='%h(zData)'/></label><br />
@ <label>Width: <input type='text' size='8' name='width' value='%d(width)'/></label>
@ <label>Height: <input type='text' size='8' name='height' value='%d(height)'/></label><br />
@ <input type='submit' value='Draw The Pie Chart'/>
@ </form>
@ <p>Interesting test cases:
@ <ul>
@ <li> <a href='test-piechart?data=44,2,2,2,2,2,3,2,2,2,2,2,44'>Case 1</a>
@ <li> <a href='test-piechart?data=2,2,2,2,2,44,44,2,2,2,2,2'>Case 2</a>
@ <li> <a href='test-piechart?data=20,2,2,2,2,2,2,2,2,2,2,80'>Case 3</a>
|
︙ | | |
Changes to src/pikchrshow.c.
︙ | | |
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
-
+
|
"box rad 10px \"Markdown\" \"Formatter\" \"(markdown.c)\" fit\n"
"arrow right 200% \"HTML+SVG\" \"Output\"\n"
"arrow <-> down from last box.s\n"
"box same \"Pikchr\" \"Formatter\" \"(pikchr.c)\" fit\n";
}
style_header("PikchrShow Client/Server");
CX("<style>"); {
CX("div.content { padding-top: 0.5em }\n");
CX("main.content { padding-top: 0.5em }\n");
CX("#sbs-wrapper {"
"display: flex; flex-direction: column;"
"}\n");
CX("#sbs-wrapper > * {"
"margin: 0 0.25em 0.5em 0; flex: 1 10 auto;"
"align-self: stretch;"
"}\n");
|
︙ | | |
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
-
-
+
+
|
"margin-right: 0.5em; vertical-align: middle;"
"}\n");
CX("body.pikchrshow .v-align-middle{"
"vertical-align: middle"
"}\n");
CX(".dragover {border: 3px dotted rgba(0,255,0,0.6)}\n");
} CX("</style>");
CX("<div>Input pikchr code and tap Preview (or Shift-Enter) to render "
"it. <a href='?wasm'>Switch to WASM mode</a>.</div>");
CX("<div><label for='content'>Input pikchr code</label> and tap Preview (or "
"Shift-Enter) to render it. <a href='?wasm'>Switch to WASM mode</a>.</div>");
CX("<div id='sbs-wrapper'>"); {
CX("<div id='pikchrshow-form'>"); {
CX("<textarea id='content' name='content' rows='15'>"
"%s</textarea>",zContent/*safe-for-%s*/);
CX("<div id='pikchrshow-controls'>"); {
CX("<button id='pikchr-submit-preview'>Preview</button>");
CX("<div class='input-with-label'>"); {
|
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
**
** Accepts a pikchr script as input and outputs the rendered script as
** an SVG graphic. The INFILE and OUTFILE options default to stdin
** resp. stdout, and the names "-" can be used as aliases for those
** streams.
**
** Options:
**
** -div On success, add a DIV wrapper around the
** resulting SVG output which limits its max-width to
** its computed maximum ideal size.
**
** -div-indent Like -div but indent the div.
**
** -div-center Like -div but center the div.
**
** -div-left Like -div but float the div left.
**
** -div-right Like -div but float the div right.
**
** -div-toggle Set the 'toggle' CSS class on the div (used by the
** JavaScript-side post-processor).
**
** -div-source Set the 'source' CSS class on the div, which tells
** CSS to hide the SVG and reveal the source by default.
**
** -src Store the input pikchr's source code in the output as
** a separate element adjacent to the SVG one. Implied
** by -div-source.
**
**
** -th Process the input using TH1 before passing it to pikchr.
**
** -th-novar Disable $var and $<var> TH1 processing. Use this if the
** pikchr script uses '$' for its own purposes and that
** causes issues. This only affects parsing of '$' outside
** of TH1 script blocks. Code in such blocks is unaffected.
**
** -th-nosvg When using -th, output the post-TH1'd script
** instead of the pikchr-rendered output.
**
** -th-trace Trace TH1 execution (for debugging purposes).
**
**
** The -div-indent/center/left/right flags may not be combined.
**
** TH1-related Notes and Caveats:
**
** If the -th flag is used, this command must open a fossil database
** for certain functionality to work (via a checkout or the -R REPO
|
︙ | | |
Changes to src/purge.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
**
** WARNING: This command can potentially destroy historical data and
** leave your repository in a goofy state. Know what you are doing!
** Make a backup of your repository before using this command!
**
** FURTHER WARNING: This command is a work-in-progress and may yet
** contain bugs.
**
** > fossil purge artifacts HASH... ?OPTIONS?
**
** Move arbitrary artifacts identified by the HASH list into the
** graveyard.
**
** > fossil purge cat HASH...
**
** Write the content of one or more artifacts in the graveyard onto
** standard output.
**
** > fossil purge checkins TAGS... ?OPTIONS?
**
** Move the check-ins or branches identified by TAGS and all of
** their descendants out of the repository and into the graveyard.
** If TAGS includes a branch name then it means all the check-ins
** on the most recent occurrence of that branch.
**
** > fossil purge files NAME ... ?OPTIONS?
**
** Move all instances of files called NAME into the graveyard.
** NAME should be the name of the file relative to the root of the
** repository. If NAME is a directory, then all files within that
** directory are moved.
**
** > fossil purge list|ls ?-l?
**
** Show the graveyard of prior purges. The -l option gives more
** detail in the output.
**
** > fossil purge obliterate ID... ?--force?
**
** Remove one or more purge events from the graveyard. Once a purge
** event is obliterated, it can no longer be undone. The --force
** option suppresses the confirmation prompt.
**
** > fossil purge tickets NAME ... ?OPTIONS?
**
** TBD...
**
** > fossil purge undo ID
**
** Restore the content previously removed by purge ID.
**
** > fossil purge wiki NAME ... ?OPTIONS?
**
** TBD...
**
** COMMON OPTIONS:
**
** --explain Make no changes, but show what would happen
** --dry-run An alias for --explain
*/
void purge_cmd(void){
int purgeFlags = PURGE_MOVETO_GRAVEYARD | PURGE_PRINT_SUMMARY;
const char *zSubcmd;
int n;
|
︙ | | |
Changes to src/regexp.c.
︙ | | |
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
|
807
808
809
810
811
812
813
814
815
816
817
818
819
820
|
-
|
**
** Usage: %fossil test-grep REGEXP [FILE...]
**
** Run a regular expression match over the named disk files, or against
** standard input if no disk files are named on the command-line.
**
** Options:
**
** -i|--ignore-case Ignore case
*/
void re_test_grep(void){
ReCompiled *pRe;
const char *zErr;
int ignoreCase = find_option("ignore-case","i",0)!=0;
if( g.argc<3 ){
|
︙ | | |
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
|
850
851
852
853
854
855
856
857
858
859
860
861
862
863
|
-
|
** be specified, in which case all named files are searched in reverse
** chronological order.
**
** For details of the supported regular expression dialect, see
** https://fossil-scm.org/fossil/doc/trunk/www/grep.md
**
** Options:
**
** -c|--count Suppress normal output; instead print a count
** of the number of matching files
** -i|--ignore-case Ignore case
** -l|--files-with-matches List only hash for each match
** --once Stop searching after the first match
** -s|--no-messages Suppress error messages about nonexistent
** or unreadable files
|
︙ | | |
Changes to src/report.c.
︙ | | |
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
|
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
|
-
+
|
}
/*
** WEBPAGE: rptnew
** WEBPAGE: rptedit
**
** Create (/rptnew) or edit (/rptedit) a ticket report format.
** Query parameters:
**
** Query parameters:
** rn=N Ticket report number. (required)
** t=TITLE Title of the report format
** w=USER Owner of the report format
** s=SQL SQL text used to implement the report
** k=KEY Color key
*/
void view_edit(void){
|
︙ | | |
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
|
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
|
-
-
-
-
+
+
+
+
+
-
-
+
+
+
-
+
-
+
|
}
style_header("%s", rn>0 ? "Edit Report Format":"Create New Report Format");
if( zErr ){
@ <blockquote class="reportError">%h(zErr)</blockquote>
}
@ <form action="rptedit" method="post"><div>
@ <input type="hidden" name="rn" value="%d(rn)" />
@ <p>Report Title:<br />
@ <input type="text" name="t" value="%h(zTitle)" size="60" /></p>
@ <p>Enter a complete SQL query statement against the "TICKET" table:<br />
@ <textarea name="s" rows="20" cols="80">%h(zSQL)</textarea>
@ <p><label for="t">Report Title:</label><br />
@ <input type="text" id="t" name="t" value="%h(zTitle)" size="60" /></p>
@ <p><label for="s">
@ Enter a complete SQL query statement against the "TICKET" table:</label><br />
@ <textarea id="s" name="s" rows="20" cols="80">%h(zSQL)</textarea>
@ </p>
login_insert_csrf_secret();
if( g.perm.Admin ){
@ <p>Report owner:
@ <input type="text" name="w" size="20" value="%h(zOwner)" />
@ <p><label for="w">Report owner:</label>
@ <input type="text" id="w" name="w" size="20" value="%h(zOwner)" />
@ </p>
} else {
@ <input type="hidden" name="w" value="%h(zOwner)" />
}
@ <p><label for="k">
@ <p>Enter an optional color key in the following box. (If blank, no
@ Enter an optional color key in the following box.</label> (If blank, no
@ color key is displayed.) Each line contains the text for a single
@ entry in the key. The first token of each line is the background
@ color for that line.<br />
@ <textarea name="k" rows="8" cols="50">%h(zClrKey)</textarea>
@ <textarea id="k" name="k" rows="8" cols="50">%h(zClrKey)</textarea>
@ </p>
@ <p><label><input type="checkbox" name="dflt" %s(dflt?"checked":"")> \
@ Make this the default report</label></p>
if( !g.perm.Admin && fossil_strcmp(zOwner,g.zLogin)!=0 ){
@ <p>This report format is owned by %h(zOwner). You are not allowed
@ to change it.</p>
@ </form>
|
︙ | | |
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
|
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
|
-
+
|
static void report_format_hints(void){
char *zSchema;
zSchema = db_text(0,"SELECT sql FROM sqlite_schema WHERE name='ticket'");
if( zSchema==0 ){
zSchema = db_text(0,"SELECT sql FROM repository.sqlite_schema"
" WHERE name='ticket'");
}
@ <hr /><h3>TICKET Schema</h3>
@ <hr /><h2>TICKET Schema</h2>
@ <blockquote><pre>
@ <code class="language-sql">%h(zSchema)</code>
@ </pre></blockquote>
@ <h3>Notes</h3>
@ <ul>
@ <li><p>The SQL must consist of a single SELECT statement</p></li>
@
|
︙ | | |
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
|
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
|
-
+
-
+
|
@ <thead><tr>
zTid = 0;
for(i=0; i<nArg; i++){
const char *zName = azName[i];
if( i==pState->iBg ) continue;
if( pState->iNewRow>=0 && i>=pState->iNewRow ){
if( g.perm.Write && zTid ){
@ <th> </th>
@ <td> </td>
zTid = 0;
}
if( zName[0]=='_' ) zName++;
@ </tr><tr><th colspan=%d(pState->nCol)>%h(zName)</th>
}else{
if( zName[0]=='#' ){
zTid = zName;
}
@ <th>%h(zName)</th>
}
}
if( g.perm.Write && zTid ){
@ <th> </th>
@ <td> </td>
}
@ </tr></thead><tbody>
}
if( azArg==0 ){
@ <tr><td colspan="%d(pState->nCol)">
@ <i>No records match the report criteria</i>
@ </td></tr>
|
︙ | | |
Changes to src/rss.c.
︙ | | |
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
|
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
|
-
+
+
-
-
-
-
-
-
|
/*
** COMMAND: rss*
**
** Usage: %fossil rss ?OPTIONS?
**
** The CLI variant of the /timeline.rss page, this produces an RSS
** feed of the timeline to stdout. Options:
** feed of the timeline to stdout.
**
** Options:
** -type|y FLAG May be: all (default), ci (show check-ins only),
** t (show tickets only), w (show wiki only).
**
** -limit|n LIMIT The maximum number of items to show.
**
** -tkt HASH Filter for only those events for the specified ticket.
**
** -tag TAG Filter for a tag
**
** -wiki NAME Filter on a specific wiki page.
**
** Only one of -tkt, -tag, or -wiki may be used.
**
** -name FILENAME Filter for a specific file. This may be combined
** with one of the other filters (useful for looking
** at a specific branch).
**
** -url STRING Set the RSS feed's root URL to the given string.
** The default is "URL-PLACEHOLDER" (without quotes).
*/
void cmd_timeline_rss(void){
Stmt q;
int nLine=0;
char *zPubDate, *zProjectName, *zProjectDescr, *zFreeProjectName=0;
|
︙ | | |
Changes to src/search.c.
︙ | | |
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
|
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
-
|
**
** Usage: %fossil test-match SEARCHSTRING FILE1 FILE2 ...
**
** Run the full-scan search algorithm using SEARCHSTRING against
** the text of the files listed. Output matches and snippets.
**
** Options:
**
** --begin TEXT Text to insert before each match
** --end TEXT Text to insert after each match
** --gap TEXT Text to indicate elided content
** --html Input is HTML
** --static Use the static Search object
*/
void test_match_cmd(void){
|
︙ | | |
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
|
580
581
582
583
584
585
586
587
588
589
590
591
592
593
|
-
|
** Outputs, by default, some top-N fraction of the results. The -all
** option can be used to output all matches, regardless of their search
** score. The -limit option can be used to limit the number of entries
** returned. The -width option can be used to set the output width used
** when printing matches.
**
** Options:
**
** -a|--all Output all matches, not just best matches.
** -n|--limit N Limit output to N matches.
** -W|--width WIDTH Set display width to WIDTH columns, 0 for
** unlimited. Defaults the terminal's width.
*/
void search_cmd(void){
Blob pattern;
|
︙ | | |
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
|
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
|
+
-
+
-
+
-
+
|
}
@ <form method='GET' action='%R/%T(g.zPath)'>
if( zClass ){
@ <div class='searchForm searchForm%s(zClass)'>
}else{
@ <div class='searchForm'>
}
@ <label>Search for:
@ <input type="text" name="s" size="40" value="%h(zPattern)"%s(zDisable1)>
@ <input type="text" name="s" size="40" value="%h(zPattern)"%s(zDisable1)></label>
if( (mFlags & 0x01)!=0 && (srchFlags & (srchFlags-1))!=0 ){
static const struct { const char *z; const char *zNm; unsigned m; } aY[] = {
{ "all", "All", SRCH_ALL },
{ "c", "Check-ins", SRCH_CKIN },
{ "d", "Docs", SRCH_DOC },
{ "t", "Tickets", SRCH_TKT },
{ "w", "Wiki", SRCH_WIKI },
{ "e", "Tech Notes", SRCH_TECHNOTE },
{ "f", "Forum", SRCH_FORUM },
};
const char *zY = PD("y","all");
unsigned newFlags = srchFlags;
int i;
@ <select size='1' name='y'>
@ <label> Elements: <select size='1' name='y'>
for(i=0; i<count(aY); i++){
if( (aY[i].m & srchFlags)==0 ) continue;
cgi_printf("<option value='%s'", aY[i].z);
if( fossil_strcmp(zY,aY[i].z)==0 ){
newFlags &= aY[i].m;
cgi_printf(" selected");
}
cgi_printf(">%s</option>\n", aY[i].zNm);
}
@ </select>
@ </select></label>
srchFlags = newFlags;
}
if( fDebug ){
@ <input type="hidden" name="debug" value="1">
}
@ <input type="submit" value="Search%s(zType)"%s(zDisable2)>
if( srchFlags==0 ){
|
︙ | | |
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
|
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
|
-
|
}
/*
** WEBPAGE: search
**
** Search for check-in comments, documents, tickets, or wiki that
** match a user-supplied pattern.
**
** s=PATTERN Specify the full-text pattern to search for
** y=TYPE What to search.
** c -> check-ins
** d -> documentation
** t -> tickets
** w -> wiki
** e -> tech notes
|
︙ | | |
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
|
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
|
-
+
+
-
-
-
-
|
/*
** COMMAND: fts-config*
**
** Usage: fossil fts-config ?SUBCOMMAND? ?ARGUMENT?
**
** The "fossil fts-config" command configures the full-text search capabilities
** of the repository. Subcommands:
** of the repository.
**
** Subcommands:
** reindex Rebuild the search index. This is a no-op if
** index search is disabled
**
** index (on|off) Turn the search index on or off
**
** enable cdtwe Enable various kinds of search. c=Check-ins,
** d=Documents, t=Tickets, w=Wiki, e=Tech Notes.
**
** disable cdtwe Disable various kinds of search
**
** stemmer (on|off) Turn the Porter stemmer on or off for indexed
** search. (Unindexed search is never stemmed.)
**
** The current search settings are displayed after any changes are applied.
** Run this command with no arguments to simply see the settings.
*/
void fts_config_cmd(void){
|
︙ | | |
Changes to src/setup.c.
︙ | | |
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
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
|
+
+
+
-
-
+
+
+
+
+
+
+
-
+
+
|
db_protect_pop();
setup_incr_cfgcnt();
admin_log("Set option [%q] to [%q].",
zVar, iQ ? "on" : "off");
iVal = iQ;
}
}
if( zLabel[0] ) {
@ <label>
}
@ <label><input type="checkbox" name="%s(zQParm)" \
@ aria-label="%h(zLabel[0]?zLabel:zQParm)" \
@ <input type="checkbox" name="%s(zQParm)" \
if( !zLabel[0] ) {
@ aria-label="%h(zLabel[0]?zLabel:zQParm)" \
}
@ title="%h(zLabel[0]?zLabel:zQParm)" \
if( iVal ){
@ checked="checked" \
}
if( disabled ){
@ disabled="disabled" \
}
@ />
if( zLabel[0] ) {
@ /> <b>%s(zLabel)</b></label>
@ <b>%s(zLabel)</b></label>
}
}
/*
** Generate an entry box for an attribute.
*/
void entry_attribute(
const char *zLabel, /* The text label on the entry box */
|
︙ | | |
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
|
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
|
+
+
+
+
+
-
+
+
+
+
+
-
+
+
|
db_protect_only(PROTECT_NONE);
db_set(zVar/*works-like:"x"*/, zQ, 0);
db_protect_pop();
admin_log("Set entry_attribute %Q to: %.*s%s",
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
zVal = zQ;
}
if( zLabel[0] ) {
@ <label>
}
@ <input
if( !zLabel[0] ) {
@ <input aria-label="%h(zLabel[0]?zLabel:zQParm)" type="text" \
@ aria-label="%h(zLabel[0]?zLabel:zQParm)"
}
@ title="%h(zLabel[0]?zLabel:zQParm)" type="text" \
@ id="%s(zQParm)" name="%s(zQParm)" value="%h(zVal)" size="%d(width)" \
if( disabled ){
@ disabled="disabled" \
}
@ />
if( zLabel[0] ) {
@ /> <b>%s(zLabel)</b>
@ <b>%s(zLabel)</b></label>
}
}
/*
** Generate a text box for an attribute.
*/
const char *textarea_attribute(
const char *zLabel, /* The text label on the textarea */
|
︙ | | |
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
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
|
+
+
+
+
-
+
+
+
-
+
|
db_protect_pop();
setup_incr_cfgcnt();
admin_log("Set textarea_attribute %Q to: %.*s%s",
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
z = zQ;
}
if( rows>0 && cols>0 ){
if( *zLabel ){
@ <label>
}
@ <textarea id="id%s(zQP)" name="%s(zQP)" rows="%d(rows)" \
if( !*zLabel ){
@ aria-label="%h(zLabel[0]?zLabel:zQP)" \
@ aria-label="%h(zLabel[0]?zLabel:zQP)" \
}
@ title="%h(zLabel[0]?zLabel:zQP)" \
if( disabled ){
@ disabled="disabled" \
}
@ cols="%d(cols)">%h(z)</textarea>
if( *zLabel ){
@ <span class="textareaLabel">%s(zLabel)</span>
@ <span class="textareaLabel">%s(zLabel)</span></label>
}
}
return z;
}
/*
** Generate a text box for an attribute.
|
︙ | | |
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
|
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
-
+
-
+
|
db_set(zVar/*works-like:"x"*/, zQ, 0);
setup_incr_cfgcnt();
db_protect_pop();
admin_log("Set multiple_choice_attribute %Q to: %.*s%s",
zVar, 20, zQ, (nZQ>20 ? "..." : ""));
z = zQ;
}
@ <select aria-label="%h(zLabel)" size="1" name="%s(zQP)" id="id%s(zQP)">
@ <label><select title="%h(zLabel)" size="1" name="%s(zQP)" id="id%s(zQP)">
for(i=0; i<nChoice*2; i+=2){
const char *zSel = fossil_strcmp(azChoice[i],z)==0 ? " selected" : "";
@ <option value="%h(azChoice[i])"%s(zSel)>%h(azChoice[i+1])</option>
}
@ </select> <b>%h(zLabel)</b>
@ </select> <b>%h(zLabel)</b></label>
}
/*
** Insert code into the current page that allows the user to configure
** auto-hyperlink related robot defense settings.
*/
static void addAutoHyperlinkSettings(void){
|
︙ | | |
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
|
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
|
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
|
@ is not currently part of any login-group.
@ To join a login group, fill out the form below.</p>
@
@ <form action="%R/setup_login_group" method="post"><div>
login_insert_csrf_secret();
@ <blockquote><table border="0">
@
@ <tr><th align="right" id="rfigtj">Repository filename \
@ in group to join:</th>
@ <tr><th align="right" id="rfigtj"><label for="repo">Repository filename \
@ in group to join:</label></th>
@ <td width="5"></td><td>
@ <input aria-labelledby="rfigtj" type="text" size="50" \
@ value="%h(zRepo)" name="repo"></td></tr>
@ <input type="text" size="50" \
@ value="%h(zRepo)" id="repo" name="repo"></td></tr>
@
@ <tr><th align="right" id="lotar">Login on the above repo:</th>
@ <tr><th align="right" id="lotar"><label for="login">Login on the above repo:</label></th>
@ <td width="5"></td><td>
@ <input aria-labelledby="lotar" type="text" size="20" \
@ value="%h(zLogin)" name="login"></td></tr>
@ <input type="text" size="20" \
@ value="%h(zLogin)" id="login" name="login"></td></tr>
@
@ <tr><th align="right" id="lgpw">Password:</th>
@ <tr><th align="right" id="lgpw"><label for="pw">Password:</label></th>
@ <td width="5"></td><td>
@ <input aria-labelledby="lgpw" type="password" size="20" name="pw">\
@ <input type="password" size="20" id="pw" name="pw">\
@ </td></tr>
@
@ <tr><th align="right" id="nolg">Name of login-group:</th>
@ <tr><th align="right" id="nolg"><label for="newname">Name of login-group:</label></th>
@ <td width="5"></td><td>
@ <input aria-labelledby="nolg" type="text" size="30" \
@ value="%h(zNewName)" name="newname">
@ <input type="text" size="30" \
@ value="%h(zNewName)" id="newname" name="newname">
@ (only used if creating a new login-group).</td></tr>
@
@ <tr><td colspan="3" align="center">
@ <input type="submit" value="Join" name="join"></td></tr>
@ </table></blockquote></div></form>
}else{
Stmt q;
|
︙ | | |
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
|
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
|
-
-
+
+
|
@ <p>The logo is accessible to all users at this URL:
@ <a href="%s(g.zBaseURL)/logo">%s(g.zBaseURL)/logo</a>.
@ The logo may or may not appear on each
@ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
@ <a href="setup_skinedit?w=2">header setup</a>.
@ To change the logo image, use the following form:</p>
login_insert_csrf_secret();
@ Logo Image file:
@ <input type="file" name="logoim" size="60" accept="image/*" />
@ <label>Logo Image file:
@ <input type="file" name="logoim" size="60" accept="image/*" /></label>
@ <p align="center">
@ <input type="submit" name="setlogo" value="Change Logo" />
@ <input type="submit" name="clrlogo" value="Revert To Default" /></p>
@ <p>(Properties: "logo-image" and "logo-mimetype")
@ </div></form>
@ <hr />
@
|
︙ | | |
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
|
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
|
-
-
+
+
|
@ <p>The background image is accessible to all users at this URL:
@ <a href="%s(g.zBaseURL)/background">%s(g.zBaseURL)/background</a>.
@ The background image may or may not appear on each
@ page depending on the <a href="setup_skinedit?w=0">CSS</a> and
@ <a href="setup_skinedit?w=2">header setup</a>.
@ To change the background image, use the following form:</p>
login_insert_csrf_secret();
@ Background image file:
@ <input type="file" name="bgim" size="60" accept="image/*" />
@ <label>Background image file:
@ <input type="file" name="bgim" size="60" accept="image/*" /></label>
@ <p align="center">
@ <input type="submit" name="setbg" value="Change Background" />
@ <input type="submit" name="clrbg" value="Revert To Default" /></p>
@ </div></form>
@ <p>(Properties: "background-image" and "background-mimetype")
@ <hr />
@
|
︙ | | |
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
|
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
|
-
-
+
+
|
@ <p>The icon image is accessible to all users at this URL:
@ <a href="%s(g.zBaseURL)/favicon.ico">%s(g.zBaseURL)/favicon.ico</a>.
@ The icon image may or may not appear on each
@ page depending on the web browser in use and the MIME-Types that it
@ supports for icon images.
@ To change the icon image, use the following form:</p>
login_insert_csrf_secret();
@ Icon image file:
@ <input type="file" name="iconim" size="60" accept="image/*" />
@ <label>Icon image file:
@ <input type="file" name="iconim" size="60" accept="image/*" /></label>
@ <p align="center">
@ <input type="submit" name="seticon" value="Change Icon" />
@ <input type="submit" name="clricon" value="Revert To Default" /></p>
@ </div></form>
@ <p>(Properties: "icon-image" and "icon-mimetype")
@ <hr />
@
|
︙ | | |
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
|
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
|
-
-
+
+
|
"FROM config\n"
"-- ORDER BY mtime DESC; -- optional";
go = 1;
}
@
@ <form method="post" action="%R/admin_sql">
login_insert_csrf_secret();
@ SQL:<br />
@ <textarea name="q" rows="8" cols="80">%h(zQ)</textarea><br />
@ <label>SQL:<br />
@ <textarea name="q" rows="8" cols="80">%h(zQ)</textarea></label><br />
@ <input type="submit" name="go" value="Run SQL">
@ <input type="submit" name="schema" value="Show Schema">
@ <input type="submit" name="tablelist" value="List Tables">
@ <input type="submit" name="configtab" value="CONFIG Table Query">
@ </form>
if( P("schema") ){
zQ = sqlite3_mprintf(
|
︙ | | |
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
|
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
|
-
-
+
+
|
style_header("Raw TH1 Commands");
@ <p><b>Caution:</b> There are no restrictions on the TH1 that can be
@ run by this page. If Tcl integration was enabled at compile-time and
@ the "tcl" setting is enabled, Tcl commands may be run as well.</p>
@
@ <form method="post" action="%R/admin_th1">
login_insert_csrf_secret();
@ TH1:<br />
@ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea><br />
@ <label>TH1:<br />
@ <textarea name="q" rows="5" cols="80">%h(zQ)</textarea></label><br />
@ <input type="submit" name="go" value="Run TH1">
@ </form>
if( go ){
const char *zR;
int rc;
int n;
@ <hr />
|
︙ | | |
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
|
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
|
-
+
-
+
|
@ <table border=0 cellpadding=5>
@ <tr><th>Alias<th>URI That The Alias Maps Into
blob_init(&namelist, 0, 0);
while( db_step(&q)==SQLITE_ROW ){
const char *zName = db_column_text(&q, 0);
const char *zValue = db_column_text(&q, 1);
@ <tr><td>
@ <input type='text' size='20' value='%h(zName)' name='n%d(cnt)'>
@ <input type='text' size='20' value='%h(zName)' name='n%d(cnt)' title='Alias %d(cnt)'>
@ </td><td>
@ <input type='text' size='80' value='%h(zValue)' name='v%d(cnt)'>
@ <input type='text' size='80' value='%h(zValue)' name='v%d(cnt)' title='URI %d(cnt)'>
@ </td></tr>
cnt++;
if( blob_size(&namelist)>0 ) blob_append(&namelist, " ", 1);
blob_append(&namelist, zName, -1);
}
db_finalize(&q);
@ <tr><td>
|
︙ | | |
Changes to src/setupuser.c.
︙ | | |
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
-
|
/*
** WEBPAGE: setup_ulist
**
** Show a list of users. Clicking on any user jumps to the edit
** screen for that user. Requires Admin privileges.
**
** Query parameters:
**
** with=CAP Only show users that have one or more capabilities in CAP.
** ubg Color backgrounds by username hash
*/
void setup_ulist(void){
Stmt s;
double rNow;
const char *zWith = P("with");
|
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
|
@ <input type="hidden" name="login" value="%s(zLogin)">
@ <input type="hidden" name="info" value="">
@ <input type="hidden" name="pw" value="*">
}
@ <input type="hidden" name="referer" value="%h(cgi_referer("setup_ulist"))">
@ <table width="100%%">
@ <tr>
@ <td class="usetupEditLabel" id="suuid">User ID:</td>
@ <td class="usetupEditLabel" id="suuid"><label for="id">User ID:</label></td>
if( uid ){
@ <td>%d(uid) <input aria-labelledby="suuid" type="hidden" \
@ <td>%d(uid) <input type="hidden" \
@ name="id" value="%d(uid)"/>\
@ </td>
}else{
@ <td>(new user)<input aria-labelledby="suuid" type="hidden" name="id" \
@ <td>(new user)<input type="hidden" name="id" \
@ value="0" /></td>
}
@ </tr>
@ <tr>
@ <td class="usetupEditLabel" id="sulgn">Login:</td>
@ <td class="usetupEditLabel" id="sulgn"><label for="login">Login:</label></td>
if( login_is_special(zLogin) ){
@ <td><b>%h(zLogin)</b></td>
}else{
@ <td><input aria-labelledby="sulgn" type="text" name="login" \
@ <td><input type="text" id="login" name="login" \
@ value="%h(zLogin)" />
if( alert_tables_exist() ){
int sid;
sid = db_int(0, "SELECT subscriberId FROM subscriber"
" WHERE suname=%Q", zLogin);
if( sid>0 ){
@ <a href="%R/alerts?sid=%d(sid)">\
@ (subscription info for %h(zLogin))</a>\
}
}
@ </td></tr>
@ <tr>
@ <td class="usetupEditLabel" id="sucnfo">Contact Info:</td>
@ <td><textarea aria-labelledby="sucnfo" name="info" cols="40" \
@ <td class="usetupEditLabel" id="sucnfo">
@ <label for="info">Contact Info:</label></td>
@ <td><textarea id="info" name="info" cols="40" \
@ rows="2">%h(zInfo)</textarea></td>
}
@ </tr>
@ <tr>
@ <td class="usetupEditLabel">Capabilities:</td>
@ <td width="100%%">
#define B(x) inherit[x]
|
︙ | | |
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
|
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
|
-
+
-
-
+
+
-
+
|
@ <td>
@ <span id="usetupEditCapability">(missing JS?)</span>
@ <a href="%R/setup_ucap_list">(key)</a>
@ </td>
@ </tr>
if( !login_is_special(zLogin) ){
@ <tr>
@ <td align="right" id="supw">Password:</td>
@ <td align="right" id="supw"><label for="pw">Password:</label></td>
if( zPw[0] ){
/* Obscure the password for all users */
@ <td><input aria-labelledby="supw" type="password" autocomplete="off" \
@ name="pw" value="**********" /></td>
@ <td><input type="password" autocomplete="off" \
@ id="pw" name="pw" value="**********" /></td>
}else{
/* Show an empty password as an empty input field */
char *zRPW = fossil_random_password(12);
@ <td><input aria-labelledby="supw" type="password" name="pw" \
@ <td><input type="password" id="pw" name="pw" \
@ autocomplete="off" value="" /> Password suggestion: %z(zRPW)</td>
}
@ </tr>
}
zGroup = login_group_name();
if( zGroup ){
@ <tr>
|
︙ | | |
Changes to src/sha1.c.
︙ | | |
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
|
-
+
|
/*
** COMMAND: sha1sum*
**
** Usage: %fossil sha1sum FILE...
**
** Compute an SHA1 checksum of all files named on the command-line.
** If a file is named "-" then take its content from standard input.
** Options:
**
** Options:
** -h|--dereference If FILE is a symbolic link, compute the hash
** on the object that the link points to. Normally,
** the hash is over the name of the object that
** the link points to.
**
** See also: [[md5sum]], [[sha3sum]]
*/
|
︙ | | |
Changes to src/sha3.c.
︙ | | |
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
|
626
627
628
629
630
631
632
633
634
635
636
637
638
639
|
-
|
** Compute an SHA3 checksum of all files named on the command-line.
** If a file is named "-" then take its content from standard input.
**
** To be clear: The official NIST FIPS-202 implementation of SHA3
** with the added 01 padding is used, not the original Keccak submission.
**
** Options:
**
** --224 Compute a SHA3-224 hash
** --256 Compute a SHA3-256 hash (the default)
** --384 Compute a SHA3-384 hash
** --512 Compute a SHA3-512 hash
** --size N An N-bit hash. N must be a multiple of 32 between
** 128 and 512.
** -h|--dereference If FILE is a symbolic link, compute the hash on
|
︙ | | |
Changes to src/shun.c.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
-
+
+
-
+
|
}
@ <p>A shunned artifact will not be pushed nor accepted in a pull and the
@ artifact content will be purged from the repository the next time the
@ repository is rebuilt. A list of shunned artifacts can be seen at the
@ bottom of this page.</p>
@
@ <a name="addshun"></a>
@ <p>To shun artifacts, enter their artifact hashes (the 40- or
@ <p><label for="shun-uuid">To shun artifacts, enter their artifact hashes (the 40- or
@ 64-character lowercase hexadecimal hash of the artifact content) in the
@ following box and press the "Shun" button. This will cause the artifacts
@ following box and press the "Shun" button.</label> This will cause the artifacts
@ to be removed from the repository and will prevent the artifacts from being
@ readded to the repository by subsequent sync operation.</p>
@
@ <p>Note that you must enter full artifact hashes, not abbreviations
@ or symbolic tags.</p>
@
@ <p>Warning: Shunning should only be used to remove inappropriate content
@ from the repository. Inappropriate content includes such things as
@ spam added to Wiki, files that violate copyright or patent agreements,
@ or artifacts that by design or accident interfere with the processing
@ of the repository. Do not shun artifacts merely to remove them from
@ sight - set the "hidden" tag on such artifacts instead.</p>
@
@ <blockquote>
@ <form method="post" action="%R/%s(g.zPath)"><div>
login_insert_csrf_secret();
@ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid">
@ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid" id="shun-uuid">
if( zShun ){
if( strlen(zShun) ){
@ %h(zShun)
}else if( nRcvid ){
db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
while( db_step(&q)==SQLITE_ROW ){
@ %s(db_column_text(&q, 0))
}
db_finalize(&q);
}
}
@ </textarea>
@ <input type="submit" name="add" value="Shun" />
@ </div></form>
@ </blockquote>
@
@ <a name="delshun"></a>
@ <p>Enter the UUIDs of previously shunned artifacts to cause them to be
@ accepted again in the repository. The artifacts content is not
@ <p><label for="accept-uuid">Enter the UUIDs of previously shunned artifacts to cause them to be
@ accepted again in the repository.</label> The artifacts content is not
@ restored because the content is unknown. The only change is that
@ the formerly shunned artifacts will be accepted on subsequent sync
@ operations.</p>
@
@ <blockquote>
@ <form method="post" action="%R/%s(g.zPath)"><div>
login_insert_csrf_secret();
@ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid">
@ <textarea class="fullsize-text" cols="70" rows="%d(numRows)" name="uuid" id="accept-uuid">
if( zAccept ){
if( strlen(zAccept) ){
@ %h(zAccept)
}else if( nRcvid ){
db_prepare(&q, "SELECT uuid FROM blob WHERE rcvid=%d", nRcvid);
while( db_step(&q)==SQLITE_ROW ){
@ %s(db_column_text(&q, 0))
|
︙ | | |
Changes to src/sitemap.c.
︙ | | |
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
-
+
|
@ <ul>
@ <li>%z(href("%R/tree?type=tree&ci=trunk"))Tree-view,
@ Trunk Check-in</a></li>
@ <li>%z(href("%R/tree?type=flat"))Flat-view</a></li>
@ <li>%z(href("%R/fileage?name=trunk"))File ages for Trunk</a></li>
@ <li>%z(href("%R/uvlist"))Unversioned Files</a>
if( g.perm.Write && zEditGlob[0]!=0 ){
@ <li>%z(href("%R/fileedit"))On-line File Editor</li>
@ <li>%z(href("%R/fileedit"))On-line File Editor</a></li>
}
@ </ul>
}
if( g.perm.Read ){
@ <li>%z(href("%R/timeline"))Project Timeline</a>
@ <ul>
@ <li>%z(href("%R/reports"))Activity Reports</a></li>
|
︙ | | |
Changes to src/skins.c.
︙ | | |
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
|
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
|
-
-
+
+
|
if( ex ){
@ <p><span class="generalError">There is already another skin
@ named "%h(zNewName)". Choose a different name.</span></p>
}
@ <form action="%R/setup_skin_admin" method="post"><div>
@ <table border="0"><tr>
@ <tr><td align="right">Current name:<td align="left"><b>%h(zOldName)</b>
@ <tr><td align="right">New name:<td align="left">
@ <input type="text" size="35" name="newname" value="%h(zNewName)">
@ <tr><td align="right"><label for="newname">New name:</label><td align="left">
@ <input type="text" size="35" id="newname" name="newname" value="%h(zNewName)">
@ <tr><td><td>
@ <input type="hidden" name="sn" value="%h(zOldName)">
@ <input type="submit" name="rename" value="Rename">
@ <input type="submit" name="canren" value="Cancel">
@ </table>
login_insert_csrf_secret();
@ </div></form>
|
︙ | | |
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
|
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
|
-
-
+
+
|
style_header("Save Current Skin");
if( ex ){
@ <p><span class="generalError">There is already another skin
@ named "%h(zNewName)". Choose a different name.</span></p>
}
@ <form action="%R/setup_skin_admin" method="post"><div>
@ <table border="0"><tr>
@ <tr><td align="right">Name for this skin:<td align="left">
@ <input type="text" size="35" name="svname" value="%h(zNewName)">
@ <tr><td align="right"><label for="svname">Name for this skin:</label><td align="left">
@ <input type="text" size="35" id="svname" name="svname" value="%h(zNewName)">
@ <tr><td><td>
@ <input type="submit" name="save" value="Save">
@ <input type="submit" name="cansave" value="Cancel">
@ </table>
login_insert_csrf_secret();
@ </div></form>
style_finish_page();
|
︙ | | |
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
|
772
773
774
775
776
777
778
779
780
781
782
783
784
785
|
-
|
} cssDefaultList[];
/*
** WEBPAGE: setup_skinedit
**
** Edit aspects of a skin determined by the w= query parameter.
** Requires Admin or Setup privileges.
**
** w=NUM -- 0=CSS, 1=footer, 2=header, 3=details, 4=js
** sk=NUM -- the draft skin number
*/
void setup_skinedit(void){
static const struct sSkinAddr {
const char *zFile;
const char *zTitle;
|
︙ | | |
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
|
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
|
-
+
-
+
-
+
+
|
style_submenu_element(aSkinAttr[j].zSubmenu,
"%R/setup_skinedit?w=%d&basis=%h&sk=%d",j,zBasis,iSkin);
}
@ <form action="%R/setup_skinedit" method="post"><div>
login_insert_csrf_secret();
@ <input type='hidden' name='w' value='%d(ii)'>
@ <input type='hidden' name='sk' value='%d(iSkin)'>
@ <h2>Edit %s(zTitle):</h2>
@ <h2><label for="%s(zFile)">Edit %s(zTitle):</label></h2>
if( P("submit") && cgi_csrf_safe(0) && (zOrig==0 || strcmp(zOrig,zContent)!=0) ){
db_set_mprintf(zContent, 0, "draft%d-%s",iSkin,zFile);
}
@ <textarea name="%s(zFile)" rows="10" cols="80">\
@ <textarea id="%s(zFile)" name="%s(zFile)" rows="10" cols="80">\
@ %h(zContent)</textarea>
@ <br />
@ <input type="submit" name="submit" value="Apply Changes" />
if( isRevert ){
@ ← Press to complete reversion to "%s(zBasis)"
}else if( fossil_strcmp(zContent,zDflt)!=0 ){
@ <input type="submit" name="revert" value='Revert To "%s(zBasis)"' />
}
@ <hr />
@ Baseline: \
@ <label>Baseline: \
skin_emit_skin_selector("basis", zBasis, zDraft);
@ </label>
@ <input type="submit" name="diff" value="Unified Diff" />
@ <input type="submit" name="sbsdiff" value="Side-by-Side Diff" />
if( P("diff")!=0 || P("sbsdiff")!=0 ){
Blob from, to, out;
DiffConfig DCfg;
construct_diff_flags(1, &DCfg);
DCfg.diffFlags |= DIFF_STRIP_EOLCR;
|
︙ | | |
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
|
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
|
-
+
-
+
-
+
-
+
|
@
@ <p>The main skin of Fossil cannot be edited directly. Instead,
@ edits are made to one of nine draft skins. A draft skin can then
@ be published to become the default skin.
@ Nine separate drafts are available to facilitate A/B testing.</p>
@
@ <form method='POST' action='%R/setup_skin#step2' id='f01'>
@ <p class='skinInput'>Draft skin to edit:
@ <p class='skinInput'><label>Draft skin to edit:
@ <select size='1' name='sk' id='skStep1'>
for(i=1; i<=9; i++){
if( i==iSkin ){
@ <option value='%d(i)' selected>draft%d(i)</option>
}else{
@ <option value='%d(i)'>draft%d(i)</option>
}
}
@ </select>
@ </select></label>
@ </p>
@
@ <a name='step2'></a>
@ <h1>Step 2: Authenticate</h1>
@
if( isSetup ){
@ <p>As an administrator, you can make any edits you like to this or
@ any other skin. You can also authorize other users to edit this
@ skin. Any user whose login name matches the comma-separated list
@ of GLOB expressions below is given special permission to edit
@ the draft%d(iSkin) skin:
@
@ <form method='POST' action='%R/setup_skin#step2' id='f02'>
@ <p class='skinInput'>
@ <input type='hidden' name='sk' value='%d(iSkin)'>
@ Authorized editors for skin draft%d(iSkin):
@ <label>Authorized editors for skin draft%d(iSkin):
@ <input type='text' name='editors' value='%h(zAllowedEditors)'\
@ width='40'>
@ width='40'></label>
@ <input type='submit' name='submit2' value='Change'>
@ </p>
@ </form>
}else if( isEditor ){
@ <p>You are authorized to make changes to the draft%d(iSkin) skin.
@ Continue to the <a href='#step3'>next step</a>.</p>
}else{
|
︙ | | |
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
|
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
|
-
+
-
+
|
}else{
@ <p>Initialize the draft%d(iSkin) skin to one of the built-in skins
@ or a preexisting skin, to use as a baseline.</p>
@
@ <form method='POST' action='%R/setup_skin#step4' id='f03'>
@ <p class='skinInput'>
@ <input type='hidden' name='sk' value='%d(iSkin)'>
@ Initialize skin <b>draft%d(iSkin)</b> using
@ <label>Initialize skin <b>draft%d(iSkin)</b> using
skin_emit_skin_selector("initskin", "current", 0);
@ <input type='submit' name='init3' value='Go'>
@ </label><input type='submit' name='init3' value='Go'>
@ </p>
@ </form>
}
@
@ <a name='step4'></a>
@ <h1>Step 4: Make Edits</h1>
@
|
︙ | | |
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
|
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
|
-
-
-
-
+
+
+
+
|
@ <p>When the draft%d(iSkin) skin is ready for production use,
@ make it the default skin by clicking the acknowledgements and
@ pressing the button below:</p>
@
@ <form method='POST' action='%R/setup_skin#step7'>
@ <p class='skinInput'>
@ <input type='hidden' name='sk' value='%d(iSkin)'>
@ <input type='checkbox' name='pub7ck1' value='yes'>\
@ Skin draft%d(iSkin) has been tested and found ready for production.<br>
@ <input type='checkbox' name='pub7ck2' value='yes'>\
@ The current skin should be overwritten with draft%d(iSkin).<br>
@ <label><input type='checkbox' name='pub7ck1' value='yes'>\
@ Skin draft%d(iSkin) has been tested and found ready for production.</label><br>
@ <label><input type='checkbox' name='pub7ck2' value='yes'>\
@ The current skin should be overwritten with draft%d(iSkin).</label><br>
@ <input type='submit' name='pub7' value='Publish Draft%d(iSkin)'>
@ </p></form>
@
@ <p>You will probably need to press Reload on your browser after
@ publishing the new skin.</p>
}
@
|
︙ | | |
Changes to src/smtp.c.
︙ | | |
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
|
421
422
423
424
425
426
427
428
429
430
431
432
433
434
|
-
|
** Usage: %fossil test-smtp-probe DOMAIN [ME]
**
** Interact with the SMTP server for DOMAIN by setting up a connection
** and then immediately shutting it back down. Log all interaction
** on the console. Use ME as the domain name of the sender.
**
** Options:
**
** --direct Use DOMAIN directly without going through MX
** --port N Talk on TCP port N
*/
void test_smtp_probe(void){
SmtpSession *p;
const char *zDomain;
const char *zSelf;
|
︙ | | |
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
|
593
594
595
596
597
598
599
600
601
602
603
604
605
606
|
-
|
**
** Usage: %fossil test-smtp-send EMAIL FROM TO ...
**
** Use SMTP to send the email message contained in the file named EMAIL
** to the list of users TO. FROM is the sender of the email.
**
** Options:
**
** --direct Go directly to the TO domain. Bypass MX lookup
** --relayhost R Use R as relay host directly for delivery.
** --port N Use TCP port N instead of 25
** --trace Show the SMTP conversation on the console
*/
void test_smtp_send(void){
SmtpSession *p;
|
︙ | | |
Changes to src/sqlcmd.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
**
** WARNING: Careless use of this command can corrupt a Fossil repository
** in ways that are unrecoverable. Be sure you know what you are doing before
** running any SQL commands that modify the repository database. Use the
** --readonly option to prevent accidental damage to the repository.
**
** Options:
**
** --no-repository Skip opening the repository database.
**
** --readonly Open the repository read-only. No changes
** are allowed. This is a recommended safety
** precaution to prevent repository damage.
**
** -R REPOSITORY Use REPOSITORY as the repository database
**
** --test Enable some testing and analysis features
** that are normally disabled.
**
** All of the standard sqlite3 command-line shell options should also
** work.
**
** The following SQL extensions are provided with this Fossil-enhanced
** version of the sqlite3 command-line shell:
**
** builtin A virtual table that contains one row for
** each datafile that is built into the Fossil
** binary.
**
** checkin_mtime(X,Y) Return the mtime for the file Y (a BLOB.RID)
** found in check-in X (another BLOB.RID value).
**
** compress(X) Compress text X with the same algorithm used
** to compress artifacts in the BLOB table.
**
** content(X) Return the content of artifact X. X can be an
** artifact hash or hash prefix or a tag. Artifacts
** are stored compressed and deltaed. This function
** does all necessary decompression and undeltaing.
**
** decompress(X) Decompress text X. Undoes the work of
** compress(X).
**
** delta_apply(X,D) Apply delta D to source blob X and return
** the result.
**
** delta_create(X,Y) Create and return a delta that will convert
** X into Y.
**
** delta_output_size(D) Return the number of bytes of output to expect
** when applying delta D
**
** delta_parse(D) A table-valued function that deconstructs
** delta D and returns rows for each element of
** that delta.
**
** files_of_checkin(X) A table-valued function that returns info on
** all files contained in check-in X. Example:
**
** SELECT * FROM files_of_checkin('trunk');
**
** helptext A virtual table with one row for each command,
** webpage, and setting together with the built-in
** help text.
**
** now() Return the number of seconds since 1970.
**
** obscure(T) Obfuscate the text password T so that its
** original value is not readily visible. Fossil
** uses this same algorithm when storing passwords
** of remote URLs.
**
** regexp The REGEXP operator works, unlike in
** standard SQLite.
**
** symbolic_name_to_rid(X) Return the BLOB.RID corresponding to symbolic
** name X.
*/
void cmd_sqlite3(void){
int noRepository;
char *zConfigDb;
extern int sqlite3_shell(int, char**);
|
︙ | | |
Changes to src/stash.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
return stashid;
}
/*
** COMMAND: stash
**
** Usage: %fossil stash SUBCOMMAND ARGS...
**
** > fossil stash
** > fossil stash save ?-m|--comment COMMENT? ?FILES...?
** > fossil stash snapshot ?-m|--comment COMMENT? ?FILES...?
**
** Save the current changes in the working tree as a new stash.
** Then revert the changes back to the last check-in. If FILES
** are listed, then only stash and revert the named files. The
** "save" verb can be omitted if and only if there are no other
** arguments. The "snapshot" verb works the same as "save" but
** omits the revert, keeping the checkout unchanged.
**
** > fossil stash list|ls ?-v|--verbose? ?-W|--width NUM?
**
** List all changes sets currently stashed. Show information about
** individual files in each changeset if -v or --verbose is used.
**
** > fossil stash show|cat ?STASHID? ?DIFF-OPTIONS?
** > fossil stash gshow|gcat ?STASHID? ?DIFF-OPTIONS?
**
** Show the contents of a stash as a diff against its baseline.
** With gshow and gcat, gdiff-command is used instead of internal
** diff logic.
**
** > fossil stash pop
** > fossil stash apply ?STASHID?
**
** Apply STASHID or the most recently created stash to the current
** working checkout. The "pop" command deletes that changeset from
** the stash after applying it but the "apply" command retains the
** changeset.
**
** > fossil stash goto ?STASHID?
**
** Update to the baseline checkout for STASHID then apply the
** changes of STASHID. Keep STASHID so that it can be reused
** This command is undoable.
**
** > fossil stash drop|rm ?STASHID? ?-a|--all?
**
** Forget everything about STASHID. Forget the whole stash if the
** -a|--all flag is used. Individual drops are undoable but -a|--all
** is not.
**
** > fossil stash diff ?STASHID? ?DIFF-OPTIONS?
** > fossil stash gdiff ?STASHID? ?DIFF-OPTIONS?
**
** Show diffs of the current working directory and what that
** directory would be if STASHID were applied. With gdiff,
** gdiff-command is used instead of internal diff logic.
*/
void stash_cmd(void){
const char *zCmd;
int nCmd;
|
︙ | | |
Changes to src/stat.c.
︙ | | |
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
331
332
333
334
335
336
337
338
339
340
341
342
343
344
|
-
|
**
** Usage: %fossil dbstat OPTIONS
**
** Shows statistics and global information about the repository and/or
** verify the integrity of a repository.
**
** Options:
**
** -b|--brief Only show essential elements.
** --db-check Run "PRAGMA quick_check" on the repository database.
** --db-verify Run a full verification of the repository integrity.
** This involves decoding and reparsing all artifacts
** and can take significant time.
** --omit-version-info Omit the SQLite and Fossil version information.
*/
|
︙ | | |
Changes to src/statrep.c.
︙ | | |
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
-
+
|
style_table_sorter();
}else{
@ class='statistics-report-table-events'>
}
@ <thead>
@ <th>%s(zTimeLabel)</th>
@ <th>Events</th>
@ <th width='90%%'><!-- relative commits graph --></th>
@ <th width='90%%'>Graph</th>
@ </thead><tbody>
/*
Run the query twice. The first time we calculate the maximum
number of events for a given row. Maybe someone with better SQL
Fu can re-implement this with a single query.
*/
while( SQLITE_ROW == db_step(&query) ){
|
︙ | | |
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
|
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
|
-
+
|
}
style_table_sorter();
@ <table class='statistics-report-table-events sortable' border='0' \
@ cellpadding='2' cellspacing='0' data-column-types='tkx' data-init-sort='2'>
@ <thead><tr>
@ <th>User</th>
@ <th>Events</th>
@ <th width='90%%'><!-- relative commits graph --></th>
@ <th width='90%%'>Graph</th>
@ </tr></thead><tbody>
db_prepare(&query,
"SELECT ifnull(euser,user), "
"COUNT(*) AS eventCount "
"FROM v_reports "
"GROUP BY ifnull(euser,user) ORDER BY eventCount DESC");
while( SQLITE_ROW == db_step(&query) ){
|
︙ | | |
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
|
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
|
-
+
|
@ </h1>
style_table_sorter();
@ <table class='statistics-report-table-events sortable' border='0' \
@ cellpadding='2' cellspacing='0' data-column-types='tNx' data-init-sort='2'>
@ <thead><tr>
@ <th>File</th>
@ <th>Check-ins</th>
@ <th width='90%%'><!-- relative commits graph --></th>
@ <th width='90%%'>Graph</th>
@ </tr></thead><tbody>
while( SQLITE_ROW == db_step(&query) ){
const char *zFile = db_column_text(&query, 0);
const int n = db_column_int(&query, 1);
int sz;
if( n<=0 ) continue;
sz = (int)(100*n/mxEvent);
|
︙ | | |
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
|
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
|
-
+
|
style_table_sorter();
@ <table class='statistics-report-table-events sortable' border='0' \
@ cellpadding='2' cellspacing='0' data-column-types='ntnx' data-init-sort='1'>
@ <thead><tr>
@ <th>DoW</th>
@ <th>Day</th>
@ <th>Events</th>
@ <th width='90%%'><!-- relative commits graph --></th>
@ <th width='90%%'>Graph</th>
@ </tr></thead><tbody>
while( SQLITE_ROW == db_step(&query) ){
const int nCount = db_column_int(&query, 1);
if(nCount>nMaxEvents){
nMaxEvents = nCount;
}
}
|
︙ | | |
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
|
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
|
-
+
|
}
style_table_sorter();
@ <table class='statistics-report-table-events sortable' border='0' \
@ cellpadding='2' cellspacing='0' data-column-types='nnx' data-init-sort='1'>
@ <thead><tr>
@ <th>Hour</th>
@ <th>Events</th>
@ <th width='90%%'><!-- relative commits graph --></th>
@ <th width='90%%'>Graph</th>
@ </tr></thead><tbody>
while( SQLITE_ROW == db_step(&query) ){
const int nCount = db_column_int(&query, 1);
if(nCount>nMaxEvents){
nMaxEvents = nCount;
}
}
|
︙ | | |
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
|
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
|
-
+
|
int nMaxEvents = 1; /* max number of events for
all rows. */
int iterations = 0; /* # of active time periods. */
int rowCount = 0;
int total = 0;
stats_report_init_view();
style_submenu_sql("y", "Year:",
style_submenu_sql("y", "Year",
"WITH RECURSIVE a(b) AS ("
" SELECT substr(date('now'),1,4) UNION ALL"
" SELECT b-1 FROM a"
" WHERE b>0+(SELECT substr(date(min(mtime)),1,4) FROM event)"
") SELECT b, b FROM a ORDER BY b DESC");
if( zYear==0 || strlen(zYear)!=4 ){
zYear = db_text("1970","SELECT substr(date('now'),1,4);");
|
︙ | | |
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
|
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
|
-
+
|
style_table_sorter();
cgi_printf("<table class='statistics-report-table-events sortable' "
"border='0' cellpadding='2' width='100%%' "
"cellspacing='0' data-column-types='tnx' data-init-sort='0'>");
cgi_printf("<thead><tr>"
"<th>Week</th>"
"<th>Events</th>"
"<th width='90%%'><!-- relative commits graph --></th>"
"<th width='90%%'>Graph</th>"
"</tr></thead>"
"<tbody>");
while( SQLITE_ROW == db_step(&q) ){
const int nCount = db_column_int(&q, 1);
if(nCount>nMaxEvents){
nMaxEvents = nCount;
}
|
︙ | | |
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
|
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
|
-
-
-
-
-
-
-
-
+
+
+
+
+
+
|
/*
** WEBPAGE: reports
**
** Shows activity reports for the repository.
**
** Query Parameters:
**
** view=REPORT_NAME Valid values: bymonth, byyear, byuser
** user=NAME Restricts statistics to the given user
** type=TYPE Restricts the report to a specific event type:
** ci (check-in), f (forum), w (wiki), t (ticket), g (tag)
** Defaulting to all event types.
**
** The view-specific query parameters include:
**
** view=byweek:
**
** y=YYYY The year to report (default is the server's
** current year).
*/
void stats_report_page(){
const char *zView = P("view"); /* Which view/report to show. */
int eType = RPT_NONE; /* Numeric code for view/report to show */
int i; /* Loop counter */
const char *zUserName; /* Name of user */
const char *azView[16]; /* Drop-down menu of view types */
static const struct {
const char *zName; /* Name of view= screen type */
const char *zVal; /* Value of view= query parameter */
int eType; /* Corresponding RPT_* define */
} aViewType[] = {
{ "File Changes","byfile", RPT_BYFILE },
{ "Last Change", "lastchng", RPT_LASTCHNG },
{ "By Month", "bymonth", RPT_BYMONTH },
{ "By User", "byuser", RPT_BYUSER },
{ "By Week", "byweek", RPT_BYWEEK },
{ "By Weekday", "byweekday", RPT_BYWEEKDAY },
{ "By Year", "byyear", RPT_BYYEAR },
{ "By Hour", "byhour", RPT_BYHOUR },
{ "Month", "bymonth", RPT_BYMONTH },
{ "User", "byuser", RPT_BYUSER },
{ "Week", "byweek", RPT_BYWEEK },
{ "Weekday", "byweekday", RPT_BYWEEKDAY },
{ "Year", "byyear", RPT_BYYEAR },
{ "Hour", "byhour", RPT_BYHOUR },
};
static const char *const azType[] = {
"a", "All Changes",
"ci", "Check-ins",
"f", "Forum Posts",
"g", "Tags",
"e", "Tech Notes",
|
︙ | | |
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
|
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
|
-
+
-
+
-
+
|
if( eType!=RPT_NONE ){
int nView = 0; /* Slots used in azView[] */
for(i=0; i<count(aViewType); i++){
azView[nView++] = aViewType[i].zVal;
azView[nView++] = aViewType[i].zName;
}
if( eType!=RPT_BYFILE ){
style_submenu_multichoice("type", count(azType)/2, azType, 0);
style_submenu_multichoice("type", "Type", count(azType)/2, azType, 0);
}
style_submenu_multichoice("view", nView/2, azView, 0);
style_submenu_multichoice("view", "Group By", nView/2, azView, 0);
if( eType!=RPT_BYUSER && eType!=RPT_LASTCHNG ){
style_submenu_sql("user","User:",
style_submenu_sql("user","User",
"SELECT '', 'All Users' UNION ALL "
"SELECT x, x FROM ("
" SELECT DISTINCT trim(coalesce(euser,user)) AS x FROM event %s"
" ORDER BY 1 COLLATE nocase) WHERE x!=''",
eType==RPT_BYFILE ? "WHERE type='ci'" : ""
);
}
|
︙ | | |
Changes to src/style.c.
︙ | | |
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
-
+
+
|
static struct Submenu {
const char *zLabel; /* Button label */
const char *zLink; /* Jump to this link when button is pressed */
} aSubmenu[30];
static int nSubmenu = 0; /* Number of buttons */
static struct SubmenuCtrl {
const char *zName; /* Form query parameter */
const char *zLabel; /* Label. Might be NULL for FF_MULTI */
const char *zLabel; /* Label */
unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_CHECKBOX */
unsigned char eVisible; /* STYLE_NORMAL or STYLE_DISABLED */
short int iSize; /* Width for FF_ENTRY. Count for FF_MULTI */
const char *const *azChoice; /* value/display pairs for FF_MULTI */
const char *zTrue; /* FF_BINARY label when true */
const char *zFalse; /* FF_BINARY label when false */
const char *zJS; /* Javascript to run on toggle */
} aSubmenuCtrl[20];
static int nSubmenuCtrl = 0;
#define FF_ENTRY 1 /* Text entry box */
#define FF_MULTI 2 /* Combobox. Multiple choices. */
#define FF_BINARY 3 /* Control for binary query parameter */
|
︙ | | |
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
|
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
|
+
-
+
+
+
+
|
aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible;
aSubmenuCtrl[nSubmenuCtrl].zJS = zJS;
aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX;
nSubmenuCtrl++;
}
void style_submenu_binary(
const char *zName, /* Query parameter name */
const char *zLabel, /* Label of parameter */
const char *zTrue, /* Label to show when parameter is true */
const char *zFalse, /* Label to show when the parameter is false */
int eVisible /* Visible or disabled */
){
assert( nSubmenuCtrl < count(aSubmenuCtrl) );
aSubmenuCtrl[nSubmenuCtrl].zName = zName;
aSubmenuCtrl[nSubmenuCtrl].zLabel = zTrue;
aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel;
aSubmenuCtrl[nSubmenuCtrl].zTrue = zTrue;
aSubmenuCtrl[nSubmenuCtrl].zFalse = zFalse;
aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible;
aSubmenuCtrl[nSubmenuCtrl].eType = FF_BINARY;
nSubmenuCtrl++;
}
void style_submenu_multichoice(
const char *zName, /* Query parameter name */
const char *zLabel, /* Label of parameter */
int nChoice, /* Number of options */
const char *const *azChoice, /* value/display pairs. 2*nChoice entries */
int eVisible /* Visible or disabled */
){
assert( nSubmenuCtrl < count(aSubmenuCtrl) );
aSubmenuCtrl[nSubmenuCtrl].zName = zName;
aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel;
aSubmenuCtrl[nSubmenuCtrl].iSize = nChoice;
aSubmenuCtrl[nSubmenuCtrl].azChoice = azChoice;
aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible;
aSubmenuCtrl[nSubmenuCtrl].eType = FF_MULTI;
nSubmenuCtrl++;
}
void style_submenu_sql(
|
︙ | | |
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
|
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
|
-
+
|
/*
** Default HTML page header text through <body>. If the repository-specific
** header template lacks a <body> tag, then all of the following is
** prepended.
*/
static const char zDfltHeader[] =
@ <html>
@ <html lang="en">
@ <head>
@ <meta charset="UTF-8">
@ <base href="$baseurl/$current_page" />
@ <meta http-equiv="Content-Security-Policy" content="$default_csp" />
@ <meta name="viewport" content="width=device-width, initial-scale=1.0">
@ <title>$<project_name>: $<title></title>
@ <link rel="alternate" type="application/rss+xml" title="RSS Feed" \
|
︙ | | |
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
|
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
|
-
+
|
int i;
char zClass[32]; /* reduced form of the main attribute */
if( nSubmenuCtrl ){
@ <form id='f01' method='GET' action='%R/%s(g.zPath)'>
@ <input type='hidden' name='udc' value='1'>
cgi_tag_query_parameter("udc");
}
@ <div class="submenu">
@ <nav id="submenu" class="submenu">
if( nSubmenu>0 ){
qsort(aSubmenu, nSubmenu, sizeof(aSubmenu[0]), submenuCompare);
for(i=0; i<nSubmenu; i++){
struct Submenu *p = &aSubmenu[i];
style_derive_classname(p->zLabel, zClass, sizeof zClass);
/* switching away from the %h formatting below might be dangerous
** because some places use %s to compose zLabel and zLink;
|
︙ | | |
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
|
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
|
-
+
-
+
-
-
+
-
+
+
-
+
+
-
+
-
+
-
+
|
}else if( zQPN ){
cgi_tag_query_parameter(zQPN);
}
style_derive_classname(zQPN, zClass+4, sizeof(zClass)-4);
switch( aSubmenuCtrl[i].eType ){
case FF_ENTRY:
@ <span class='submenuctrl%s(zXtraClass) %s(zClass)'>\
@ %h(aSubmenuCtrl[i].zLabel)\
@ <label>%h(aSubmenuCtrl[i].zLabel): \
@ <input type='text' name='%s(zQPN)' value='%h(PD(zQPN, ""))' \
if( aSubmenuCtrl[i].iSize<0 ){
@ size='%d(-aSubmenuCtrl[i].iSize)' \
}else if( aSubmenuCtrl[i].iSize>0 ){
@ size='%d(aSubmenuCtrl[i].iSize)' \
@ maxlength='%d(aSubmenuCtrl[i].iSize)' \
}
@ id='submenuctrl-%d(i)'%s(zDisabled)></span>
@ id='submenuctrl-%d(i)'%s(zDisabled)></label></span>
break;
case FF_MULTI: {
int j;
const char *zVal = P(zQPN);
if( zXtraClass[0] ){
@ <span class='%s(zXtraClass+1) %s(zClass)'>
}
if( aSubmenuCtrl[i].zLabel ){
@ %h(aSubmenuCtrl[i].zLabel)\
@ <label>%h(aSubmenuCtrl[i].zLabel): \
}
@ <select class='submenuctrl %s(zClass)' size='1' name='%s(zQPN)' \
@ id='submenuctrl-%d(i)'%s(zDisabled)>
for(j=0; j<aSubmenuCtrl[i].iSize*2; j+=2){
const char *zQPV = aSubmenuCtrl[i].azChoice[j];
@ <option value='%h(zQPV)'\
if( fossil_strcmp(zVal, zQPV)==0 ){
@ selected\
}
@ >%h(aSubmenuCtrl[i].azChoice[j+1])</option>
}
@ </select>
@ </label>
if( zXtraClass[0] ){
@ </span>
}
break;
}
case FF_BINARY: {
int isTrue = PB(zQPN);
@ <label for='submenuctrl-%d(i)'>%h(aSubmenuCtrl[i].zLabel):
@ <select class='submenuctrl%s(zXtraClass)' size='1' \
@ name='%s(zQPN)' id='submenuctrl-%d(i)'%s(zDisabled)>
@ <option value='1'\
if( isTrue ){
@ selected\
}
@ >%h(aSubmenuCtrl[i].zLabel)</option>
@ >%h(aSubmenuCtrl[i].zTrue)</option>
@ <option value='0'\
if( !isTrue ){
@ selected\
}
@ >%h(aSubmenuCtrl[i].zFalse)</option>
@ </select>
@ </label>
break;
}
case FF_CHECKBOX: {
@ <label class='submenuctrl submenuckbox%s(zXtraClass) %s(zClass)'>\
@ <input type='checkbox' name='%s(zQPN)' id='submenuctrl-%d(i)' \
if( PB(zQPN) ){
@ checked \
}
if( aSubmenuCtrl[i].zJS ){
@ data-ctrl='%s(aSubmenuCtrl[i].zJS)'%s(zDisabled)>\
}else{
@ %s(zDisabled)>\
}
@ %h(aSubmenuCtrl[i].zLabel)</label>
break;
}
}
}
@ </div>
@ </nav>
if( nSubmenuCtrl ){
cgi_query_parameters_to_hidden();
cgi_tag_query_parameter(0);
@ </form>
builtin_request_js("menu.js");
}
}
zAd = style_adunit_text(&mAdFlags);
if( (mAdFlags & ADUNIT_RIGHT_OK)!=0 ){
@ <div class="content adunit_right_container">
@ <div class="adunit_right">
cgi_append_content(zAd, -1);
@ </div>
}else if( zAd ){
@ <div class="adunit_banner">
cgi_append_content(zAd, -1);
@ </div>
}
@ <div class="content"><span id="debugMsg"></span>
@ <main class="content"><span id="debugMsg"></span>
cgi_destination(CGI_BODY);
if( sideboxUsed ){
@ <div class="endContent"></div>
}
@ </div>
@ </main>
/* Put the footer at the bottom of the page. */
zFooter = skin_get("footer");
if( sqlite3_strlike("%</body>%", zFooter, 0)==0 ){
style_load_all_js_files();
}
if( g.thTrace ) Th_Trace("BEGIN_FOOTER<br />\n", -1);
|
︙ | | |
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
|
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
|
-
-
-
|
}
/*
** WEBPAGE: style.css loadavg-exempt
**
** Return the style sheet. The style sheet is assemblied from
** multiple sources, in order:
**
** (1) The built-in "default.css" style sheet containing basic defaults.
**
** (2) The page-specific style sheet taken from the built-in
** called "PAGENAME.css" where PAGENAME is the value of the name=
** or page= query parameters. If neither name= nor page= exist,
** then this section is a no-op.
**
** (3) The skin-specific "css.txt" file, if there one.
**
** All of (1), (2), and (3) above (or as many as exist) are concatenated.
** The result is then run through TH1 with the following variables set:
**
** * $basename
** * $secureurl
|
︙ | | |
Changes to src/style.chat.css.
︙ | | |
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
|
-
+
|
overflow: auto;
padding: 0 0.25em;
}
body.chat #chat-messages-wrapper.loading > * {
/* An attempt at reducing flicker when loading lots of messages. */
visibility: hidden;
}
body.chat div.content {
body.chat main.content {
margin: 0;
padding: 0;
display: flex;
flex-direction: column-reverse;
/* ^^^^ In order to get good automatic scrolling of new messages on
the BOTTOM in bottom-up chat mode, such that they scroll up
instead of down, we have to use column-reverse layout, which
|
︙ | | |
Changes to src/sync.c.
︙ | | |
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
|
317
318
319
320
321
322
323
324
325
326
327
328
329
330
|
-
|
** "configuration pull" command to pull website configuration details.
**
** If URL is not specified, then the URL from the most recent clone, push,
** pull, remote, or sync command is used. See "fossil help clone" for
** details on the URL formats.
**
** Options:
**
** --all Pull from all remotes, not just the default
** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol,
** if required by the remote website
** --from-parent-project Pull content from the parent project
** --ipv4 Use only IPv4, not IPv6
** --no-http-compression Do not compress HTTP traffic
** --once Do not remember URL for subsequent syncs
|
︙ | | |
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
|
371
372
373
374
375
376
377
378
379
380
381
382
383
384
|
-
|
** push" command to push website configuration details.
**
** If URL is not specified, then the URL from the most recent clone, push,
** pull, remote, or sync command is used. See "fossil help clone" for
** details on the URL formats.
**
** Options:
**
** --all Push to all remotes, not just the default
** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol,
** if required by the remote website
** --ipv4 Use only IPv4, not IPv6
** --no-http-compression Do not compress HTTP traffic
** --once Do not remember URL for subsequent syncs
** --proxy PROXY Use the specified HTTP proxy
|
︙ | | |
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
|
419
420
421
422
423
424
425
426
427
428
429
430
431
432
|
-
|
** edits to wiki pages, tickets, forum posts, and technical notes.
**
** If URL is not specified, then the URL from the most recent clone, push,
** pull, remote, or sync command is used. See "fossil help clone" for
** details on the URL formats.
**
** Options:
**
** --all Sync with all remotes, not just the default
** -B|--httpauth USER:PASS Credentials for the simple HTTP auth protocol,
** if required by the remote website
** --ipv4 Use only IPv4, not IPv6
** --no-http-compression Do not compress HTTP traffic
** --once Do not remember URL for subsequent syncs
** --proxy PROXY Use the specified HTTP proxy
|
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
** Usage: %fossil remote ?SUBCOMMAND ...?
**
** View or modify the URLs of remote repositories used for syncing.
** The "default" remote is specially named by Fossil and corresponds to
** the URL used in the most recent "sync", "push", "pull", "clone", or
** similar command. As such, the default remote can be updated by
** Fossil with each sync command. Other named remotes are persistent.
**
** > fossil remote
**
** With no arguments, this command shows the current default remote
** URL. If there is no default, it shows "off".
**
** > fossil remote add NAME URL
**
** Add a new named URL. Afterwards, NAME can be used as a short
** symbolic name for URL in contexts where a URL is required. The
** URL argument can be "default" or a prior symbolic name to make
** a copy of an existing URL under the new NAME. The "default"
** remote cannot be defined with this subcommand; instead,
** use 'fossil remote REF' as documented below.
**
** > fossil remote config-data
**
** DEBUG USE ONLY - Show the name and value of every CONFIG table
** entry in the repository that is associated with the remote URL store.
** Passwords are obscured in the output.
**
** > fossil remote delete NAME
**
** Delete a named URL previously created by the "add" subcommand.
**
** > fossil remote hyperlink ?FILENAME? ?LINENUM? ?LINENUM?
**
** Print a URL that will access the current checkout on the remote
** repository. Or if the FILENAME argument is included, print the
** URL to access that particular file within the current checkout.
** If one or two linenumber arguments are provided after the filename,
** then the URL is for the line or range of lines specified.
**
** > fossil remote list|ls
**
** Show all remote repository URLs.
**
** > fossil remote off
**
** Forget the default URL. This disables autosync.
**
** This is a convenient way to enter "airplane mode". To enter
** airplane mode, first save the current default URL, then turn the
** default off. Perhaps like this:
**
** fossil remote add main default
** fossil remote off
**
** To exit airplane mode and turn autosync back on again:
**
** fossil remote main
**
** > fossil remote scrub
**
** Forget any saved passwords for remote repositories, but continue
** to remember the URLs themselves. You will be prompted for the
** password the next time it is needed.
**
** > fossil remote ui ?FILENAME? ?LINENUM? ?LINENUM?
**
** Bring up a web browser pointing at the remote repository, and
** specifically to the page that describes the current checkout
** on that remote repository. Or if FILENAME and/or LINENUM arguments
** are provided, to the specific file and range of lines. This
** command is similar to "fossil remote hyperlink" except that instead
** of printing the URL, it passes the URL off to the web browser.
**
** > fossil remote REF
**
** Make REF the new default URL, replacing the prior default.
** REF may be a URL or a NAME from a prior "add".
*/
void remote_url_cmd(void){
char *zUrl, *zArg;
int nArg;
db_find_and_open_repository(0, 0);
|
︙ | | |
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
|
795
796
797
798
799
800
801
802
803
804
805
806
807
808
|
-
|
** is safe to run "fossil backup" on a repository that is in active use.
**
** Only the main repository database is backed up by this command. The
** open checkout file (if any) is not saved. Nor is the global configuration
** database.
**
** Options:
**
** --overwrite OK to overwrite an existing file
** -R NAME Filename of the repository to backup
*/
void backup_cmd(void){
char *zDest;
int bOverwrite = 0;
db_find_and_open_repository(OPEN_ANY_SCHEMA, 0);
|
︙ | | |
Changes to src/tag.c.
︙ | | |
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
|
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
|
-
-
|
/*
** COMMAND: tag
**
** Usage: %fossil tag SUBCOMMAND ...
**
** Run various subcommands to control tags and properties.
**
** > fossil tag add ?OPTIONS? TAGNAME ARTIFACT-ID ?VALUE?
**
** Add a new tag or property to an artifact referenced by
** ARTIFACT-ID. For checkins, the tag will be usable instead
** of a CHECK-IN in commands such as update and merge. If the
** --propagate flag is present and ARTIFACT-ID refers to a
** wiki page, forum post, technote, or check-in, the tag
** propagates to all descendants of that artifact.
**
|
︙ | | |
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
|
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
|
-
-
-
-
-
-
|
** The --date-override and --user-override options support
** importing history from other SCM systems. DATETIME has
** the form 'YYYY-MMM-DD HH:MM:SS'.
**
** Note that fossil uses some tag prefixes internally and this
** command will reject tags with these prefixes to avoid
** causing problems or confusion: "wiki-", "tkt-", "event-".
**
** > fossil tag cancel ?--raw? TAGNAME ARTIFACT-ID
**
** Remove the tag TAGNAME from the artifact referenced by
** ARTIFACT-ID, and also remove the propagation of the tag to
** any descendants. Use the the -n|--dry-run option to see
** what would have happened. Certain tag name prefixes are
** forbidden, as documented for the 'add' subcommand.
**
** Options:
** --raw Raw tag name. Ignored for
** non-CHECK-IN artifacts.
** --date-override DATETIME Set date and time deleted.
** --user-override USER Name USER when deleting the tag.
** -n|--dry-run Display the control artifact, but do
** not insert it into the database.
**
** > fossil tag find ?OPTIONS? TAGNAME
**
** List all objects that use TAGNAME.
**
** Options:
** --raw Interprets tag as a raw name instead of a
** branch name and matches any type of artifact.
** Changes the output to include only the
** hashes of matching objects.
** -t|--type TYPE One of: ci (check-in), w (wiki),
** e (event/technote), f (forum post),
** t (ticket). Default is all types. Ignored
** if --raw is used.
** -n|--limit N Limit to N results.
**
** > fossil tag list|ls ?OPTIONS? ?ARTIFACT-ID?
**
** List all tags or, if ARTIFACT-ID is supplied, all tags and
** their values for that artifact. The tagtype option accepts
** one of: propagated, singleton, cancel. For historical
** scripting compatibility, the internal tag types "wiki-",
** "tkt-", and "event-" (technote) are elided by default
** unless the --raw or --prefix options are used.
**
|
︙ | | |
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
|
737
738
739
740
741
742
743
744
745
746
747
748
749
750
|
-
|
** This is an experts-only command. It is used to patch up a repository
** that has been damaged by a shun or that has been pieced together from
** two or more separate repositories. You should never need to reparent
** during normal operations.
**
** Reparenting is accomplished by adding a parent tag. So to undo the
** reparenting operation, simply delete the tag.
**
** --test Make database entries but do not add the tag artifact.
** So the reparent operation will be undone by the next
** "fossil rebuild" command.
** -n|--dry-run Print the tag that would have been created but do not
** actually change the database in any way.
** --date-override DATETIME Set the change time on the control artifact
** --user-override USER Set the user name on the control artifact
|
︙ | | |
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
|
830
831
832
833
834
835
836
837
838
839
840
841
842
843
|
-
|
/*
** WEBPAGE: /tagtimeline
**
** Render a timeline with all check-ins that contain non-propagating
** symbolic tags.
**
** Query parameters:
**
** ng No graph
** nohidden Hide check-ins with "hidden" tag
** onlyhidden Show only check-ins with "hidden" tag
** brbg Background color by branch name
** ubg Background color by user name
*/
void tagtimeline_page(void){
|
︙ | | |
Changes to src/tar.c.
︙ | | |
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
|
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
|
-
-
-
-
|
**
** /tarball/release/xyz.tar.gz
** /tarball?r=release&name=xyz.tar.gz
** /tarball/xyz.tar.gz?r=release
** /tarball?name=release/xyz.tar.gz
**
** Query parameters:
**
** name=NAME[.tar.gz] The base name of the output file. The default
** value is a configuration parameter in the project
** settings. A prefix of the name, omitting the
** extension, is used as the top-most directory name.
**
** r=TAG The check-in that is turned into a compressed tarball.
** Defaults to "trunk". This query parameter used to
** be called "uuid" and "uuid" is still accepted for
** backwards compatibility. If the name= query parameter
** contains one "/" character then the part before the /
** is the TAG and the part after the / is the true name.
** If no TAG is specified by any of the above means, then
** "trunk" is used as the default.
**
** in=PATTERN Only include files that match the comma-separate
** list of GLOB patterns in PATTERN, as with ex=
**
** ex=PATTERN Omit any file that match PATTERN. PATTERN is a
** comma-separated list of GLOB patterns, where each
** pattern can optionally be quoted using ".." or '..'.
** Any file matching both ex= and in= is excluded.
*/
void tarball_page(void){
int rid;
|
︙ | | |
Changes to src/th_main.c.
︙ | | |
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
|
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
|
-
|
** Usage: %fossil test-th-render FILE
**
** Read the content of the file named "FILE" as if it were a header or
** footer or ticket rendering script, evaluate it, and show the results
** on standard output.
**
** Options:
**
** --cgi Include a CGI response header in the output
** --http Include an HTTP response header in the output
** --open-config Open the configuration database
** --set-anon-caps Set anonymous login capabilities
** --set-user-caps Set user login capabilities
** --th-trace Trace TH1 execution (for debugging purposes)
*/
|
︙ | | |
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
|
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
|
-
|
** Usage: %fossil test-th-eval SCRIPT
**
** Evaluate SCRIPT as if it were a header or footer or ticket rendering
** script and show the results on standard output. SCRIPT may be either
** a filename or a string of th1 script code.
**
** Options:
**
** --cgi Include a CGI response header in the output
** --http Include an HTTP response header in the output
** --open-config Open the configuration database
** --set-anon-caps Set anonymous login capabilities
** --set-user-caps Set user login capabilities
** --th-trace Trace TH1 execution (for debugging purposes)
*/
|
︙ | | |
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
|
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
|
-
|
** Usage: %fossil test-th-source FILE
**
** Evaluate the contents of the file named "FILE" as if it were a header
** or footer or ticket rendering script and show the results on standard
** output.
**
** Options:
**
** --cgi Include a CGI response header in the output
** --http Include an HTTP response header in the output
** --open-config Open the configuration database
** --set-anon-caps Set anonymous login capabilities
** --set-user-caps Set user login capabilities
** --th-trace Trace TH1 execution (for debugging purposes)
** --no-print-result Do not output the final result. Use if it
|
︙ | | |
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
|
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
|
-
-
-
-
|
** recognized by Fossil. The FLAGS argument will be used to set the value
** of the "cmd_flags" and/or "web_flags" TH1 variables, if applicable. The
** TYPE argument must be one of the following:
**
** cmdhook Executes the TH1 procedure [command_hook], after
** setting the TH1 variables "cmd_name", "cmd_args",
** and "cmd_flags" to appropriate values.
**
** cmdnotify Executes the TH1 procedure [command_notify], after
** setting the TH1 variables "cmd_name", "cmd_args",
** and "cmd_flags" to appropriate values.
**
** webhook Executes the TH1 procedure [webpage_hook], after
** setting the TH1 variables "web_name", "web_args",
** and "web_flags" to appropriate values.
**
** webnotify Executes the TH1 procedure [webpage_notify], after
** setting the TH1 variables "web_name", "web_args",
** and "web_flags" to appropriate values.
**
** Options:
**
** --cgi Include a CGI response header in the output
** --http Include an HTTP response header in the output
** --th-trace Trace TH1 execution (for debugging purposes)
*/
void test_th_hook(void){
int rc = TH_OK;
int nResult = 0;
|
︙ | | |
Changes to src/timeline.c.
︙ | | |
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
|
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
|
-
+
|
/* For technotes, make a graph node with nParent==(-1). This will
** not actually draw anything on the graph, but it will set the
** background color of the timeline entry */
gidx = graph_add_row(pGraph, rid, -1, 0, 0, zBr, zBgClr, zUuid, 0);
@ <div id="m%d(gidx)" class="tl-nodemark"></div>
}
@</td>
if( !isSelectedOrCurrent ){
if( !isSelectedOrCurrent && gidx>0 ){
@ <td class="timeline%s(zStyle)Cell%s(zExtraClass)" id='mc%d(gidx)'>
}else{
@ <td class="timeline%s(zStyle)Cell%s(zExtraClass)">
}
if( pGraph ){
if( zType[0]=='e' ){
@ <b>Note:</b>
|
︙ | | |
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
|
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
|
-
+
|
** Example: "(check-in: [abcdefg], user: drh, tags: trunk)"
*/
if( drawDetailEllipsis ){
@ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \
@ data-id='%d(rid)'>...</span>
}
if( tmFlags & TIMELINE_COLUMNAR ){
if( !isSelectedOrCurrent ){
if( !isSelectedOrCurrent && gidx>0 ){
@ <td class="timelineDetailCell%s(zExtraClass)" id='md%d(gidx)'>
}else{
@ <td class="timelineDetailCell%s(zExtraClass)">
}
}
if( tmFlags & TIMELINE_COMPACT ){
cgi_printf("<span class='clutter' id='detail-%d'>",rid);
|
︙ | | |
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
|
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
|
-
+
|
** on the timeline.
*/
static void timeline_y_submenu(int isDisabled){
static int i = 0;
static const char *az[16];
if( i==0 ){
az[0] = "all";
az[1] = "Any Type";
az[1] = "Any";
i = 2;
if( g.perm.Read ){
az[i++] = "ci";
az[i++] = "Check-ins";
az[i++] = "g";
az[i++] = "Tags";
}
|
︙ | | |
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
|
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
|
-
+
|
if( g.perm.RdForum ){
az[i++] = "f";
az[i++] = "Forum";
}
assert( i<=count(az) );
}
if( i>2 ){
style_submenu_multichoice("y", i/2, az, isDisabled);
style_submenu_multichoice("y", "Elements", i/2, az, isDisabled);
}
}
/*
** Return the default value for the "ss" cookie or query parameter.
** The "ss" cookie determines the graph style. See the
** timeline_view_styles[] global constant for a list of choices.
|
︙ | | |
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
|
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
|
-
-
-
-
-
+
+
+
+
+
+
|
return tmFlags;
}
/* Available timeline display styles, together with their y= query
** parameter names.
*/
const char *const timeline_view_styles[] = {
"m", "Modern View",
"j", "Columnar View",
"c", "Compact View",
"v", "Verbose View",
"x", "Classic View",
"m", "Modern",
"j", "Columnar",
"c", "Compact",
"v", "Verbose",
"x", "Classic",
};
#if INTERFACE
# define N_TIMELINE_VIEW_STYLE 5
#endif
/*
** Add the select/option box to the timeline submenu that is used to
** set the ss= parameter that determines the viewing mode.
**
** Return the TIMELINE_* value appropriate for the view-style.
*/
int timeline_ss_submenu(void){
cookie_link_parameter("ss","ss",timeline_default_ss());
style_submenu_multichoice("ss",
"View",
N_TIMELINE_VIEW_STYLE,
timeline_view_styles, 0);
return timeline_ss_cookie();
}
/*
** If the zChng string is not NULL, then it should be a comma-separated
|
︙ | | |
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
|
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
|
-
|
}
/*
** WEBPAGE: timeline
**
** Query parameters:
**
** a=TIMEORTAG Show events after TIMEORTAG
** b=TIMEORTAG Show events before TIMEORTAG
** c=TIMEORTAG Show events that happen "circa" TIMEORTAG
** cf=FILEHASH Show events around the time of the first use of
** the file with FILEHASH
** m=TIMEORTAG Highlight the event at TIMEORTAG, or the closest available
** event if TIMEORTAG is not part of the timeline. If
|
︙ | | |
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
|
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
|
-
+
|
/* If both p= and d= are set, we don't have the uuid of d yet. */
zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid);
}
}
if( advancedMenu ){
style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0);
}
style_submenu_entry("n","Max:",4,0);
style_submenu_entry("n","Max",4,0);
timeline_y_submenu(1);
}else if( f_rid && g.perm.Read ){
/* If f= is present, ignore all other parameters other than n= */
char *zUuid;
db_multi_exec(
"CREATE TEMP TABLE IF NOT EXISTS ok(rid INTEGER PRIMARY KEY);"
"INSERT INTO ok VALUES(%d);"
|
︙ | | |
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
|
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
|
-
+
-
-
+
+
|
}
if( advancedMenu ){
if( zType[0]=='a' || zType[0]=='c' ){
style_submenu_checkbox("unhide", "Unhide", 0, 0);
}
style_submenu_checkbox("v", "Files",(zType[0]!='a' && zType[0]!='c'),0);
}
style_submenu_entry("n","Max:",4,0);
style_submenu_entry("n","Max",4,0);
timeline_y_submenu(disableY);
if( advancedMenu ){
style_submenu_entry("t", "Tag Filter:", -8, 0);
style_submenu_multichoice("ms", count(azMatchStyles)/2,azMatchStyles,0);
style_submenu_entry("t", "Tag Filter", -8, 0);
style_submenu_multichoice("ms", "Match Style", count(azMatchStyles)/2,azMatchStyles,0);
}
}
blob_zero(&cond);
}
if( PB("showsql") ){
@ <pre>%h(blob_sql_text(&sql))</pre>
}
|
︙ | | |
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
|
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
|
-
|
/*
** WEBPAGE: thisdayinhistory
**
** Generate a vanity page that shows project activity for the current
** day of the year for various years in the history of the project.
**
** Query parameters:
**
** today=DATE Use DATE as today's date
*/
void thisdayinhistory_page(void){
static int aYearsAgo[] = { 1, 2, 3, 4, 5, 10, 15, 20, 30, 40, 50, 75, 100 };
const char *zToday;
char *zStartOfProject;
int i;
|
︙ | | |
Changes to src/tkt.c.
︙ | | |
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
|
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
|
-
+
|
}
/*
** WEBPAGE: tktview
** URL: tktview?name=HASH
**
** View a ticket identified by the name= query parameter.
** Other query parameters:
**
** Other query parameters:
** tl Show a timeline of the ticket above the status
*/
void tktview_page(void){
const char *zScript;
char *zFullName;
const char *zUuid = PD("name","");
int showTimeline = P("tl")!=0;
|
︙ | | |
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
|
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
|
-
|
/*
** WEBPAGE: tkttimeline
** URL: /tkttimeline/TICKETUUID
**
** Show the change history for a single ticket in timeline format.
**
** Query parameters:
**
** y=ci Show only check-ins associated with the ticket
*/
void tkttimeline_page(void){
char *zTitle;
const char *zUuid;
int tagid;
char zGlobPattern[50];
|
︙ | | |
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
|
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
|
-
+
+
+
-
-
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
/*
** COMMAND: ticket*
**
** Usage: %fossil ticket SUBCOMMAND ...
**
** Run various subcommands to control tickets
**
** > fossil ticket show (REPORTTITLE|REPORTNR) ?TICKETFILTER? ?OPTIONS?
** Run the ticket report, identified by the report format title
** used in the GUI. The data is written as flat file on stdout,
** using TAB as separator.
**
** Options:
** -l|--limit LIMITCHAR
** -q|--quote
** -l|--limit LIMITCHAR Specify a different separator
** -q|--quote If --quote is used, the tickets are encoded by quoting special
** chars (space -> \\s, tab -> \\t, newline -> \\n, cr -> \\r,
** formfeed -> \\f, vtab -> \\v, nul -> \\0, \\ -> \\\\).
** Otherwise, the simplified encoding as on the show report raw page
** in the GUI is used. This has no effect in JSON mode.
** -R|--repository REPO
**
** Run the ticket report, identified by the report format title
** used in the GUI. The data is written as flat file on stdout,
** using TAB as separator. The separator can be changed using
** the -l or --limit option.
**
** If TICKETFILTER is given on the commandline, the query is
** limited with a new WHERE-condition.
** example: Report lists a column # with the uuid
** TICKETFILTER may be [#]='uuuuuuuuu'
** example: Report only lists rows with status not open
** TICKETFILTER: status != 'open'
**
** If --quote is used, the tickets are encoded by quoting special
** chars (space -> \\s, tab -> \\t, newline -> \\n, cr -> \\r,
** formfeed -> \\f, vtab -> \\v, nul -> \\0, \\ -> \\\\).
** Otherwise, the simplified encoding as on the show report raw page
** in the GUI is used. This has no effect in JSON mode.
**
** Instead of the report title it's possible to use the report
** number; the special report number 0 lists all columns defined in
** the ticket table.
**
** > fossil ticket list fields
** > fossil ticket ls fields
**
** List all fields defined for ticket in the fossil repository.
**
** > fossil ticket list reports
** > fossil ticket ls reports
**
** List all ticket reports defined in the fossil repository.
**
** > fossil ticket set TICKETUUID (FIELD VALUE)+ ?-q|--quote?
** > fossil ticket change TICKETUUID (FIELD VALUE)+ ?-q|--quote?
**
** Change ticket identified by TICKETUUID to set the values of
** each field FIELD to VALUE.
**
** Field names as defined in the TICKET table. By default, these
** names include: type, status, subsystem, priority, severity, foundin,
** resolution, title, and comment, but other field names can be added
** or substituted in customized installations.
**
** If you use +FIELD, the VALUE is appended to the field FIELD. You
** can use more than one field/value pair on the commandline. Using
** --quote enables the special character decoding as in "ticket
** show", which allows setting multiline text or text with special
** characters.
**
** > fossil ticket add FIELD VALUE ?FIELD VALUE .. ? ?-q|--quote?
**
** Like set, but create a new ticket with the given values.
**
** > fossil ticket history TICKETUUID
**
** Show the complete change history for the ticket
**
** Note that the values in set|add are not validated against the
** definitions given in "Ticket Common Script".
*/
void ticket_cmd(void){
int n;
|
︙ | | |
Changes to src/tktsetup.c.
︙ | | |
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
-
-
+
+
|
db_set(zDbField/*works-like:"x"*/, z, 0);
if( xRebuild ) xRebuild();
cgi_redirect("tktsetup");
}
}
@ <form action="%R/%s(g.zPath)" method="post"><div>
login_insert_csrf_secret();
@ <p>%s(zDesc)</p>
@ <textarea name="x" rows="%d(height)" cols="80">%h(z)</textarea>
@ <p><label for="x">%s(zDesc)</label></p>
@ <textarea id="x" name="x" rows="%d(height)" cols="80">%h(z)</textarea>
@ <blockquote><p>
@ <input type="submit" name="submit" value="Apply Changes" />
@ <input type="submit" name="clear" value="Revert To Default" />
@ <input type="submit" name="setup" value="Cancel" />
@ </p></blockquote>
@ </div></form>
@ <hr />
|
︙ | | |
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
|
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
|
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
|
@ set preview 1
@ }
@ </th1>
@ <h1 style="text-align: center;">Enter A New Ticket</h1>
@ <table cellpadding="5">
@ <tr>
@ <td colspan="3">
@ Enter a one-line summary of the ticket:<br />
@ <input type="text" name="title" size="60" value="$<title>" />
@ <label>Enter a one-line summary of the ticket:<br />
@ <input type="text" name="title" size="60" value="$<title>" /></label>
@ </td>
@ </tr>
@
@ <tr>
@ <td align="right">Type:</td>
@ <td align="right"><label for="type">Type:</label></td>
@ <td align="left"><th1>combobox type $type_choices 1</th1></td>
@ <td align="left">What type of ticket is this?</td>
@ </tr>
@
@ <tr>
@ <td align="right">Version:</td>
@ <td align="right"><label for="foundin">Version:</label></td>
@ <td align="left">
@ <input type="text" name="foundin" size="20" value="$<foundin>" />
@ <input type="text" id="foundin" name="foundin" size="20" value="$<foundin>" />
@ </td>
@ <td align="left">In what version or build number do you observe
@ the problem?</td>
@ </tr>
@
@ <tr>
@ <td align="right">Severity:</td>
@ <td align="right"><label for="severity">Severity:</label></td>
@ <td align="left"><th1>combobox severity $severity_choices 1</th1></td>
@ <td align="left">How debilitating is the problem? How badly does the problem
@ affect the operation of the product?</td>
@ </tr>
@
@ <tr>
@ <td align="right">EMail:</td>
@ <td align="right"><label for="private_contact">EMail:</label></td>
@ <td align="left">
@ <input type="text" name="private_contact" value="$<private_contact>"
@ <input type="text" id="private_contact" name="private_contact" value="$<private_contact>"
@ size="30" />
@ </td>
@ <td align="left"><u>Not publicly visible</u>
@ Used by developers to contact you with questions.</td>
@ </tr>
@
@ <tr>
@ <td colspan="3">
@ Enter a detailed description of the problem.
@ <label for="icomment">Enter a detailed description of the problem.</label>
@ For code defects, be sure to provide details on exactly how
@ the problem can be reproduced. Provide as much detail as
@ possible. Format:
@ possible. <label for="mutype">Format:</label>
@ <th1>combobox mutype {HTML {[links only]} Markdown {Plain Text} Wiki} 1</th1>
@ <br />
@ <th1>set nline [linecount $comment 50 10]</th1>
@ <textarea name="icomment" cols="80" rows="$nline"
@ <textarea id="icomment" name="icomment" cols="80" rows="$nline"
@ wrap="virtual" class="wikiedit">$<icomment></textarea><br />
@ </tr>
@
@ <th1>enable_output [info exists preview]</th1>
@ <tr><td colspan="3">
@ Description Preview:<br /><hr />
@ <th1>
|
︙ | | |
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
|
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
|
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
+
-
+
-
-
-
+
+
+
|
@ set mimetype text/plain
@ }
@ submit_ticket
@ set preview 1
@ }
@ </th1>
@ <table cellpadding="5">
@ <tr><td class="tktDspLabel">Title:</td><td>
@ <input type="text" name="title" value="$<title>" size="60" />
@ <tr><td class="tktDspLabel"><label for="title">Title:</label></td><td>
@ <input type="text" id="title" name="title" value="$<title>" size="60" />
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Status:</td><td>
@ <tr><td class="tktDspLabel"><label for="status">Status:</label></td><td>
@ <th1>combobox status $status_choices 1</th1>
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Type:</td><td>
@ <tr><td class="tktDspLabel"><label for="type">Type:</label></td><td>
@ <th1>combobox type $type_choices 1</th1>
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Severity:</td><td>
@ <tr><td class="tktDspLabel"><label for="severity">Severity:</label></td><td>
@ <th1>combobox severity $severity_choices 1</th1>
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Priority:</td><td>
@ <tr><td class="tktDspLabel"><label for="priority">Priority:</label></td><td>
@ <th1>combobox priority $priority_choices 1</th1>
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Resolution:</td><td>
@ <tr><td class="tktDspLabel"><label for="resolution">Resolution:</label></td><td>
@ <th1>combobox resolution $resolution_choices 1</th1>
@ </td></tr>
@
@ <tr><td class="tktDspLabel">Subsystem:</td><td>
@ <tr><td class="tktDspLabel"><label for="subsystem">Subsystem:</label></td><td>
@ <th1>combobox subsystem $subsystem_choices 1</th1>
@ </td></tr>
@
@ <th1>enable_output [hascap e]</th1>
@ <tr><td class="tktDspLabel">Contact:</td><td>
@ <input type="text" name="private_contact" size="40"
@ <tr><td class="tktDspLabel"><label for="private_contact">Contact:</label></td><td>
@ <input type="text" id="private_contact" name="private_contact" size="40"
@ value="$<private_contact>" />
@ </td></tr>
@ <th1>enable_output 1</th1>
@
@ <tr><td class="tktDspLabel">Version Found In:</td><td>
@ <input type="text" name="foundin" size="50" value="$<foundin>" />
@ <tr><td class="tktDspLabel"><label for="foundin">
@ Version Found In:</label></td><td>
@ <input type="text" id="foundin" name="foundin" size="50" value="$<foundin>" />
@ </td></tr>
@
@ <tr><td colspan="2">
@ Append Remark with format
@ <label for="icomment">Append Remark</label> with <label for="mutype">format</label>
@ <th1>combobox mutype {HTML {[links only]} Markdown {Plain Text} Wiki} 1</th1>
@ from
@ <input type="text" name="username" value="$<username>" size="30" />:<br />
@ <textarea name="icomment" cols="80" rows="15"
@ <label for="username">from</label>
@ <input type="text" id="username" name="username" value="$<username>" size="30" />:<br />
@ <textarea id="icomment" name="icomment" cols="80" rows="15"
@ wrap="virtual" class="wikiedit">$<icomment></textarea>
@ </td></tr>
@
@ <th1>enable_output [info exists preview]</th1>
@ <tr><td colspan="2">
@ Description Preview:<br /><hr />
@ <th1>
|
︙ | | |
Changes to src/unversioned.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
|
**
** Unversioned files (UV-files) are artifacts that are synced and are available
** for download but which do not preserve history. Only the most recent version
** of each UV-file is retained. Changes to an UV-file are permanent and cannot
** be undone, so use appropriate caution with this command.
**
** Subcommands:
**
** add FILE ... Add or update one or more unversioned files in
** the local repository so that they match FILEs
** on disk. Changes are not pushed to other
** repositories until the next sync.
**
** add FILE --as UVFILE Add or update a single file named FILE on disk
** and UVFILE in the repository unversioned file
** namespace. This variant of the 'add' command allows
** the name to be different in the repository versus
** what appears on disk, but it only allows adding
** a single file at a time.
**
** cat FILE ... Concatenate the content of FILEs to stdout.
**
** edit FILE Bring up FILE in a text editor for modification.
**
** export FILE OUTPUT Write the content of FILE into OUTPUT on disk
**
** list | ls Show all unversioned files held in the local
** repository. Options:
** repository.
**
** Options:
** --glob PATTERN Show only files that match
** --like PATTERN Show only files that match
** -l Show additional details for
** files that match. Implied
** when 'list' is used.
**
** revert ?URL? Restore the state of all unversioned files in the
** local repository to match the remote repository
** URL.
**
** Options:
** -v|--verbose Extra diagnostic output
** -n|--dry-run Show what would have happened
**
** remove|rm|delete FILE ...
** Remove unversioned files from the local repository.
** Changes are not pushed to other repositories until
** the next sync. Options:
** the next sync.
**
** Options:
** --glob PATTERN Remove files that match
** --like PATTERN Remove files that match
**
** sync ?URL? Synchronize the state of all unversioned files with
** the remote repository URL. The most recent version
** of each file is propagated to all repositories and
** all prior versions are permanently forgotten.
**
** Options:
** -v|--verbose Extra diagnostic output
** -n|--dry-run Show what would have happened
**
** touch FILE ... Update the TIMESTAMP on all of the listed files
**
** Options:
**
** --mtime TIMESTAMP Use TIMESTAMP instead of "now" for the "add",
** "edit", "remove", and "touch" subcommands.
** -R|--repository REPO Use FILE as the repository
*/
void unversioned_cmd(void){
const char *zCmd;
int nCmd;
|
︙ | | |
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
|
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
|
-
+
|
}
}
/*
** WEBPAGE: uvlist
**
** Display a list of all unversioned files in the repository.
** Query parameters:
**
** Query parameters:
** byage=1 Order the initial display be decreasing age
** showdel=0 Show deleted files
*/
void uvlist_page(void){
Stmt q;
sqlite3_int64 iNow;
sqlite3_int64 iTotalSz = 0;
|
︙ | | |
Changes to src/user.c.
︙ | | |
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
|
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
|
-
-
-
-
-
-
-
-
-
-
-
-
|
/*
** COMMAND: user*
**
** Usage: %fossil user SUBCOMMAND ... ?-R|--repository REPO?
**
** Run various subcommands on users of the open repository or of
** the repository identified by the -R or --repository option.
**
** > fossil user capabilities USERNAME ?STRING?
**
** Query or set the capabilities for user USERNAME
**
** > fossil user contact USERNAME ?CONTACT-INFO?
**
** Query or set contact information for user USERNAME
**
** > fossil user default ?USERNAME?
**
** Query or set the default user. The default user is the
** user for command-line interaction.
**
** > fossil user list
** > fossil user ls
**
** List all users known to the repository
**
** > fossil user new ?USERNAME? ?CONTACT-INFO? ?PASSWORD?
**
** Create a new user in the repository. Users can never be
** deleted. They can be denied all access but they must continue
** to exist in the database.
**
** > fossil user password USERNAME ?PASSWORD?
**
** Change the web access password for a user.
*/
void user_cmd(void){
int n;
db_find_and_open_repository(0, 0);
if( g.argc<3 ){
usage("capabilities|contact|default|list|new|password ...");
|
︙ | | |
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
|
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
|
-
-
-
-
-
|
** COMMAND: test-prompt-password
**
** Usage: %fossil test-prompt-password PROMPT VERIFY
**
** Prompts the user for a password and then prints it verbatim.
**
** Behavior is controlled by the VERIFY parameter:
**
** 0 Just ask once.
**
** 1 If the first answer is a non-empty string, ask for
** verification. Repeat if the two strings do not match.
**
** 2 Ask twice, repeat if the strings do not match.
*/
void test_prompt_password_cmd(void){
Blob answer;
int iVerify = 0;
if( g.argc!=4 ) usage("PROMPT VERIFY");
iVerify = atoi(g.argv[3]);
prompt_for_password(g.argv[2], &answer, iVerify);
fossil_print("[%s]\n", blob_str(&answer));
}
/*
** WEBPAGE: access_log
**
** Show login attempts, including timestamp and IP address.
** Requires Admin privileges.
**
** Query parameters:
**
** y=N 1: success only. 2: failure only. 3: both (default: 3)
** n=N Number of entries to show (default: 200)
** o=N Skip this many entries (default: 0)
*/
void access_log_page(void){
int y = atoi(PD("y","3"));
int n = atoi(PD("n","200"));
|
︙ | | |
Changes to src/wiki.c.
︙ | | |
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
|
521
522
523
524
525
526
527
528
529
530
531
532
533
534
|
-
|
/*
** WEBPAGE: wiki
**
** Display a wiki page. Example: /wiki?name=PAGENAME
**
** Query parameters:
**
** name=NAME Name of the wiki page to display. Required.
** nsm Omit the submenu if present. (Mnemonic: No SubMenu)
** p Always show just the wiki page. For special
** pages for check-ins, branches, or tags, there will
** be a redirect to the associated /info page unless
** this query parameter is present.
** popup Suppress the header and footer and other page
|
︙ | | |
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
|
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
|
-
+
|
/*
** Output a selection box from which the user can select the
** wiki mimetype.
*/
void mimetype_option_menu(const char *zMimetype){
unsigned i;
@ <select name="mimetype" size="1">
@ <select id="mimetype" name="mimetype" size="1">
for(i=0; i<count(azStyles); i+=3){
if( fossil_strcmp(zMimetype,azStyles[i])==0 ){
@ <option value="%s(azStyles[i])" selected>%s(azStyles[i+1])</option>
}else{
@ <option value="%s(azStyles[i])">%s(azStyles[i+1])</option>
}
}
|
︙ | | |
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
|
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
|
-
+
-
+
|
"data-tab-parent='wikiedit-tabs' "
"data-tab-label='Editor' "
"class='hidden'"
">");
CX("<div class='"
"wikiedit-options flex-container flex-row child-gap-small'>");
CX("<div class='input-with-label'>"
"<label>Mime type</label>");
"<label>Mime type ");
mimetype_option_menu("text/x-markdown");
CX("</div>");
CX("</label></div>");
style_select_list_int("select-font-size",
"editor_font_size", "Editor font size",
NULL/*tooltip*/,
100,
"100%", 100, "125%", 125,
"150%", 150, "175%", 175,
"200%", 200, NULL);
|
︙ | | |
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
|
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
|
-
+
|
"a few seconds or it will not reload."
"</div>"
"</div>");
CX("</div>");
CX("<div class='flex-container flex-column stretch'>");
CX("<textarea name='content' id='wikiedit-content-editor' "
"class='wikiedit' rows='25'>");
"class='wikiedit' rows='25' aria-label='Content' title='Content'>");
CX("</textarea>");
CX("</div>"/*textarea wrapper*/);
CX("</div>"/*#tab-file-content*/);
}
/****** Preview tab ******/
{
CX("<div id='wikiedit-tab-preview' "
|
︙ | | |
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
|
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
|
-
-
-
+
+
+
+
+
-
+
|
}
style_set_current_feature("wiki");
style_header("Create A New Wiki Page");
wiki_standard_submenu(W_ALL_BUT(W_NEW));
@ <p>Rules for wiki page names:</p>
well_formed_wiki_name_rules();
form_begin(0, "%R/wikinew");
@ <p>Name of new wiki page:
@ <input style="width: 35;" type="text" name="name" value="%h(zName)" /><br />
@ %z(href("%R/markup_help"))Markup style</a>:
@ <p><label>Name of new wiki page:
@ <input style="width: 35;" type="text" name="name" value="%h(zName)" /></label><br />
@ <label>Markup style
@ %z(href("%R/markup_help"))
@ <span class="help-buttonlet processed" title="Help"></span></a>:
mimetype_option_menu("text/x-markdown");
@ <br /><input type="submit" value="Create" />
@ </label><br /><input type="submit" value="Create" />
@ </p></form>
if( zName[0] ){
@ <p><span class="wikiError">
@ "%h(zName)" is not a valid wiki page name!</span></p>
}
style_finish_page();
}
|
︙ | | |
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
|
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
|
-
-
+
+
-
+
-
+
-
|
blob_reset(&preview);
}
zUser = PD("u", g.zLogin);
form_begin(0, "%R/wikiappend");
login_insert_csrf_secret();
@ <input type="hidden" name="name" value="%h(zPageName)" />
@ <input type="hidden" name="mimetype" value="%h(zMimetype)" />
@ Your Name:
@ <input type="text" name="u" size="20" value="%h(zUser)" /><br />
@ <label>Your Name:
@ <input type="text" name="u" size="20" value="%h(zUser)" /></label><br />
zFormat = mimetype_common_name(zMimetype);
@ Comment to append (formatted as %s(zFormat)):<br />
@ <label>Comment to append (formatted as %s(zFormat)):<br />
@ <textarea name="r" class="wikiedit" cols="80"
@ rows="10" wrap="virtual">%h(PD("r",""))</textarea>
@ rows="10" wrap="virtual">%h(PD("r",""))</textarea></label>
@ <br />
@ <input type="submit" name="preview" value="Preview Your Comment" />
@ <input type="submit" name="submit" value="Append Your Changes" />
@ <input type="submit" name="cancel" value="Cancel" />
captcha_generate(0);
@ </form>
manifest_destroy(pWiki);
style_finish_page();
}
/*
** WEBPAGE: whistory
** URL: /whistory?name=PAGENAME
**
** Additional parameters:
**
** showid Show RID values
**
** Show the complete change history for a single wiki page.
*/
void whistory_page(void){
Stmt q;
const char *zPageName;
|
︙ | | |
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
|
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
|
-
|
/*
** WEBPAGE: wdiff
**
** Show the changes to a wiki page.
**
** Query parameters:
**
** id=HASH Hash prefix for the child version to be diffed.
** rid=INTEGER RecordID for the child version
** pid=HASH Hash prefix for the parent.
**
** The "id" query parameter is required. "pid" is optional. If "pid"
** is omitted, then the diff is against the first parent of the child.
*/
|
︙ | | |
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
|
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
|
-
-
-
-
|
/*
** COMMAND: wiki*
**
** Usage: %fossil wiki (export|create|commit|list) WikiName
**
** Run various subcommands to work with wiki entries or tech notes.
**
** > fossil wiki export ?OPTIONS? PAGENAME ?FILE?
** > fossil wiki export ?OPTIONS? -t|--technote DATETIME|TECHNOTE-ID|TAG ?FILE?
**
** Sends the latest version of either a wiki page or of a tech
** note to the given file or standard output. A filename of "-"
** writes the output to standard output. The directory parts of
** the output filename are created if needed.
** If PAGENAME is provided, the named wiki page will be output.
**
** Options:
** -t|--technote DATETIME|TECHNOTE-ID|TAG
** Specifies that a technote, rather than a wiki page,
** will be exported. If DATETIME is used, the most
** recently modified tech note with that DATETIME will
** output. If TAG is used, the most recently modified
** tech note with that TAG will be output.
** -h|--html The body (only) is rendered in HTML form, without
** any page header/foot or HTML/BODY tag wrappers.
** -H|--HTML Works like -h|-html but wraps the output in
** <html><body>...</body></html>.
** -p|--pre If -h|-H is used and the page or technote has
** the text/plain mimetype, its HTML-escaped output
** will be wrapped in <pre>...</pre>.
**
** > fossil wiki (create|commit) (PAGENAME | TECHNOTE-COMMENT) ?FILE? ?OPTIONS?
**
** Create a new or commit changes to an existing wiki page or
** technote from FILE or from standard input. PAGENAME is the
** name of the wiki entry. TECHNOTE-COMMENT is the timeline comment of
** the technote.
**
** Options:
** -M|--mimetype TEXT-FORMAT The mime type of the update.
|
︙ | | |
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
|
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
|
-
-
-
|
** will be updated.
** -t|--technote TECHNOTE-ID Specifies the technote to be
** updated by its technote id, which is
** its UUID.
** --technote-tags TAGS The set of tags for a technote.
** --technote-bgcolor COLOR The color used for the technote
** on the timeline.
**
** > fossil wiki list ?OPTIONS?
** > fossil wiki ls ?OPTIONS?
**
** Lists all wiki entries, one per line, ordered
** case-insensitively by name. Wiki pages associated with
** check-ins and branches are NOT shown, unless -a is given.
**
** Options:
** --all Include "deleted" pages in output.
** By default deleted pages are elided.
** -t|--technote Technotes will be listed instead of
** pages. The technotes will be in order
** of timestamp with the most recent
** first.
** -a|--show-associated Show wiki pages associated with
** check-ins and branches.
** -s|--show-technote-ids The id of the tech note will be listed
** along side the timestamp. The tech note
** id will be the first word on each line.
** This option only applies if the
** --technote option is also specified.
**
** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in
** year-month-day form, it may be truncated, the "T" may be replaced by
** a space, and it may also name a timezone offset from UTC as "-HH:MM"
** (westward) or "+HH:MM" (eastward). Either no timezone suffix or "Z"
** means UTC.
**
** The "Sandbox" wiki pseudo-page is a special case. Its name is
|
︙ | | |
Changes to src/wikiformat.c.
︙ | | |
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
|
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
|
-
+
|
/*
** COMMAND: test-markdown-render
**
** Usage: %fossil test-markdown-render FILE ...
**
** Render markdown in FILE as HTML on stdout.
** Options:
**
** Options:
** --safe Restrict the output to use only "safe" HTML
** --lint-footnotes Print stats for footnotes-related issues
*/
void test_markdown_render(void){
Blob in, out;
int i;
int bSafe = 0, bFnLint = 0;
|
︙ | | |
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
|
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
|
-
|
/*
** SETTING: safe-html width=8
** This setting controls whether or not unsafe HTML elements
** (such as SCRIPT or STYLE tags) are allowed in Markdown-formatted
** documents. Unsafe HTML is disabled by default. If this setting
** exists and is a string, then letters in that string can enable
** unsafe HTML in various contexts:
**
** - b Unsafe HTML allowed in embedded documentation
** - f Unsafe HTML allowed in forum posts
** - t Unsafe HTML allowed in tickets
** - w Unsafe HTML allowed on wiki pages
*/
/*
** The input blob contains HTML. If safe-html is enabled, then
|
︙ | | |
Changes to src/xfer.c.
︙ | | |
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
|
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
|
-
|
** The complete HTTP requests are stored in files named "http-request-N.txt".
** Find one of those requests, remove the HTTP header, and make other edits
** as necessary to generate an appropriate XFERFILE test case. Then run:
**
** fossil test-xfer xferfile.txt
**
** Options:
**
** --host HOSTNAME Supply a server hostname used to populate
** g.zBaseURL and similar.
*/
void cmd_test_xfer(void){
const char *zHost;
db_find_and_open_repository(0,0);
zHost = find_option("host",0,1);
|
︙ | | |
Changes to src/xfersetup.c.
︙ | | |
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
-
-
+
+
|
db_set(zDbField/*works-like:"x"*/, z, 0);
if( xRebuild ) xRebuild();
cgi_redirect("xfersetup");
}
}
@ <form action="%R/%s(g.zPath)" method="post"><div>
login_insert_csrf_secret();
@ <p>%s(zDesc)</p>
@ <textarea name="x" rows="%d(height)" cols="80">%h(z)</textarea>
@ <p><label for="x">%s(zDesc)</label></p>
@ <textarea id="x" name="x" rows="%d(height)" cols="80">%h(z)</textarea>
@ <p>
@ <input type="submit" name="submit" value="Apply Changes" />
@ <input type="submit" name="clear" value="Revert To Default" />
@ <input type="submit" name="setup" value="Cancel" />
@ </p>
@ </div></form>
if ( zDfltValue ){
|
︙ | | |
Changes to src/zip.c.
︙ | | |
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
|
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
|
-
-
-
-
-
|
**
** Generate a ZIP or SQL archive for the check-in specified by the "r"
** query parameter. Return the archive as the HTTP reply content.
**
** If the NAME contains one "/" then the part before the "/" is taken
** as the TAG and the part after the "/" becomes the true name. Hence,
** the following URLs are all equivalent:
**
** /sqlar/508c42a6398f8/download.sqlar
** /sqlar?r=508c42a6398f8&name=download.sqlar
** /sqlar/download.sqlar?r=508c42a6398f8
** /sqlar?name=508c42a6398f8/download.sqlar
**
** Query parameters:
**
** name=NAME The base name of the output file. The default
** value is a configuration parameter in the project
** settings. A prefix of the name, omitting the
** extension, is used as the top-most directory name.
**
** r=TAG The check-in that is turned into a ZIP archive.
** Defaults to "trunk". This query parameter used to
** be called "uuid" and the older "uuid" name is still
** accepted for backwards compatibility. If this
** query parameter is omitted, the latest "trunk"
** check-in is used.
**
** in=PATTERN Only include files that match the comma-separate
** list of GLOB patterns in PATTERN, as with ex=
**
** ex=PATTERN Omit any file that match PATTERN. PATTERN is a
** comma-separated list of GLOB patterns, where each
** pattern can optionally be quoted using ".." or '..'.
** Any file matching both ex= and in= is excluded.
*/
void baseline_zip_page(void){
int rid;
|
︙ | | |
Changes to www/customskin.md.
︙ | | |
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
|
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
|
-
+
-
+
-
+
-
+
|
written in Markdown, leaving all other block quotes alone.
In most cases, it is best to leave the Fossil-generated HTML Header
alone. (One exception is when the administrator needs to include links
to additional CSS files.) The configurable part of the skin begins
with the Content Header section which should follow this template:
<div class="header">
<header class="header">
... top banner and menu bar ...
</div>
Note that `<div class="header">` and `</div>` tags must be included in
Note that `<header class="header">` and `</div>` tags must be included in
the Content Header text of the skin. In other words, you, the
administrator, need to supply that text as part of your skin
customization.
The Fossil-generated Content section immediately follows the Content Header.
The Content section will looks like this:
<div class="content">
... Fossil-generated content here ...
</div>
After the Content is the custom Content Footer section which should
follow this template:
<div class="footer">
<footer class="footer">
... skin-specific stuff here ...
</div>
As with the Content Header, the template elements of the Content Footer
should appear exactly as they are shown.
Finally, Fossil always adds its own footer (unless overridden)
to close out the generated HTML:
</body>
</html>
## <a id="mainmenu"></a>Changing the Main Menu Contents
As of Fossil 2.15, the actual text content of the skin’s main menu is no
longer part of the skin proper if you’re using one of the stock skins.
If you look at the Header section of the skin, you’ll find a
`<div class="mainmenu">` element whose contents are set by a short
`<nav class="mainmenu">` element whose contents are set by a short
[TH1](./th1.md) script from the contents of the **Main Menu** section of
the Setup → Configuration screen.
This feature allows the main menu contents to stay the same across
different skins, so you no longer have to reapply menu customizations
when trying different skins.
|
︙ | | |
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
|
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
|
-
+
-
+
|
* Text of the form "$NAME" or "$<NAME>" is replaced with
the value of the TH1 variable NAME.
For example, first few lines of a typical Content Header will look
like this:
<div class="header">
<header class="header">
<div class="title"><h1>$<project_name></h1>$<title>/div>
After variables are substituted by TH1, that will look more like this:
<div class="header">
<header class="header">
<div class="title"><h1>Project Name</h1>Page Title</div>
As you can see, two TH1 variable substitutions were done.
The same TH1 interpreter is used for both the header and the footer
and for all scripts contained within them both. Hence, any global
TH1 variables that are set by the header are available to the footer.
|
︙ | | |
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
|
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
|
-
+
-
-
+
+
-
+
-
+
|
"builtin_request_js hbmenu.js" asks Fossil to include the "hbmenu.js"
resource files in the Fossil-generated footer.
The hbmenu.js script requires
the following `<div>` element somewhere in your header, in which to build
the hamburger menu.
<div id='hbdrop'></div>
<nav id='hbdrop'></nav>
Out of the box, the contents of the panel is populated with the [Site
Map](/sitemap), but only if the panel does not already contain any HTML
elements (that is, not just comments, plain text or non-presentational white
space). So the hamburger menu can be customized by replacing the empty `<div
id='hbdrop'></div>` element with a menu structure knitted according to the
space). So the hamburger menu can be customized by replacing the empty `<nav
id='hbdrop'></nav>` element with a menu structure knitted according to the
following template:
<div id="hbdrop" data-anim-ms="400">
<nav id="hbdrop" data-anim-ms="400">
<ul class="columns" style="column-width: 20em; column-count: auto">
<!-- NEW GROUP WITH HEADING LINK -->
<li>
<a href="$home$index_page">Link: Home</a>
<ul>
<li><a href="$home/timeline">Link: Timeline</a></li>
<li><a href="$home/dir?ci=tip">Link: File List</a></li>
</ul>
</li>
<!-- NEW GROUP WITH HEADING TEXT -->
<li>
Heading Text
<ul>
<li><a href="$home/doc/trunk/www/customskin.md">Link: Theming</a></li>
<li><a href="$home/doc/trunk/www/th1.md">Link: TH1 Scripts</a></li>
</ul>
</li>
<!-- NEXT GROUP GOES HERE -->
</ul>
</div>
</nav>
The custom `data-anim-ms` attribute can be added to the panel element to direct
the Javascript logic to override the default menu animation duration of 400 ms.
A faster animation duration of 80-200 ms may be preferred for smaller menus. The
animation is disabled by setting the attribute to `"0"`.
|
︙ | | |