stagit

git clone https://git.tarina.org/stagit
Log | Files | Refs | README | LICENSE

commit 8df54926f2ad80ae46a4cc701f3341e97839e0c8
parent 70b777831a80a7a204f02697563d39dba612c8c4
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date:   Wed, 27 Apr 2016 19:19:50 +0200

resolve absolute paths to repodir, remove basename just use strrchr.

- resolve repodir, for example: stagit-index ../ used to use ".." as the name,
  now it will resolve to the real directory name.
- just use strrchr(path, '/') instead of basename, '/' path separator is now
  used.

Diffstat:
Mstagit-index.c | 37+++++++++----------------------------
Mstagit.c | 32++++++++------------------------
2 files changed, 17 insertions(+), 52 deletions(-)

diff --git a/stagit-index.c b/stagit-index.c @@ -3,7 +3,6 @@ #include <err.h> #include <errno.h> #include <inttypes.h> -#include <libgen.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> @@ -21,7 +20,7 @@ static const char *relpath = ""; static const char *repodir; static char description[255] = "Repositories"; -static char name[255]; +static char *name = ""; static char owner[255]; /* Escape characters below as HTML 2.0 / XML 1.0. */ @@ -42,27 +41,6 @@ xmlencode(FILE *fp, const char *s, size_t len) } } -/* Some implementations of basename(3) return a pointer to a static - * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX). - * This is a wrapper function that is compatible with both versions. - * The program will error out if basename(3) failed, this can only happen - * with the OpenBSD version. */ -char * -xbasename(const char *path) -{ - char *p, *b; - - if (!(p = strdup(path))) - err(1, "strdup"); - if (!(b = basename(p))) - err(1, "basename"); - if (!(b = strdup(b))) - err(1, "strdup"); - free(p); - - return b; -} - void printtimeformat(FILE *fp, const git_time *intime, const char *fmt) { @@ -166,7 +144,7 @@ main(int argc, char *argv[]) { const git_error *e = NULL; FILE *fp; - char path[PATH_MAX], *p; + char path[PATH_MAX], repodirabs[PATH_MAX + 1]; int i, r, ret = 0; if (argc < 2) { @@ -179,6 +157,8 @@ main(int argc, char *argv[]) for (i = 1; i < argc; i++) { repodir = argv[i]; + if (!realpath(repodir, repodirabs)) + err(1, "realpath"); if (git_repository_open_ext(&repo, repodir, GIT_REPOSITORY_OPEN_NO_SEARCH, NULL)) { @@ -188,10 +168,11 @@ main(int argc, char *argv[]) continue; } - /* use directory name as name, truncation of name is no problem. */ - p = xbasename(repodir); - snprintf(name, sizeof(name), "%s", p); - free(p); + /* use directory name as name */ + if ((name = strrchr(repodirabs, '/'))) + name++; + else + name = ""; /* read description or .git/description */ description[0] = '\0'; diff --git a/stagit.c b/stagit.c @@ -42,7 +42,7 @@ static git_repository *repo; static const char *relpath = ""; static const char *repodir; -static char *name; +static char *name = ""; static char *stripped_name; static char description[255]; static char cloneurl[1024]; @@ -162,27 +162,6 @@ xdirname(const char *path) return b; } -/* Some implementations of basename(3) return a pointer to a static - * internal buffer (OpenBSD). Others modify the contents of `path` (POSIX). - * This is a wrapper function that is compatible with both versions. - * The program will error out if basename(3) failed, this can only happen - * with the OpenBSD version. */ -char * -xbasename(const char *path) -{ - char *p, *b; - - if (!(p = strdup(path))) - err(1, "strdup"); - if (!(b = basename(p))) - err(1, "basename"); - if (!(b = strdup(b))) - err(1, "strdup"); - free(p); - - return b; -} - int mkdirp(const char *path) { @@ -879,7 +858,7 @@ main(int argc, char *argv[]) const git_oid *head = NULL; const git_error *e = NULL; FILE *fp, *fpread; - char path[PATH_MAX], *p; + char path[PATH_MAX], repodirabs[PATH_MAX + 1], *p; int r, status; if (argc != 2) { @@ -887,6 +866,8 @@ main(int argc, char *argv[]) return 1; } repodir = argv[1]; + if (!realpath(repodir, repodirabs)) + err(1, "realpath"); git_libgit2_init(); @@ -904,7 +885,10 @@ main(int argc, char *argv[]) git_object_free(obj); /* use directory name as name */ - name = xbasename(repodir); + if ((name = strrchr(repodirabs, '/'))) + name++; + else + name = ""; /* strip .git suffix */ if (!(stripped_name = strdup(name)))