summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.gitmodules8
-rw-r--r--Makefile102
-rw-r--r--cgit.c36
-rw-r--r--cgit.css75
-rw-r--r--cgit.h47
-rw-r--r--cgitrc9
-rwxr-xr-xgen-version.sh20
m---------git0
-rw-r--r--parsing.c2
-rw-r--r--shared.c45
-rwxr-xr-xsubmodules.sh181
-rw-r--r--ui-commit.c78
-rw-r--r--ui-diff.c66
-rw-r--r--ui-log.c26
-rw-r--r--ui-repolist.c66
-rw-r--r--ui-shared.c234
-rw-r--r--ui-snapshot.c156
-rw-r--r--ui-summary.c49
-rw-r--r--ui-tag.c74
-rw-r--r--ui-tree.c213
-rw-r--r--ui-view.c55
22 files changed, 929 insertions, 614 deletions
diff --git a/.gitignore b/.gitignore
index c4c9ac3..5664962 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
# Files I don't care to see in git-status/commit
cgit
+VERSION
*.o
*~
diff --git a/.gitmodules b/.gitmodules
index 51dd1ef..1daea94 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,5 +1,3 @@
-# This file maps a submodule path to an url from where the submodule
-# can be obtained. The script "submodules.sh" finds the url in this file
-# when invoked with -i to clone the submodules.
-
-git git://git.kernel.org/pub/scm/git/git.git
+[submodule "git"]
+ url = git://git.kernel.org/pub/scm/git/git.git
+ path = git
diff --git a/Makefile b/Makefile
index 57f80f8..fcbe3e4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,87 +1,71 @@
-CGIT_VERSION = 0.5
-
-prefix = /var/www/htdocs/cgit
-
-SHA1_HEADER = <openssl/sha.h>
-CACHE_ROOT = /var/cache/cgit
-CGIT_CONFIG = /etc/cgitrc
+CGIT_VERSION = v0.5
CGIT_SCRIPT_NAME = cgit.cgi
+CGIT_SCRIPT_PATH = /var/www/htdocs/cgit
+CGIT_CONFIG = /etc/cgitrc
+CACHE_ROOT = /var/cache/cgit
+SHA1_HEADER = <openssl/sha.h>
+GIT_VER = 1.5.2
+GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2
#
# Let the user override the above settings.
#
-include cgit.conf
+
EXTLIBS = git/libgit.a git/xdiff/lib.a -lz -lcrypto
OBJECTS = shared.o cache.o parsing.o html.o ui-shared.o ui-repolist.o \
- ui-summary.o ui-log.o ui-view.o ui-tree.o ui-commit.o ui-diff.o \
- ui-snapshot.o ui-blob.o
+ ui-summary.o ui-log.o ui-tree.o ui-commit.o ui-diff.o \
+ ui-snapshot.o ui-blob.o ui-tag.o
+
+
+.PHONY: all git install clean distclean force-version get-git
-CFLAGS += -Wall
+all: cgit git
-ifdef DEBUG
- CFLAGS += -g
-endif
+VERSION: force-version
+ @./gen-version.sh "$(CGIT_VERSION)"
+-include VERSION
-CFLAGS += -Igit
+
+CFLAGS += -g -Wall -Igit
CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER)'
CFLAGS += -DCGIT_VERSION='"$(CGIT_VERSION)"'
CFLAGS += -DCGIT_CONFIG='"$(CGIT_CONFIG)"'
CFLAGS += -DCGIT_SCRIPT_NAME='"$(CGIT_SCRIPT_NAME)"'
-#
-# If make is run on a nongit platform, get the git sources as a tarball.
-#
-GITVER = $(shell git version 2>/dev/null || echo nogit)
-ifeq ($(GITVER),nogit)
-GITURL = http://www.kernel.org/pub/software/scm/git/git-1.5.2.tar.bz2
-INITGIT = test -e git/git.c || ((curl "$(GITURL)" | tar -xj) && mv git-1.5.2 git)
-else
-INITGIT = ./submodules.sh -i
-endif
-
-
-#
-# basic build rules
-#
-all: cgit
-
-cgit: cgit.c cgit.h $(OBJECTS)
+cgit: cgit.c $(OBJECTS)
$(CC) $(CFLAGS) cgit.c -o cgit $(OBJECTS) $(EXTLIBS)
-$(OBJECTS): cgit.h git/libgit.a
+$(OBJECTS): cgit.h git/xdiff/lib.a git/libgit.a VERSION
-git/libgit.a:
- $(INITGIT)
- $(MAKE) -C git
+git/xdiff/lib.a: | git
-#
-# phony targets
-#
-install: all clean-cache
- mkdir -p $(prefix)
- install cgit $(prefix)/$(CGIT_SCRIPT_NAME)
- install cgit.css $(prefix)/cgit.css
+git/libgit.a: | git
-clean-cgit:
- rm -f cgit *.o
+git:
+ cd git && $(MAKE) xdiff/lib.a
+ cd git && $(MAKE) libgit.a
-distclean-cgit: clean-cgit
- git clean -d -x
-
-clean-sub:
- $(MAKE) -C git clean
-
-distclean-sub: clean-sub
- $(shell cd git && git clean -d -x)
-
-clean-cache:
+install: all
+ mkdir -p $(CGIT_SCRIPT_PATH)
+ install cgit $(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
+ install cgit.css $(CGIT_SCRIPT_PATH)/cgit.css
rm -rf $(CACHE_ROOT)/*
-clean: clean-cgit clean-sub
+uninstall:
+ rm -f $(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME)
+ rm -f $(CGIT_SCRIPT_PATH)/cgit.css
+ rm -rf $(CACHE_ROOT)
+
+clean:
+ rm -f cgit VERSION *.o
+ cd git && $(MAKE) clean
-distclean: distclean-cgit distclean-sub
+distclean: clean
+ git clean -d -x
+ cd git && git clean -d -x
-.PHONY: all install clean clean-cgit clean-sub clean-cache \
- distclean distclean-cgit distclean-sub
+get-git:
+ curl $(GIT_URL) | tar -xj && rm -rf git && mv git-$(GIT_VER) git
diff --git a/cgit.c b/cgit.c
index 34e590e..c86d290 100644
--- a/cgit.c
+++ b/cgit.c
@@ -8,9 +8,6 @@
#include "cgit.h"
-const char cgit_version[] = CGIT_VERSION;
-
-
static int cgit_prepare_cache(struct cacheitem *item)
{
if (!cgit_repo && cgit_query_repo) {
@@ -29,13 +26,15 @@ static int cgit_prepare_cache(struct cacheitem *item)
}
if (!cgit_cmd) {
- item->name = xstrdup(fmt("%s/%s/index.html", cgit_cache_root,
- cache_safe_filename(cgit_repo->url)));
+ item->name = xstrdup(fmt("%s/%s/index.%s.html", cgit_cache_root,
+ cache_safe_filename(cgit_repo->url),
+ cache_safe_filename(cgit_querystring)));
item->ttl = cgit_cache_repo_ttl;
} else {
item->name = xstrdup(fmt("%s/%s/%s/%s.html", cgit_cache_root,
- cache_safe_filename(cgit_repo->url), cgit_query_page,
- cache_safe_filename(cgit_querystring)));
+ cache_safe_filename(cgit_repo->url),
+ cgit_query_page,
+ cache_safe_filename(cgit_querystring)));
if (cgit_query_has_symref)
item->ttl = cgit_cache_dynamic_ttl;
else if (cgit_query_has_sha1)
@@ -69,8 +68,10 @@ static void cgit_print_repo_page(struct cacheitem *item)
setenv("GIT_DIR", cgit_repo->path, 1);
if ((cgit_cmd == CMD_SNAPSHOT) && cgit_repo->snapshots) {
- cgit_print_snapshot(item, cgit_query_sha1, "zip",
- cgit_repo->url, cgit_query_name);
+ cgit_print_snapshot(item, cgit_query_head, cgit_query_sha1,
+ cgit_repobasename(cgit_repo->url),
+ cgit_query_path,
+ cgit_repo->snapshots );
return;
}
@@ -92,22 +93,21 @@ static void cgit_print_repo_page(struct cacheitem *item)
switch(cgit_cmd) {
case CMD_LOG:
- cgit_print_log(cgit_query_head, cgit_query_ofs,
+ cgit_print_log(cgit_query_sha1, cgit_query_ofs,
cgit_max_commit_count, cgit_query_search,
cgit_query_path, 1);
break;
case CMD_TREE:
- cgit_print_tree(cgit_query_head, cgit_query_sha1, cgit_query_path);
+ cgit_print_tree(cgit_query_sha1, cgit_query_path);
break;
case CMD_COMMIT:
- cgit_print_commit(cgit_query_head);
+ cgit_print_commit(cgit_query_sha1);
break;
- case CMD_VIEW:
- cgit_print_view(cgit_query_sha1, cgit_query_path);
+ case CMD_TAG:
+ cgit_print_tag(cgit_query_sha1);
break;
case CMD_DIFF:
- cgit_print_diff(cgit_query_head, cgit_query_sha1, cgit_query_sha2,
- cgit_query_path);
+ cgit_print_diff(cgit_query_sha1, cgit_query_sha2);
break;
default:
cgit_print_error("Invalid request");
@@ -227,6 +227,7 @@ static void cgit_parse_args(int argc, const char **argv)
int main(int argc, const char **argv)
{
struct cacheitem item;
+ const char *cgit_config_env = getenv("CGIT_CONFIG");
htmlfd = STDOUT_FILENO;
item.st.st_mtime = time(NULL);
@@ -234,7 +235,8 @@ int main(int argc, const char **argv)
cgit_repolist.count = 0;
cgit_repolist.repos = NULL;
- cgit_read_config(CGIT_CONFIG, cgit_global_config_cb);
+ cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG,
+ cgit_global_config_cb);
cgit_repo = NULL;
if (getenv("SCRIPT_NAME"))
cgit_script_name = xstrdup(getenv("SCRIPT_NAME"));
diff --git a/cgit.css b/cgit.css
index 8977533..54bbfcc 100644
--- a/cgit.css
+++ b/cgit.css
@@ -1,6 +1,7 @@
body {
- font-family: arial;
+ font-family: arial, sans-serif;
font-size: 11pt;
+ color: black;
background: white;
}
@@ -94,6 +95,14 @@ td#header {
vertical-align: text-bottom;
}
+td#header a {
+ color: #666;
+}
+
+td#header a:hoved {
+ text-decoration: underline;
+}
+
td#logo {
text-align: right;
vertical-align: middle;
@@ -114,15 +123,19 @@ td#crumb {
td#crumb a {
color: #ccc;
+ background-color: #666;
+ padding: 0em 0.5em 0em 0.5em;
}
td#crumb a:hover {
- color: #eee;
+ color: #666;
+ background-color: #ccc;
+ text-decoration: none;
}
td#search {
text-align: right;
- vertical-align: center;
+ vertical-align: middle;
padding-right: 0.5em;
}
@@ -171,35 +184,47 @@ div.error {
margin: 1em 2em;
}
-td.ls-blob, td.ls-dir, td.ls-mod {
+a.ls-blob, a.ls-dir, a.ls-mod {
font-family: monospace;
}
-div.ls-dir a {
- font-weight: bold;
+td.ls-size {
+ text-align: right;
}
-th.filesize, td.filesize {
- text-align: right;
+td.ls-size {
+ font-family: monospace;
}
-td.filesize {
+td.ls-mode {
font-family: monospace;
}
-td.links {
- font-size: 80%;
- padding-left: 2em;
+table.blob {
+ margin-top: 0.5em;
+ border-top: solid 1px black;
}
-td.filemode {
- font-family: monospace;
+table.blob td.no {
+ border-right: solid 1px black;
+ color: black;
+ background-color: #eee;
+ text-align: right;
+}
+
+table.blob td.no a {
+ color: black;
}
-td.blob {
+table.blob td.no a:hover {
+ color: black;
+ text-decoration: none;
+}
+
+table.blob td.txt {
white-space: pre;
font-family: monospace;
- background-color: white;
+ padding-left: 0.5em;
}
table.nowrap td {
@@ -215,6 +240,7 @@ table.commit-info th {
text-align: left;
font-weight: normal;
padding: 0.1em 1em 0.1em 0.1em;
+ vertical-align: top;
}
table.commit-info td {
@@ -287,7 +313,7 @@ table.diffstat td.upd a {
table.diffstat td.graph {
width: 75%;
- vertical-align: center;
+ vertical-align: middle;
}
table.diffstat td.graph table {
@@ -308,10 +334,6 @@ table.diffstat td.graph td.rem {
background-color: #c55;
}
-table.diffstat td.graph td.none {
- background-color: none;
-}
-
div.diffstat-summary {
color: #888;
padding-top: 0.5em;
@@ -340,7 +362,7 @@ table.diff td div.del {
}
.sha1 {
- font-family: courier;
+ font-family: monospace;
font-size: 90%;
}
@@ -359,16 +381,17 @@ table.list td.repogroup {
a.button {
font-size: 80%;
- color: #333;
- background-color: #ccc;
- border: solid 1px #999;
+ color: #aaa;
+ background-color: #eee;
+ border: solid 1px #aaa;
padding: 0em 0.5em;
margin: 0.1em 0.25em;
}
a.button:hover {
text-decoration: none;
- background-color: #eee;
+ color: #333;
+ background-color: #ccc;
}
a.primary {
diff --git a/cgit.h b/cgit.h
index 2f3fca1..e3d9cb8 100644
--- a/cgit.h
+++ b/cgit.h
@@ -25,10 +25,9 @@
#define CMD_COMMIT 2
#define CMD_DIFF 3
#define CMD_TREE 4
-#define CMD_VIEW 5
-#define CMD_BLOB 6
-#define CMD_SNAPSHOT 7
-
+#define CMD_BLOB 5
+#define CMD_SNAPSHOT 6
+#define CMD_TAG 7
/*
* Dateformats used on misc. pages
@@ -99,7 +98,7 @@ struct taginfo {
char *msg;
};
-extern const char cgit_version[];
+extern const char *cgit_version;
extern struct repolist cgit_repolist;
extern struct repoinfo *cgit_repo;
@@ -119,6 +118,7 @@ extern char *cgit_repo_group;
extern int cgit_nocache;
extern int cgit_snapshots;
+extern int cgit_enable_index_links;
extern int cgit_enable_log_filecount;
extern int cgit_enable_log_linecount;
extern int cgit_max_lock_attempts;
@@ -157,8 +157,10 @@ extern void cgit_querystring_cb(const char *name, const char *value);
extern int chk_zero(int result, char *msg);
extern int chk_positive(int result, char *msg);
+extern int chk_non_negative(int result, char *msg);
extern int hextoint(char c);
+extern char *trim_end(const char *str, char c);
extern void *cgit_free_commitinfo(struct commitinfo *info);
@@ -199,9 +201,26 @@ extern int cache_exist(struct cacheitem *item);
extern int cache_expired(struct cacheitem *item);
extern char *cgit_repourl(const char *reponame);
+extern char *cgit_fileurl(const char *reponame, const char *pagename,
+ const char *filename, const char *query);
extern char *cgit_pageurl(const char *reponame, const char *pagename,
const char *query);
+extern const char *cgit_repobasename(const char *reponame);
+
+extern void cgit_tree_link(char *name, char *title, char *class, char *head,
+ char *rev, char *path);
+extern void cgit_log_link(char *name, char *title, char *class, char *head,
+ char *rev, char *path, int ofs);
+extern void cgit_commit_link(char *name, char *title, char *class, char *head,
+ char *rev);
+extern void cgit_snapshot_link(char *name, char *title, char *class,
+ char *head, char *rev, char *archivename);
+extern void cgit_diff_link(char *name, char *title, char *class, char *head,
+ char *new_rev, char *old_rev, char *path);
+
+extern void cgit_object_link(struct object *obj);
+
extern void cgit_print_error(char *msg);
extern void cgit_print_date(time_t secs, char *format);
extern void cgit_print_age(time_t t, time_t max_relative, char *format);
@@ -215,14 +234,16 @@ extern void cgit_print_snapshot_start(const char *mimetype,
extern void cgit_print_repolist(struct cacheitem *item);
extern void cgit_print_summary();
extern void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *path, int pager);
-extern void cgit_print_view(const char *hex, char *path);
extern void cgit_print_blob(struct cacheitem *item, const char *hex, char *path);
-extern void cgit_print_tree(const char *rev, const char *hex, char *path);
-extern void cgit_print_commit(const char *hex);
-extern void cgit_print_diff(const char *head, const char *old_hex, const char *new_hex,
- char *path);
-extern void cgit_print_snapshot(struct cacheitem *item, const char *hex,
- const char *format, const char *prefix,
- const char *filename);
+extern void cgit_print_tree(const char *rev, char *path);
+extern void cgit_print_commit(char *hex);
+extern void cgit_print_tag(char *revname);
+extern void cgit_print_diff(const char *new_hex, const char *old_hex);
+extern void cgit_print_snapshot(struct cacheitem *item, const char *head,
+ const char *hex, const char *prefix,
+ const char *filename, int snapshot);
+extern void cgit_print_snapshot_links(const char *repo, const char *head,
+ const char *hex, int snapshots);
+extern int cgit_parse_snapshots_mask(const char *str);
#endif /* CGIT_H */
diff --git a/cgitrc b/cgitrc
index 0f602e4..1040997 100644
--- a/cgitrc
+++ b/cgitrc
@@ -8,10 +8,15 @@
#nocache=0
-## Enable/disable snapshots by default. This can be overridden per repo
+## Set allowed snapshot types by default. Can be overridden per repo
+# can be any combination of zip/tar.gz/tar.bz2/tar
#snapshots=0
+## Enable/disable extra links to summary/log/tree per repo on index page
+#enable-index-links=0
+
+
## Enable/disable display of 'number of files changed' in log view
#enable-log-filecount=0
@@ -109,7 +114,7 @@
#repo.desc=the caching cgi for git
#repo.path=/pub/git/cgit
#repo.owner=Lars Hjemli
-#repo.snapshots=1 # override a sitewide snapshot-setting
+#repo.snapshots=tar.bz2 # override a sitewide snapshot-setting
#repo.enable-log-filecount=0 # override the default filecount setting
#repo.enable-log-linecount=0 # override the default linecount setting
#repo.module-link=/git/%s/commit/?id=%s # override the standard module-link
diff --git a/gen-version.sh b/gen-version.sh
new file mode 100755
index 0000000..739c83e
--- /dev/null
+++ b/gen-version.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Get version-info specified in Makefile
+V=$1
+
+# Use `git describe` to get current version if we're inside a git repo
+if test -d .git
+then
+ V=$(git describe --abbrev=4 HEAD 2>/dev/null | sed -e 's/-/./g')
+fi
+
+new="CGIT_VERSION = $V"
+old=$(cat VERSION 2>/dev/null)
+
+# Exit if VERSION is uptodate
+test "$old" = "$new" && exit 0
+
+# Update VERSION with new version-info
+echo "$new" > VERSION
+cat VERSION
diff --git a/git b/git
-Subproject aba170cdb4874b72dd619e6f7bbc13c33295f83
+Subproject 86bab9615c3516d4ac7756ae3c1285d331b78f0
diff --git a/parsing.c b/parsing.c
index 74a2484..2c05c09 100644
--- a/parsing.c
+++ b/parsing.c
@@ -168,7 +168,7 @@ void cgit_parse_url(const char *url)
if (p) {
p[0] = '\0';
if (p[1])
- cgit_query_path = xstrdup(p + 1);
+ cgit_query_path = trim_end(p + 1, '/');
}
cgit_cmd = cgit_get_cmd_index(cmd + 1);
cgit_query_page = xstrdup(cmd + 1);
diff --git a/shared.c b/shared.c
index b6d2fa1..077934f 100644
--- a/shared.c
+++ b/shared.c
@@ -12,6 +12,8 @@ struct repolist cgit_repolist;
struct repoinfo *cgit_repo;
int cgit_cmd;
+const char *cgit_version = CGIT_VERSION;
+
char *cgit_root_title = "Git repository browser";
char *cgit_css = "/cgit.css";
char *cgit_logo = "/git-logo.png";
@@ -26,6 +28,7 @@ char *cgit_repo_group = NULL;
int cgit_nocache = 0;
int cgit_snapshots = 0;
+int cgit_enable_index_links = 0;
int cgit_enable_log_filecount = 0;
int cgit_enable_log_linecount = 0;
int cgit_max_lock_attempts = 5;
@@ -59,7 +62,8 @@ int htmlfd = 0;
int cgit_get_cmd_index(const char *cmd)
{
- static char *cmds[] = {"log", "commit", "diff", "tree", "view", "blob", "snapshot", NULL};
+ static char *cmds[] = {"log", "commit", "diff", "tree", "blob",
+ "snapshot", "tag", NULL};
int i;
for(i = 0; cmds[i]; i++)
@@ -82,6 +86,13 @@ int chk_positive(int result, char *msg)
return result;
}
+int chk_non_negative(int result, char *msg)
+{
+ if (result < 0)
+ die("%s: %s",msg, strerror(errno));
+ return result;
+}
+
struct repoinfo *add_repo(const char *url)
{
struct repoinfo *ret;
@@ -144,7 +155,9 @@ void cgit_global_config_cb(const char *name, const char *value)
else if (!strcmp(name, "nocache"))
cgit_nocache = atoi(value);
else if (!strcmp(name, "snapshots"))
- cgit_snapshots = atoi(value);
+ cgit_snapshots = cgit_parse_snapshots_mask(value);
+ else if (!strcmp(name, "enable-index-links"))
+ cgit_enable_index_links = atoi(value);
else if (!strcmp(name, "enable-log-filecount"))
cgit_enable_log_filecount = atoi(value);
else if (!strcmp(name, "enable-log-linecount"))
@@ -184,7 +197,7 @@ void cgit_global_config_cb(const char *name, const char *value)
else if (cgit_repo && !strcmp(name, "repo.defbranch"))
cgit_repo->defbranch = xstrdup(value);
else if (cgit_repo && !strcmp(name, "repo.snapshots"))
- cgit_repo->snapshots = cgit_snapshots * atoi(value);
+ cgit_repo->snapshots = cgit_snapshots & cgit_parse_snapshots_mask(value); /* XXX: &? */
else if (cgit_repo && !strcmp(name, "repo.enable-log-filecount"))
cgit_repo->enable_log_filecount = cgit_enable_log_filecount * atoi(value);
else if (cgit_repo && !strcmp(name, "repo.enable-log-linecount"))
@@ -224,7 +237,7 @@ void cgit_querystring_cb(const char *name, const char *value)
} else if (!strcmp(name, "ofs")) {
cgit_query_ofs = atoi(value);
} else if (!strcmp(name, "path")) {
- cgit_query_path = xstrdup(value);
+ cgit_query_path = trim_end(value, '/');
} else if (!strcmp(name, "name")) {
cgit_query_name = xstrdup(value);
}
@@ -253,6 +266,28 @@ int hextoint(char c)
return -1;
}
+char *trim_end(const char *str, char c)
+{
+ int len;
+ char *s, *t;
+
+ if (str == NULL)
+ return NULL;
+ t = (char *)str;
+ len = strlen(t);
+ while(len > 0 && t[len - 1] == c)
+ len--;
+
+ if (len == 0)
+ return NULL;
+
+ c = t[len];
+ t[len] = '\0';
+ s = xstrdup(t);
+ t[len] = c;
+ return s;
+}
+
void cgit_diff_tree_cb(struct diff_queue_struct *q,
struct diff_options *options, void *data)
{
@@ -359,7 +394,7 @@ void cgit_diff_tree(const unsigned char *old_sha1,
opt.format_callback_data = fn;
diff_setup_done(&opt);
- if (old_sha1)
+ if (old_sha1 && !is_null_sha1(old_sha1))
ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt);
else
ret = diff_root_tree_sha1(new_sha1, "", &opt);
diff --git a/submodules.sh b/submodules.sh
deleted file mode 100755
index 1d7b13f..0000000
--- a/submodules.sh
+++ /dev/null
@@ -1,181 +0,0 @@
-#!/bin/sh
-#
-# submodules.sh: init, update or list git submodules
-#
-# Copyright (C) 2006 Lars Hjemli
-#
-# Licensed under GNU General Public License v2
-# (see COPYING for full license text)
-#
-
-
-usage="submodules.sh [-i | -u] [-q] [--cached] [path...]"
-init=
-update=
-quiet=
-cached=
-
-
-say()
-{
- if test -z "$quiet"
- then
- echo -e "$@"
- fi
-}
-
-
-die()
-{
- echo >&2 -e "$@"
- exit 1
-}
-
-
-
-#
-# Silently checkout specified submodule revision, return exit status of git-checkout
-#
-# $1 = local path
-# $2 = requested sha1
-#
-module_checkout()
-{
- $(cd "$1" && git checkout "$2" 1>/dev/null 2>/dev/null)
-}
-
-
-#
-# Find all (requested) submodules, run clone + checkout on missing paths
-#
-# $@ = requested paths (default to all)
-#
-modules_init()
-{
- git ls-files --stage -- $@ | grep -e '^160000 ' |
- while read mode sha1 stage path
- do
- test -d "$path/.git" && continue
-
- if test -d "$path"
- then
- rmdir "$path" 2>/dev/null ||
- die "Directory '$path' exist, but not as a submodule"
- fi
-
- test -e "$path" && die "A file already exist at path '$path'"
-
- url=$(sed -nre "s/^$path[ \t]+//p" .gitmodules)
- test -z "$url" && die "No url found for $path in .gitmodules"
-
- git clone "$url" "$path" || die "Clone of submodule '$path' failed"
- module_checkout "$path" "$sha1" || die "Checkout of submodule '$path' failed"
- say "Submodule '$path' initialized"
- done
-}
-
-#
-# Checkout correct revision of each initialized submodule
-#
-# $@ = requested paths (default to all)
-#
-modules_update()
-{
- git ls-files --stage -- $@ | grep -e '^160000 ' |
- while read mode sha1 stage path
- do
- if ! test -d "$path/.git"
- then
- say "Submodule '$path' not initialized"
- continue;
- fi
- subsha1=$(cd "$path" && git rev-parse --verify HEAD) ||
- die "Unable to find current revision of submodule '$path'"
- if test "$subsha1" != "$sha1"
- then
- module_checkout "$path" "$sha1" ||
- die "Unable to checkout revision $sha1 of submodule '$path'"
- say "Submodule '$path' reset to revision $sha1"
- fi
- done
-}
-
-#
-# List all registered submodules, prefixed with:
-# - submodule not initialized
-# + different version checked out
-#
-# If --cached was specified the revision in the index will be printed
-# instead of the currently checked out revision.
-#
-# $@ = requested paths (default to all)
-#
-modules_list()
-{
- git ls-files --stage -- $@ | grep -e '^160000 ' |
- while read mode sha1 stage path
- do
- if ! test -d "$path/.git"
- then
- say "-$sha1 $path"
- continue;
- fi
- revname=$(cd "$path" && git describe $sha1)
- if git diff-files --quiet -- "$path"
- then
- say " $sha1 $path\t($revname)"
- else
- if test -z "$cached"
- then
- sha1=$(cd "$path" && git rev-parse HEAD)
- revname=$(cd "$path" && git describe HEAD)
- fi
- say "+$sha1 $path\t($revname)"
- fi
- done
-}
-
-
-while case "$#" in 0) break ;; esac
-do
- case "$1" in
- -i)
- init=1
- ;;
- -u)
- update=1
- ;;
- -q)
- quiet=1
- ;;
- --cached)
- cached=1
- ;;
- --)
- break
- ;;
- -*)
- echo "Usage: $usage"
- exit 1
- ;;
- --*)
- echo "Usage: $usage"
- exit 1
- ;;
- *)
- break
- ;;
- esac
- shift
-done
-
-
-if test "$init" = "1"
-then
- modules_init $@
-elif test "$update" = "1"
-then
- modules_update $@
-else
- modules_list $@
-fi
diff --git a/ui-commit.c b/ui-commit.c
index 1d12bbb..90e09ed 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -11,6 +11,7 @@
static int files, slots;
static int total_adds, total_rems, max_changes;
static int lines_added, lines_removed;
+static char *curr_rev;
static struct fileinfo {
char status;
@@ -27,7 +28,6 @@ static struct fileinfo {
void print_fileinfo(struct fileinfo *info)
{
- char *query, *query2;
char *class;
switch (info->status) {
@@ -75,24 +75,12 @@ void print_fileinfo(struct fileinfo *info)
html("]</span>");
}
htmlf("</td><td class='%s'>", class);
- query = fmt("id=%s&amp;id2=%s&amp;path=%s", sha1_to_hex(info->old_sha1),
- sha1_to_hex(info->new_sha1), info->new_path);
- html_link_open(cgit_pageurl(cgit_query_repo, "diff", query),
- NULL, NULL);
- if (info->status == DIFF_STATUS_COPIED ||
- info->status == DIFF_STATUS_RENAMED) {
- html_txt(info->new_path);
- htmlf("</a> (%s from ", info->status == DIFF_STATUS_COPIED ?
- "copied" : "renamed");
- query2 = fmt("id=%s", sha1_to_hex(info->old_sha1));
- html_link_open(cgit_pageurl(cgit_query_repo, "view", query2),
- NULL, NULL);
- html_txt(info->old_path);
- html("</a>)");
- } else {
- html_txt(info->new_path);
- html("</a>");
- }
+ cgit_tree_link(info->new_path, NULL, NULL, cgit_query_head, curr_rev,
+ info->new_path);
+ if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
+ htmlf(" (%s from %s)",
+ info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
+ info->old_path);
html("</td><td class='right'>");
htmlf("%d", info->added + info->removed);
html("</td><td class='graph'>");
@@ -145,16 +133,19 @@ void inspect_filepair(struct diff_filepair *pair)
}
-void cgit_print_commit(const char *hex)
+void cgit_print_commit(char *hex)
{
struct commit *commit, *parent;
struct commitinfo *info;
struct commit_list *p;
unsigned char sha1[20];
- char *query;
- char *filename;
+ char *tmp;
int i;
+ if (!hex)
+ hex = cgit_query_head;
+ curr_rev = hex;
+
if (get_sha1(hex, sha1)) {
cgit_print_error(fmt("Bad object id: %s", hex));
return;
@@ -181,11 +172,11 @@ void cgit_print_commit(const char *hex)
html("</td><td class='right'>");
cgit_print_date(info->committer_date, FMT_LONGDATE);
html("</td></tr>\n");
- html("<tr><th>tree</th><td colspan='2' class='sha1'><a href='");
- query = fmt("h=%s&amp;id=%s", sha1_to_hex(commit->object.sha1),
- sha1_to_hex(commit->tree->object.sha1));
- html_attr(cgit_pageurl(cgit_query_repo, "tree", query));
- htmlf("'>%s</a></td></tr>\n", sha1_to_hex(commit->tree->object.sha1));
+ html("<tr><th>tree</th><td colspan='2' class='sha1'>");
+ tmp = xstrdup(hex);
+ cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL,
+ cgit_query_head, tmp, NULL);
+ html("</td></tr>\n");
for (p = commit->parents; p ; p = p->next) {
parent = lookup_commit_reference(p->item->object.sha1);
if (!parent) {
@@ -195,23 +186,19 @@ void cgit_print_commit(const char *hex)
continue;
}
html("<tr><th>parent</th>"
- "<td colspan='2' class='sha1'>"
- "<a href='");
- query = fmt("h=%s", sha1_to_hex(p->item->object.sha1));
- html_attr(cgit_pageurl(cgit_query_repo, "commit", query));
- htmlf("'>%s</a> (<a href='",
- sha1_to_hex(p->item->object.sha1));
- query = fmt("id=%s&amp;id2=%s", sha1_to_hex(parent->tree->object.sha1),
- sha1_to_hex(commit->tree->object.sha1));
- html_attr(cgit_pageurl(cgit_query_repo, "diff", query));
- html("'>diff</a>)</td></tr>");
+ "<td colspan='2' class='sha1'>");
+ cgit_commit_link(sha1_to_hex(p->item->object.sha1), NULL, NULL,
+ cgit_query_head, sha1_to_hex(p->item->object.sha1));
+ html(" (");
+ cgit_diff_link("diff", NULL, NULL, cgit_query_head, hex,
+ sha1_to_hex(p->item->object.sha1), NULL);
+ html(")</td></tr>");
}
if (cgit_repo->snapshots) {
- htmlf("<tr><th>download</th><td colspan='2' class='sha1'><a href='");
- filename = fmt("%s-%s.zip", cgit_query_repo, hex);
- html_attr(cgit_pageurl(cgit_query_repo, "snapshot",
- fmt("id=%s&amp;name=%s", hex, filename)));
- htmlf("'>%s</a></td></tr>", filename);
+ html("<tr><th>download</th><td colspan='2' class='sha1'>");
+ cgit_print_snapshot_links(cgit_query_repo, cgit_query_head,
+ hex, cgit_repo->snapshots);
+ html("</td></tr>");