aboutsummaryrefslogtreecommitdiff
path: root/git-export.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org.(none)>2005-04-19 14:00:34 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org.(none)>2005-04-19 14:00:34 -0700
commitc9823a427a0a7aabc4f840a90e82548e91f9bdd6 (patch)
tree2e576d757af633d75c8df6340e28266e7a010714 /git-export.c
parent7fa6b4e7692926d2d07adee1ef8e277157929058 (diff)
downloadgit-c9823a427a0a7aabc4f840a90e82548e91f9bdd6.tar.gz
git-c9823a427a0a7aabc4f840a90e82548e91f9bdd6.tar.xz
Add stupid "git export" thing, which can export a git archive
as a set of patches and commentary. You'd want something like this if you are tracking a git archive in another SCM format. Notably, we want something like that for BK users.
Diffstat (limited to 'git-export.c')
-rw-r--r--git-export.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/git-export.c b/git-export.c
new file mode 100644
index 000000000..cf40946cf
--- /dev/null
+++ b/git-export.c
@@ -0,0 +1,81 @@
+#include "cache.h"
+#include "commit.h"
+
+/*
+ * Show one commit
+ */
+void show_commit(struct commit *commit)
+{
+ char cmdline[400];
+ char hex[100];
+
+ strcpy(hex, sha1_to_hex(commit->object.sha1));
+ printf("Id: %s\n", hex);
+ fflush(NULL);
+ sprintf(cmdline, "cat-file commit %s", hex);
+ system(cmdline);
+ if (commit->parents) {
+ char *against = sha1_to_hex(commit->parents->item->object.sha1);
+ printf("\n\n======== diff against %s ========\n", against);
+ fflush(NULL);
+ sprintf(cmdline, "git diff %s %s", against, hex);
+ system(cmdline);
+ }
+ printf("======== end ========\n\n");
+}
+
+/*
+ * Show all unseen commits, depth-first
+ */
+void show_unseen(struct commit *top)
+{
+ struct commit_list *parents;
+
+ if (top->object.flags & 2)
+ return;
+ top->object.flags |= 2;
+ parents = top->parents;
+ while (parents) {
+ show_unseen(parents->item);
+ parents = parents->next;
+ }
+ show_commit(top);
+}
+
+void export(struct commit *top, struct commit *base)
+{
+ mark_reachable(&top->object, 1);
+ if (base)
+ mark_reachable(&base->object, 2);
+ show_unseen(top);
+}
+
+struct commit *get_commit(unsigned char *sha1)
+{
+ struct commit *commit = lookup_commit(sha1);
+ if (!commit->object.parsed) {
+ struct commit_list *parents;
+
+ if (parse_commit(commit) < 0)
+ die("unable to parse commit %s", sha1_to_hex(sha1));
+ parents = commit->parents;
+ while (parents) {
+ get_commit(parents->item->object.sha1);
+ parents = parents->next;
+ }
+ }
+ return commit;
+}
+
+int main(int argc, char **argv)
+{
+ unsigned char base_sha1[20];
+ unsigned char top_sha1[20];
+
+ if (argc < 2 || argc > 4 ||
+ get_sha1_hex(argv[1], top_sha1) ||
+ (argc == 3 && get_sha1_hex(argv[2], base_sha1)))
+ usage("git-export top [base]");
+ export(get_commit(top_sha1), argc==3 ? get_commit(base_sha1) : NULL);
+ return 0;
+}