Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/cs/vcs_src/vcs_marker.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
#include "vcs_rscs.h"
21
#include "vcs_cmd.h"
22
23
tag_t* getmarker();
24
25
int rs_marker(rp, from, to, st, expire, force)
26
register rfile_t* rp;
27
register char* from;
28
register char* to;
29
register struct stat* st;
30
time_t expire;
31
int force;
32
{
33
rdirent_t* dir;
34
tag_t* tp;
35
tag_t* dump;
36
tag_t tag;
37
char buf[1024];
38
39
tp = NULL;
40
if (from && *from && search_tag(rp->fd, rp->ap, from, 0, &tp, G_LINK, &dir))
41
{
42
message((0, "Version %s not found", from));
43
return (-1);
44
}
45
46
if (!gettagbyspec(dir, to, 0, &dump))
47
{
48
message((0, "Version %s existed", to));
49
return (-1);
50
}
51
52
sfsprintf(buf, sizeof(buf), "%s%c%s", to, CHRMARKER, (tp ? tp->version : NULL));
53
54
if (!force && (dump = getmarker(dir, buf)))
55
{
56
if (!R_ISMARKER(dump))
57
{
58
message((0, "Version %s existed", buf));
59
return (-1);
60
}
61
if (dump->stat.st_ino != st->st_ino)
62
{
63
message((0, "Marker %s existed", buf));
64
return (-1);
65
}
66
}
67
tp = &tag;
68
new_tag(tp, st, buf, 0, 0, LOG | MARKER);
69
tp->stat.st_mtime = expire;
70
(void) sfseek(rp->fd, 0L, 2);
71
sfwrite(rp->fd, (char *)tp, tp->length);
72
replica(rp->path, NULL, tp);
73
return (0);
74
}
75
76
77
tag_t* getmarker(dir, s)
78
rdirent_t* dir;
79
register char* s;
80
{
81
register rdirent_t* ep;
82
83
for (ep=dir; ep ; ep = ep->next)
84
{
85
if (strcmp(ep->tag->version, s) == 0)
86
return (ep->tag);
87
}
88
return (NULL);
89
}
90
91
tag_t* getmarkerbyfrom(dir, s)
92
rdirent_t* dir;
93
register char* s;
94
{
95
register rdirent_t* ep;
96
register char* t;
97
register rdirent_t* r;
98
99
r = NULL;
100
for (ep = dir; ep; ep = ep->next)
101
{
102
if (!R_ISMARKER(ep->tag))
103
continue;
104
if ((t = strrchr(ep->tag->version, CHRMARKER)) == NULL)
105
continue;
106
107
if (!(*++t))
108
{
109
if (!r || r->tag->stat.st_ctime < ep->tag->stat.st_ctime)
110
r = ep;
111
continue;
112
}
113
114
if (strcmp(t, s) == 0)
115
{
116
if (!r || r->tag->stat.st_ctime < ep->tag->stat.st_ctime)
117
r = ep;
118
}
119
120
}
121
if (r)
122
return (r->tag);
123
else
124
return (NULL);
125
}
126
127
tag_t* getmarkerbyto(dir, s)
128
rdirent_t* dir;
129
register char* s;
130
{
131
register rdirent_t* ep;
132
register rdirent_t* r;
133
134
r = NULL;
135
136
for (ep = dir; ep; ep = ep->next)
137
{
138
if (!R_ISMARKER(ep->tag))
139
continue;
140
if (markermatch(ep->tag->version, s))
141
{
142
if (!r || r->tag->stat.st_ctime < ep->tag->stat.st_ctime)
143
r = ep;
144
}
145
146
}
147
if (r)
148
return (r->tag);
149
else
150
return (NULL);
151
}
152
153
154
155
156
157
int markermatch(marker, s)
158
char* marker;
159
char* s;
160
{
161
register char* t;
162
int i;
163
164
for (i = 1, t = marker; *t && *t != CHRMARKER; t++, i++);
165
return *t && strncmp(marker, s, i) == 0 && s[i] == '\0';
166
}
167
168