Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/vcs_rscs.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
#pragma prototyped
21
22
#include "vcs_rscs.h"
23
#include "vcs_cmd.h"
24
25
int rserrno;
26
int debug; /* take away ? */
27
28
int
29
rscs_out(int argc, char** argv, char* ret, int* n)
30
{
31
rfile_t rf;
32
version_t vs;
33
attr_t attr;
34
tag_t tag;
35
rdirent_t* list;
36
register struct stat* st;
37
38
if (argc < 2)
39
{
40
*n = sfsprintf(ret, *n, "E arguments error\n");
41
return (-1);
42
}
43
rf.path = argv[1];
44
vs.path = argv[1];
45
vs.version = NULL;
46
if (argc > 3)
47
{
48
vs.version = argv[2];
49
if (argc > 4)
50
vs.path = argv[3];
51
}
52
53
if ((rf.fd = sfopen(NULL, rf.path, "r")) == NULL)
54
{
55
*n = sfsprintf(ret, *n, "E %s cannot open for read\n", rf.path);
56
return (-1);
57
}
58
if (get_attr(rf.fd, &attr))
59
{
60
*n = sfsprintf(ret, *n, "E %s not vcs\n", rf.path);
61
sfclose(rf.fd);
62
return (-1);
63
}
64
rf.ap = &attr;
65
vs.tp = &tag;
66
if (search_tag(rf.fd, rf.ap, vs.version, 0, &(vs.tp), G_LINK, &list))
67
{
68
*n = sfsprintf(ret, *n, "E version %s not existed\n", vs.version);
69
return (-1);
70
}
71
(void) unlink(vs.path);
72
if ((vs.fd = sfopen(NULL, vs.path, "w")) == NULL)
73
{
74
sfclose(rf.fd);
75
*n = sfsprintf(ret, *n, "E %s cannot open for write\n", vs.path);
76
return (-1);
77
}
78
if (checkout(&rf, &vs) < 0)
79
{
80
sfclose(rf.fd); sfclose(vs.fd);
81
*n = sfsprintf(ret, *n, "E checkout\n");
82
return (-1);
83
}
84
sfsync(vs.fd);
85
sfclose(rf.fd); sfclose(vs.fd);
86
st = &(vs.tp->stat);
87
(void) touch(vs.path, st->st_atime, st->st_mtime, 1);
88
(void) chmod(vs.path, st->st_mode);
89
(void) chown(vs.path, st->st_uid, st->st_gid);
90
*n = sfsprintf(ret, *n, "I %s(%s) checkout\n", vs.path, vs.tp->version);
91
return (0);
92
}
93
94
int
95
rscs_instances(int argc, char** argv, char* ret, int* n)
96
{
97
register Sfio_t* fd;
98
attr_t attr;
99
register rdirent_t* list;
100
register char* s;
101
register int len;
102
register int rsize;
103
register char* path;
104
105
path = argv[1];
106
107
if ((fd = sfopen(NULL, path, "r")) == NULL)
108
{
109
*n = sfsprintf(ret, *n, "E %s cannot open for read\n", path);
110
return (-1);
111
}
112
if (get_attr(fd, &attr))
113
{
114
*n = sfsprintf(ret, *n, "E %s not vcs\n", path);
115
sfclose(fd);
116
return (-1);
117
}
118
if ((list = rs_dir(fd, &attr)) == NULL)
119
{
120
*n = sfsprintf(ret, *n, "I no entry\n");
121
sfclose(fd);
122
return (0);
123
}
124
125
sfclose(fd);
126
127
s = ret;
128
rsize = *n;
129
len = sfsprintf(s, rsize, "I <");
130
s += len;
131
rsize -= len;
132
while(list != NULL)
133
{
134
len = sfsprintf(s, rsize, "%s ", list->tag->version);
135
s += len;
136
rsize -= len;
137
list = list->next;
138
}
139
len = s - ret;
140
ret[len-1] = '>';
141
ret[len] = '\n';
142
ret[len+1] = '\0';
143
*n = len + 2;
144
return (0);
145
}
146
147