11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
-
+
-
-
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
* <tt>[/finfo?name=f-wiki.c|f-wiki]</tt> hopes to one day be a generic wiki manipulation tool.
These applications provide demonstrations of using the library and give devs a place to test new features. <tt>[FossilApp]</tt> provides a mini-framework which takes care of bootstrapping fossil for these applications, making it pretty simple to create new ones. FossilApp handles the CLI parsing, global flags, opening of a repo/checkout, and other "getting started" bits. If you've ever hacked on fossil(1), adding a new f-* app is very similar to adding a new command to fossil, with only a few more lines of bootstrap code (because each "command" is in its own app to simplify testing).
<h2>Demos</h2>
<nowiki><pre>
[stephan@host:~/cvs/fossil/libfossil]$ ./f-wiki ls
# f-wiki ls
Timestamp UUID Name
2013-08-22@22:26:59 86afdaa5 AmalgamationBuild
2013-08-23@18:37:26 e451926f building
2013-08-22@14:54:47 042b30df download
2013-08-24@11:29:34 0f083370 f-tools
2013-08-24@11:01:41 1024fcf8 FossilApp
2013-08-22@18:53:41 8ed8320c home
2013-08-23@17:26:34 327a3ca8 scratchpad
2013-08-01@22:29:49 bfa19f48 th1ish
...
[stephan@host:~/cvs/fossil/f2]$ ./f-tag -a tip -t demo-tag -v "demo for prosperity purposes" --trace-sql
# f-tag -a tip -t demo-tag -v "demo for prosperity purposes" --trace-sql
SQL TRACE #1: SELECT '/home/stephan/cvs/fossil/f2' || '/' || value FROM vvar WHERE name='repository';
SQL TRACE #2: ATTACH DATABASE '/home/stephan/cvs/fossil/f2.fsl' AS repo;
SQL TRACE #3: SELECT julianday('now');
SQL TRACE #4: SELECT objid FROM event WHERE type='ci' ORDER BY event.mtime DESC LIMIT 1;
SQL TRACE #5: SELECT uuid FROM blob WHERE rid=1226;
SQL TRACE #6: SELECT strftime('%Y-%m-%dT%H:%M:%f',2456517.117559);
SQL TRACE #7: BEGIN TRANSACTION;
SQL TRACE #8: SELECT rid, size FROM blob WHERE uuid='daa063582c2cd9d6029a5616f8a05eaa12c1b01b';
SQL TRACE #9: INSERT INTO blob(rcvid,size,uuid,content)<...SNIP...>;
SQL TRACE #10: INSERT OR IGNORE INTO unclustered VALUES(1227);
SQL TRACE #11: COMMIT;
SQL TRACE #12: SELECT 1 FROM private WHERE rid=1226;
SQL TRACE #13: BEGIN TRANSACTION;
SQL TRACE #14: SELECT rid FROM blob WHERE uuid GLOB '2a84ad397a134ca3f278a44f4f969f962eb47a7b*';
SQL TRACE #15: SELECT tagid FROM tag WHERE tagname='demo-tag';
SQL TRACE #16: INSERT INTO tag(tagname) VALUES('demo-tag');
SQL TRACE #17: SELECT 1 FROM tagxref WHERE tagid=30 AND rid=1226 AND mtime>=2456517.11755911;
SQL TRACE #18: REPLACE INTO tagxref(tagid,tagtype,srcId,origid,value,mtime,rid) VALUES(30,1,1227,1226,<...SNIP...>);
SQL TRACE #19: SELECT <...SNIP...> WHERE pid=1226 AND isprim;
SQL TRACE #20: REPLACE INTO event(type,mtime,objid,user,comment)VALUES(<...SNIP...>);
...
SQL TRACE #21: COMMIT;
SQL TRACE #22: DETACH DATABASE repo;
[stephan@host:~/cvs/fossil/f2]$ ./f-timeline -n 1
# f-timeline -n 1
g [daa063582c2c] @ 2013-08-12 16:49:17 by [stephan]
Edit [2a84ad39]: Add "demo-tag" with value "demo for prosperity purposes".
[stephan@host:~/cvs/fossil/f2]$ ./f-timeline -n 1 --trace-sql
# f-timeline -n 1 --trace-sql
SQL TRACE #1: SELECT '/home/stephan/cvs/fossil/f2' || '/' || value FROM vvar WHERE name='repository';
SQL TRACE #2: ATTACH DATABASE '/home/stephan/cvs/fossil/f2.fsl' AS repo;
SQL TRACE #3: SELECT substr(uuid,1,12) AS uuid, <...BIG SNIP...> ORDER BY event.mtime DESC LIMIT 1;
g [daa063582c2c] @ 2013-08-12 16:49:17 by [stephan]
Edit [2a84ad39]: Add "demo-tag" with value "demo for prosperity purposes".
SQL TRACE #4: DETACH DATABASE repo;
[stephan@host:~/cvs/fossil/f2]$ ./f-resolve current prev
# f-resolve current prev
b170fb24fe5d94a5b7fa7a00a9911083bf69b27b 1466 current
1ec904fa6a54b45b0a35cd14bab41af138584e45 1461 prev
</pre></nowiki>
<h2>f-new</h2>
<tt>f-new</tt> can be used to create a new, empty repository, analog to fossil's "new" command. It has one feature fossil(1) does not: it allows the client to specify the commit message for the "initial empty checkin." (Sidebar: the library has a mechanism to disable creation of the initial empty checkin, but fossil/libfossil are largely untested with such repos.)
Example usage:
<nowiki><pre>
# f-new -m 'hi there' --config ../fossil.fsl my.fsl --user fred
Copying configuration from: ../fossil.fsl
Created repository: my.fsl
server-code = a3d6ac6448017382fa1277bbee7e74b96ce385cb
project-code = e0e38c4a0fb01a2ea277ed8af4e5742d68dbdc60
admin-user = fred (password=084fdd)
# f-timeline -R my.fsl
ci [3a661da86ae5] @ 2013-08-28 23:30:39 by [fred] in branch [trunk]
hi there
# f-acat trunk -R my.fsl
C hi\sthere
D 2013-08-28T21:30:39.000
R d41d8cd98f00b204e9800998ecf8427e
T *branch * trunk
T *sym-trunk *
U fred
Z 52ef222ec505c27615d80a8552690272
</nowiki></pre>
<h2>f-tag</h2>
f-tag can be used to add and cancel tags on arbitrary repository artifacts. Tags in fossil are actually key/value pairs, but the value is optional. The ability to tag arbitrary artifacts, including other tags, allows (in principal) for applying arbitrary key/value-pair metadata to arbitrary artifacts. This can be used for a great many things above and beyond what fossil currently uses tags for. For example, tags could be used to implement a simple form of comment thread system, by implementing comments as tags, and replies as tags to those comment tags, ad nauseum.
Anyway... this tool is a very basic test/demonstration of this library which allows one to apply tags to artifacts. It allows some things the current fossil UI/CLI cannot make much sense of or do anything useful with (e.g. tags on tags or "cancel" tags with values), but nothing it does is incompatible with how fossil works internally.
|