Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/vcs_checkout.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1990-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
/*
21
* checkout()
22
*/
23
24
#include "vcs_cmd.h"
25
#include "vcs_rscs.h"
26
27
int checkout(rp, vp)
28
register rfile_t* rp;
29
register version_t* vp;
30
{
31
register attr_t* ap;
32
tag_t* tp;
33
tag_t* marker;
34
Sfio_t *fsrc, *wtar, *rtar, *fdel;
35
char *sbuf, *tbuf, *dbuf, magic[4];
36
long nsrc, ntar;
37
int len;
38
rdirent_t* dir;
39
40
fsrc = wtar = rtar = fdel = NULL;
41
sbuf = dbuf = tbuf = NULL;
42
ap = rp->ap;
43
if (vp->tp == NULL)
44
{
45
vp->tp = tp = (tag_t *)malloc(sizeof(tag_t));
46
47
TOBEGIN(rp->fd);
48
49
/*
50
if (lookup_tag(NULL, rp->fd, ap, vp->version, vp->domain, &tp, 0))
51
*/
52
53
if (search_tag(rp->fd, ap, vp->version, vp->domain, &tp, G_LINK, &dir))
54
return (-1);
55
if ((marker = getmarkerbyfrom(dir, vp->tp->version)))
56
{
57
char buf[1024];
58
char* s;
59
strcpy(buf, marker->version);
60
if ((s = strchr(buf, CHRMARKER)))
61
{
62
*s = '\0';
63
s++;
64
}
65
message((0, "Version %s has been check out and marked as version%s", s, buf));
66
}
67
68
}
69
else
70
tp = vp->tp;
71
72
/* get the base */
73
(void) TOBASE(rp->fd, ap);
74
nsrc = ap->basesize;
75
if ((sbuf = (char *) malloc(nsrc)) == NULL ||
76
sfread(rp->fd, sbuf, nsrc) != nsrc ||
77
!(fsrc = sfnew(NULL, sbuf, nsrc, -1, SF_STRING|SF_READ)))
78
{
79
rserrno = ERRBASE;
80
goto ERR_EXIT;
81
}
82
(void) sfseek(fsrc, 0L, 0);
83
84
if (ISBASE(tp))
85
{
86
sfmove(fsrc, vp->fd, -1, -1);
87
sfclose(fsrc);
88
free((char *)sbuf);
89
vp->tp = tp;
90
message((1, "check out from the base"));
91
return (0);
92
}
93
94
/* get the delta */
95
len = tp->dsize;
96
if (((dbuf = (char *) malloc(len)) == NULL) || sfseek(rp->fd, tp->del, 0) != tp->del || sfread(rp->fd, dbuf, len) != len || !(fdel = sfnew(NULL, dbuf, len, -1, SF_STRING|SF_READ)))
97
{
98
rserrno = ERRDELTA;
99
goto ERR_EXIT;
100
}
101
/* get sizes */
102
(void) TOBEGIN(fdel);
103
if (sfread(fdel, magic,4)!=4 || sfgetc(fdel)<0 || (nsrc = sfgetu(fdel))<0 || (ntar = sfgetu(fdel))<0)
104
{
105
rserrno = ERRDELTA;
106
goto ERR_EXIT;
107
}
108
(void) TOBEGIN(fdel);
109
110
111
/* set buffer for target */
112
tbuf = (char *)malloc(ntar);
113
if(!(rtar = sfnew(NULL,tbuf,ntar,-1,SF_STRING|SF_READ)) ||
114
!(wtar = sfnew(NULL,tbuf,ntar,-1,SF_STRING|SF_WRITE)))
115
{
116
rserrno = NOMEM;
117
goto ERR_EXIT;
118
}
119
120
/* do the update */
121
if(update(fsrc, fdel, wtar, rtar) < 0)
122
{
123
rserrno = ERRUPDATE;
124
goto ERR_EXIT;
125
}
126
127
sfseek(rtar, 0L, 0);
128
sfmove(rtar, vp->fd, -1, -1);
129
sfclose(fdel); sfclose(rtar); sfclose(fsrc);
130
free((char *)dbuf);
131
free((char *)sbuf);
132
free((char *)tbuf);
133
134
return (0);
135
136
ERR_EXIT:
137
if (dbuf) free((char *)dbuf);
138
if (sbuf) free((char *)sbuf);
139
if (tbuf) free((char *)tbuf);
140
if (fdel) sfclose(fdel);
141
if (rtar) sfclose(rtar);
142
if (fsrc) sfclose(fsrc);
143
144
return (-1);
145
}
146
147
148