On Thu, May 17, 2007 at 06:57:22PM +0200, Johan Herland wrote:
quoted
Of course, it all depends on whether the $Id$ conversion is triggered by
git-archive...
Another possibility might be to add a commandline switch to git-archive
so you can decide whether the commit id should be added as a header to
the tar file (which it already supports) or as a ordinary file (which
should be reasonable trivial to implement). The question if whether
it would be worth to add that feature. Don't know if there are many
other users out there that need it.
diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt
index 721e035..ac31aac 100644
--- a/Documentation/git-archive.txt
+++ b/Documentation/git-archive.txt
@@ -43,6 +43,10 @@ OPTIONS
--prefix=<prefix>/::
Prepend <prefix>/ to each filename in the archive.
+--commit-id-file=<filename>::
+ Adds a file to the archive containing the commit ID. This option
+ is ignored if <tree-ish> references a tree instead of a commit.
+
<extra>::
This can be any options that the archiver backend understand.
See next section.
diff --git a/archive-tar.c b/archive-tar.c
index 33e7657..555850a 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -319,6 +319,13 @@ int write_tar_archive(struct archiver_args *args)
}
read_tree_recursive(args->tree, args->base, plen, 0,
args->pathspec, write_tar_entry);
+ if (args->commit_sha1 && args->commit_sha1_file) {
+ unsigned char fake_sha1[20];
+ pretend_sha1_file(sha1_to_hex(args->commit_sha1), 40,
+ OBJ_BLOB, fake_sha1);
+ write_tar_entry(fake_sha1, args->base, plen,
+ args->commit_sha1_file, 0100666, 0);
+ }
write_trailer();
return 0;diff --git a/archive-zip.c b/archive-zip.c
index 3cbf6bb..88c5dfa 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -328,6 +328,13 @@ int write_zip_archive(struct archiver_args *args)
}
read_tree_recursive(args->tree, args->base, plen, 0,
args->pathspec, write_zip_entry);
+ if (args->commit_sha1 && args->commit_sha1_file) {
+ unsigned char fake_sha1[20];
+ pretend_sha1_file(sha1_to_hex(args->commit_sha1), 40,
+ OBJ_BLOB, fake_sha1);
+ write_zip_entry(fake_sha1, args->base, plen,
+ args->commit_sha1_file, 0100666, 0);
+ }
write_zip_trailer(args->commit_sha1);
free(zip_dir);diff --git a/archive.h b/archive.h
index 6838dc7..020f82f 100644
--- a/archive.h
+++ b/archive.h
@@ -8,6 +8,7 @@ struct archiver_args {
const char *base;
struct tree *tree;
const unsigned char *commit_sha1;
+ const char *commit_sha1_file;
time_t time;
const char **pathspec;
unsigned int verbose : 1;diff --git a/builtin-archive.c b/builtin-archive.c
index 7f4e409..e58ea16 100644
--- a/builtin-archive.c
+++ b/builtin-archive.c
@@ -151,6 +151,7 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
int extra_argc = 0;
const char *format = "tar";
const char *base = "";
+ const char *commit_sha1_file = NULL;
int verbose = 0;
int i;
@@ -174,6 +175,10 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
base = arg + 9;
continue;
}
+ if (!prefixcmp(arg, "--commit-id-file=")) {
+ commit_sha1_file = arg + 17;
+ continue;
+ }
if (!strcmp(arg, "--")) {
i++;
break;@@ -192,6 +197,11 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
usage(archive_usage);
if (init_archiver(format, ar) < 0)
die("Unknown archive format '%s'", format);
+ if (commit_sha1_file) {
+ size_t namelen = strlen(commit_sha1_file);
+ if (namelen == 0 || commit_sha1_file[namelen - 1] == '/')
+ die("Invalid commit ID file name: %s", commit_sha1_file);
+ }
if (extra_argc) {
if (!ar->parse_extra)@@ -201,6 +211,7 @@ int parse_archive_args(int argc, const char **argv, struct archiver *ar)
}
ar->args.verbose = verbose;
ar->args.base = base;
+ ar->args.commit_sha1_file = commit_sha1_file;
return i;
}