##// END OF EJS Templates
Merge with crew-stable
Patrick Mezard -
r7603:d702a702 merge default
parent child Browse files
Show More
@@ -1,336 +1,335 b''
1 1 # GNU Arch support for the convert extension
2 2
3 3 from common import NoRepo, commandline, commit, converter_source
4 4 from mercurial.i18n import _
5 5 from mercurial import util
6 6 import os, shutil, tempfile, stat, locale
7 7 from email.Parser import Parser
8 8
9 9 class gnuarch_source(converter_source, commandline):
10 10
11 11 class gnuarch_rev:
12 12 def __init__(self, rev):
13 13 self.rev = rev
14 14 self.summary = ''
15 15 self.date = None
16 16 self.author = ''
17 17 self.continuationof = None
18 18 self.add_files = []
19 19 self.mod_files = []
20 20 self.del_files = []
21 21 self.ren_files = {}
22 22 self.ren_dirs = {}
23 23
24 24 def __init__(self, ui, path, rev=None):
25 25 super(gnuarch_source, self).__init__(ui, path, rev=rev)
26 26
27 27 if not os.path.exists(os.path.join(path, '{arch}')):
28 28 raise NoRepo(_("%s does not look like a GNU Arch repo") % path)
29 29
30 30 # Could use checktool, but we want to check for baz or tla.
31 31 self.execmd = None
32 32 if util.find_exe('baz'):
33 33 self.execmd = 'baz'
34 34 else:
35 35 if util.find_exe('tla'):
36 36 self.execmd = 'tla'
37 37 else:
38 38 raise util.Abort(_('cannot find a GNU Arch tool'))
39 39
40 40 commandline.__init__(self, ui, self.execmd)
41 41
42 42 self.path = os.path.realpath(path)
43 43 self.tmppath = None
44 44
45 45 self.treeversion = None
46 46 self.lastrev = None
47 47 self.changes = {}
48 48 self.parents = {}
49 49 self.tags = {}
50 50 self.modecache = {}
51 51 self.catlogparser = Parser()
52 52 self.locale = locale.getpreferredencoding()
53 53 self.archives = []
54 54
55 55 def before(self):
56 56 # Get registered archives
57 57 self.archives = [i.rstrip('\n')
58 58 for i in self.runlines0('archives', '-n')]
59 59
60 60 if self.execmd == 'tla':
61 61 output = self.run0('tree-version', self.path)
62 62 else:
63 63 output = self.run0('tree-version', '-d', self.path)
64 64 self.treeversion = output.strip()
65 65
66 66 # Get name of temporary directory
67 67 version = self.treeversion.split('/')
68 68 self.tmppath = os.path.join(tempfile.gettempdir(),
69 69 'hg-%s' % version[1])
70 70
71 71 # Generate parents dictionary
72 72 self.parents[None] = []
73 73 treeversion = self.treeversion
74 74 child = None
75 75 while treeversion:
76 76 self.ui.status(_('analyzing tree version %s...\n') % treeversion)
77 77
78 78 archive = treeversion.split('/')[0]
79 79 if archive not in self.archives:
80 80 self.ui.status(_('tree analysis stopped because it points to an unregistered archive %s...\n') % archive)
81 81 break
82 82
83 83 # Get the complete list of revisions for that tree version
84 84 output, status = self.runlines('revisions', '-r', '-f', treeversion)
85 85 self.checkexit(status, 'failed retrieveing revisions for %s' % treeversion)
86 86
87 87 # No new iteration unless a revision has a continuation-of header
88 88 treeversion = None
89 89
90 90 for l in output:
91 91 rev = l.strip()
92 92 self.changes[rev] = self.gnuarch_rev(rev)
93 93 self.parents[rev] = []
94 94
95 95 # Read author, date and summary
96 96 catlog, status = self.run('cat-log', '-d', self.path, rev)
97 97 if status:
98 98 catlog = self.run0('cat-archive-log', rev)
99 99 self._parsecatlog(catlog, rev)
100 100
101 101 # Populate the parents map
102 102 self.parents[child].append(rev)
103 103
104 104 # Keep track of the current revision as the child of the next
105 105 # revision scanned
106 106 child = rev
107 107
108 108 # Check if we have to follow the usual incremental history
109 109 # or if we have to 'jump' to a different treeversion given
110 110 # by the continuation-of header.
111 111 if self.changes[rev].continuationof:
112 112 treeversion = '--'.join(self.changes[rev].continuationof.split('--')[:-1])
113 113 break
114 114
115 115 # If we reached a base-0 revision w/o any continuation-of
116 116 # header, it means the tree history ends here.
117 117 if rev[-6:] == 'base-0':
118 118 break
119 119
120 120 def after(self):
121 121 self.ui.debug(_('cleaning up %s\n') % self.tmppath)
122 122 shutil.rmtree(self.tmppath, ignore_errors=True)
123 123
124 124 def getheads(self):
125 125 return self.parents[None]
126 126
127 127 def getfile(self, name, rev):
128 128 if rev != self.lastrev:
129 129 raise util.Abort(_('internal calling inconsistency'))
130 130
131 131 # Raise IOError if necessary (i.e. deleted files).
132 132 if not os.path.exists(os.path.join(self.tmppath, name)):
133 133 raise IOError
134 134
135 135 data, mode = self._getfile(name, rev)
136 136 self.modecache[(name, rev)] = mode
137 137
138 138 return data
139 139
140 140 def getmode(self, name, rev):
141 141 return self.modecache[(name, rev)]
142 142
143 143 def getchanges(self, rev):
144 144 self.modecache = {}
145 145 self._update(rev)
146 146 changes = []
147 147 copies = {}
148 148
149 149 for f in self.changes[rev].add_files:
150 150 changes.append((f, rev))
151 151
152 152 for f in self.changes[rev].mod_files:
153 153 changes.append((f, rev))
154 154
155 155 for f in self.changes[rev].del_files:
156 156 changes.append((f, rev))
157 157
158 158 for src in self.changes[rev].ren_files:
159 159 to = self.changes[rev].ren_files[src]
160 160 changes.append((src, rev))
161 161 changes.append((to, rev))
162 copies[src] = to
162 copies[to] = src
163 163
164 164 for src in self.changes[rev].ren_dirs:
165 165 to = self.changes[rev].ren_dirs[src]
166 166 chgs, cps = self._rendirchanges(src, to);
167 167 changes += [(f, rev) for f in chgs]
168 for c in cps:
169 copies[c] = cps[c]
168 copies.update(cps)
170 169
171 170 self.lastrev = rev
172 return util.sort(changes), copies
171 return util.sort(util.unique(changes)), copies
173 172
174 173 def getcommit(self, rev):
175 174 changes = self.changes[rev]
176 175 return commit(author = changes.author, date = changes.date,
177 176 desc = changes.summary, parents = self.parents[rev], rev=rev)
178 177
179 178 def gettags(self):
180 179 return self.tags
181 180
182 181 def _execute(self, cmd, *args, **kwargs):
183 182 cmdline = [self.execmd, cmd]
184 183 cmdline += args
185 184 cmdline = [util.shellquote(arg) for arg in cmdline]
186 185 cmdline += ['>', util.nulldev, '2>', util.nulldev]
187 186 cmdline = util.quotecommand(' '.join(cmdline))
188 187 self.ui.debug(cmdline, '\n')
189 188 return os.system(cmdline)
190 189
191 190 def _update(self, rev):
192 191 self.ui.debug(_('applying revision %s...\n') % rev)
193 192 changeset, status = self.runlines('replay', '-d', self.tmppath,
194 193 rev)
195 194 if status:
196 195 # Something went wrong while merging (baz or tla
197 196 # issue?), get latest revision and try from there
198 197 shutil.rmtree(self.tmppath, ignore_errors=True)
199 198 self._obtainrevision(rev)
200 199 else:
201 200 old_rev = self.parents[rev][0]
202 201 self.ui.debug(_('computing changeset between %s and %s...\n')
203 202 % (old_rev, rev))
204 203 self._parsechangeset(changeset, rev)
205 204
206 205 def _getfile(self, name, rev):
207 206 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
208 207 if stat.S_ISLNK(mode):
209 208 data = os.readlink(os.path.join(self.tmppath, name))
210 209 mode = mode and 'l' or ''
211 210 else:
212 211 data = open(os.path.join(self.tmppath, name), 'rb').read()
213 212 mode = (mode & 0111) and 'x' or ''
214 213 return data, mode
215 214
216 215 def _exclude(self, name):
217 216 exclude = [ '{arch}', '.arch-ids', '.arch-inventory' ]
218 217 for exc in exclude:
219 218 if name.find(exc) != -1:
220 219 return True
221 220 return False
222 221
223 222 def _readcontents(self, path):
224 223 files = []
225 224 contents = os.listdir(path)
226 225 while len(contents) > 0:
227 226 c = contents.pop()
228 227 p = os.path.join(path, c)
229 228 # os.walk could be used, but here we avoid internal GNU
230 229 # Arch files and directories, thus saving a lot time.
231 230 if not self._exclude(p):
232 231 if os.path.isdir(p):
233 232 contents += [os.path.join(c, f) for f in os.listdir(p)]
234 233 else:
235 234 files.append(c)
236 235 return files
237 236
238 237 def _rendirchanges(self, src, dest):
239 238 changes = []
240 239 copies = {}
241 240 files = self._readcontents(os.path.join(self.tmppath, dest))
242 241 for f in files:
243 242 s = os.path.join(src, f)
244 243 d = os.path.join(dest, f)
245 244 changes.append(s)
246 245 changes.append(d)
247 copies[s] = d
246 copies[d] = s
248 247 return changes, copies
249 248
250 249 def _obtainrevision(self, rev):
251 250 self.ui.debug(_('obtaining revision %s...\n') % rev)
252 251 output = self._execute('get', rev, self.tmppath)
253 252 self.checkexit(output)
254 253 self.ui.debug(_('analysing revision %s...\n') % rev)
255 254 files = self._readcontents(self.tmppath)
256 255 self.changes[rev].add_files += files
257 256
258 257 def _stripbasepath(self, path):
259 258 if path.startswith('./'):
260 259 return path[2:]
261 260 return path
262 261
263 262 def _parsecatlog(self, data, rev):
264 263 try:
265 264 catlog = self.catlogparser.parsestr(data)
266 265
267 266 # Commit date
268 267 self.changes[rev].date = util.datestr(
269 268 util.strdate(catlog['Standard-date'],
270 269 '%Y-%m-%d %H:%M:%S'))
271 270
272 271 # Commit author
273 272 self.changes[rev].author = self.recode(catlog['Creator'])
274 273
275 274 # Commit description
276 275 self.changes[rev].summary = '\n\n'.join((catlog['Summary'],
277 276 catlog.get_payload()))
278 277 self.changes[rev].summary = self.recode(self.changes[rev].summary)
279 278
280 279 # Commit revision origin when dealing with a branch or tag
281 280 if catlog.has_key('Continuation-of'):
282 281 self.changes[rev].continuationof = self.recode(catlog['Continuation-of'])
283 282 except Exception, err:
284 283 raise util.Abort(_('could not parse cat-log of %s') % rev)
285 284
286 285 def _parsechangeset(self, data, rev):
287 286 for l in data:
288 287 l = l.strip()
289 288 # Added file (ignore added directory)
290 289 if l.startswith('A') and not l.startswith('A/'):
291 290 file = self._stripbasepath(l[1:].strip())
292 291 if not self._exclude(file):
293 292 self.changes[rev].add_files.append(file)
294 293 # Deleted file (ignore deleted directory)
295 294 elif l.startswith('D') and not l.startswith('D/'):
296 295 file = self._stripbasepath(l[1:].strip())
297 296 if not self._exclude(file):
298 297 self.changes[rev].del_files.append(file)
299 298 # Modified binary file
300 299 elif l.startswith('Mb'):
301 300 file = self._stripbasepath(l[2:].strip())
302 301 if not self._exclude(file):
303 302 self.changes[rev].mod_files.append(file)
304 303 # Modified link
305 304 elif l.startswith('M->'):
306 305 file = self._stripbasepath(l[3:].strip())
307 306 if not self._exclude(file):
308 307 self.changes[rev].mod_files.append(file)
309 308 # Modified file
310 309 elif l.startswith('M'):
311 310 file = self._stripbasepath(l[1:].strip())
312 311 if not self._exclude(file):
313 312 self.changes[rev].mod_files.append(file)
314 313 # Renamed file (or link)
315 314 elif l.startswith('=>'):
316 315 files = l[2:].strip().split(' ')
317 316 if len(files) == 1:
318 317 files = l[2:].strip().split('\t')
319 318 src = self._stripbasepath(files[0])
320 319 dst = self._stripbasepath(files[1])
321 320 if not self._exclude(src) and not self._exclude(dst):
322 321 self.changes[rev].ren_files[src] = dst
323 322 # Conversion from file to link or from link to file (modified)
324 323 elif l.startswith('ch'):
325 324 file = self._stripbasepath(l[2:].strip())
326 325 if not self._exclude(file):
327 326 self.changes[rev].mod_files.append(file)
328 327 # Renamed directory
329 328 elif l.startswith('/>'):
330 329 dirs = l[2:].strip().split(' ')
331 330 if len(dirs) == 1:
332 331 dirs = l[2:].strip().split('\t')
333 332 src = self._stripbasepath(dirs[0])
334 333 dst = self._stripbasepath(dirs[1])
335 334 if not self._exclude(src) and not self._exclude(dst):
336 335 self.changes[rev].ren_dirs[src] = dst
@@ -1,73 +1,82 b''
1 1 #!/bin/sh
2 2
3 3 "$TESTDIR/hghave" baz || exit 80
4 4
5 5 mkdir do_not_use_HOME_baz
6 6 cd do_not_use_HOME_baz
7 7 HOME=`pwd`; export HOME
8 8 cd ..
9 9 baz my-id "mercurial <mercurial@selenic.com>"
10 10
11 11 echo "[extensions]" >> $HGRCPATH
12 12 echo "convert=" >> $HGRCPATH
13 13 echo 'hgext.graphlog =' >> $HGRCPATH
14 14
15 15 echo % create baz archive
16 16 baz make-archive baz@mercurial--convert hg-test-convert-baz
17 17
18 18 echo % initialize baz repo
19 19 mkdir baz-repo
20 20 cd baz-repo/
21 21 baz init-tree baz@mercurial--convert/baz--test--0
22 22 baz import
23 23
24 24 echo % create initial files
25 25 echo 'this is a file' > a
26 26 baz add a
27 27 mkdir src
28 28 baz add src
29 29 cd src
30 30 dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
31 31 baz add b
32 32 baz commit -s "added a file, src and src/b (binary)"
33 33
34 34 echo % create link file and modify a
35 35 ln -s ../a a-link
36 36 baz add a-link
37 37 echo 'this a modification to a' >> ../a
38 38 baz commit -s "added link to a and modify a"
39 39
40 40 echo % create second link and modify b
41 41 ln -s ../a a-link-2
42 42 baz add a-link-2
43 43 dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
44 44 baz commit -s "added second link and modify b"
45 45
46 46 echo % b file to link and a-link-2 to regular file
47 47 rm -f a-link-2
48 48 echo 'this is now a regular file' > a-link-2
49 49 ln -sf ../a b
50 50 baz commit -s "file to link and link to file test"
51 51
52 52 echo % move a-link-2 file and src directory
53 53 cd ..
54 54 baz mv src/a-link-2 c
55 55 baz mv src test
56 56 baz commit -s "move and rename a-link-2 file and src directory"
57 57
58 echo % move and add the moved file again
59 echo e > e
60 baz add e
61 baz commit -s "add e"
62 baz mv e f
63 echo ee > e
64 baz add e
65 baz commit -s "move e and recreate it again"
58 66 cd ..
59 67
60 68 echo % converting baz repo to Mercurial
61 69 hg convert baz-repo baz-repo-hg
62 70
63 71 baz register-archive -d baz@mercurial--convert
64 72
65 73 glog()
66 74 {
67 75 hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
68 76 }
69 77
70 78 echo % show graph log
71 79 glog -R baz-repo-hg
72 80 hg up -q -R baz-repo-hg
73 81 hg -R baz-repo-hg manifest --debug
82 hg -R baz-repo-hg log -r 5 -r 7 -C --debug | grep copies
@@ -1,75 +1,96 b''
1 1 % create baz archive
2 2 % initialize baz repo
3 3 * creating version baz@mercurial--convert/baz--test--0
4 4 * imported baz@mercurial--convert/baz--test--0
5 5 % create initial files
6 6 * build pristine tree for baz@mercurial--convert/baz--test--0--base-0
7 7 * Scanning for full-tree revision: .
8 8 * from import revision: baz@mercurial--convert/baz--test--0--base-0
9 9 A/ .arch-ids
10 10 A/ src
11 11 A/ src/.arch-ids
12 12 A .arch-ids/a.id
13 13 A a
14 14 A src/.arch-ids/=id
15 15 A src/.arch-ids/b.id
16 16 A src/b
17 17 * update pristine tree (baz@mercurial--convert/baz--test--0--base-0 => baz--test--0--patch-1)
18 18 * committed baz@mercurial--convert/baz--test--0--patch-1
19 19 % create link file and modify a
20 20 A src/.arch-ids/a-link.id
21 21 A src/a-link
22 22 M a
23 23 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-1 => baz--test--0--patch-2)
24 24 * committed baz@mercurial--convert/baz--test--0--patch-2
25 25 % create second link and modify b
26 26 A src/.arch-ids/a-link-2.id
27 27 A src/a-link-2
28 28 Mb src/b
29 29 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-2 => baz--test--0--patch-3)
30 30 * committed baz@mercurial--convert/baz--test--0--patch-3
31 31 % b file to link and a-link-2 to regular file
32 32 fl src/b
33 33 lf src/a-link-2
34 34 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-3 => baz--test--0--patch-4)
35 35 * committed baz@mercurial--convert/baz--test--0--patch-4
36 36 % move a-link-2 file and src directory
37 37 D/ src/.arch-ids
38 38 A/ test/.arch-ids
39 39 /> src test
40 40 => src/.arch-ids/a-link-2.id .arch-ids/c.id
41 41 => src/a-link-2 c
42 42 => src/.arch-ids/=id test/.arch-ids/=id
43 43 => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
44 44 => src/.arch-ids/b.id test/.arch-ids/b.id
45 45 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-4 => baz--test--0--patch-5)
46 46 * committed baz@mercurial--convert/baz--test--0--patch-5
47 % move and add the moved file again
48 A .arch-ids/e.id
49 A e
50 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-5 => baz--test--0--patch-6)
51 * committed baz@mercurial--convert/baz--test--0--patch-6
52 A .arch-ids/e.id
53 A e
54 => .arch-ids/e.id .arch-ids/f.id
55 => e f
56 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-6 => baz--test--0--patch-7)
57 * committed baz@mercurial--convert/baz--test--0--patch-7
47 58 % converting baz repo to Mercurial
48 59 initializing destination baz-repo-hg repository
49 60 analyzing tree version baz@mercurial--convert/baz--test--0...
50 61 scanning source...
51 62 sorting...
52 63 converting...
53 5 initial import
54 4 added a file, src and src/b (binary)
55 3 added link to a and modify a
56 2 added second link and modify b
57 1 file to link and link to file test
58 0 move and rename a-link-2 file and src directory
64 7 initial import
65 6 added a file, src and src/b (binary)
66 5 added link to a and modify a
67 4 added second link and modify b
68 3 file to link and link to file test
69 2 move and rename a-link-2 file and src directory
70 1 add e
71 0 move e and recreate it again
59 72 % show graph log
73 o 7 "move e and recreate it again" files: e f
74 |
75 o 6 "add e" files: e
76 |
60 77 o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
61 78 |
62 79 o 4 "file to link and link to file test" files: src/a-link-2 src/b
63 80 |
64 81 o 3 "added second link and modify b" files: src/a-link-2 src/b
65 82 |
66 83 o 2 "added link to a and modify a" files: a src/a-link
67 84 |
68 85 o 1 "added a file, src and src/b (binary)" files: a src/b
69 86 |
70 87 o 0 "initial import" files:
71 88
72 89 c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
73 e3207be798aaf87a444a62903621edab4ddc1fb6 644 c
74 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
75 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
90 623942606de842342ac7b221ae9ccabc13b5d8c8 644 c
91 1a4a864db0073705a11b1439f563bfa4b46d9246 644 e
92 ab9089704d7c988687521e6adf018ebf767da7d6 644 f
93 43b4308708a4b36340566684df2e2a074b12ceb0 644 @ test/a-link
94 73773e3389ef7ec5a070519b74895d2eaa4ad5db 644 @ test/b
95 copies: c (src/a-link-2) test/a-link (src/a-link) test/b (src/b)
96 copies: f (e)
@@ -1,72 +1,72 b''
1 1 % create tla archive
2 2 % initialize tla repo
3 3 * creating version tla@mercurial--convert/tla--test--0
4 4 * imported tla@mercurial--convert/tla--test--0
5 5 % create initial files
6 6 A/ .arch-ids
7 7 A/ src
8 8 A/ src/.arch-ids
9 9 A .arch-ids/a.id
10 10 A a
11 11 A src/.arch-ids/=id
12 12 A src/.arch-ids/b.id
13 13 A src/b
14 14 * update pristine tree (tla@mercurial--convert/tla--test--0--base-0 => tla--test--0--patch-1)
15 15 * committed tla@mercurial--convert/tla--test--0--patch-1
16 16 % create link file and modify a
17 17 A src/.arch-ids/a-link.id
18 18 A src/a-link
19 19 M a
20 20 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-1 => tla--test--0--patch-2)
21 21 * committed tla@mercurial--convert/tla--test--0--patch-2
22 22 % create second link and modify b
23 23 A src/.arch-ids/a-link-2.id
24 24 A src/a-link-2
25 25 Mb src/b
26 26 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-2 => tla--test--0--patch-3)
27 27 * committed tla@mercurial--convert/tla--test--0--patch-3
28 28 % b file to link and a-link-2 to regular file
29 29 fl src/b
30 30 lf src/a-link-2
31 31 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-3 => tla--test--0--patch-4)
32 32 * committed tla@mercurial--convert/tla--test--0--patch-4
33 33 % move a-link-2 file and src directory
34 34 D/ src/.arch-ids
35 35 A/ test/.arch-ids
36 36 /> src test
37 37 => src/.arch-ids/a-link-2.id .arch-ids/c.id
38 38 => src/a-link-2 c
39 39 => src/.arch-ids/=id test/.arch-ids/=id
40 40 => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
41 41 => src/.arch-ids/b.id test/.arch-ids/b.id
42 42 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-4 => tla--test--0--patch-5)
43 43 * committed tla@mercurial--convert/tla--test--0--patch-5
44 44 % converting tla repo to Mercurial
45 45 initializing destination tla-repo-hg repository
46 46 analyzing tree version tla@mercurial--convert/tla--test--0...
47 47 scanning source...
48 48 sorting...
49 49 converting...
50 50 5 initial import
51 51 4 added a file, src and src/b (binary)
52 52 3 added link to a and modify a
53 53 2 added second link and modify b
54 54 1 file to link and link to file test
55 55 0 move and rename a-link-2 file and src directory
56 56 % show graph log
57 57 o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
58 58 |
59 59 o 4 "file to link and link to file test" files: src/a-link-2 src/b
60 60 |
61 61 o 3 "added second link and modify b" files: src/a-link-2 src/b
62 62 |
63 63 o 2 "added link to a and modify a" files: a src/a-link
64 64 |
65 65 o 1 "added a file, src and src/b (binary)" files: a src/b
66 66 |
67 67 o 0 "initial import" files:
68 68
69 69 c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
70 e3207be798aaf87a444a62903621edab4ddc1fb6 644 c
71 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
72 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
70 623942606de842342ac7b221ae9ccabc13b5d8c8 644 c
71 43b4308708a4b36340566684df2e2a074b12ceb0 644 @ test/a-link
72 73773e3389ef7ec5a070519b74895d2eaa4ad5db 644 @ test/b
General Comments 0
You need to be logged in to leave comments. Login now