fnc

Check-in Differences
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Difference From 0.7 To 0.8

2022-01-09 15:42
[1291047898] Bump version number: 0.9 (user: mark tags: trunk)
2022-01-09 15:32
[ab629f6e73] CHANGES for 0.8 (user: mark tags: trunk, 0.8)
2022-01-09 15:29
[250d2884e8] Fix vertical split regression and DB locking issue. (user: mark tags: trunk)
2022-01-08 13:33
[9918bb8dab] Bump version number: 0.8 (user: mark tags: trunk)
2022-01-08 13:30
[2c45034580] CHANGES for 0.7 (user: mark tags: trunk, 0.7)
2022-01-08 13:10
[277b68b64f] Bump year in license headers (user: mark tags: trunk)

Changes to CHANGES.md.






1
2
3
4
5
6
7
1
2
3
4
5
6
7
8
9
10
11
12
+
+
+
+
+







**fnc 0.8** 2022-01-10

- fix vertical split
- fix DB lock when opening horizontal split that signals the timeline thread

**fnc 0.7** 2022-01-09

- factor out common make(1) and gmake build bits
- make build depend on make file
- make all commands compatible with `-R|--repository` (i.e., no checkout needed)
- implement Vim-like smartcase for commands that filter repository results
- improve timeline arg parsing for more informative output upon invalid input

Changes to README.md.

1
2
3

4
5

6
7
8
9
10
11
12
13

14
15
16
17
18
19
20
21
22
23








24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


41
42
43
44
45
46
47
1
2

3
4

5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46


47
48
49
50
51
52
53
54
55


-
+

-
+







-
+










+
+
+
+
+
+
+
+















-
-
+
+







# README

# fnc 0.6
# fnc 0.7

## An ncurses browser for [Fossil][0] repositories in the terminal.
## An interactive ncurses browser for [Fossil][0] repositories.

`fnc` uses [libfossil][1] to create a [`fossil ui`][2] experience in the
terminal.

Tested and confirmed to run on the following amd64 systems (additional platforms
noted inline):

1. OpenBSD 6.8- and 6.9-release
1. OpenBSD 6.8-, 6.9-, and 7.0-release
2. macOS 10.15.7 (Catalina) and 11.5.2 (Big Sur)
3. Linux Mint 20.2 (32- and 64-bit ARM)
4. Ubuntu 18.04 running Linux kernel 5.11 (32-bit ARM)
5. Debian GNU/Linux 8, 9, and 10
6. CentOS 6.5 (32-bit)

Alpha development notwithstanding, the `timeline`, `diff`, `tree`, `blame`, and
`branch` commands are relatively stable; however, there is no commitment to
refrain from breaking changes.

# Install

* **OpenBSD**
  - `doas pkg_add fnc`
* **macOS**
  - `sudo port install fnc`
* **[Download](/uv/download.html)** and install the binary on your path

# Build

1. clone the repository
  - `fossil clone https://fnc.bsdbox.org`
2. move into the repository checkout
  - `cd fnc`
3. build fnc
  - `make`
4. install the `fnc` binary (*requires privileges*)
  - `doas make install`
5. move into an open Fossil checkout, and run it:
  - `cd ~/museum/repo && fossil open ../repo.fossil && fnc`

This will install the `fnc` executable and man page into `/usr/local/bin` and
`/usr/local/share/man/man1`, respectively. Alternatively, cryptographically
signed binaries for some of the abovementioned platforms are available to
[download][3].
signed tarballs of the source code and binaries for some of the abovementioned
platforms are available to [download][3].

# Doc

See `fnc --help` for a quick reference, and the [fnc(1)][4] manual page for more
comprehensive documentation. In-app help can also be accessed with the `?`,
`F1`, or `H` key binding. The following video briefly demonstrates some of the
key bindings in use.
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
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








-
+








-
-
-
-
-
-
-
+
+
+
+
+
+
+







-
+



















-
[ticket][11]. As a rule, all reports should include a bug reproduction recipe;
that is, either (1) the series of steps beginning with `fossil init` to create a
new repository through to the `fnc` command that triggers the unexpected
behaviour; or, if possible, (2) a shell script that contains all necessary
ingredients to reproduce the problem.

Patches are thoughtfully considered and can be sent to the [mailing list][12].
While `diff -up` patches are preferred, `fossil patch create` and `fossil diff` 
While `diff -up` patches are preferred, `fossil patch create` and `fossil diff`
patches are also welcomed. Please ensure code conforms to the C99 standard,
and complies with OpenBSD's KNF [style(9)][13]. Any patch containing
user-visible code addition, modification, or deletion (i.e., code that impacts
user interfaces) should concomitantly include updating documentation affected
by the change.

# Screenshots

