mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
Merge branch 'pb/gitweb-tagcloud' into pb/gitweb
* pb/gitweb-tagcloud: gitweb: Support for simple project search form gitweb: Make the by_tag filter delve in forks as well gitweb: Support for tag clouds ... (+ many updates from master) ... Conflicts: gitweb/gitweb.perl
This commit is contained in:
commit
3e3d4ee7cb
|
@ -30,7 +30,7 @@ Functions
|
|||
start_command() followed by finish_command(). Takes a pointer
|
||||
to a `struct child_process` that specifies the details.
|
||||
|
||||
`run_command_v_opt`, `run_command_v_opt_cd`, `run_command_v_opt_cd_env`::
|
||||
`run_command_v_opt`, `run_command_v_opt_cd_env`::
|
||||
|
||||
Convenience functions that encapsulate a sequence of
|
||||
start_command() followed by finish_command(). The argument argv
|
||||
|
|
1
Makefile
1
Makefile
|
@ -648,6 +648,7 @@ ifeq ($(uname_S),SunOS)
|
|||
NO_MEMMEM = YesPlease
|
||||
NO_HSTRERROR = YesPlease
|
||||
NO_MKDTEMP = YesPlease
|
||||
OLD_ICONV = UnfortunatelyYes
|
||||
ifeq ($(uname_R),5.8)
|
||||
NEEDS_LIBICONV = YesPlease
|
||||
NO_UNSETENV = YesPlease
|
||||
|
|
|
@ -15,7 +15,7 @@ static char const * const archive_usage[] = {
|
|||
|
||||
#define USES_ZLIB_COMPRESSION 1
|
||||
|
||||
const struct archiver {
|
||||
static const struct archiver {
|
||||
const char *name;
|
||||
write_archive_fn_t write_archive;
|
||||
unsigned int flags;
|
||||
|
|
16
arm/sha1.c
16
arm/sha1.c
|
@ -8,9 +8,9 @@
|
|||
#include <string.h>
|
||||
#include "sha1.h"
|
||||
|
||||
extern void sha_transform(uint32_t *hash, const unsigned char *data, uint32_t *W);
|
||||
extern void arm_sha_transform(uint32_t *hash, const unsigned char *data, uint32_t *W);
|
||||
|
||||
void SHA1_Init(SHA_CTX *c)
|
||||
void arm_SHA1_Init(arm_SHA_CTX *c)
|
||||
{
|
||||
c->len = 0;
|
||||
c->hash[0] = 0x67452301;
|
||||
|
@ -20,7 +20,7 @@ void SHA1_Init(SHA_CTX *c)
|
|||
c->hash[4] = 0xc3d2e1f0;
|
||||
}
|
||||
|
||||
void SHA1_Update(SHA_CTX *c, const void *p, unsigned long n)
|
||||
void arm_SHA1_Update(arm_SHA_CTX *c, const void *p, unsigned long n)
|
||||
{
|
||||
uint32_t workspace[80];
|
||||
unsigned int partial;
|
||||
|
@ -32,12 +32,12 @@ void SHA1_Update(SHA_CTX *c, const void *p, unsigned long n)
|
|||
if (partial) {
|
||||
done = 64 - partial;
|
||||
memcpy(c->buffer + partial, p, done);
|
||||
sha_transform(c->hash, c->buffer, workspace);
|
||||
arm_sha_transform(c->hash, c->buffer, workspace);
|
||||
partial = 0;
|
||||
} else
|
||||
done = 0;
|
||||
while (n >= done + 64) {
|
||||
sha_transform(c->hash, p + done, workspace);
|
||||
arm_sha_transform(c->hash, p + done, workspace);
|
||||
done += 64;
|
||||
}
|
||||
} else
|
||||
|
@ -46,7 +46,7 @@ void SHA1_Update(SHA_CTX *c, const void *p, unsigned long n)
|
|||
memcpy(c->buffer + partial, p + done, n - done);
|
||||
}
|
||||
|
||||
void SHA1_Final(unsigned char *hash, SHA_CTX *c)
|
||||
void arm_SHA1_Final(unsigned char *hash, arm_SHA_CTX *c)
|
||||
{
|
||||
uint64_t bitlen;
|
||||
uint32_t bitlen_hi, bitlen_lo;
|
||||
|
@ -57,7 +57,7 @@ void SHA1_Final(unsigned char *hash, SHA_CTX *c)
|
|||
bitlen = c->len << 3;
|
||||
offset = c->len & 0x3f;
|
||||
padlen = ((offset < 56) ? 56 : (64 + 56)) - offset;
|
||||
SHA1_Update(c, padding, padlen);
|
||||
arm_SHA1_Update(c, padding, padlen);
|
||||
|
||||
bitlen_hi = bitlen >> 32;
|
||||
bitlen_lo = bitlen & 0xffffffff;
|
||||
|
@ -69,7 +69,7 @@ void SHA1_Final(unsigned char *hash, SHA_CTX *c)
|
|||
bits[5] = bitlen_lo >> 16;
|
||||
bits[6] = bitlen_lo >> 8;
|
||||
bits[7] = bitlen_lo;
|
||||
SHA1_Update(c, bits, 8);
|
||||
arm_SHA1_Update(c, bits, 8);
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
uint32_t v = c->hash[i];
|
||||
|
|
15
arm/sha1.h
15
arm/sha1.h
|
@ -7,12 +7,17 @@
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct sha_context {
|
||||
typedef struct {
|
||||
uint64_t len;
|
||||
uint32_t hash[5];
|
||||
unsigned char buffer[64];
|
||||
} SHA_CTX;
|
||||
} arm_SHA_CTX;
|
||||
|
||||
void SHA1_Init(SHA_CTX *c);
|
||||
void SHA1_Update(SHA_CTX *c, const void *p, unsigned long n);
|
||||
void SHA1_Final(unsigned char *hash, SHA_CTX *c);
|
||||
void arm_SHA1_Init(arm_SHA_CTX *c);
|
||||
void arm_SHA1_Update(arm_SHA_CTX *c, const void *p, unsigned long n);
|
||||
void arm_SHA1_Final(unsigned char *hash, arm_SHA_CTX *c);
|
||||
|
||||
#define git_SHA_CTX arm_SHA_CTX
|
||||
#define git_SHA1_Init arm_SHA1_Init
|
||||
#define git_SHA1_Update arm_SHA1_Update
|
||||
#define git_SHA1_Final arm_SHA1_Final
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
*/
|
||||
|
||||
.text
|
||||
.globl sha_transform
|
||||
.globl arm_sha_transform
|
||||
|
||||
/*
|
||||
* void sha_transform(uint32_t *hash, const unsigned char *data, uint32_t *W);
|
||||
|
@ -18,7 +18,7 @@
|
|||
* note: the "data" pointer may be unaligned.
|
||||
*/
|
||||
|
||||
sha_transform:
|
||||
arm_sha_transform:
|
||||
|
||||
stmfd sp!, {r4 - r8, lr}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ static const char unpack_usage[] = "git unpack-objects [-n] [-q] [-r] [--strict]
|
|||
static unsigned char buffer[4096];
|
||||
static unsigned int offset, len;
|
||||
static off_t consumed_bytes;
|
||||
static SHA_CTX ctx;
|
||||
static git_SHA_CTX ctx;
|
||||
|
||||
/*
|
||||
* When running under --strict mode, objects whose reachability are
|
||||
|
@ -59,7 +59,7 @@ static void *fill(int min)
|
|||
if (min > sizeof(buffer))
|
||||
die("cannot fill %d bytes", min);
|
||||
if (offset) {
|
||||
SHA1_Update(&ctx, buffer, offset);
|
||||
git_SHA1_Update(&ctx, buffer, offset);
|
||||
memmove(buffer, buffer + offset, len);
|
||||
offset = 0;
|
||||
}
|
||||
|
@ -539,10 +539,10 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
|
|||
/* We don't take any non-flag arguments now.. Maybe some day */
|
||||
usage(unpack_usage);
|
||||
}
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
unpack_all();
|
||||
SHA1_Update(&ctx, buffer, offset);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Update(&ctx, buffer, offset);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
if (strict)
|
||||
write_rest();
|
||||
if (hashcmp(fill(20), sha1))
|
||||
|
|
9
cache.h
9
cache.h
|
@ -6,8 +6,14 @@
|
|||
#include "hash.h"
|
||||
|
||||
#include SHA1_HEADER
|
||||
#include <zlib.h>
|
||||
#ifndef git_SHA_CTX
|
||||
#define git_SHA_CTX SHA_CTX
|
||||
#define git_SHA1_Init SHA1_Init
|
||||
#define git_SHA1_Update SHA1_Update
|
||||
#define git_SHA1_Final SHA1_Final
|
||||
#endif
|
||||
|
||||
#include <zlib.h>
|
||||
#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
|
||||
#define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
|
||||
#endif
|
||||
|
@ -749,7 +755,6 @@ typedef int (*config_fn_t)(const char *, const char *, void *);
|
|||
extern int git_default_config(const char *, const char *, void *);
|
||||
extern int git_config_from_file(config_fn_t fn, const char *, void *);
|
||||
extern int git_config(config_fn_t fn, void *);
|
||||
extern int git_parse_long(const char *, long *);
|
||||
extern int git_parse_ulong(const char *, unsigned long *);
|
||||
extern int git_config_int(const char *, const char *);
|
||||
extern unsigned long git_config_ulong(const char *, const char *);
|
||||
|
|
2
commit.c
2
commit.c
|
@ -160,7 +160,7 @@ struct commit_graft *read_graft_line(char *buf, int len)
|
|||
return graft;
|
||||
}
|
||||
|
||||
int read_graft_file(const char *graft_file)
|
||||
static int read_graft_file(const char *graft_file)
|
||||
{
|
||||
FILE *fp = fopen(graft_file, "r");
|
||||
char buf[1024];
|
||||
|
|
1
commit.h
1
commit.h
|
@ -118,7 +118,6 @@ struct commit_graft {
|
|||
|
||||
struct commit_graft *read_graft_line(char *buf, int len);
|
||||
int register_commit_graft(struct commit_graft *, int);
|
||||
int read_graft_file(const char *graft_file);
|
||||
struct commit_graft *lookup_commit_graft(const unsigned char *sha1);
|
||||
|
||||
extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);
|
||||
|
|
23
config.c
23
config.c
|
@ -205,8 +205,27 @@ static int git_parse_file(config_fn_t fn, void *data)
|
|||
int baselen = 0;
|
||||
static char var[MAXNAME];
|
||||
|
||||
/* U+FEFF Byte Order Mark in UTF8 */
|
||||
static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
|
||||
const unsigned char *bomptr = utf8_bom;
|
||||
|
||||
for (;;) {
|
||||
int c = get_next_char();
|
||||
if (bomptr && *bomptr) {
|
||||
/* We are at the file beginning; skip UTF8-encoded BOM
|
||||
* if present. Sane editors won't put this in on their
|
||||
* own, but e.g. Windows Notepad will do it happily. */
|
||||
if ((unsigned char) c == *bomptr) {
|
||||
bomptr++;
|
||||
continue;
|
||||
} else {
|
||||
/* Do not tolerate partial BOM. */
|
||||
if (bomptr != utf8_bom)
|
||||
break;
|
||||
/* No BOM at file beginning. Cool. */
|
||||
bomptr = NULL;
|
||||
}
|
||||
}
|
||||
if (c == '\n') {
|
||||
if (config_file_eof)
|
||||
return 0;
|
||||
|
@ -255,7 +274,7 @@ static int parse_unit_factor(const char *end, unsigned long *val)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int git_parse_long(const char *value, long *ret)
|
||||
static int git_parse_long(const char *value, long *ret)
|
||||
{
|
||||
if (value && *value) {
|
||||
char *end;
|
||||
|
@ -291,7 +310,7 @@ static void die_bad_config(const char *name)
|
|||
|
||||
int git_config_int(const char *name, const char *value)
|
||||
{
|
||||
long ret;
|
||||
long ret = 0;
|
||||
if (!git_parse_long(value, &ret))
|
||||
die_bad_config(name);
|
||||
return ret;
|
||||
|
|
|
@ -36,11 +36,11 @@ int sha1close(struct sha1file *f, unsigned char *result, unsigned int flags)
|
|||
unsigned offset = f->offset;
|
||||
|
||||
if (offset) {
|
||||
SHA1_Update(&f->ctx, f->buffer, offset);
|
||||
git_SHA1_Update(&f->ctx, f->buffer, offset);
|
||||
sha1flush(f, f->buffer, offset);
|
||||
f->offset = 0;
|
||||
}
|
||||
SHA1_Final(f->buffer, &f->ctx);
|
||||
git_SHA1_Final(f->buffer, &f->ctx);
|
||||
if (result)
|
||||
hashcpy(result, f->buffer);
|
||||
if (flags & (CSUM_CLOSE | CSUM_FSYNC)) {
|
||||
|
@ -82,7 +82,7 @@ int sha1write(struct sha1file *f, void *buf, unsigned int count)
|
|||
buf = (char *) buf + nr;
|
||||
left -= nr;
|
||||
if (!left) {
|
||||
SHA1_Update(&f->ctx, data, offset);
|
||||
git_SHA1_Update(&f->ctx, data, offset);
|
||||
sha1flush(f, data, offset);
|
||||
offset = 0;
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ struct sha1file *sha1fd_throughput(int fd, const char *name, struct progress *tp
|
|||
f->tp = tp;
|
||||
f->name = name;
|
||||
f->do_crc = 0;
|
||||
SHA1_Init(&f->ctx);
|
||||
git_SHA1_Init(&f->ctx);
|
||||
return f;
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ struct progress;
|
|||
struct sha1file {
|
||||
int fd;
|
||||
unsigned int offset;
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
off_t total;
|
||||
struct progress *tp;
|
||||
const char *name;
|
||||
|
|
12
diff.c
12
diff.c
|
@ -3087,7 +3087,7 @@ static void diff_summary(FILE *file, struct diff_filepair *p)
|
|||
}
|
||||
|
||||
struct patch_id_t {
|
||||
SHA_CTX *ctx;
|
||||
git_SHA_CTX *ctx;
|
||||
int patchlen;
|
||||
};
|
||||
|
||||
|
@ -3115,7 +3115,7 @@ static void patch_id_consume(void *priv, char *line, unsigned long len)
|
|||
|
||||
new_len = remove_space(line, len);
|
||||
|
||||
SHA1_Update(data->ctx, line, new_len);
|
||||
git_SHA1_Update(data->ctx, line, new_len);
|
||||
data->patchlen += new_len;
|
||||
}
|
||||
|
||||
|
@ -3124,11 +3124,11 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
|
|||
{
|
||||
struct diff_queue_struct *q = &diff_queued_diff;
|
||||
int i;
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
struct patch_id_t data;
|
||||
char buffer[PATH_MAX * 4 + 20];
|
||||
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
memset(&data, 0, sizeof(struct patch_id_t));
|
||||
data.ctx = &ctx;
|
||||
|
||||
|
@ -3190,7 +3190,7 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
|
|||
len2, p->two->path,
|
||||
len1, p->one->path,
|
||||
len2, p->two->path);
|
||||
SHA1_Update(&ctx, buffer, len1);
|
||||
git_SHA1_Update(&ctx, buffer, len1);
|
||||
|
||||
xpp.flags = XDF_NEED_MINIMAL;
|
||||
xecfg.ctxlen = 3;
|
||||
|
@ -3199,7 +3199,7 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
|
|||
&xpp, &xecfg, &ecb);
|
||||
}
|
||||
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
4
dir.c
4
dir.c
|
@ -382,7 +382,7 @@ static struct dir_entry *dir_entry_new(const char *pathname, int len)
|
|||
return ent;
|
||||
}
|
||||
|
||||
struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len)
|
||||
static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len)
|
||||
{
|
||||
if (cache_name_exists(pathname, len, ignore_case))
|
||||
return NULL;
|
||||
|
@ -391,7 +391,7 @@ struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int
|
|||
return dir->entries[dir->nr++] = dir_entry_new(pathname, len);
|
||||
}
|
||||
|
||||
struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
|
||||
static struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
|
||||
{
|
||||
if (cache_name_pos(pathname, len) >= 0)
|
||||
return NULL;
|
||||
|
|
1
dir.h
1
dir.h
|
@ -73,7 +73,6 @@ extern void add_excludes_from_file(struct dir_struct *, const char *fname);
|
|||
extern void add_exclude(const char *string, const char *base,
|
||||
int baselen, struct exclude_list *which);
|
||||
extern int file_exists(const char *);
|
||||
extern struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len);
|
||||
|
||||
extern char *get_relative_cwd(char *buffer, int size, const char *dir);
|
||||
extern int is_inside_dir(const char *dir);
|
||||
|
|
|
@ -845,7 +845,7 @@ static int oecmp (const void *a_, const void *b_)
|
|||
static char *create_index(void)
|
||||
{
|
||||
static char tmpfile[PATH_MAX];
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
struct sha1file *f;
|
||||
struct object_entry **idx, **c, **last, *e;
|
||||
struct object_entry_pool *o;
|
||||
|
@ -882,17 +882,17 @@ static char *create_index(void)
|
|||
idx_fd = xmkstemp(tmpfile);
|
||||
f = sha1fd(idx_fd, tmpfile);
|
||||
sha1write(f, array, 256 * sizeof(int));
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
for (c = idx; c != last; c++) {
|
||||
uint32_t offset = htonl((*c)->offset);
|
||||
sha1write(f, &offset, 4);
|
||||
sha1write(f, (*c)->sha1, sizeof((*c)->sha1));
|
||||
SHA1_Update(&ctx, (*c)->sha1, 20);
|
||||
git_SHA1_Update(&ctx, (*c)->sha1, 20);
|
||||
}
|
||||
sha1write(f, pack_data->sha1, sizeof(pack_data->sha1));
|
||||
sha1close(f, NULL, CSUM_FSYNC);
|
||||
free(idx);
|
||||
SHA1_Final(pack_data->sha1, &ctx);
|
||||
git_SHA1_Final(pack_data->sha1, &ctx);
|
||||
return tmpfile;
|
||||
}
|
||||
|
||||
|
@ -1033,15 +1033,15 @@ static int store_object(
|
|||
unsigned char hdr[96];
|
||||
unsigned char sha1[20];
|
||||
unsigned long hdrlen, deltalen;
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
z_stream s;
|
||||
|
||||
hdrlen = sprintf((char*)hdr,"%s %lu", typename(type),
|
||||
(unsigned long)dat->len) + 1;
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, hdr, hdrlen);
|
||||
SHA1_Update(&c, dat->buf, dat->len);
|
||||
SHA1_Final(sha1, &c);
|
||||
git_SHA1_Init(&c);
|
||||
git_SHA1_Update(&c, hdr, hdrlen);
|
||||
git_SHA1_Update(&c, dat->buf, dat->len);
|
||||
git_SHA1_Final(sha1, &c);
|
||||
if (sha1out)
|
||||
hashcpy(sha1out, sha1);
|
||||
|
||||
|
|
|
@ -435,6 +435,10 @@ div.search {
|
|||
right: 12px
|
||||
}
|
||||
|
||||
p.projsearch {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
td.linenr {
|
||||
text-align: right;
|
||||
}
|
||||
|
|
|
@ -27,6 +27,13 @@ BEGIN
|
|||
our $my_url = $cgi->url();
|
||||
our $my_uri = $cgi->url(-absolute => 1);
|
||||
|
||||
# if we're called with PATH_INFO, we have to strip that
|
||||
# from the URL to find our real URL
|
||||
if (my $path_info = $ENV{"PATH_INFO"}) {
|
||||
$my_url =~ s,\Q$path_info\E$,,;
|
||||
$my_uri =~ s,\Q$path_info\E$,,;
|
||||
}
|
||||
|
||||
# core git executable to use
|
||||
# this can just be "git" if your webserver has a sensible PATH
|
||||
our $GIT = "++GIT_BINDIR++/git";
|
||||
|
@ -295,6 +302,24 @@ BEGIN
|
|||
'actions' => {
|
||||
'override' => 0,
|
||||
'default' => []},
|
||||
|
||||
# Allow gitweb scan project content tags described in ctags/
|
||||
# of project repository, and display the popular Web 2.0-ish
|
||||
# "tag cloud" near the project list. Note that this is something
|
||||
# COMPLETELY different from the normal Git tags.
|
||||
|
||||
# gitweb by itself can show existing tags, but it does not handle
|
||||
# tagging itself; you need an external application for that.
|
||||
# For an example script, check Girocco's cgi/tagproj.cgi.
|
||||
# You may want to install the HTML::TagCloud Perl module to get
|
||||
# a pretty tag cloud instead of just a list of tags.
|
||||
|
||||
# To enable system wide have in $GITWEB_CONFIG
|
||||
# $feature{'ctags'}{'default'} = ['path_to_tag_script'];
|
||||
# Project specific override is not supported.
|
||||
'ctags' => {
|
||||
'override' => 0,
|
||||
'default' => [0]},
|
||||
);
|
||||
|
||||
sub gitweb_check_feature {
|
||||
|
@ -795,7 +820,7 @@ sub quot_cec {
|
|||
);
|
||||
my $chr = ( (exists $es{$cntrl})
|
||||
? $es{$cntrl}
|
||||
: sprintf('\%03o', ord($cntrl)) );
|
||||
: sprintf('\%2x', ord($cntrl)) );
|
||||
if ($opts{-nohtml}) {
|
||||
return $chr;
|
||||
} else {
|
||||
|
@ -1775,6 +1800,67 @@ sub git_get_project_description {
|
|||
return $descr;
|
||||
}
|
||||
|
||||
sub git_get_project_ctags {
|
||||
my $path = shift;
|
||||
my $ctags = {};
|
||||
|
||||
$git_dir = "$projectroot/$path";
|
||||
foreach (<$git_dir/ctags/*>) {
|
||||
open CT, $_ or next;
|
||||
my $val = <CT>;
|
||||
chomp $val;
|
||||
close CT;
|
||||
my $ctag = $_; $ctag =~ s#.*/##;
|
||||
$ctags->{$ctag} = $val;
|
||||
}
|
||||
$ctags;
|
||||
}
|
||||
|
||||
sub git_populate_project_tagcloud {
|
||||
my $ctags = shift;
|
||||
|
||||
# First, merge different-cased tags; tags vote on casing
|
||||
my %ctags_lc;
|
||||
foreach (keys %$ctags) {
|
||||
$ctags_lc{lc $_}->{count} += $ctags->{$_};
|
||||
if (not $ctags_lc{lc $_}->{topcount}
|
||||
or $ctags_lc{lc $_}->{topcount} < $ctags->{$_}) {
|
||||
$ctags_lc{lc $_}->{topcount} = $ctags->{$_};
|
||||
$ctags_lc{lc $_}->{topname} = $_;
|
||||
}
|
||||
}
|
||||
|
||||
my $cloud;
|
||||
if (eval { require HTML::TagCloud; 1; }) {
|
||||
$cloud = HTML::TagCloud->new;
|
||||
foreach (sort keys %ctags_lc) {
|
||||
# Pad the title with spaces so that the cloud looks
|
||||
# less crammed.
|
||||
my $title = $ctags_lc{$_}->{topname};
|
||||
$title =~ s/ / /g;
|
||||
$title =~ s/^/ /g;
|
||||
$title =~ s/$/ /g;
|
||||
$cloud->add($title, $home_link."?by_tag=".$_, $ctags_lc{$_}->{count});
|
||||
}
|
||||
} else {
|
||||
$cloud = \%ctags_lc;
|
||||
}
|
||||
$cloud;
|
||||
}
|
||||
|
||||
sub git_show_project_tagcloud {
|
||||
my ($cloud, $count) = @_;
|
||||
print STDERR ref($cloud)."..\n";
|
||||
if (ref $cloud eq 'HTML::TagCloud') {
|
||||
return $cloud->html_and_css($count);
|
||||
} else {
|
||||
my @tags = sort { $cloud->{$a}->{count} <=> $cloud->{$b}->{count} } keys %$cloud;
|
||||
return '<p align="center">' . join (', ', map {
|
||||
"<a href=\"$home_link?by_tag=$_\">$cloud->{$_}->{topname}</a>"
|
||||
} splice(@tags, 0, $count)) . '</p>';
|
||||
}
|
||||
}
|
||||
|
||||
sub git_get_project_url_list {
|
||||
my $path = shift;
|
||||
|
||||
|
@ -1823,9 +1909,7 @@ sub git_get_projects_list {
|
|||
|
||||
my $subdir = substr($File::Find::name, $pfxlen + 1);
|
||||
# we check related file in $projectroot
|
||||
if ($check_forks and $subdir =~ m#/.#) {
|
||||
$File::Find::prune = 1;
|
||||
} elsif (check_export_ok("$projectroot/$filter/$subdir")) {
|
||||
if (check_export_ok("$projectroot/$filter/$subdir")) {
|
||||
push @list, { path => ($filter ? "$filter/" : '') . $subdir };
|
||||
$File::Find::prune = 1;
|
||||
}
|
||||
|
@ -3606,6 +3690,7 @@ sub fill_project_list_info {
|
|||
my ($projlist, $check_forks) = @_;
|
||||
my @projects;
|
||||
|
||||
my $show_ctags = gitweb_check_feature('ctags');
|
||||
PROJECT:
|
||||
foreach my $pr (@$projlist) {
|
||||
my (@activity) = git_get_last_activity($pr->{'path'});
|
||||
|
@ -3632,6 +3717,7 @@ sub fill_project_list_info {
|
|||
$pr->{'forks'} = 0;
|
||||
}
|
||||
}
|
||||
$show_ctags and $pr->{'ctags'} = git_get_project_ctags($pr->{'path'});
|
||||
push @projects, $pr;
|
||||
}
|
||||
|
||||
|
@ -3655,6 +3741,7 @@ sub print_sort_th {
|
|||
}
|
||||
|
||||
sub git_project_list_body {
|
||||
# actually uses global variable $project
|
||||
my ($projlist, $order, $from, $to, $extra, $no_header) = @_;
|
||||
|
||||
my ($check_forks) = gitweb_check_feature('forks');
|
||||
|
@ -3677,6 +3764,18 @@ sub git_project_list_body {
|
|||
@projects = sort {$a->{$oi->{'key'}} <=> $b->{$oi->{'key'}}} @projects;
|
||||
}
|
||||
|
||||
my $show_ctags = gitweb_check_feature('ctags');
|
||||
if ($show_ctags) {
|
||||
my %ctags;
|
||||
foreach my $p (@projects) {
|
||||
foreach my $ct (keys %{$p->{'ctags'}}) {
|
||||
$ctags{$ct} += $p->{'ctags'}->{$ct};
|
||||
}
|
||||
}
|
||||
my $cloud = git_populate_project_tagcloud(\%ctags);
|
||||
print git_show_project_tagcloud($cloud, 64);
|
||||
}
|
||||
|
||||
print "<table class=\"project_list\">\n";
|
||||
unless ($no_header) {
|
||||
print "<tr>\n";
|
||||
|
@ -3691,8 +3790,21 @@ sub git_project_list_body {
|
|||
"</tr>\n";
|
||||
}
|
||||
my $alternate = 1;
|
||||
my $tagfilter = $cgi->param('by_tag');
|
||||
for (my $i = $from; $i <= $to; $i++) {
|
||||
my $pr = $projects[$i];
|
||||
|
||||
next if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}};
|
||||
next if $searchtext and not $pr->{'path'} =~ /$searchtext/
|
||||
and not $pr->{'descr_long'} =~ /$searchtext/;
|
||||
# Weed out forks or non-matching entries of search
|
||||
if ($check_forks) {
|
||||
my $forkbase = $project; $forkbase ||= ''; $forkbase =~ s#\.git$#/#;
|
||||
$forkbase="^$forkbase" if $forkbase;
|
||||
next if not $searchtext and not $tagfilter and $show_ctags
|
||||
and $pr->{'path'} =~ m#$forkbase.*/.*#; # regexp-safe
|
||||
}
|
||||
|
||||
if ($alternate) {
|
||||
print "<tr class=\"dark\">\n";
|
||||
} else {
|
||||
|
@ -4027,6 +4139,11 @@ sub git_project_list {
|
|||
close $fd;
|
||||
print "</div>\n";
|
||||
}
|
||||
print $cgi->startform(-method => "get") .
|
||||
"<p class=\"projsearch\">Search:\n" .
|
||||
$cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
|
||||
"</p>" .
|
||||
$cgi->end_form() . "\n";
|
||||
git_project_list_body(\@list, $order);
|
||||
git_footer_html();
|
||||
}
|
||||
|
@ -4098,10 +4215,10 @@ sub git_summary {
|
|||
|
||||
print "<div class=\"title\"> </div>\n";
|
||||
print "<table class=\"projects_list\">\n" .
|
||||
"<tr><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
|
||||
"<tr><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
|
||||
"<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
|
||||
"<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
|
||||
if (defined $cd{'rfc2822'}) {
|
||||
print "<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
|
||||
print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
|
||||
}
|
||||
|
||||
# use per project git URL list in $projectroot/$project/cloneurl
|
||||
|
@ -4111,9 +4228,23 @@ sub git_summary {
|
|||
@url_list = map { "$_/$project" } @git_base_url_list unless @url_list;
|
||||
foreach my $git_url (@url_list) {
|
||||
next unless $git_url;
|
||||
print "<tr><td>$url_tag</td><td>$git_url</td></tr>\n";
|
||||
print "<tr class=\"metadata_url\"><td>$url_tag</td><td>$git_url</td></tr>\n";
|
||||
$url_tag = "";
|
||||
}
|
||||
|
||||
# Tag cloud
|
||||
my $show_ctags = (gitweb_check_feature('ctags'))[0];
|
||||
if ($show_ctags) {
|
||||
my $ctags = git_get_project_ctags($project);
|
||||
my $cloud = git_populate_project_tagcloud($ctags);
|
||||
print "<tr id=\"metadata_ctags\"><td>Content tags:<br />";
|
||||
print "</td>\n<td>" unless %$ctags;
|
||||
print "<form action=\"$show_ctags\" method=\"post\"><input type=\"hidden\" name=\"p\" value=\"$project\" />Add: <input type=\"text\" name=\"t\" size=\"8\" /></form>";
|
||||
print "</td>\n<td>" if %$ctags;
|
||||
print git_show_project_tagcloud($cloud, 48);
|
||||
print "</td></tr>";
|
||||
}
|
||||
|
||||
print "</table>\n";
|
||||
|
||||
if (-s "$projectroot/$project/README.html") {
|
||||
|
@ -4473,6 +4604,7 @@ sub git_tree {
|
|||
$hash = $hash_base;
|
||||
}
|
||||
}
|
||||
die_error(404, "No such tree") unless defined($hash);
|
||||
$/ = "\0";
|
||||
open my $fd, "-|", git_cmd(), "ls-tree", '-z', $hash
|
||||
or die_error(500, "Open git-ls-tree failed");
|
||||
|
@ -4513,8 +4645,8 @@ sub git_tree {
|
|||
if ($basedir ne '' && substr($basedir, -1) ne '/') {
|
||||
$basedir .= '/';
|
||||
}
|
||||
git_print_page_path($file_name, 'tree', $hash_base);
|
||||
}
|
||||
git_print_page_path($file_name, 'tree', $hash_base);
|
||||
print "<div class=\"page_body\">\n";
|
||||
print "<table class=\"tree\">\n";
|
||||
my $alternate = 1;
|
||||
|
|
10
http-push.c
10
http-push.c
|
@ -126,7 +126,7 @@ struct transfer_request
|
|||
char errorstr[CURL_ERROR_SIZE];
|
||||
long http_code;
|
||||
unsigned char real_sha1[20];
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
z_stream stream;
|
||||
int zret;
|
||||
int rename;
|
||||
|
@ -209,7 +209,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
|
|||
request->stream.next_out = expn;
|
||||
request->stream.avail_out = sizeof(expn);
|
||||
request->zret = inflate(&request->stream, Z_SYNC_FLUSH);
|
||||
SHA1_Update(&request->c, expn,
|
||||
git_SHA1_Update(&request->c, expn,
|
||||
sizeof(expn) - request->stream.avail_out);
|
||||
} while (request->stream.avail_in && request->zret == Z_OK);
|
||||
data_received++;
|
||||
|
@ -270,7 +270,7 @@ static void start_fetch_loose(struct transfer_request *request)
|
|||
|
||||
inflateInit(&request->stream);
|
||||
|
||||
SHA1_Init(&request->c);
|
||||
git_SHA1_Init(&request->c);
|
||||
|
||||
url = xmalloc(strlen(remote->url) + 50);
|
||||
request->url = xmalloc(strlen(remote->url) + 50);
|
||||
|
@ -310,7 +310,7 @@ static void start_fetch_loose(struct transfer_request *request)
|
|||
if (prev_read == -1) {
|
||||
memset(&request->stream, 0, sizeof(request->stream));
|
||||
inflateInit(&request->stream);
|
||||
SHA1_Init(&request->c);
|
||||
git_SHA1_Init(&request->c);
|
||||
if (prev_posn>0) {
|
||||
prev_posn = 0;
|
||||
lseek(request->local_fileno, 0, SEEK_SET);
|
||||
|
@ -742,7 +742,7 @@ static void finish_request(struct transfer_request *request)
|
|||
fprintf(stderr, "Warning: requested range invalid; we may already have all the data.\n");
|
||||
|
||||
inflateEnd(&request->stream);
|
||||
SHA1_Final(request->real_sha1, &request->c);
|
||||
git_SHA1_Final(request->real_sha1, &request->c);
|
||||
if (request->zret != Z_STREAM_END) {
|
||||
unlink(request->tmpfile);
|
||||
} else if (hashcmp(request->obj->sha1, request->real_sha1)) {
|
||||
|
|
|
@ -36,7 +36,7 @@ struct object_request
|
|||
char errorstr[CURL_ERROR_SIZE];
|
||||
long http_code;
|
||||
unsigned char real_sha1[20];
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
z_stream stream;
|
||||
int zret;
|
||||
int rename;
|
||||
|
@ -83,7 +83,7 @@ static size_t fwrite_sha1_file(void *ptr, size_t eltsize, size_t nmemb,
|
|||
obj_req->stream.next_out = expn;
|
||||
obj_req->stream.avail_out = sizeof(expn);
|
||||
obj_req->zret = inflate(&obj_req->stream, Z_SYNC_FLUSH);
|
||||
SHA1_Update(&obj_req->c, expn,
|
||||
git_SHA1_Update(&obj_req->c, expn,
|
||||
sizeof(expn) - obj_req->stream.avail_out);
|
||||
} while (obj_req->stream.avail_in && obj_req->zret == Z_OK);
|
||||
data_received++;
|
||||
|
@ -144,7 +144,7 @@ static void start_object_request(struct walker *walker,
|
|||
|
||||
inflateInit(&obj_req->stream);
|
||||
|
||||
SHA1_Init(&obj_req->c);
|
||||
git_SHA1_Init(&obj_req->c);
|
||||
|
||||
url = xmalloc(strlen(obj_req->repo->base) + 51);
|
||||
obj_req->url = xmalloc(strlen(obj_req->repo->base) + 51);
|
||||
|
@ -184,7 +184,7 @@ static void start_object_request(struct walker *walker,
|
|||
if (prev_read == -1) {
|
||||
memset(&obj_req->stream, 0, sizeof(obj_req->stream));
|
||||
inflateInit(&obj_req->stream);
|
||||
SHA1_Init(&obj_req->c);
|
||||
git_SHA1_Init(&obj_req->c);
|
||||
if (prev_posn>0) {
|
||||
prev_posn = 0;
|
||||
lseek(obj_req->local, 0, SEEK_SET);
|
||||
|
@ -244,7 +244,7 @@ static void finish_object_request(struct object_request *obj_req)
|
|||
}
|
||||
|
||||
inflateEnd(&obj_req->stream);
|
||||
SHA1_Final(obj_req->real_sha1, &obj_req->c);
|
||||
git_SHA1_Final(obj_req->real_sha1, &obj_req->c);
|
||||
if (obj_req->zret != Z_STREAM_END) {
|
||||
unlink(obj_req->tmpfile);
|
||||
return;
|
||||
|
|
|
@ -67,7 +67,7 @@ static struct progress *progress;
|
|||
static unsigned char input_buffer[4096];
|
||||
static unsigned int input_offset, input_len;
|
||||
static off_t consumed_bytes;
|
||||
static SHA_CTX input_ctx;
|
||||
static git_SHA_CTX input_ctx;
|
||||
static uint32_t input_crc32;
|
||||
static int input_fd, output_fd, pack_fd;
|
||||
|
||||
|
@ -119,7 +119,7 @@ static void flush(void)
|
|||
if (input_offset) {
|
||||
if (output_fd >= 0)
|
||||
write_or_die(output_fd, input_buffer, input_offset);
|
||||
SHA1_Update(&input_ctx, input_buffer, input_offset);
|
||||
git_SHA1_Update(&input_ctx, input_buffer, input_offset);
|
||||
memmove(input_buffer, input_buffer + input_offset, input_len);
|
||||
input_offset = 0;
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ static char *open_pack_file(char *pack_name)
|
|||
output_fd = -1;
|
||||
pack_fd = input_fd;
|
||||
}
|
||||
SHA1_Init(&input_ctx);
|
||||
git_SHA1_Init(&input_ctx);
|
||||
return pack_name;
|
||||
}
|
||||
|
||||
|
@ -588,7 +588,7 @@ static void parse_pack_objects(unsigned char *sha1)
|
|||
|
||||
/* Check pack integrity */
|
||||
flush();
|
||||
SHA1_Final(sha1, &input_ctx);
|
||||
git_SHA1_Final(sha1, &input_ctx);
|
||||
if (hashcmp(fill(20), sha1))
|
||||
die("pack is corrupted (SHA1 mismatch)");
|
||||
use(20);
|
||||
|
|
|
@ -35,9 +35,9 @@
|
|||
|
||||
#include "sha1.h"
|
||||
|
||||
static void shaHashBlock(SHA_CTX *ctx);
|
||||
static void shaHashBlock(moz_SHA_CTX *ctx);
|
||||
|
||||
void SHA1_Init(SHA_CTX *ctx) {
|
||||
void moz_SHA1_Init(moz_SHA_CTX *ctx) {
|
||||
int i;
|
||||
|
||||
ctx->lenW = 0;
|
||||
|
@ -56,7 +56,7 @@ void SHA1_Init(SHA_CTX *ctx) {
|
|||
}
|
||||
|
||||
|
||||
void SHA1_Update(SHA_CTX *ctx, const void *_dataIn, int len) {
|
||||
void moz_SHA1_Update(moz_SHA_CTX *ctx, const void *_dataIn, int len) {
|
||||
const unsigned char *dataIn = _dataIn;
|
||||
int i;
|
||||
|
||||
|
@ -75,7 +75,7 @@ void SHA1_Update(SHA_CTX *ctx, const void *_dataIn, int len) {
|
|||
}
|
||||
|
||||
|
||||
void SHA1_Final(unsigned char hashout[20], SHA_CTX *ctx) {
|
||||
void moz_SHA1_Final(unsigned char hashout[20], moz_SHA_CTX *ctx) {
|
||||
unsigned char pad0x80 = 0x80;
|
||||
unsigned char pad0x00 = 0x00;
|
||||
unsigned char padlen[8];
|
||||
|
@ -91,10 +91,10 @@ void SHA1_Final(unsigned char hashout[20], SHA_CTX *ctx) {
|
|||
padlen[5] = (unsigned char)((ctx->sizeLo >> 16) & 255);
|
||||
padlen[6] = (unsigned char)((ctx->sizeLo >> 8) & 255);
|
||||
padlen[7] = (unsigned char)((ctx->sizeLo >> 0) & 255);
|
||||
SHA1_Update(ctx, &pad0x80, 1);
|
||||
moz_SHA1_Update(ctx, &pad0x80, 1);
|
||||
while (ctx->lenW != 56)
|
||||
SHA1_Update(ctx, &pad0x00, 1);
|
||||
SHA1_Update(ctx, padlen, 8);
|
||||
moz_SHA1_Update(ctx, &pad0x00, 1);
|
||||
moz_SHA1_Update(ctx, padlen, 8);
|
||||
|
||||
/* Output hash
|
||||
*/
|
||||
|
@ -106,13 +106,13 @@ void SHA1_Final(unsigned char hashout[20], SHA_CTX *ctx) {
|
|||
/*
|
||||
* Re-initialize the context (also zeroizes contents)
|
||||
*/
|
||||
SHA1_Init(ctx);
|
||||
moz_SHA1_Init(ctx);
|
||||
}
|
||||
|
||||
|
||||
#define SHA_ROT(X,n) (((X) << (n)) | ((X) >> (32-(n))))
|
||||
|
||||
static void shaHashBlock(SHA_CTX *ctx) {
|
||||
static void shaHashBlock(moz_SHA_CTX *ctx) {
|
||||
int t;
|
||||
unsigned int A,B,C,D,E,TEMP;
|
||||
|
||||
|
|
|
@ -38,8 +38,13 @@ typedef struct {
|
|||
unsigned int W[80];
|
||||
int lenW;
|
||||
unsigned int sizeHi,sizeLo;
|
||||
} SHA_CTX;
|
||||
} moz_SHA_CTX;
|
||||
|
||||
void SHA1_Init(SHA_CTX *ctx);
|
||||
void SHA1_Update(SHA_CTX *ctx, const void *dataIn, int len);
|
||||
void SHA1_Final(unsigned char hashout[20], SHA_CTX *ctx);
|
||||
void moz_SHA1_Init(moz_SHA_CTX *ctx);
|
||||
void moz_SHA1_Update(moz_SHA_CTX *ctx, const void *dataIn, int len);
|
||||
void moz_SHA1_Final(unsigned char hashout[20], moz_SHA_CTX *ctx);
|
||||
|
||||
#define git_SHA_CTX moz_SHA_CTX
|
||||
#define git_SHA1_Init moz_SHA1_Init
|
||||
#define git_SHA1_Update moz_SHA1_Update
|
||||
#define git_SHA1_Final moz_SHA1_Final
|
||||
|
|
16
pack-check.c
16
pack-check.c
|
@ -47,7 +47,7 @@ static int verify_packfile(struct packed_git *p,
|
|||
{
|
||||
off_t index_size = p->index_size;
|
||||
const unsigned char *index_base = p->index_data;
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
unsigned char sha1[20], *pack_sig;
|
||||
off_t offset = 0, pack_sig_ofs = p->pack_size - 20;
|
||||
uint32_t nr_objects, i;
|
||||
|
@ -60,16 +60,16 @@ static int verify_packfile(struct packed_git *p,
|
|||
* immediately.
|
||||
*/
|
||||
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
while (offset < pack_sig_ofs) {
|
||||
unsigned int remaining;
|
||||
unsigned char *in = use_pack(p, w_curs, offset, &remaining);
|
||||
offset += remaining;
|
||||
if (offset > pack_sig_ofs)
|
||||
remaining -= (unsigned int)(offset - pack_sig_ofs);
|
||||
SHA1_Update(&ctx, in, remaining);
|
||||
git_SHA1_Update(&ctx, in, remaining);
|
||||
}
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
pack_sig = use_pack(p, w_curs, pack_sig_ofs, NULL);
|
||||
if (hashcmp(sha1, pack_sig))
|
||||
err = error("%s SHA1 checksum mismatch",
|
||||
|
@ -135,7 +135,7 @@ int verify_pack(struct packed_git *p)
|
|||
{
|
||||
off_t index_size;
|
||||
const unsigned char *index_base;
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
unsigned char sha1[20];
|
||||
int err = 0;
|
||||
struct pack_window *w_curs = NULL;
|
||||
|
@ -146,9 +146,9 @@ int verify_pack(struct packed_git *p)
|
|||
index_base = p->index_data;
|
||||
|
||||
/* Verify SHA1 sum of the index file */
|
||||
SHA1_Init(&ctx);
|
||||
SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
git_SHA1_Update(&ctx, index_base, (unsigned int)(index_size - 20));
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
if (hashcmp(sha1, index_base + index_size - 20))
|
||||
err = error("Packfile index for %s SHA1 mismatch",
|
||||
p->pack_name);
|
||||
|
|
30
pack-write.c
30
pack-write.c
|
@ -25,7 +25,7 @@ char *write_idx_file(char *index_name, struct pack_idx_entry **objects,
|
|||
off_t last_obj_offset = 0;
|
||||
uint32_t array[256];
|
||||
int i, fd;
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
uint32_t index_version;
|
||||
|
||||
if (nr_objects) {
|
||||
|
@ -86,7 +86,7 @@ char *write_idx_file(char *index_name, struct pack_idx_entry **objects,
|
|||
sha1write(f, array, 256 * 4);
|
||||
|
||||
/* compute the SHA1 hash of sorted object names. */
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
|
||||
/*
|
||||
* Write the actual SHA1 entries..
|
||||
|
@ -99,7 +99,7 @@ char *write_idx_file(char *index_name, struct pack_idx_entry **objects,
|
|||
sha1write(f, &offset, 4);
|
||||
}
|
||||
sha1write(f, obj->sha1, 20);
|
||||
SHA1_Update(&ctx, obj->sha1, 20);
|
||||
git_SHA1_Update(&ctx, obj->sha1, 20);
|
||||
}
|
||||
|
||||
if (index_version >= 2) {
|
||||
|
@ -140,7 +140,7 @@ char *write_idx_file(char *index_name, struct pack_idx_entry **objects,
|
|||
|
||||
sha1write(f, sha1, 20);
|
||||
sha1close(f, NULL, CSUM_FSYNC);
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
return index_name;
|
||||
}
|
||||
|
||||
|
@ -168,12 +168,12 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
off_t partial_pack_offset)
|
||||
{
|
||||
int aligned_sz, buf_sz = 8 * 1024;
|
||||
SHA_CTX old_sha1_ctx, new_sha1_ctx;
|
||||
git_SHA_CTX old_sha1_ctx, new_sha1_ctx;
|
||||
struct pack_header hdr;
|
||||
char *buf;
|
||||
|
||||
SHA1_Init(&old_sha1_ctx);
|
||||
SHA1_Init(&new_sha1_ctx);
|
||||
git_SHA1_Init(&old_sha1_ctx);
|
||||
git_SHA1_Init(&new_sha1_ctx);
|
||||
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start of %s: %s", pack_name, strerror(errno));
|
||||
|
@ -181,9 +181,9 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
die("Unable to reread header of %s: %s", pack_name, strerror(errno));
|
||||
if (lseek(pack_fd, 0, SEEK_SET) != 0)
|
||||
die("Failed seeking to start of %s: %s", pack_name, strerror(errno));
|
||||
SHA1_Update(&old_sha1_ctx, &hdr, sizeof(hdr));
|
||||
git_SHA1_Update(&old_sha1_ctx, &hdr, sizeof(hdr));
|
||||
hdr.hdr_entries = htonl(object_count);
|
||||
SHA1_Update(&new_sha1_ctx, &hdr, sizeof(hdr));
|
||||
git_SHA1_Update(&new_sha1_ctx, &hdr, sizeof(hdr));
|
||||
write_or_die(pack_fd, &hdr, sizeof(hdr));
|
||||
partial_pack_offset -= sizeof(hdr);
|
||||
|
||||
|
@ -198,7 +198,7 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
break;
|
||||
if (n < 0)
|
||||
die("Failed to checksum %s: %s", pack_name, strerror(errno));
|
||||
SHA1_Update(&new_sha1_ctx, buf, n);
|
||||
git_SHA1_Update(&new_sha1_ctx, buf, n);
|
||||
|
||||
aligned_sz -= n;
|
||||
if (!aligned_sz)
|
||||
|
@ -207,11 +207,11 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
if (!partial_pack_sha1)
|
||||
continue;
|
||||
|
||||
SHA1_Update(&old_sha1_ctx, buf, n);
|
||||
git_SHA1_Update(&old_sha1_ctx, buf, n);
|
||||
partial_pack_offset -= n;
|
||||
if (partial_pack_offset == 0) {
|
||||
unsigned char sha1[20];
|
||||
SHA1_Final(sha1, &old_sha1_ctx);
|
||||
git_SHA1_Final(sha1, &old_sha1_ctx);
|
||||
if (hashcmp(sha1, partial_pack_sha1) != 0)
|
||||
die("Unexpected checksum for %s "
|
||||
"(disk corruption?)", pack_name);
|
||||
|
@ -220,7 +220,7 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
* pack, which also means making partial_pack_offset
|
||||
* big enough not to matter anymore.
|
||||
*/
|
||||
SHA1_Init(&old_sha1_ctx);
|
||||
git_SHA1_Init(&old_sha1_ctx);
|
||||
partial_pack_offset = ~partial_pack_offset;
|
||||
partial_pack_offset -= MSB(partial_pack_offset, 1);
|
||||
}
|
||||
|
@ -228,8 +228,8 @@ void fixup_pack_header_footer(int pack_fd,
|
|||
free(buf);
|
||||
|
||||
if (partial_pack_sha1)
|
||||
SHA1_Final(partial_pack_sha1, &old_sha1_ctx);
|
||||
SHA1_Final(new_pack_sha1, &new_sha1_ctx);
|
||||
git_SHA1_Final(partial_pack_sha1, &old_sha1_ctx);
|
||||
git_SHA1_Final(new_pack_sha1, &new_sha1_ctx);
|
||||
write_or_die(pack_fd, new_pack_sha1, 20);
|
||||
fsync_or_die(pack_fd, pack_name);
|
||||
}
|
||||
|
|
12
patch-id.c
12
patch-id.c
|
@ -1,6 +1,6 @@
|
|||
#include "cache.h"
|
||||
|
||||
static void flush_current_id(int patchlen, unsigned char *id, SHA_CTX *c)
|
||||
static void flush_current_id(int patchlen, unsigned char *id, git_SHA_CTX *c)
|
||||
{
|
||||
unsigned char result[20];
|
||||
char name[50];
|
||||
|
@ -8,10 +8,10 @@ static void flush_current_id(int patchlen, unsigned char *id, SHA_CTX *c)
|
|||
if (!patchlen)
|
||||
return;
|
||||
|
||||
SHA1_Final(result, c);
|
||||
git_SHA1_Final(result, c);
|
||||
memcpy(name, sha1_to_hex(id), 41);
|
||||
printf("%s %s\n", sha1_to_hex(result), name);
|
||||
SHA1_Init(c);
|
||||
git_SHA1_Init(c);
|
||||
}
|
||||
|
||||
static int remove_space(char *line)
|
||||
|
@ -31,10 +31,10 @@ static void generate_id_list(void)
|
|||
{
|
||||
static unsigned char sha1[20];
|
||||
static char line[1000];
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
int patchlen = 0;
|
||||
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
while (fgets(line, sizeof(line), stdin) != NULL) {
|
||||
unsigned char n[20];
|
||||
char *p = line;
|
||||
|
@ -67,7 +67,7 @@ static void generate_id_list(void)
|
|||
/* Compute the sha without whitespace */
|
||||
len = remove_space(line);
|
||||
patchlen += len;
|
||||
SHA1_Update(&ctx, line, len);
|
||||
git_SHA1_Update(&ctx, line, len);
|
||||
}
|
||||
flush_current_id(patchlen, sha1, &ctx);
|
||||
}
|
||||
|
|
18
ppc/sha1.c
18
ppc/sha1.c
|
@ -10,10 +10,10 @@
|
|||
#include <string.h>
|
||||
#include "sha1.h"
|
||||
|
||||
extern void sha1_core(uint32_t *hash, const unsigned char *p,
|
||||
unsigned int nblocks);
|
||||
extern void ppc_sha1_core(uint32_t *hash, const unsigned char *p,
|
||||
unsigned int nblocks);
|
||||
|
||||
int SHA1_Init(SHA_CTX *c)
|
||||
int ppc_SHA1_Init(ppc_SHA_CTX *c)
|
||||
{
|
||||
c->hash[0] = 0x67452301;
|
||||
c->hash[1] = 0xEFCDAB89;
|
||||
|
@ -25,7 +25,7 @@ int SHA1_Init(SHA_CTX *c)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int SHA1_Update(SHA_CTX *c, const void *ptr, unsigned long n)
|
||||
int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *ptr, unsigned long n)
|
||||
{
|
||||
unsigned long nb;
|
||||
const unsigned char *p = ptr;
|
||||
|
@ -38,12 +38,12 @@ int SHA1_Update(SHA_CTX *c, const void *ptr, unsigned long n)
|
|||
nb = n;
|
||||
memcpy(&c->buf.b[c->cnt], p, nb);
|
||||
if ((c->cnt += nb) == 64) {
|
||||
sha1_core(c->hash, c->buf.b, 1);
|
||||
ppc_sha1_core(c->hash, c->buf.b, 1);
|
||||
c->cnt = 0;
|
||||
}
|
||||
} else {
|
||||
nb = n >> 6;
|
||||
sha1_core(c->hash, p, nb);
|
||||
ppc_sha1_core(c->hash, p, nb);
|
||||
nb <<= 6;
|
||||
}
|
||||
n -= nb;
|
||||
|
@ -52,7 +52,7 @@ int SHA1_Update(SHA_CTX *c, const void *ptr, unsigned long n)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int SHA1_Final(unsigned char *hash, SHA_CTX *c)
|
||||
int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c)
|
||||
{
|
||||
unsigned int cnt = c->cnt;
|
||||
|
||||
|
@ -60,13 +60,13 @@ int SHA1_Final(unsigned char *hash, SHA_CTX *c)
|
|||
if (cnt > 56) {
|
||||
if (cnt < 64)
|
||||
memset(&c->buf.b[cnt], 0, 64 - cnt);
|
||||
sha1_core(c->hash, c->buf.b, 1);
|
||||
ppc_sha1_core(c->hash, c->buf.b, 1);
|
||||
cnt = 0;
|
||||
}
|
||||
if (cnt < 56)
|
||||
memset(&c->buf.b[cnt], 0, 56 - cnt);
|
||||
c->buf.l[7] = c->len;
|
||||
sha1_core(c->hash, c->buf.b, 1);
|
||||
ppc_sha1_core(c->hash, c->buf.b, 1);
|
||||
memcpy(hash, c->hash, 20);
|
||||
return 0;
|
||||
}
|
||||
|
|
15
ppc/sha1.h
15
ppc/sha1.h
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct sha_context {
|
||||
typedef struct {
|
||||
uint32_t hash[5];
|
||||
uint32_t cnt;
|
||||
uint64_t len;
|
||||
|
@ -13,8 +13,13 @@ typedef struct sha_context {
|
|||
unsigned char b[64];
|
||||
uint64_t l[8];
|
||||
} buf;
|
||||
} SHA_CTX;
|
||||
} ppc_SHA_CTX;
|
||||
|
||||
int SHA1_Init(SHA_CTX *c);
|
||||
int SHA1_Update(SHA_CTX *c, const void *p, unsigned long n);
|
||||
int SHA1_Final(unsigned char *hash, SHA_CTX *c);
|
||||
int ppc_SHA1_Init(ppc_SHA_CTX *c);
|
||||
int ppc_SHA1_Update(ppc_SHA_CTX *c, const void *p, unsigned long n);
|
||||
int ppc_SHA1_Final(unsigned char *hash, ppc_SHA_CTX *c);
|
||||
|
||||
#define git_SHA_CTX ppc_SHA_CTX
|
||||
#define git_SHA1_Init ppc_SHA1_Init
|
||||
#define git_SHA1_Update ppc_SHA1_Update
|
||||
#define git_SHA1_Final ppc_SHA1_Final
|
||||
|
|
|
@ -162,8 +162,8 @@ add RE(t),RE(t),%r0; rotlwi RB(t),RB(t),30
|
|||
STEPUP4(fn, (t)+12, (s)+12,); \
|
||||
STEPUP4(fn, (t)+16, (s)+16, loadk)
|
||||
|
||||
.globl sha1_core
|
||||
sha1_core:
|
||||
.globl ppc_sha1_core
|
||||
ppc_sha1_core:
|
||||
stwu %r1,-80(%r1)
|
||||
stmw %r13,4(%r1)
|
||||
|
||||
|
|
28
read-cache.c
28
read-cache.c
|
@ -1072,16 +1072,16 @@ struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int really)
|
|||
|
||||
static int verify_hdr(struct cache_header *hdr, unsigned long size)
|
||||
{
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
unsigned char sha1[20];
|
||||
|
||||
if (hdr->hdr_signature != htonl(CACHE_SIGNATURE))
|
||||
return error("bad signature");
|
||||
if (hdr->hdr_version != htonl(2))
|
||||
return error("bad index version");
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, hdr, size - 20);
|
||||
SHA1_Final(sha1, &c);
|
||||
git_SHA1_Init(&c);
|
||||
git_SHA1_Update(&c, hdr, size - 20);
|
||||
git_SHA1_Final(sha1, &c);
|
||||
if (hashcmp(sha1, (unsigned char *)hdr + size - 20))
|
||||
return error("bad index file sha1 signature");
|
||||
return 0;
|
||||
|
@ -1278,11 +1278,11 @@ int unmerged_index(const struct index_state *istate)
|
|||
static unsigned char write_buffer[WRITE_BUFFER_SIZE];
|
||||
static unsigned long write_buffer_len;
|
||||
|
||||
static int ce_write_flush(SHA_CTX *context, int fd)
|
||||
static int ce_write_flush(git_SHA_CTX *context, int fd)
|
||||
{
|
||||
unsigned int buffered = write_buffer_len;
|
||||
if (buffered) {
|
||||
SHA1_Update(context, write_buffer, buffered);
|
||||
git_SHA1_Update(context, write_buffer, buffered);
|
||||
if (write_in_full(fd, write_buffer, buffered) != buffered)
|
||||
return -1;
|
||||
write_buffer_len = 0;
|
||||
|
@ -1290,7 +1290,7 @@ static int ce_write_flush(SHA_CTX *context, int fd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
|
||||
static int ce_write(git_SHA_CTX *context, int fd, void *data, unsigned int len)
|
||||
{
|
||||
while (len) {
|
||||
unsigned int buffered = write_buffer_len;
|
||||
|
@ -1312,7 +1312,7 @@ static int ce_write(SHA_CTX *context, int fd, void *data, unsigned int len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int write_index_ext_header(SHA_CTX *context, int fd,
|
||||
static int write_index_ext_header(git_SHA_CTX *context, int fd,
|
||||
unsigned int ext, unsigned int sz)
|
||||
{
|
||||
ext = htonl(ext);
|
||||
|
@ -1321,13 +1321,13 @@ static int write_index_ext_header(SHA_CTX *context, int fd,
|
|||
(ce_write(context, fd, &sz, 4) < 0)) ? -1 : 0;
|
||||
}
|
||||
|
||||
static int ce_flush(SHA_CTX *context, int fd)
|
||||
static int ce_flush(git_SHA_CTX *context, int fd)
|
||||
{
|
||||
unsigned int left = write_buffer_len;
|
||||
|
||||
if (left) {
|
||||
write_buffer_len = 0;
|
||||
SHA1_Update(context, write_buffer, left);
|
||||
git_SHA1_Update(context, write_buffer, left);
|
||||
}
|
||||
|
||||
/* Flush first if not enough space for SHA1 signature */
|
||||
|
@ -1338,7 +1338,7 @@ static int ce_flush(SHA_CTX *context, int fd)
|
|||
}
|
||||
|
||||
/* Append the SHA1 signature at the end */
|
||||
SHA1_Final(write_buffer + left, context);
|
||||
git_SHA1_Final(write_buffer + left, context);
|
||||
left += 20;
|
||||
return (write_in_full(fd, write_buffer, left) != left) ? -1 : 0;
|
||||
}
|
||||
|
@ -1392,7 +1392,7 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce)
|
|||
}
|
||||
}
|
||||
|
||||
static int ce_write_entry(SHA_CTX *c, int fd, struct cache_entry *ce)
|
||||
static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce)
|
||||
{
|
||||
int size = ondisk_ce_size(ce);
|
||||
struct ondisk_cache_entry *ondisk = xcalloc(1, size);
|
||||
|
@ -1416,7 +1416,7 @@ static int ce_write_entry(SHA_CTX *c, int fd, struct cache_entry *ce)
|
|||
|
||||
int write_index(const struct index_state *istate, int newfd)
|
||||
{
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
struct cache_header hdr;
|
||||
int i, err, removed;
|
||||
struct cache_entry **cache = istate->cache;
|
||||
|
@ -1430,7 +1430,7 @@ int write_index(const struct index_state *istate, int newfd)
|
|||
hdr.hdr_version = htonl(2);
|
||||
hdr.hdr_entries = htonl(entries - removed);
|
||||
|
||||
SHA1_Init(&c);
|
||||
git_SHA1_Init(&c);
|
||||
if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0)
|
||||
return -1;
|
||||
|
||||
|
|
10
rerere.c
10
rerere.c
|
@ -73,7 +73,7 @@ static int write_rr(struct string_list *rr, int out_fd)
|
|||
static int handle_file(const char *path,
|
||||
unsigned char *sha1, const char *output)
|
||||
{
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
char buf[1024];
|
||||
int hunk_no = 0;
|
||||
enum {
|
||||
|
@ -95,7 +95,7 @@ static int handle_file(const char *path,
|
|||
}
|
||||
|
||||
if (sha1)
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
|
||||
strbuf_init(&one, 0);
|
||||
strbuf_init(&two, 0);
|
||||
|
@ -127,9 +127,9 @@ static int handle_file(const char *path,
|
|||
fputs(">>>>>>>\n", out);
|
||||
}
|
||||
if (sha1) {
|
||||
SHA1_Update(&ctx, one.buf ? one.buf : "",
|
||||
git_SHA1_Update(&ctx, one.buf ? one.buf : "",
|
||||
one.len + 1);
|
||||
SHA1_Update(&ctx, two.buf ? two.buf : "",
|
||||
git_SHA1_Update(&ctx, two.buf ? two.buf : "",
|
||||
two.len + 1);
|
||||
}
|
||||
strbuf_reset(&one);
|
||||
|
@ -154,7 +154,7 @@ static int handle_file(const char *path,
|
|||
if (out)
|
||||
fclose(out);
|
||||
if (sha1)
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
if (hunk != RR_CONTEXT) {
|
||||
if (output)
|
||||
unlink(output);
|
||||
|
|
|
@ -273,14 +273,6 @@ int run_command_v_opt(const char **argv, int opt)
|
|||
return run_command(&cmd);
|
||||
}
|
||||
|
||||
int run_command_v_opt_cd(const char **argv, int opt, const char *dir)
|
||||
{
|
||||
struct child_process cmd;
|
||||
prepare_run_command_v_opt(&cmd, argv, opt);
|
||||
cmd.dir = dir;
|
||||
return run_command(&cmd);
|
||||
}
|
||||
|
||||
int run_command_v_opt_cd_env(const char **argv, int opt, const char *dir, const char *const *env)
|
||||
{
|
||||
struct child_process cmd;
|
||||
|
|
|
@ -53,7 +53,6 @@ int run_command(struct child_process *);
|
|||
#define RUN_GIT_CMD 2 /*If this is to be git sub-command */
|
||||
#define RUN_COMMAND_STDOUT_TO_STDERR 4
|
||||
int run_command_v_opt(const char **argv, int opt);
|
||||
int run_command_v_opt_cd(const char **argv, int opt, const char *dir);
|
||||
|
||||
/*
|
||||
* env (the environment) is to be formatted like environ: "VAR=VALUE".
|
||||
|
|
10
sha1_file.c
10
sha1_file.c
|
@ -2132,16 +2132,16 @@ static void write_sha1_file_prepare(const void *buf, unsigned long len,
|
|||
const char *type, unsigned char *sha1,
|
||||
char *hdr, int *hdrlen)
|
||||
{
|
||||
SHA_CTX c;
|
||||
git_SHA_CTX c;
|
||||
|
||||
/* Generate the header */
|
||||
*hdrlen = sprintf(hdr, "%s %lu", type, len)+1;
|
||||
|
||||
/* Sha1.. */
|
||||
SHA1_Init(&c);
|
||||
SHA1_Update(&c, hdr, *hdrlen);
|
||||
SHA1_Update(&c, buf, len);
|
||||
SHA1_Final(sha1, &c);
|
||||
git_SHA1_Init(&c);
|
||||
git_SHA1_Update(&c, hdr, *hdrlen);
|
||||
git_SHA1_Update(&c, buf, len);
|
||||
git_SHA1_Final(sha1, &c);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
64
t/t7403-submodule-sync.sh
Executable file
64
t/t7403-submodule-sync.sh
Executable file
|
@ -0,0 +1,64 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2008 David Aguilar
|
||||
#
|
||||
|
||||
test_description='git submodule sync
|
||||
|
||||
These tests exercise the "git submodule sync" subcommand.
|
||||
'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success setup '
|
||||
echo file > file &&
|
||||
git add file &&
|
||||
test_tick &&
|
||||
git commit -m upstream
|
||||
git clone . super &&
|
||||
git clone super submodule &&
|
||||
(cd super &&
|
||||
git submodule add ../submodule submodule &&
|
||||
test_tick &&
|
||||
git commit -m "submodule"
|
||||
) &&
|
||||
git clone super super-clone &&
|
||||
(cd super-clone && git submodule update --init)
|
||||
'
|
||||
|
||||
test_expect_success 'change submodule' '
|
||||
(cd submodule &&
|
||||
echo second line >> file &&
|
||||
test_tick &&
|
||||
git commit -a -m "change submodule"
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success 'change submodule url' '
|
||||
(cd super &&
|
||||
cd submodule &&
|
||||
git checkout master &&
|
||||
git pull
|
||||
) &&
|
||||
mv submodule moved-submodule &&
|
||||
(cd super &&
|
||||
git config -f .gitmodules submodule.submodule.url ../moved-submodule
|
||||
test_tick &&
|
||||
git commit -a -m moved-submodule
|
||||
)
|
||||
'
|
||||
|
||||
test_expect_success '"git submodule sync" should update submodule URLs' '
|
||||
(cd super-clone &&
|
||||
git pull &&
|
||||
git submodule sync
|
||||
) &&
|
||||
test -d "$(git config -f super-clone/submodule/.git/config \
|
||||
remote.origin.url)" &&
|
||||
(cd super-clone/submodule &&
|
||||
git checkout master &&
|
||||
git pull
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
|
@ -502,6 +502,55 @@ test_expect_success \
|
|||
gitweb_run "p=.git;a=history;f=deleted_file"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# path_info links
|
||||
test_expect_success \
|
||||
'path_info: project' \
|
||||
'gitweb_run "" "/.git"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch' \
|
||||
'gitweb_run "" "/.git/b"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch:file' \
|
||||
'gitweb_run "" "/.git/master:file"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch:dir/' \
|
||||
'gitweb_run "" "/.git/master:foo/"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch:file (non-existent)' \
|
||||
'gitweb_run "" "/.git/master:non-existent"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch:dir/ (non-existent)' \
|
||||
'gitweb_run "" "/.git/master:non-existent/"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/branch:/file' \
|
||||
'gitweb_run "" "/.git/master:/file"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/:/file (implicit HEAD)' \
|
||||
'gitweb_run "" "/.git/:/file"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
test_expect_success \
|
||||
'path_info: project/:/ (implicit HEAD, top tree)' \
|
||||
'gitweb_run "" "/.git/:/"'
|
||||
test_debug 'cat gitweb.log'
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# feed generation
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
SHA_CTX ctx;
|
||||
git_SHA_CTX ctx;
|
||||
unsigned char sha1[20];
|
||||
unsigned bufsz = 8192;
|
||||
char *buffer;
|
||||
|
@ -20,7 +20,7 @@ int main(int ac, char **av)
|
|||
die("OOPS");
|
||||
}
|
||||
|
||||
SHA1_Init(&ctx);
|
||||
git_SHA1_Init(&ctx);
|
||||
|
||||
while (1) {
|
||||
ssize_t sz, this_sz;
|
||||
|
@ -39,9 +39,9 @@ int main(int ac, char **av)
|
|||
}
|
||||
if (this_sz == 0)
|
||||
break;
|
||||
SHA1_Update(&ctx, buffer, this_sz);
|
||||
git_SHA1_Update(&ctx, buffer, this_sz);
|
||||
}
|
||||
SHA1_Final(sha1, &ctx);
|
||||
git_SHA1_Final(sha1, &ctx);
|
||||
puts(sha1_to_hex(sha1));
|
||||
exit(0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue