5e8220614bd0447b9bb39ba64143450f6365f019
[webgit] / src / worktree.c
1 /*
2     cehtehs git web frontend
3
4   Copyright (C)
5     2008,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software: you can redistribute it and/or modify
8   it under the terms of the GNU Affero General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU Affero General Public License for more details.
16
17   You should have received a copy of the GNU Affero General Public License
18   along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "worktree.h"
22
23 #define SHA1_HEADER <openssl/sha.h>
24 #include "git/cache.h"
25 #include "git/commit.h"
26 #include "git/refs.h"
27 #include "git/tree.h"
28
29
30 //webgit_worktree_ensure ;
31
32 void
33 webgit_worktree_setup (struct webgit_repo_info* repo)
34 {
35   char* buf = cwa_buffer_provide (PATH_MAX);
36   snprintf (buf, PATH_MAX, "refs/worktrees/%s", repo->query->head);
37
38   unsigned char sha1_head[20];
39   get_sha1 (repo->query->head, sha1_head);
40
41   unsigned char sha1[20];
42
43   if (!read_ref (buf, sha1))
44     {
45       repo->worktree = cwa_strndup (sha1_to_hex (sha1), 40);
46
47       struct commit* commit = lookup_commit_reference (sha1);
48       parse_commit (commit);
49
50       struct commit* parent = pop_commit(&commit->parents);
51
52       if (!!hashcmp (sha1_head, parent->object.sha1))
53         {
54           /* uh ohh, head diverted from worktree */
55           die ("TODO: uh ohh, head diverted from worktree, needs merge strategy");
56         }
57     }
58   else
59     {
60       struct commit* commit = lookup_commit_reference (sha1_head);
61       parse_commit (commit);
62
63       repo->worktree = cwa_strndup (webgit_object_commit_tree_parse (commit), 40);
64
65       char* cbuf = cwa_buffer_provide (512);
66       sprintf (cbuf,
67                "tree %s\n"
68                "parent %s\n"
69                "author %s <%s> %lu +0000\n"
70                "committer %s <%s> %lu +0000\n\n",
71                repo->worktree,
72                sha1_to_hex (sha1_head),
73                repo->query->name,
74                repo->query->email,
75                repo->query->now,
76                repo->query->name,
77                repo->query->email,
78                repo->query->now
79                );
80
81       if (!!write_sha1_file (cbuf, strlen (cbuf), "commit", sha1))
82         die("error writing worktree %s\n", sha1_to_hex(sha1));
83
84       struct ref_lock * lock = lock_ref_sha1 (buf+5, NULL);
85
86       lock->force_write = 1;
87       write_ref_sha1 (lock, sha1, "");
88     }
89 }
90
91
92
93
94 #if 0
95 int
96 webgit_worktree_same_blob (struct webgit_repo_info* repo)
97 {
98
99   return 0;
100 }
101 #endif
102
103 /*
104 //      Local Variables:
105 //      mode: C
106 //      c-file-style: "gnu"
107 //      indent-tabs-mode: nil
108 //      End:
109 */