![diff split screen](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-splitscreen.png "fnc diff split screen")
![diff renamed file](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-full-file_renamed.png "fnc diff file renamed")
![diff added file](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-split-file_added.png "fnc diff file added")
![diff removed file](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-split-file-removed.png "fnc diff file removed")
![blame split screen](https://fnc.bsdbox.org/uv/resources/img/fnc-blame-splitscreen.png "fnc blame split screen")
![tree split screen](https://fnc.bsdbox.org/uv/resources/img/fnc-tree-splitscreen.png "fnc tree split screen")
![branch split screen](https://fnc.bsdbox.org/uv/resources/img/fnc-branch-splitscreen.png "fnc branch split screen")
![diff vsplit](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-vsplit.png "diff vertical split")
![diff hsplit renamed](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-hsplit-renamed.png "diff horizontal split file renamed")
![diff vsplit added](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-vsplit-added.png "diff vertical split file added")
![diff vsplit removed](https://fnc.bsdbox.org/uv/resources/img/fnc-diff-vsplit-removed.png "diff vertical split file removed")
![blame vsplit](https://fnc.bsdbox.org/uv/resources/img/fnc-blame-vsplit.png "blame vertical split")
![tree vsplit](https://fnc.bsdbox.org/uv/resources/img/fnc-tree-vsplit.png "tree vertical split")
![branch hsplit](https://fnc.bsdbox.org/uv/resources/img/fnc-branch-hsplit.png "branch horizontal split")
![in-app help](https://fnc.bsdbox.org/uv/resources/img/fnc-inapp_help.png "fnc in-app help")
![timeline help](https://fnc.bsdbox.org/uv/resources/img/fnc-timeline-help.png "fnc timeline help")

# Trivia

**fnc** [fɪŋk]  
*noun* (n.)  
1. an ncurses browser for [Fossil][0] repositories in the terminal  
1. an interactive ncurses browser for [Fossil][0] repositories  
*verb* (v.)  
2. to inform  
etymology  
From the German word *Fink*, meaning "finch", a type of bird.

[0]: https://fossil-scm.org
[1]: https://fossil.wanderinghorse.net/r/libfossil
[2]: https://fossil-scm.org/home/help?cmd=ui
[3]: https://fnc.bsdbox.org/uv/download.html
[4]: https://fnc.bsdbox.org/uv/resources/doc/fnc.1.html
[5]: https://fnc.bsdbox.org/uv/resources/img/fnc-timeline-fullscreen.png
[6]: https://itac.bsdbox.org/fnc-demo.mp4
[7]: https://gameoftrees.org/tog.1.html
[8]: https://gameoftrees.org
[9]: mailto:fnc@bsdbox.org
[10]: https://fnc.bsdbox.org/forum
[11]: https://fnc.bsdbox.org/ticket
[12]: https://itac.bsdbox.org/listinfo/fnc
[13]: https://man.openbsd.org/style.9

Changes to fnc.bld.mk.

1
2
3
4
5
6
7
8
9

10
11
12
13
14
15
16
1
2
3
4
5
6
7
8

9
10
11
12
13
14
15
16








-
+







#
# FNC Common Build
#

# CONFIGURATION
CC ?=		cc
PREFIX ?=	/usr/local
MANDIR ?=	/share/man
VERSION ?=	0.7
VERSION ?=	0.8

# FLAGS NEEDED TO BUILD SQLITE3
SQLITE_CFLAGS =	${CFLAGS} -Wall -Werror -Wno-sign-compare -pedantic -std=c99 \
		-DNDEBUG=1 \
		-DSQLITE_DQS=0 \
		-DSQLITE_THREADSAFE=0 \
		-DSQLITE_DEFAULT_MEMSTATUS=0 \

Deleted signify/fnc-06-release.pub.

1
2


-
-
untrusted comment: fnc 0.6 public key
RWR9WSUPU3FZeibo9ua+4XS26RqiiIDD9uecMYwaNup8M8ulfmARVC1N

Added signify/fnc-08-release.pub.



1
2
+
+
untrusted comment: fnc 0.8 public key
RWRvIlnJtmD7IOR9LK/Ed1KrC+OsoACBv6wlQvDm0d117Lbvn48ez+2L

Changes to src/fnc.c.

2357
2358
2359
2360
2361
2362
2363



2364
2365
2366
2367
2368
2369
2370
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373







+
+
+







{
	struct fnc_tl_thread_cx	*cx = &view->state.timeline.thread_cx;
	int			 rc = 0;

	while (cx->ncommits_needed > 0) {
		if (cx->eotl)
			break;

		if (view->mode == VIEW_SPLIT_HRZN)
			cx->reset = true;

		/* Wake timeline thread. */
		if ((rc = pthread_cond_signal(&cx->commit_consumer)))
			return RC(fsl_errno_to_rc(rc, FSL_RC_MISUSE),
			    "%s", "pthread_cond_signal");

		/*
3620
3621
3622
3623
3624
3625
3626

3627
3628


3629
3630
3631




3632
3633
3634



3635
3636
3637
3638
3639
3640
3641
3623
3624
3625
3626
3627
3628
3629
3630
3631

3632
3633
3634


3635
3636
3637
3638
3639


3640
3641
3642
3643
3644
3645
3646
3647
3648
3649







+

-
+
+

-
-
+
+
+
+

-
-
+
+
+







 * estate. If set to 'v' or 'h', assign start column or start line of the split
 * view to *start_col and *start_ln, respectively, and return split mode.
 */
static enum view_mode
view_get_split(struct fnc_view *view, int *start_col, int *start_ln)
{
	char *mode = fnc_conf_getopt(FNC_VIEW_SPLIT_MODE, false);
	enum view_mode vm;

	if (!mode || mode[0] != 'h')
	if (!mode || mode[0] != 'h') {
		vm = VIEW_SPLIT_VERT;
		*start_col = view_split_start_col(view->start_col);

	if (!*start_col && (!mode || mode[0] != 'v'))
	}

	if (!*start_col && (!mode || mode[0] != 'v')) {
		vm = VIEW_SPLIT_HRZN;
		*start_ln = view_split_start_ln(view->lines);

	return *start_col ? VIEW_SPLIT_VERT : VIEW_SPLIT_HRZN;
	}

	return vm;
}

/* Split view horizontally at *start_ln and offset view->state->selected line */
static int
split_view(struct fnc_view *view, int *start_ln)
{
	int rc = FSL_RC_OK;