mirror of
https://github.com/git/git.git
synced 2026-01-17 22:26:32 +00:00
Merge branch 'master' into next
* master: Relative timestamps in git log Add git-zip-tree git-svn: stop repeatedly reusing the first commit message with dcommit Use xrealloc instead of realloc Use PATH_MAX instead of MAXPATHLEN Convert unpack_entry_gently and friends to use offsets. Cleanup unpack_object_header to use only offsets. Cleanup unpack_entry_gently and friends to use type_name array. Reuse compression code in unpack_compressed_entry. Reorganize/rename unpack_non_delta_entry to unpack_compressed_entry.
This commit is contained in:
67
Documentation/git-zip-tree.txt
Normal file
67
Documentation/git-zip-tree.txt
Normal file
@@ -0,0 +1,67 @@
|
||||
git-zip-tree(1)
|
||||
===============
|
||||
|
||||
NAME
|
||||
----
|
||||
git-zip-tree - Creates a ZIP archive of the files in the named tree
|
||||
|
||||
|
||||
SYNOPSIS
|
||||
--------
|
||||
'git-zip-tree' [-0|...|-9] <tree-ish> [ <base> ]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Creates a ZIP archive containing the tree structure for the named tree.
|
||||
When <base> is specified it is added as a leading path to the files in the
|
||||
generated ZIP archive.
|
||||
|
||||
git-zip-tree behaves differently when given a tree ID versus when given
|
||||
a commit ID or tag ID. In the first case the current time is used as
|
||||
modification time of each file in the archive. In the latter case the
|
||||
commit time as recorded in the referenced commit object is used instead.
|
||||
Additionally the commit ID is stored as an archive comment.
|
||||
|
||||
Currently git-zip-tree can handle only files and directories, symbolic
|
||||
links are not supported.
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
|
||||
-0::
|
||||
Store the files instead of deflating them.
|
||||
|
||||
-9::
|
||||
Highest and slowest compression level. You can specify any
|
||||
number from 1 to 9 to adjust compression speed and ratio.
|
||||
|
||||
<tree-ish>::
|
||||
The tree or commit to produce ZIP archive for. If it is
|
||||
the object name of a commit object.
|
||||
|
||||
<base>::
|
||||
Leading path to the files in the resulting ZIP archive.
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
git zip-tree v1.4.0 git-1.4.0 >git-1.4.0.zip::
|
||||
|
||||
Create a ZIP file for v1.4.0 release.
|
||||
|
||||
git zip-tree HEAD:Documentation/ git-docs >docs.zip::
|
||||
|
||||
Put everything in the current head's Documentation/ directory
|
||||
into 'docs.zip', with the prefix 'git-docs/'.
|
||||
|
||||
Author
|
||||
------
|
||||
Written by Rene Scharfe.
|
||||
|
||||
Documentation
|
||||
--------------
|
||||
Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
|
||||
|
||||
GIT
|
||||
---
|
||||
Part of the gitlink:git[7] suite
|
||||
|
||||
3
Makefile
3
Makefile
@@ -304,7 +304,8 @@ BUILTIN_OBJS = \
|
||||
builtin-update-ref.o \
|
||||
builtin-upload-tar.o \
|
||||
builtin-verify-pack.o \
|
||||
builtin-write-tree.o
|
||||
builtin-write-tree.o \
|
||||
builtin-zip-tree.o
|
||||
|
||||
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
||||
EXTLIBS = -lz
|
||||
|
||||
@@ -54,7 +54,7 @@ static void pprint_tag(const unsigned char *sha1, const char *buf, unsigned long
|
||||
write_or_die(1, tagger, sp - tagger);
|
||||
date = strtoul(sp, &ep, 10);
|
||||
tz = strtol(ep, NULL, 10);
|
||||
sp = show_date(date, tz);
|
||||
sp = show_date(date, tz, 0);
|
||||
write_or_die(1, sp, strlen(sp));
|
||||
xwrite(1, "\n", 1);
|
||||
break;
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
static int line_termination = '\n';
|
||||
static int checkout_stage; /* default to checkout stage0 */
|
||||
static int to_tempfile;
|
||||
static char topath[4][MAXPATHLEN+1];
|
||||
static char topath[4][PATH_MAX + 1];
|
||||
|
||||
static struct checkout state;
|
||||
|
||||
|
||||
@@ -27,8 +27,8 @@ static void append_to_list(struct list *list, char *value, void *payload)
|
||||
{
|
||||
if (list->nr == list->alloc) {
|
||||
list->alloc += 32;
|
||||
list->list = realloc(list->list, sizeof(char *) * list->alloc);
|
||||
list->payload = realloc(list->payload,
|
||||
list->list = xrealloc(list->list, sizeof(char *) * list->alloc);
|
||||
list->payload = xrealloc(list->payload,
|
||||
sizeof(char *) * list->alloc);
|
||||
}
|
||||
list->payload[list->nr] = payload;
|
||||
|
||||
@@ -101,7 +101,7 @@ static int git_format_config(const char *var, const char *value)
|
||||
if (!strcmp(var, "format.headers")) {
|
||||
int len = strlen(value);
|
||||
extra_headers_size += len + 1;
|
||||
extra_headers = realloc(extra_headers, extra_headers_size);
|
||||
extra_headers = xrealloc(extra_headers, extra_headers_size);
|
||||
extra_headers[extra_headers_size - len - 1] = 0;
|
||||
strcat(extra_headers, value);
|
||||
return 0;
|
||||
@@ -381,7 +381,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
|
||||
continue;
|
||||
|
||||
nr++;
|
||||
list = realloc(list, nr * sizeof(list[0]));
|
||||
list = xrealloc(list, nr * sizeof(list[0]));
|
||||
list[nr - 1] = commit;
|
||||
}
|
||||
total = nr;
|
||||
|
||||
@@ -168,13 +168,13 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
|
||||
int j, dst_len;
|
||||
|
||||
if (last - first > 0) {
|
||||
source = realloc(source,
|
||||
source = xrealloc(source,
|
||||
(count + last - first)
|
||||
* sizeof(char *));
|
||||
destination = realloc(destination,
|
||||
destination = xrealloc(destination,
|
||||
(count + last - first)
|
||||
* sizeof(char *));
|
||||
modes = realloc(modes,
|
||||
modes = xrealloc(modes,
|
||||
(count + last - first)
|
||||
* sizeof(enum update_mode));
|
||||
}
|
||||
|
||||
353
builtin-zip-tree.c
Normal file
353
builtin-zip-tree.c
Normal file
@@ -0,0 +1,353 @@
|
||||
/*
|
||||
* Copyright (c) 2006 Rene Scharfe
|
||||
*/
|
||||
#include <time.h>
|
||||
#include "cache.h"
|
||||
#include "commit.h"
|
||||
#include "blob.h"
|
||||
#include "tree.h"
|
||||
#include "quote.h"
|
||||
#include "builtin.h"
|
||||
|
||||
static const char zip_tree_usage[] =
|
||||
"git-zip-tree [-0|...|-9] <tree-ish> [ <base> ]";
|
||||
|
||||
static int zip_date;
|
||||
static int zip_time;
|
||||
|
||||
static unsigned char *zip_dir;
|
||||
static unsigned int zip_dir_size;
|
||||
|
||||
static unsigned int zip_offset;
|
||||
static unsigned int zip_dir_offset;
|
||||
static unsigned int zip_dir_entries;
|
||||
|
||||
#define ZIP_DIRECTORY_MIN_SIZE (1024 * 1024)
|
||||
|
||||
struct zip_local_header {
|
||||
unsigned char magic[4];
|
||||
unsigned char version[2];
|
||||
unsigned char flags[2];
|
||||
unsigned char compression_method[2];
|
||||
unsigned char mtime[2];
|
||||
unsigned char mdate[2];
|
||||
unsigned char crc32[4];
|
||||
unsigned char compressed_size[4];
|
||||
unsigned char size[4];
|
||||
unsigned char filename_length[2];
|
||||
unsigned char extra_length[2];
|
||||
};
|
||||
|
||||
struct zip_dir_header {
|
||||
unsigned char magic[4];
|
||||
unsigned char creator_version[2];
|
||||
unsigned char version[2];
|
||||
unsigned char flags[2];
|
||||
unsigned char compression_method[2];
|
||||
unsigned char mtime[2];
|
||||
unsigned char mdate[2];
|
||||
unsigned char crc32[4];
|
||||
unsigned char compressed_size[4];
|
||||
unsigned char size[4];
|
||||
unsigned char filename_length[2];
|
||||
unsigned char extra_length[2];
|
||||
unsigned char comment_length[2];
|
||||
unsigned char disk[2];
|
||||
unsigned char attr1[2];
|
||||
unsigned char attr2[4];
|
||||
unsigned char offset[4];
|
||||
};
|
||||
|
||||
struct zip_dir_trailer {
|
||||
unsigned char magic[4];
|
||||
unsigned char disk[2];
|
||||
unsigned char directory_start_disk[2];
|
||||
unsigned char entries_on_this_disk[2];
|
||||
unsigned char entries[2];
|
||||
unsigned char size[4];
|
||||
unsigned char offset[4];
|
||||
unsigned char comment_length[2];
|
||||
};
|
||||
|
||||
static void copy_le16(unsigned char *dest, unsigned int n)
|
||||
{
|
||||
dest[0] = 0xff & n;
|
||||
dest[1] = 0xff & (n >> 010);
|
||||
}
|
||||
|
||||
static void copy_le32(unsigned char *dest, unsigned int n)
|
||||
{
|
||||
dest[0] = 0xff & n;
|
||||
dest[1] = 0xff & (n >> 010);
|
||||
dest[2] = 0xff & (n >> 020);
|
||||
dest[3] = 0xff & (n >> 030);
|
||||
}
|
||||
|
||||
static void *zlib_deflate(void *data, unsigned long size,
|
||||
unsigned long *compressed_size)
|
||||
{
|
||||
z_stream stream;
|
||||
unsigned long maxsize;
|
||||
void *buffer;
|
||||
int result;
|
||||
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
deflateInit(&stream, zlib_compression_level);
|
||||
maxsize = deflateBound(&stream, size);
|
||||
buffer = xmalloc(maxsize);
|
||||
|
||||
stream.next_in = data;
|
||||
stream.avail_in = size;
|
||||
stream.next_out = buffer;
|
||||
stream.avail_out = maxsize;
|
||||
|
||||
do {
|
||||
result = deflate(&stream, Z_FINISH);
|
||||
} while (result == Z_OK);
|
||||
|
||||
if (result != Z_STREAM_END) {
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
deflateEnd(&stream);
|
||||
*compressed_size = stream.total_out;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static char *construct_path(const char *base, int baselen,
|
||||
const char *filename, int isdir, int *pathlen)
|
||||
{
|
||||
int filenamelen = strlen(filename);
|
||||
int len = baselen + filenamelen;
|
||||
char *path, *p;
|
||||
|
||||
if (isdir)
|
||||
len++;
|
||||
p = path = xmalloc(len + 1);
|
||||
|
||||
memcpy(p, base, baselen);
|
||||
p += baselen;
|
||||
memcpy(p, filename, filenamelen);
|
||||
p += filenamelen;
|
||||
if (isdir)
|
||||
*p++ = '/';
|
||||
*p = '\0';
|
||||
|
||||
*pathlen = len;
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
static int write_zip_entry(const unsigned char *sha1,
|
||||
const char *base, int baselen,
|
||||
const char *filename, unsigned mode, int stage)
|
||||
{
|
||||
struct zip_local_header header;
|
||||
struct zip_dir_header dirent;
|
||||
unsigned long compressed_size;
|
||||
unsigned long uncompressed_size;
|
||||
unsigned long crc;
|
||||
unsigned long direntsize;
|
||||
unsigned long size;
|
||||
int method;
|
||||
int result = -1;
|
||||
int pathlen;
|
||||
unsigned char *out;
|
||||
char *path;
|
||||
char type[20];
|
||||
void *buffer = NULL;
|
||||
void *deflated = NULL;
|
||||
|
||||
crc = crc32(0, Z_NULL, 0);
|
||||
|
||||
path = construct_path(base, baselen, filename, S_ISDIR(mode), &pathlen);
|
||||
if (pathlen > 0xffff) {
|
||||
error("path too long (%d chars, SHA1: %s): %s", pathlen,
|
||||
sha1_to_hex(sha1), path);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (S_ISDIR(mode)) {
|
||||
method = 0;
|
||||
result = READ_TREE_RECURSIVE;
|
||||
out = NULL;
|
||||
uncompressed_size = 0;
|
||||
compressed_size = 0;
|
||||
} else if (S_ISREG(mode)) {
|
||||
method = zlib_compression_level == 0 ? 0 : 8;
|
||||
result = 0;
|
||||
buffer = read_sha1_file(sha1, type, &size);
|
||||
if (!buffer)
|
||||
die("cannot read %s", sha1_to_hex(sha1));
|
||||
crc = crc32(crc, buffer, size);
|
||||
out = buffer;
|
||||
uncompressed_size = size;
|
||||
compressed_size = size;
|
||||
} else {
|
||||
error("unsupported file mode: 0%o (SHA1: %s)", mode,
|
||||
sha1_to_hex(sha1));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (method == 8) {
|
||||
deflated = zlib_deflate(buffer, size, &compressed_size);
|
||||
if (deflated && compressed_size - 6 < size) {
|
||||
/* ZLIB --> raw compressed data (see RFC 1950) */
|
||||
/* CMF and FLG ... */
|
||||
out = (unsigned char *)deflated + 2;
|
||||
compressed_size -= 6; /* ... and ADLER32 */
|
||||
} else {
|
||||
method = 0;
|
||||
compressed_size = size;
|
||||
}
|
||||
}
|
||||
|
||||
/* make sure we have enough free space in the dictionary */
|
||||
direntsize = sizeof(struct zip_dir_header) + pathlen;
|
||||
while (zip_dir_size < zip_dir_offset + direntsize) {
|
||||
zip_dir_size += ZIP_DIRECTORY_MIN_SIZE;
|
||||
zip_dir = xrealloc(zip_dir, zip_dir_size);
|
||||
}
|
||||
|
||||
copy_le32(dirent.magic, 0x02014b50);
|
||||
copy_le16(dirent.creator_version, 0);
|
||||
copy_le16(dirent.version, 20);
|
||||
copy_le16(dirent.flags, 0);
|
||||
copy_le16(dirent.compression_method, method);
|
||||
copy_le16(dirent.mtime, zip_time);
|
||||
copy_le16(dirent.mdate, zip_date);
|
||||
copy_le32(dirent.crc32, crc);
|
||||
copy_le32(dirent.compressed_size, compressed_size);
|
||||
copy_le32(dirent.size, uncompressed_size);
|
||||
copy_le16(dirent.filename_length, pathlen);
|
||||
copy_le16(dirent.extra_length, 0);
|
||||
copy_le16(dirent.comment_length, 0);
|
||||
copy_le16(dirent.disk, 0);
|
||||
copy_le16(dirent.attr1, 0);
|
||||
copy_le32(dirent.attr2, 0);
|
||||
copy_le32(dirent.offset, zip_offset);
|
||||
memcpy(zip_dir + zip_dir_offset, &dirent, sizeof(struct zip_dir_header));
|
||||
zip_dir_offset += sizeof(struct zip_dir_header);
|
||||
memcpy(zip_dir + zip_dir_offset, path, pathlen);
|
||||
zip_dir_offset += pathlen;
|
||||
zip_dir_entries++;
|
||||
|
||||
copy_le32(header.magic, 0x04034b50);
|
||||
copy_le16(header.version, 20);
|
||||
copy_le16(header.flags, 0);
|
||||
copy_le16(header.compression_method, method);
|
||||
copy_le16(header.mtime, zip_time);
|
||||
copy_le16(header.mdate, zip_date);
|
||||
copy_le32(header.crc32, crc);
|
||||
copy_le32(header.compressed_size, compressed_size);
|
||||
copy_le32(header.size, uncompressed_size);
|
||||
copy_le16(header.filename_length, pathlen);
|
||||
copy_le16(header.extra_length, 0);
|
||||
write_or_die(1, &header, sizeof(struct zip_local_header));
|
||||
zip_offset += sizeof(struct zip_local_header);
|
||||
write_or_die(1, path, pathlen);
|
||||
zip_offset += pathlen;
|
||||
if (compressed_size > 0) {
|
||||
write_or_die(1, out, compressed_size);
|
||||
zip_offset += compressed_size;
|
||||
}
|
||||
|
||||
out:
|
||||
free(buffer);
|
||||
free(deflated);
|
||||
free(path);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void write_zip_trailer(const unsigned char *sha1)
|
||||
{
|
||||
struct zip_dir_trailer trailer;
|
||||
|
||||
copy_le32(trailer.magic, 0x06054b50);
|
||||
copy_le16(trailer.disk, 0);
|
||||
copy_le16(trailer.directory_start_disk, 0);
|
||||
copy_le16(trailer.entries_on_this_disk, zip_dir_entries);
|
||||
copy_le16(trailer.entries, zip_dir_entries);
|
||||
copy_le32(trailer.size, zip_dir_offset);
|
||||
copy_le32(trailer.offset, zip_offset);
|
||||
copy_le16(trailer.comment_length, sha1 ? 40 : 0);
|
||||
|
||||
write_or_die(1, zip_dir, zip_dir_offset);
|
||||
write_or_die(1, &trailer, sizeof(struct zip_dir_trailer));
|
||||
if (sha1)
|
||||
write_or_die(1, sha1_to_hex(sha1), 40);
|
||||
}
|
||||
|
||||
static void dos_time(time_t *time, int *dos_date, int *dos_time)
|
||||
{
|
||||
struct tm *t = localtime(time);
|
||||
|
||||
*dos_date = t->tm_mday + (t->tm_mon + 1) * 32 +
|
||||
(t->tm_year + 1900 - 1980) * 512;
|
||||
*dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
|
||||
}
|
||||
|
||||
int cmd_zip_tree(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
unsigned char sha1[20];
|
||||
struct tree *tree;
|
||||
struct commit *commit;
|
||||
time_t archive_time;
|
||||
char *base;
|
||||
int baselen;
|
||||
|
||||
git_config(git_default_config);
|
||||
|
||||
if (argc > 1 && argv[1][0] == '-') {
|
||||
if (isdigit(argv[1][1]) && argv[1][2] == '\0') {
|
||||
zlib_compression_level = argv[1][1] - '0';
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
}
|
||||
|
||||
switch (argc) {
|
||||
case 3:
|
||||
base = strdup(argv[2]);
|
||||
baselen = strlen(base);
|
||||
break;
|
||||
case 2:
|
||||
base = strdup("");
|
||||
baselen = 0;
|
||||
break;
|
||||
default:
|
||||
usage(zip_tree_usage);
|
||||
}
|
||||
|
||||
if (get_sha1(argv[1], sha1))
|
||||
die("Not a valid object name %s", argv[1]);
|
||||
|
||||
commit = lookup_commit_reference_gently(sha1, 1);
|
||||
archive_time = commit ? commit->date : time(NULL);
|
||||
dos_time(&archive_time, &zip_date, &zip_time);
|
||||
|
||||
zip_dir = xmalloc(ZIP_DIRECTORY_MIN_SIZE);
|
||||
zip_dir_size = ZIP_DIRECTORY_MIN_SIZE;
|
||||
|
||||
tree = parse_tree_indirect(sha1);
|
||||
if (!tree)
|
||||
die("not a tree object");
|
||||
|
||||
if (baselen > 0) {
|
||||
write_zip_entry(tree->object.sha1, "", 0, base, 040777, 0);
|
||||
base = xrealloc(base, baselen + 1);
|
||||
base[baselen] = '/';
|
||||
baselen++;
|
||||
base[baselen] = '\0';
|
||||
}
|
||||
read_tree_recursive(tree, base, baselen, 0, NULL, write_zip_entry);
|
||||
write_zip_trailer(commit ? commit->object.sha1 : NULL);
|
||||
|
||||
free(zip_dir);
|
||||
free(base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -52,6 +52,7 @@ extern int cmd_show(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_tar_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_zip_tree(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_unpack_objects(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_index(int argc, const char **argv, const char *prefix);
|
||||
extern int cmd_update_ref(int argc, const char **argv, const char *prefix);
|
||||
|
||||
2
cache.h
2
cache.h
@@ -290,7 +290,7 @@ extern void *read_object_with_reference(const unsigned char *sha1,
|
||||
unsigned long *size,
|
||||
unsigned char *sha1_ret);
|
||||
|
||||
const char *show_date(unsigned long time, int timezone);
|
||||
const char *show_date(unsigned long time, int timezone, int relative);
|
||||
const char *show_rfc2822_date(unsigned long time, int timezone);
|
||||
int parse_date(const char *date, char *buf, int bufsize);
|
||||
void datestamp(char *buf, int bufsize);
|
||||
|
||||
4
commit.c
4
commit.c
@@ -522,14 +522,14 @@ static int add_user_info(const char *what, enum cmit_fmt fmt, char *buf, const c
|
||||
}
|
||||
switch (fmt) {
|
||||
case CMIT_FMT_MEDIUM:
|
||||
ret += sprintf(buf + ret, "Date: %s\n", show_date(time, tz));
|
||||
ret += sprintf(buf + ret, "Date: %s\n", show_date(time, tz, 0));
|
||||
break;
|
||||
case CMIT_FMT_EMAIL:
|
||||
ret += sprintf(buf + ret, "Date: %s\n",
|
||||
show_rfc2822_date(time, tz));
|
||||
break;
|
||||
case CMIT_FMT_FULLER:
|
||||
ret += sprintf(buf + ret, "%sDate: %s\n", what, show_date(time, tz));
|
||||
ret += sprintf(buf + ret, "%sDate: %s\n", what, show_date(time, tz, 0));
|
||||
break;
|
||||
default:
|
||||
/* notin' */
|
||||
|
||||
7
daemon.c
7
daemon.c
@@ -529,7 +529,6 @@ static int socksetup(int port, int **socklist_p)
|
||||
|
||||
for (ai = ai0; ai; ai = ai->ai_next) {
|
||||
int sockfd;
|
||||
int *newlist;
|
||||
|
||||
sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||
if (sockfd < 0)
|
||||
@@ -563,11 +562,7 @@ static int socksetup(int port, int **socklist_p)
|
||||
continue; /* not fatal */
|
||||
}
|
||||
|
||||
newlist = realloc(socklist, sizeof(int) * (socknum + 1));
|
||||
if (!newlist)
|
||||
die("memory allocation failed: %s", strerror(errno));
|
||||
|
||||
socklist = newlist;
|
||||
socklist = xrealloc(socklist, sizeof(int) * (socknum + 1));
|
||||
socklist[socknum++] = sockfd;
|
||||
|
||||
if (maxfd < sockfd)
|
||||
|
||||
63
date.c
63
date.c
@@ -37,6 +37,16 @@ static const char *weekday_names[] = {
|
||||
"Sundays", "Mondays", "Tuesdays", "Wednesdays", "Thursdays", "Fridays", "Saturdays"
|
||||
};
|
||||
|
||||
static time_t gm_time_t(unsigned long time, int tz)
|
||||
{
|
||||
int minutes;
|
||||
|
||||
minutes = tz < 0 ? -tz : tz;
|
||||
minutes = (minutes / 100)*60 + (minutes % 100);
|
||||
minutes = tz < 0 ? -minutes : minutes;
|
||||
return time + minutes * 60;
|
||||
}
|
||||
|
||||
/*
|
||||
* The "tz" thing is passed in as this strange "decimal parse of tz"
|
||||
* thing, which means that tz -0100 is passed in as the integer -100,
|
||||
@@ -44,21 +54,58 @@ static const char *weekday_names[] = {
|
||||
*/
|
||||
static struct tm *time_to_tm(unsigned long time, int tz)
|
||||
{
|
||||
time_t t;
|
||||
int minutes;
|
||||
|
||||
minutes = tz < 0 ? -tz : tz;
|
||||
minutes = (minutes / 100)*60 + (minutes % 100);
|
||||
minutes = tz < 0 ? -minutes : minutes;
|
||||
t = time + minutes * 60;
|
||||
time_t t = gm_time_t(time, tz);
|
||||
return gmtime(&t);
|
||||
}
|
||||
|
||||
const char *show_date(unsigned long time, int tz)
|
||||
const char *show_date(unsigned long time, int tz, int relative)
|
||||
{
|
||||
struct tm *tm;
|
||||
static char timebuf[200];
|
||||
|
||||
if (relative) {
|
||||
unsigned long diff;
|
||||
time_t t = gm_time_t(time, tz);
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
if (now.tv_sec < t)
|
||||
return "in the future";
|
||||
diff = now.tv_sec - t;
|
||||
if (diff < 90) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu seconds ago", diff);
|
||||
return timebuf;
|
||||
}
|
||||
/* Turn it into minutes */
|
||||
diff = (diff + 30) / 60;
|
||||
if (diff < 90) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu minutes ago", diff);
|
||||
return timebuf;
|
||||
}
|
||||
/* Turn it into hours */
|
||||
diff = (diff + 30) / 60;
|
||||
if (diff < 36) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu hours ago", diff);
|
||||
return timebuf;
|
||||
}
|
||||
/* We deal with number of days from here on */
|
||||
diff = (diff + 12) / 24;
|
||||
if (diff < 14) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu days ago", diff);
|
||||
return timebuf;
|
||||
}
|
||||
/* Say weeks for the past 10 weeks or so */
|
||||
if (diff < 70) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu weeks ago", (diff + 3) / 7);
|
||||
return timebuf;
|
||||
}
|
||||
/* Say months for the past 12 months or so */
|
||||
if (diff < 360) {
|
||||
snprintf(timebuf, sizeof(timebuf), "%lu months ago", (diff + 15) / 30);
|
||||
return timebuf;
|
||||
}
|
||||
/* Else fall back on absolute format.. */
|
||||
}
|
||||
|
||||
tm = time_to_tm(time, tz);
|
||||
if (!tm)
|
||||
return NULL;
|
||||
|
||||
@@ -392,7 +392,7 @@ create_delta(const struct delta_index *index,
|
||||
outsize = max_size + MAX_OP_SIZE + 1;
|
||||
if (max_size && outpos > max_size)
|
||||
break;
|
||||
out = realloc(out, outsize);
|
||||
out = xrealloc(out, outsize);
|
||||
if (!out) {
|
||||
free(tmp);
|
||||
return NULL;
|
||||
|
||||
6
dir.c
6
dir.c
@@ -101,8 +101,8 @@ void add_exclude(const char *string, const char *base,
|
||||
x->baselen = baselen;
|
||||
if (which->nr == which->alloc) {
|
||||
which->alloc = alloc_nr(which->alloc);
|
||||
which->excludes = realloc(which->excludes,
|
||||
which->alloc * sizeof(x));
|
||||
which->excludes = xrealloc(which->excludes,
|
||||
which->alloc * sizeof(x));
|
||||
}
|
||||
which->excludes[which->nr++] = x;
|
||||
}
|
||||
@@ -293,7 +293,7 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co
|
||||
if (fdir) {
|
||||
int exclude_stk;
|
||||
struct dirent *de;
|
||||
char fullname[MAXPATHLEN + 1];
|
||||
char fullname[PATH_MAX + 1];
|
||||
memcpy(fullname, base, baselen);
|
||||
|
||||
exclude_stk = push_exclude_per_directory(dir, base, baselen);
|
||||
|
||||
4
entry.c
4
entry.c
@@ -135,7 +135,7 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
|
||||
|
||||
int checkout_entry(struct cache_entry *ce, struct checkout *state, char *topath)
|
||||
{
|
||||
static char path[MAXPATHLEN+1];
|
||||
static char path[PATH_MAX + 1];
|
||||
struct stat st;
|
||||
int len = state->base_dir_len;
|
||||
|
||||
@@ -172,5 +172,3 @@ int checkout_entry(struct cache_entry *ce, struct checkout *state, char *topath)
|
||||
create_directories(path, state);
|
||||
return write_entry(ce, path, state, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -172,7 +172,4 @@ static inline int sane_case(int x, int high)
|
||||
return x;
|
||||
}
|
||||
|
||||
#ifndef MAXPATHLEN
|
||||
#define MAXPATHLEN 256
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -819,6 +819,7 @@ sub commit_diff {
|
||||
} else {
|
||||
$ed->close_edit;
|
||||
}
|
||||
$_message = $_file = undef;
|
||||
}
|
||||
|
||||
########################### utility functions #########################
|
||||
|
||||
7
git.c
7
git.c
@@ -120,7 +120,7 @@ static int split_cmdline(char *cmdline, const char ***argv)
|
||||
; /* skip */
|
||||
if (count >= size) {
|
||||
size += 16;
|
||||
*argv = realloc(*argv, sizeof(char*) * size);
|
||||
*argv = xrealloc(*argv, sizeof(char*) * size);
|
||||
}
|
||||
(*argv)[count++] = cmdline + dst;
|
||||
} else if(!quoted && (c == '\'' || c == '"')) {
|
||||
@@ -191,8 +191,8 @@ static int handle_alias(int *argcp, const char ***argv)
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
new_argv = realloc(new_argv, sizeof(char*) *
|
||||
(count + *argcp + 1));
|
||||
new_argv = xrealloc(new_argv, sizeof(char*) *
|
||||
(count + *argcp + 1));
|
||||
/* insert after command name */
|
||||
memcpy(new_argv + count, *argv + 1, sizeof(char*) * *argcp);
|
||||
new_argv[count+*argcp] = NULL;
|
||||
@@ -263,6 +263,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
||||
{ "stripspace", cmd_stripspace },
|
||||
{ "symbolic-ref", cmd_symbolic_ref, RUN_SETUP },
|
||||
{ "tar-tree", cmd_tar_tree, RUN_SETUP },
|
||||
{ "zip-tree", cmd_zip_tree, RUN_SETUP },
|
||||
{ "unpack-objects", cmd_unpack_objects, RUN_SETUP },
|
||||
{ "update-index", cmd_update_index, RUN_SETUP },
|
||||
{ "update-ref", cmd_update_ref, RUN_SETUP },
|
||||
|
||||
150
sha1_file.c
150
sha1_file.c
@@ -935,23 +935,19 @@ static unsigned long unpack_object_header(struct packed_git *p, unsigned long of
|
||||
enum object_type *type, unsigned long *sizep)
|
||||
{
|
||||
unsigned shift;
|
||||
unsigned char *pack, c;
|
||||
unsigned char c;
|
||||
unsigned long size;
|
||||
|
||||
if (offset >= p->pack_size)
|
||||
die("object offset outside of pack file");
|
||||
|
||||
pack = (unsigned char *) p->pack_base + offset;
|
||||
c = *pack++;
|
||||
offset++;
|
||||
c = *((unsigned char *)p->pack_base + offset++);
|
||||
*type = (c >> 4) & 7;
|
||||
size = c & 15;
|
||||
shift = 4;
|
||||
while (c & 0x80) {
|
||||
if (offset >= p->pack_size)
|
||||
die("object offset outside of pack file");
|
||||
c = *pack++;
|
||||
offset++;
|
||||
c = *((unsigned char *)p->pack_base + offset++);
|
||||
size += (c & 0x7f) << shift;
|
||||
shift += 7;
|
||||
}
|
||||
@@ -1014,16 +1010,10 @@ void packed_object_info_detail(struct pack_entry *e,
|
||||
}
|
||||
switch (kind) {
|
||||
case OBJ_COMMIT:
|
||||
strcpy(type, commit_type);
|
||||
break;
|
||||
case OBJ_TREE:
|
||||
strcpy(type, tree_type);
|
||||
break;
|
||||
case OBJ_BLOB:
|
||||
strcpy(type, blob_type);
|
||||
break;
|
||||
case OBJ_TAG:
|
||||
strcpy(type, tag_type);
|
||||
strcpy(type, type_names[kind]);
|
||||
break;
|
||||
default:
|
||||
die("corrupted pack file %s containing object of kind %d",
|
||||
@@ -1054,16 +1044,10 @@ static int packed_object_info(struct pack_entry *entry,
|
||||
unuse_packed_git(p);
|
||||
return retval;
|
||||
case OBJ_COMMIT:
|
||||
strcpy(type, commit_type);
|
||||
break;
|
||||
case OBJ_TREE:
|
||||
strcpy(type, tree_type);
|
||||
break;
|
||||
case OBJ_BLOB:
|
||||
strcpy(type, blob_type);
|
||||
break;
|
||||
case OBJ_TAG:
|
||||
strcpy(type, tag_type);
|
||||
strcpy(type, type_names[kind]);
|
||||
break;
|
||||
default:
|
||||
die("corrupted pack file %s containing object of kind %d",
|
||||
@@ -1075,62 +1059,9 @@ static int packed_object_info(struct pack_entry *entry,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *unpack_delta_entry(unsigned char *base_sha1,
|
||||
unsigned long delta_size,
|
||||
unsigned long left,
|
||||
char *type,
|
||||
unsigned long *sizep,
|
||||
struct packed_git *p)
|
||||
{
|
||||
struct pack_entry base_ent;
|
||||
void *data, *delta_data, *result, *base;
|
||||
unsigned long data_size, result_size, base_size;
|
||||
z_stream stream;
|
||||
int st;
|
||||
|
||||
if (left < 20)
|
||||
die("truncated pack file");
|
||||
|
||||
/* The base entry _must_ be in the same pack */
|
||||
if (!find_pack_entry_one(base_sha1, &base_ent, p))
|
||||
die("failed to find delta-pack base object %s",
|
||||
sha1_to_hex(base_sha1));
|
||||
base = unpack_entry_gently(&base_ent, type, &base_size);
|
||||
if (!base)
|
||||
die("failed to read delta-pack base object %s",
|
||||
sha1_to_hex(base_sha1));
|
||||
|
||||
data = base_sha1 + 20;
|
||||
data_size = left - 20;
|
||||
delta_data = xmalloc(delta_size);
|
||||
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
|
||||
stream.next_in = data;
|
||||
stream.avail_in = data_size;
|
||||
stream.next_out = delta_data;
|
||||
stream.avail_out = delta_size;
|
||||
|
||||
inflateInit(&stream);
|
||||
st = inflate(&stream, Z_FINISH);
|
||||
inflateEnd(&stream);
|
||||
if ((st != Z_STREAM_END) || stream.total_out != delta_size)
|
||||
die("delta data unpack failed");
|
||||
|
||||
result = patch_delta(base, base_size,
|
||||
delta_data, delta_size,
|
||||
&result_size);
|
||||
if (!result)
|
||||
die("failed to apply delta");
|
||||
free(delta_data);
|
||||
free(base);
|
||||
*sizep = result_size;
|
||||
return result;
|
||||
}
|
||||
|
||||
static void *unpack_non_delta_entry(unsigned char *data,
|
||||
unsigned long size,
|
||||
unsigned long left)
|
||||
static void *unpack_compressed_entry(struct packed_git *p,
|
||||
unsigned long offset,
|
||||
unsigned long size)
|
||||
{
|
||||
int st;
|
||||
z_stream stream;
|
||||
@@ -1139,8 +1070,8 @@ static void *unpack_non_delta_entry(unsigned char *data,
|
||||
buffer = xmalloc(size + 1);
|
||||
buffer[size] = 0;
|
||||
memset(&stream, 0, sizeof(stream));
|
||||
stream.next_in = data;
|
||||
stream.avail_in = left;
|
||||
stream.next_in = (unsigned char*)p->pack_base + offset;
|
||||
stream.avail_in = p->pack_size - offset;
|
||||
stream.next_out = buffer;
|
||||
stream.avail_out = size;
|
||||
|
||||
@@ -1155,6 +1086,42 @@ static void *unpack_non_delta_entry(unsigned char *data,
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static void *unpack_delta_entry(struct packed_git *p,
|
||||
unsigned long offset,
|
||||
unsigned long delta_size,
|
||||
char *type,
|
||||
unsigned long *sizep)
|
||||
{
|
||||
struct pack_entry base_ent;
|
||||
void *delta_data, *result, *base;
|
||||
unsigned long result_size, base_size;
|
||||
unsigned char* base_sha1;
|
||||
|
||||
if ((offset + 20) >= p->pack_size)
|
||||
die("truncated pack file");
|
||||
|
||||
/* The base entry _must_ be in the same pack */
|
||||
base_sha1 = (unsigned char*)p->pack_base + offset;
|
||||
if (!find_pack_entry_one(base_sha1, &base_ent, p))
|
||||
die("failed to find delta-pack base object %s",
|
||||
sha1_to_hex(base_sha1));
|
||||
base = unpack_entry_gently(&base_ent, type, &base_size);
|
||||
if (!base)
|
||||
die("failed to read delta-pack base object %s",
|
||||
sha1_to_hex(base_sha1));
|
||||
|
||||
delta_data = unpack_compressed_entry(p, offset + 20, delta_size);
|
||||
result = patch_delta(base, base_size,
|
||||
delta_data, delta_size,
|
||||
&result_size);
|
||||
if (!result)
|
||||
die("failed to apply delta");
|
||||
free(delta_data);
|
||||
free(base);
|
||||
*sizep = result_size;
|
||||
return result;
|
||||
}
|
||||
|
||||
static void *unpack_entry(struct pack_entry *entry,
|
||||
char *type, unsigned long *sizep)
|
||||
{
|
||||
@@ -1175,36 +1142,23 @@ void *unpack_entry_gently(struct pack_entry *entry,
|
||||
char *type, unsigned long *sizep)
|
||||
{
|
||||
struct packed_git *p = entry->p;
|
||||
unsigned long offset, size, left;
|
||||
unsigned char *pack;
|
||||
unsigned long offset, size;
|
||||
enum object_type kind;
|
||||
void *retval;
|
||||
|
||||
offset = unpack_object_header(p, entry->offset, &kind, &size);
|
||||
pack = (unsigned char *) p->pack_base + offset;
|
||||
left = p->pack_size - offset;
|
||||
switch (kind) {
|
||||
case OBJ_DELTA:
|
||||
retval = unpack_delta_entry(pack, size, left, type, sizep, p);
|
||||
return retval;
|
||||
return unpack_delta_entry(p, offset, size, type, sizep);
|
||||
case OBJ_COMMIT:
|
||||
strcpy(type, commit_type);
|
||||
break;
|
||||
case OBJ_TREE:
|
||||
strcpy(type, tree_type);
|
||||
break;
|
||||
case OBJ_BLOB:
|
||||
strcpy(type, blob_type);
|
||||
break;
|
||||
case OBJ_TAG:
|
||||
strcpy(type, tag_type);
|
||||
break;
|
||||
strcpy(type, type_names[kind]);
|
||||
*sizep = size;
|
||||
return unpack_compressed_entry(p, offset, size);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
*sizep = size;
|
||||
retval = unpack_non_delta_entry(pack, size, left);
|
||||
return retval;
|
||||
}
|
||||
|
||||
int num_packed_objects(const struct packed_git *p)
|
||||
@@ -1804,7 +1758,7 @@ int read_pipe(int fd, char** return_buf, unsigned long* return_size)
|
||||
off += iret;
|
||||
if (off == size) {
|
||||
size *= 2;
|
||||
buf = realloc(buf, size);
|
||||
buf = xrealloc(buf, size);
|
||||
}
|
||||
}
|
||||
} while (iret > 0);
|
||||
|
||||
@@ -69,9 +69,9 @@ int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
|
||||
for (i = 0; i < nbuf; i++) {
|
||||
if (mb[i].ptr[mb[i].size-1] != '\n') {
|
||||
/* Incomplete line */
|
||||
priv->remainder = realloc(priv->remainder,
|
||||
priv->remainder_size +
|
||||
mb[i].size);
|
||||
priv->remainder = xrealloc(priv->remainder,
|
||||
priv->remainder_size +
|
||||
mb[i].size);
|
||||
memcpy(priv->remainder + priv->remainder_size,
|
||||
mb[i].ptr, mb[i].size);
|
||||
priv->remainder_size += mb[i].size;
|
||||
@@ -83,9 +83,9 @@ int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
|
||||
consume_one(priv, mb[i].ptr, mb[i].size);
|
||||
continue;
|
||||
}
|
||||
priv->remainder = realloc(priv->remainder,
|
||||
priv->remainder_size +
|
||||
mb[i].size);
|
||||
priv->remainder = xrealloc(priv->remainder,
|
||||
priv->remainder_size +
|
||||
mb[i].size);
|
||||
memcpy(priv->remainder + priv->remainder_size,
|
||||
mb[i].ptr, mb[i].size);
|
||||
consume_one(priv, priv->remainder,
|
||||
|
||||
Reference in New Issue
Block a user